1.读取图片
生成样本列表和标签列表,可以根据路径或者文件名获取每个样本的标签项
2.划分测试集和训练集
在tensorflow中可以先使用tf.data.dataset.from_tensor_slices函数将数据转化成dataset类型;对于训练集可以使用shuffle函数对数据进行乱序(乱序的作用是使每个epoch中的样本数据顺序不同,防止网络记录样本间的次序信息),然后设置batch_size大小,batch_size大小就是小批量梯度下降中的样本量大小,就是训练多少样本进行计算一次梯度,对于测试样本这是一个batch_size大小,设置batch_size 本质上就是对样本进行分组,会增加数据的一个维度
3.预处理
若在tensorflow里,我们可以
- 先使用tf.io.read_file 函数以细节流字符串的形式读取图片数据,
- 使用image.decode_jpeg 函数将字节流字符串解析成图片
- 使用image.resize方法将图片统一尺寸
- 使用tensorflow tf.image下的方法将图片进行一些随机对比度,随机裁剪,随机亮度,随机反转的操作来增加样本量,进而增加样本数量
- 使用tf.cast方法对图片张量中的数据转换为float32 类型,然后使用除法进行归一化操作,一般将数据除以255
5.构建模型
卷积->池化->批标准化->激活函数(relu)->
… (重复)
卷积->池化->批标准化->激活函数(relu)->
全局平均池化->
全连接层->批标准化->激活函数(relu)->
…(重复)
全连接层->批标准化->激活函数(sigmoid或softmax)
注意:
- 卷积核数量一般设置为2的n次方并且越来越大,,卷积核大小参考VGG16设置为3*3
- 对于有的多层 feature map 的网络,先对每个feature map 进行卷积 然后将每层卷积结果相加
- 池化层主要的作用 保留显著特征、降低特征维度,简化网络复杂度、减小计算量、增大kernel的视野
- 模型中的卷积层(CNN)的主要作用是进行体征提取,全连接层用来进行分类(本质上就是一个分类器)
- 全连接就是个矩阵乘法,相当于一个特征空间变换,可以把前面所有有用的信息提取整合。再加上激活函数的非线性映射,多层全连接层理论上可以模拟任何非线性变换。但缺点也很明显: 无法保持空间结构。
- GAP 的作用是将每一个feature map降维成一个数据值,在使用GAP后,网络收敛速度将会变慢。
下边展示一下 VGG 的网络结构图:
6.训练网络
- 每次选取一个batch数量的样本放到网络里进行训练,然后计算每个节点的平均梯度,然后根据学习率在梯度反方向上更新参数值(权重或偏置)
- 当每个epoch结束之后,计算(测试集或者训练集)当前epoch下的平均损失或是平均准确率
- 逻辑回归(通过sigmoid逻辑激活函数激活的网络)一般使用交叉熵损失函数,损失函数根据二分类或多分类分别用
BinaryCrossentropy()
(二元交叉熵)和CategoricalAccuracy()
(多元交叉熵) 同时根据标签项是否是one-hot编码,损失函数也有不同。详细了解交叉熵请参考此博文->#本质上理解# 熵、交叉熵、KL散度的关系 - 线性回归 使用最小二乘最为损失函数,因为激活函数的目的就是实现非线性,因此线性回归一般不使用激活函数
- 优化函数一般有 随机梯度下降 小批量梯度下降,批量梯度下降。这种划分batch的方式是小批量梯度下降
7.多输出的CNN模型
多输出的CNN模型表示并非指模型的最后一层有多个输出,而是指在CNN的特征提取器(所有卷积层)后连接多个分类器,每个分类器拥有不同的功能(目标定位,分类等)