目录
1 预训练网络
我们之前每次创建模型,模型自我的第一步都是初始化自己的参数,初始化的参数都是随机的,如果我们使用预训练网络,我们初始化的参数就是之前已经训练好的神经网络
keras中包含VGG16,VGG19,ResNet50,Inception v3,Xception等网络
下面这个图是VGG的六种网络结构
- VGG16中16的意思是网络中可训练参数层(不算池化层与输出层)共有16层,VGG19中19的意思是网络中共有19层
- FC 是指Dense层,后面的数值是该层的神经元个数,FC-4096就是4096个神经元的dense层
- VGG 有两个大的缺点,第一是消耗磁盘空间大,第二是训练速度慢
2 代码实现
2.1 制作数据集
我们使用上一章的猫狗分类添加VGG,我们沿用创建数据集前的所有代码,我们简单看一下
2.2 建立模型
之后调用VGG网络
我们首先点进keras.applications中看一下
发现其中有很多网络,此时我们用的网络为vgg16,之后我们再看VGG16的参数
我们这里首先使用到了weights,这个参数为是否使用VGG16的权重,如果使用我们就输入'imagenet',如果不使用,我们就输入None,第一次运行的时候权重会自动从网络上下载
这一步有可能下载失败,除了多尝试几次,我们还可以通过其他渠道先把模型下载好,之后放在 用户目录下的.keras\models中,我当前是C:\Users\MSI.keras\models,下面这两个文件是我运行代码自动下载下来的文件
nclude_top为是否使用最后的全链接层(就是上面提到的FC-4096这些),如果使用我们就输入True,如果不使用我们就输入False,这个就得看情况,如果是我们应用场景是日常的一些事物,且种类很多,这个我们最好是使用它原来的全连接层,当前我们是做猫狗二分类,所以我们这里输入False
我们称没有全连接层的神经网络为卷积基,这个也是我们变量名称conv_base的含义,卷积基本身就为一个神经网络,我们可以看一下它的summary()
之后我们在卷积基的基础上建立神经网络
- GlobalAveragePooling2D()在这里与之前的例子中我们可以理解为加强版的Flatten()
我们看一下这个模型
由于我们继承了VGG的权重,之后进行的训练实际上我们希望仅对Dense层训练,所以我们要将卷积基置为不可训练状态
我们现在再看一下这个模型
发现可训练参数比起之前少了许多
2.3 编译模型
2.4 训练模型
我们看一下曲线
- acc
- loss
我们可以看到训练仅进行15次,正确率就可达到80%以上,且仍然有上升趋势,从图像上来看,我们的结果是有一点儿欠拟合,我们可以增加epoch,这样训练的acc与loss应该会有改观
之后我们保存模型
2.5 预测模型
然后我们对模型进行预测,我们使用这两张图像进行预测
我们训练时的输出层是有sigmoid的,所以在这里我们使用0.5作为阈值