学过深度卷积网络的应该都非常熟悉这张demo图(LeNet):
此图是LeNet的结构图,把32*32的手写英文字符图片作为输入,训练出一个对于手写字符的分类
我们训练这个网络必须经过4步:
第一步:将输入input向前传播,进行运算后得到输出output
第二步:将output再输入loss函数,计算loss值(是个标量)
第三步:将梯度反向传播到每个参数
第四步:利用下面公式进行权重更新
新权重w = 旧权重w + 学习速率? x 梯度向量g
先不管怎么训练,我们必须先构建出一个CNN网络,很快我们写了一段关于这个LeNet的代码,并进行注释:
1至37行定义了一个卷积神经网络,40行以下是为了观察该网络需要训练的参数数量。
运行完该代码我们得到下图
该网络有5层神经元,第一层是1到6的卷积层,第二层是6到16的卷积层,第三层到第5层均为全连接层。第一层的参数计算是6x1x5x5=150,当然别忘了还有bias=6,所以第一层的参数总量是150+6=156。以此类推,总参数和为61706个
注意:torch.nn只接受mini-batch的输入,也就是说我们输入的时候是必须是好几张图片同时输入。 例如:nn. Conv2d 允许输入4维的Tensor:n个样本 x n个色彩频道 x 高度 x 宽度