承接上文神经网络基础篇九
卷积神经网络做分类任务
- 导入类库
-
设置参数
读取数据并预处理
准备数据集
建立卷积神经网络
- inputShape表示第一层输入图片数据的h w c ,后续层就不需要指定了
- 3,3是卷积核大小,用非常小的卷积核和非常多的卷积层去做特征提取
- 32表示32个不同的卷积核
- padding=same表示需要边界填充
- 卷积完之后所有带参数计算的层(卷积层、全连接层)都会连接激活函数
接下来创建卷积层 对数据进行卷积和特征提取
Conv1D主要对文本和数值做卷积
Conv2D主要对特征图做卷积
- 每一个2x2的区域做一个池化的操作
VGG所有卷积都是3x3的,pooling把特征图压缩,长和宽都压缩为原来的1/2,体积则压缩为原来的1/4,所以会损失一部分特征信息,怎么弥补损失?池化后,特征图翻倍,所以特征图个数由32->64->128
卷积完之后,得到一个三维的特征图,需要拉长成一维的数据
- 全连接层512个神经元
正常VGG都是3层的,也可以再加一层
分类
设置损失函数
-
decay使得学习率下降,因为权重参数一开始是随机生成的,先学的差不多了,再慢慢去调学习率。
-
优化器SGD
SGD里面代码
每个epoch完之后,都会动态的衰减学习率
模型训练
训练的结果
训练集表现的好,验证集表现的差,最本质原因是数据量太小了,过拟合了,所以也正常,一般最小也以万为单位,几万都不够的。
调优
- BatchNormalization
一开始做了一些标准化处理,随着网络迭代的进行,每一层学完之后,可能是参差不齐,可能有的偏大,有的偏小,需要对每一层矫正,相当于对每一层的结果再做类似的标准化,卷积和全连接层做完之后都可以做一些矫正。
右边的结果显示loss下降的过程稍微稳定了一些。loss值为4是因为权重一开始是随机初始化产生的导致的。
再训练一次的结果:
使用BatchNormalization前后效果对比
可以看到验证集的准确度提高了,由0.6提高到0.7。
使用截断高斯分布初始化权重参数,
卷积和全连接都加上这个参数配置,效果对比
将TruncateNormal的标准差设置的小一些比如调整为0.02,让每个参数发挥的作用更小一些,使得范化能力更平稳一些。
Dropout
Dropout参数可以添加在卷积层也可以添加在全连接层,但卷积层权重参数都能共享,本来就没有几个参数,所以卷积层就不必要添加Dropout参数了
训练得到的模型
模型预测
- 参数配置
卷积神经网络不需要flatten拉平参数
- 参数初始化、读取数据
预处理和预测数据
绘画预测结果
用卷积神经网络预测图片分类比传统的神经网络的效果更好。