卷积神经网络的结构
#定义网络结构
#不是le-net5的结构
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
# Sequential表示在搭建网络模型中要执行的一系列的步骤
# Dropout中,p=0.5表示50%的神经元不工作
# layer3:输出层 一般输出层中不需要加Dropout
# Conv2d Conv:卷积 2d:表示2维的卷积
# nn.Conv2d的几个参数
# 1:输入通道数:1表示黑白的图片 彩色的话就是3
# 32:输出通道数:表示要生成多少个特征图
# 5:是卷积核的大小,(5,5)表示是5*5的窗口。可以只写一个5
# 1表示步长。步长默认值就是1
# 2表示在padding外面填2圈0 这个相当于samepadding
# nn.MaxPool2d的几个参数
# 第一个2是池化的窗口的大小是2*2 第二个2表示步长为2
self.conv1 = nn.Sequential(nn.Conv2d(1,32,5,1,2),nn.ReLU(),nn.MaxPool2d(2,2))
self.conv2 = nn.Sequential(nn.Conv2d(32,64,5,1,2),nn.ReLU(),nn.MaxPool2d(2,2))
self.fc1 = nn.Sequential(nn.Linear(64*7*7,1000),nn.Dropout(p=0.5),nn.ReLU())
self.fc2 = nn.Sequential(nn.Linear(1000,10),nn.Softmax(dim=1))
# dim=1代表对第一个维度,计算概率值
# 因为batch = 64
# 所以fc1输出的是(64,10)
# 所以dim=1,表示对第二个维度进行softmax求值
def forward(self,x):
# ([64,1,28,28])变成2维的数据->(64,784) 全连接层做计算,必须是2维的数据
# x = x.view(x.size()[0],-1)
# 但是卷积只能对四维的数据进行计算 ([64,1,28,28])
# 64表示批次的数量,1表示通道数 28表示长宽
x = self.conv1(x)
x = self.conv2(x)
#将原来x四维的数据,改变为2维的数据
# (64,64,7,7)
x = x.view(x.size()[0],-1)
x = self.fc1(x)
x = self.fc2(x)
return x
代价函数是交叉熵,优化器是Adam,基于mnist数据集训练,30轮。
手写板的一部分代码,是借鉴的网络上的,然后我又将其魔改一番,最终形成了一个界面。运行好的效果,如下图所示。
识别结果是自动识别的,点击清空画板,画板就会清空,然后识别结果会变成99999。写下数字之后,便会自动识别。几乎是0延迟,预测结果非常的快!?
|