一、视频学习
卷积神经网络的基本应用:分类、检索、检测、分割。
深度学习三部曲:step1:搭建神经网络结构;step2:找到一个合适的损失函数;step3:找到一个合适的优化函数,更新参数。
全连接网络处理图像的问题:参数太多导致过拟合。
卷积神经网络的解决方式:局部关联,参数共享。
卷积:对两个实变函数的一种数学操作。
卷积神经网络(CNN)由输入层、卷积层、激活函数、池化层、全连接层组成,即INPUT(输入层)-CONV(卷积层)-RELU(激活函数)-POOL(池化层)-FC(全连接层),其中卷积层用来进行特征提取,池化层对输入的特征图进行压缩,一方面使特征图变小,简化网络计算复杂度;一方面进行特征压缩,提取主要特征,全连接层连接所有的特征,将输出值送给分类器。
遇到的问题:1.池化是否可理解为过滤“杂质”、保留关键信息?那么如何降低池化提取特征的误差呢?2.“局部关联,参数共享”的含义?3.如何选择合适的损失函数?如何确定其是否合适?
二、代码练习
2.1 MNIST数据集分类
很好奇这两行代码的含义:
transforms.ToTensor(),
transforms.Normalize((0.1307,),(0.3081,))
查了一下CSDN,解释为ToTensor()能够把灰度范围从0-255变换为0-1之间,而后面的Normalize()是对每个通道执行image=(image-mean)/std,其中0.1307和0.3081是mnist数据集的均值和标准差,因为mnist数据集都是灰度图,所以图像的通道数只有一个,因此均值和标准差都各一个。
稍微修改了原代码的数据,显示了数据集中的40张图。
在小型全连接网络上训练:
可以看到精确度为88%
在卷积神经网络上训练:
可以看到精确度为95%
打乱像素顺序后在全连接网络上训练与测试:
可以看到精确度为89%,相较之前没有明显变化。
同理,在卷积神经网络上训练和测试:
精确度为80%,有了显著的下降。
造成两者区别的原因在于卷积神经网络会利用像素的局部关系,但是打乱顺序后,这些像素间的关系将无法得到利用。
2.2 CIFAR10数据集分类
训练网络:
从测试集中取出八张图片:
把图片输入模型:
可以看出有一张图片识别错了。
网络在整个数据集上的表现:
2.3 使用VGG16对CIFAR10分类
这里出现了错误,经研究和咨询,发现是上一段代码有问题。
这里定义self.cfg在VGG内部,其实应该在外部;图像大小应该是512。
关于梯度归零:
网络训练:
测试精确率:
可以看到,精确率提升至83.24%。