版权声明:小博主水平有限,希望大家多多指导。
目录:
【使用传统DNN】
BG大龍:【DL项目实战02】图像分类——Keras框架+使用传统神经网络DNNzhuanlan.zhihu.com【使用卷积神经网络CNN】
BG大龍:【DL项目实战02】图像识别分类——Keras框架+卷积神经网络CNN(使用VGGNet)zhuanlan.zhihu.com1、数据集情况
2、任务目标
3、流程中的注意点
(1)读取数据
(2)建立CNN(选用VGGNet)
——【第1部分】Conv2D层中,确定data_format类型
——【第2部分】特征提取:(卷积+池化)
——【第3部分】分类识别:(全连接)
(3)设定超参
(4)定义损失函数
(5)训练模型
(6)结果
4、对比实验
(1)第1个对比:添加Batch Normalization(BN,批量标准化层)
(2)第2个对比:添加Truncated Normal(TN,截断分布)
(3)第3个对比:添加Dropout
5、加载模型,进行测试
1、数据集情况
2、任务目标
当输入“image”时候,能否正确识别,识别的acc是多少
3、流程中的注意点
(1)读取数据
DNN结构:
CNN结构:
正常CNN输入是2242443,这里进行缩小成64643,为了提高计算速度
(2)建立CNN(选用VGGNet)
把网络模型单独写成一个模块,然后直接去调用simpleVGGNet
在simpleVGGNet模块里面,三部分工作
【第1部分】Conv2D层中,确定data_format类型
(data_format='channels_last')—input_shape = (128,128,3)代表128*128的RGB图像
(data_format='channels_first')—input_shape = (3,128,128)代表128*128的RGB图像
keras使用tensorflow作为Backend时,格式是(data_format='channels_first')
或者我们定义一个判断语句:
【第2部分】特征提取:(卷积+池化)
(1)32—64—128:为了降低pooling压缩带来的损失影响,filter个数逐步翻倍
(2)padding:补0策略,为“valid”, “same”
“valid”代表只进行有效的卷积,即对边界数据不处理。
“same”代表保留边界处的卷积结果,通常会导致输出shape与输入shape相同。
API文档: 卷积层 - Keras中文文档
(3)凡是计算层后面,都要加上激活函数
【第3部分】分类识别:(全连接)
FC层:
激活函数softmax:
(3)设定超参
(4)定义损失函数
这里,有一个学习率的衰减,decay=INIT_LR / EPOCHS
看下API文档,
(5)训练模型
steps_per_epoch=len(trainX) // BS
它表示是将一个epoch分成多少个batch_size,
如果训练样本数N=1000,steps_per_epoch = 10,那么相当于一个batch_size=100
(6)结果
观察val_loss,
4、对比实验
(1)第1个对比:添加Batch Normalization(BN,批量标准化层)
API文档:(批)规范化BatchNormalization - Keras中文文档
axis:整数,指定当mode=0
时规范化的轴。例如输入是形如(samples,channels,rows,cols)的4D图像张量,则应设置规范化的轴为1,意味着对每个特征图进行规范化
NN结构:
在每一个“relu”后,添加BN
例如:
结果:
但是Loss为什么这么大?
猜测是“随机初始化”的原因,我又重新运行了一次
BN添加前后对比:
更加稳定,提高了val_acc,
(2)第2个对比:添加Truncated Normal(TN,截断分布)
API文档: 初始化方法 - Keras中文文档
NN结构:
在每个卷积层里面,添加kernel_initializer=TruncatedNormal(),stddev=0.01
例如:
结果:
TN添加前后对比:
有的参数添加后,不一定好
(3)第3个对比:添加Dropout
API文档: 常用层 - Keras中文文档
NN结构:
有个疑问:在卷积层中,已经是“权重参数共享”,连接的参数本来就不多,再进行Dropout,岂不是更少?(所以一般在Dense层在dropout?)
结果:
Dropout添加前后对比:
更加平稳,但是loss老是跑的比较高……
5、加载模型,进行测试
用“image”文件夹,去做预测
CNN结果:
对比DNN结果: