企业网站建设既可以外包给专业的网站建设服务公司,海外专用服务器,wordpress 3d标签云,做哪一类网站能赚钱提示#xff1a;文章写完后#xff0c;目录可以自动生成#xff0c;如何生成可参考右边的帮助文档 文章目录 前言Q1#xff1a;卷积网络和传统网络的区别Q2:卷积神经网络的架构Q3:卷积神经网络中的参数共享#xff0c;也是比传统网络的优势所在4、 具体的实现代码网络搭建… 提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档 文章目录 前言Q1卷积网络和传统网络的区别Q2:卷积神经网络的架构Q3:卷积神经网络中的参数共享也是比传统网络的优势所在4、 具体的实现代码网络搭建 前言
深度学习pytorch系列第三篇啦之前更了FCNN这篇是卷积神经网络cNN模型实现手写数字识别依然是重在理解哈具体的理解内容我都以注释的形式放在了代码中我就直接放代码了因为我把一些知识点和理解的东西用注释的形式写了 首先是关于卷积神经网络的一些点
Q1卷积网络和传统网络的区别
传统网络只适合结构化数据不适合图像数据由于图像数据的数据量大表现为像素点多传统网络需要使用的参数量太大
Q2:卷积神经网络的架构
卷积神经网络包括输入层卷积层池化层全连接层 重点介绍卷积层 卷积就是针对每个区域去计算特征。可以这样做的原因是图片是有像素点构成的针对每个像素点进行处理需要的参数量过于庞大并且相邻的像素点之间是存在联系的 特征图的个数与卷积核的个数一致。每个卷积核通过对输入特征图进行卷积操作生成一个输出特征图。因此卷积核的个数决定了输出的特征图的个数。 使用不同的卷积核学习同一个位置可以得到不同的特征图从而使特征多样化 卷积核的大小一般使用3*3 卷积核的大小规格一般是固定的卷积核的数量理论上是越多越好 卷积层涉及的参数有滑动窗口步长卷积核尺寸边缘填充卷积核个数 卷积结果计算公式长h2(h1-Fh2p)/s 1 宽w2(w1-Fw2p)/s 1 其中w1h1表示输入的宽度长度w2和h2表示输出特征图的宽度、长度F表示卷积核的长和宽s表示滑动窗口的补偿p表示边界填充 经过卷积操作后特征图的长和宽也可以保持不变 池化层的作用就是筛选好的特征pool是只筛选位置的channel是全部使用的 池化也称为下采样(一次只能下采样原来的一半不能直接224-16) 卷积神经网络由多个block组成重点就在于怎么设计这个block的组成 关于卷积神经网络的层数带权重参数的就算是一层6个conn1个fc就可以说是7层网络结构
Q3:卷积神经网络中的参数共享也是比传统网络的优势所在
同一个卷积核在各个位置上的参数都是一致的 权重参数的个数与输入数据的大小无关
4、 具体的实现代码网络搭建
# 读取数据
import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
from torchvision import datasets,transforms
# transforms 进行预处理比如进行tensor转换
import matplotlib.pyplot as plt
import numpy as np
#全连接batch*28*28全连接各个像素点之间无关
# cnnbatch*1*28*28 多了一个参数channel卷积会综合考虑一个窗口之间的关系因此各个像素点并不是独立的卷积网络更适合处理图像数据
# 定义超参数
input_size 28 #图像的总尺寸28*28
num_classes 10 #标签的种类数
num_epochs 3 #训练的总循环周期
batch_size 64 #一个撮批次的大小64张图片
# 训练集
train_dataset datasets.MNIST(root./data,trainTrue,transformtransforms.ToTensor(),downloadTrue)
# 测试集
test_dataset datasets.MNIST(root./data,trainFalse,transformtransforms.ToTensor())# 构建batch数据
train_loader torch.utils.data.DataLoader(datasettrain_dataset,batch_sizebatch_size,shuffleTrue)
test_loader torch.utils.data.DataLoader(datasettest_dataset,batch_sizebatch_size,shuffleTrue)
# 卷积网络模块构建
# 一般卷积层relu层池化层可以写成一个套餐
# 注意卷积最后结果还是一个特征图需要把图转换成向量才能做分类或者回归任务
# 定义一个网络
class CNN(nn.Module):def __init__(self):# 构造函数# 卷积网络一般是组合进行的conv pool relu可以当一个组合super(CNN, self).__init__()self.conv1 nn.Sequential( # 输入大小 (1, 28, 28)nn.Conv2d( # 2d卷积做任务in_channels1, # 灰度图out_channels16, # 要得到几多少个特征图就是卷积核的个数相当于有16个卷积核kernel_size5, # 卷积核大小 5*5的stride1, # 步长padding2, # 如果希望卷积后大小跟原来一样需要设置padding(kernel_size-1)/2 if stride1一般是这么希望的# 如果不能整除pytorch采用向下取整), # 输出的特征图为 (16, 28, 28)nn.ReLU(), # relu层nn.MaxPool2d(kernel_size2), # 进行池化操作2x2 区域, 输出结果为 (16, 14, 14)一般是pooling后是之前的一半)self.conv2 nn.Sequential( # 下一个套餐的输入 (16, 14, 14)nn.Conv2d(16, 32, 5, 1, 2), # 输出 (32, 14, 14)nn.ReLU(), # relu层nn.Conv2d(32, 32, 5, 1, 2),nn.ReLU(),nn.MaxPool2d(2), # 输出 (32, 7, 7))self.conv3 nn.Sequential( # 下一个套餐的输入 (32, 7, 7)nn.Conv2d(32, 64, 5, 1, 2), # 输出 (64, 7, 7)nn.ReLU(), # 输出 (64, 7, 7))# 只有pool的时候才会筛选特征self.out nn.Linear(64 * 7 * 7, 10) # 全连接层得到的结果最后的任务是10分类任务进行一个wxb的操作去做分类def forward(self, x):x self.conv1(x)x self.conv2(x)x self.conv3(x)x x.view(x.size(0), -1) # flatten操作结果为(batch_size, 32 * 7 * 7)和reshape操作一样# reshape操作总的大小是不变的提供一个维度后后边的维度自动计算# 比如当前的x64*7*7x.size:64也就是要从三维转成两维总的大小不变就变为64*49这样-1可以简单的看成一个占位符号# 变换维度开始是64*7*7转成batchsize*特征个数比如64*49output self.out(x)return output
# 定义准确率
def accuracy(predictions, labels):pred torch.max(predictions.data, 1)[1] # 最大值是多少最大值的索引只要索引就可以rights pred.eq(labels.data.view_as(pred)).sum()return rights, len(labels)
# 训练网络模型
# 实例化
net CNN()
# 损失函数
criterion nn.CrossEntropyLoss()
# 优化器学习率是0.001
optimizer optim.Adam(net.parameters(), lr0.001) # 定义优化器普通的随机梯度下降算法
# 开始训练循环
for epoch in range(num_epochs):# 当前epoch的结果保存下来train_rights []for batch_idx, (data, target) in enumerate(train_loader): # 针对容器中的每一个批进行循环net.train()output net(data)loss criterion(output, target)optimizer.zero_grad()loss.backward()optimizer.step()right accuracy(output, target)train_rights.append(right)# 每一个batch都进行训练每一百个batch进行一次评估if batch_idx % 100 0:net.eval()val_rights []for (data, target) in test_loader:output net(data)right accuracy(output, target)val_rights.append(right)# 准确率计算train_r (sum([tup[0] for tup in train_rights]), sum([tup[1] for tup in train_rights]))val_r (sum([tup[0] for tup in val_rights]), sum([tup[1] for tup in val_rights]))print(当前epoch: {} [{}/{} ({:.0f}%)]\t损失: {:.6f}\t训练集准确率: {:.2f}%\t测试集正确率: {:.2f}%.format(epoch, batch_idx * batch_size, len(train_loader.dataset),100. * batch_idx / len(train_loader),loss.data,100. * train_r[0].numpy() / train_r[1],100. * val_r[0].numpy() / val_r[1]))实现结果