前言
本次练习旨在通过使用残差网络帮助我们训练一个深层的卷积网络,在过去深层的网络意味着复杂的函数,很难去实践。残差网络帮助我们让实践变得可行。
具体操作:
1.构建残差网络的块
2.将块连接到一起去训练一个用于图片分类的残差网络
(使用Keras实现)
加载包报错1:
ImportError: cannot import name 'plot_model' from 'keras.utils'
过去已经出现过此问题,是版本更新引起的,修改表达方式如下:
from keras.utils.vis_utils import plot_model
解决!
构建残差网络
1.标识块
作业中使用了如上两种结构的标识块,第一种通过快捷方式连接跨越了两层,第二种直接跨越三层。
2.标识块构成细节:
1.构建“主路”:分三步 参考指南
实施BatchNorm 参考指南
2.最后步骤:快捷链接 参考指南;使用激活函数
报错:
AttributeError: module 'tensorflow' has no attribute 'reset_default_graph'
解决方法:
错误产生是源于tensorflow版本更新
引用语句改为:
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
再次编译成功!
3.卷积块
注:即便输入输出的维度不同也可以使用卷积块;卷积块与标识块的不同之处在于快捷链接部分包含Conv2D层
Conv2D层的用处在于使用线性函数将输入x转化为不同的尺寸
卷积块构成细节:
1.构建“主路”:分三步
2.建立快捷方式:与之前的不同在于添加了Conv2D层
3.最后步骤:将快捷方式与主路连接;应用激活函数
4.构建你的一个残差网络模型
注:图中“ID BLOCK x3”表示你需要堆叠标识块3次
构建好模型后就可以开始训练模型了,练习中初始设置的epochs=2,这样训练后精确度并不高。作者给出的解释是,在训练20轮后可以获得不错的精确度,但是在CPU上训练模型会花费很长时间。若果使用GPU进行训练,时间会大幅度缩短。
5.测试自己的图片
报错:
AttributeError: module 'scipy.misc' has no attribute 'imread'
报错原因:新版本的scipy舍弃了一些函数,其中就包括 imread。
解决方法:
1.降低scipy的版本
2.修改引用方式和使用方式如下:
原引用方式:
import scipy.misc
原使用方式:
my_image = scipy.misc.imread(img_path)
修改后:
import imageio
my_image = imageio.imread(img_path)
总结:由于梯度消失问题,很深的传统卷积网络实践中很难实现,残差网络的出现解决了这一问题,只需简单的堆叠标识块和卷积块就能实现很深的网络,获得较好的性能。在完成作业的过程中可能会出现得出的数据和示例不一致的情况,作者也给出了适当的范围值,只要在范围内就可以接受。
希望能够帮助你解决和我一样的问题。