AlexNet详解
这个网络可以看成上下两部分,因为作者使用了两块GPU进行并行运算。
为了便于理解,看其中一部分就行,因为这两部分是一样的。
- Conv1
(1+2)代表的是padding的大小,虽然图中没有给出,但是自己可以推理出来,也可以从源码里面发现。
1:在特征矩阵左边加上一列0,在右边加上两列0,上面加上一列0,下面加上两列0 。
(括号弹幕大佬:
2p就等于两边padding的像素之和,不一定严格要求两边padding的像素个数一样
)
(
其实这里双gpu和单gpu卷积层和下采样一致,这是因为batch只是增加厚度,而做卷积只会影响高宽。只是经过全链接的线性层,需要batch数据交互,后面才会互相影响。
)
-
MaxPool1
Maxpooling下采样
池化操作只会改变输出矩阵的高度和宽度,不会改变特征矩阵的深度 -
Conv2
-
MaxPool2
-
Conv3
-
Conv4
-
Conv5
-
Maxpool3
-
3个全连接层
将Maxpooling得到的输出展平,与这三个层进行连接。
最后一个层有1000个节点,因为论文用到的数据集有1000个类别。
花分类数据集
- 下载数据集
五个类别
下载地址https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz
- 训练集、测试集
使用脚本将数据按照9:1的比例划分为训练集和验证集
回到文件夹检查,发现划分成功
使用pytorch搭建并训练花分类网络
1、定义组件
padding[1,2]是左边1右边2
Sequential:之前每使用一个层结构,都要self.模块名称=……,如果每个模块都这么定义,那么工作量太大。
对网络层次比较多的网络,可以使用Sequential函数来精简代码
- Conv2d
关于padding:
①整数:如1,则会在矩阵上下左右补一行/列0;
②tuple:
③:nn.ZeroPad2d 精确补0
在卷积过程中,如果按照公式计算得到的不是整数:
- ReLU
inplace:pytorch中增加计算量,但能减小内存容量的方法 - Maxpool1
- 代码的卷积核个数都弄成论文中的一半了
下一步就是跟全连接层连接 - 三个全连接层
drop使全连接层的节点按照一定比例失活
init_weights为True则进入初始化权重函数
self.module
返回一个迭代器。这个迭代器会遍历网络中所有的模块–>则这个迭代器会遍历网络中每一个层结构:
此处初始化权重的方法:
pytorch里面自动使用上面这个初始化方法
2、定义正向传播
train
好,成功了
太感动了。
jason这样:
查看数据集:
把batch_size设置成4,因为是查看四张图片。把后面的shuffle随机打乱改成True,否则一直按顺序读取那就是同一文件夹中的同一种类。
但是报错了。
这样改之后好了,但是有新的错误
MatplotlibDeprecationWarning: Support for FigureCanvases without a required_interactive_framework attribute was deprecated in Matplotlib 3.6 and will be removed two minor releases later.
找了许多方法,最后发现是Matplotlib的后端问题。一开始输出后端:
按照网页说法:
https://blog.csdn.net/m0_37724919/article/details/128874187(不是我这个问题,但是先码住,说不定以后换到服务器会用到)
https://blog.csdn.net/Reginasong/article/details/128841357(解决问题)
打印出来的是这个:
module://backend_interagg
感觉不对,按照网上的,把后端改成了:
解决问题。
注释掉这段代码之后把之前的地方改回去,继续下一步。
validate
main
predict
遇到了这个问题:
RuntimeError: The size of tensor a (4) must match the size of tensor b (3) at non-singleton dimension 0
使用自己的数据集训练网络
修改网络参数
train:
predict: