本机环境:
Anaconda TensorFlow2.1.0 - CPU
Ubuntu18.04
Python3.7
任务描述:
以上环境下使用tf.Keras搭建CNN,使用Keras Applications内置预训练模块VGG16(不使用自带fc层);对源数据进行数据增强
方案及报错解决:
1)希望引入VGG系列网络提升网络性能,直接在代码中写入VGG代码效率低下、效果不佳,改用嵌入预训练模块方式;keras使用预训练网络训练有两种方式:Keras Applications和TensorFlow Hub,(具体内容见:https://blog.csdn.net/zimiao552147572/article/details/104134536介绍地很详细)
2)本文使用Keras Applications模块导入VGG16,使用命令:
from tensorflow.keras.applications import VGG16
训练时默认到github下载初始化权重,该权重用imagenet数据集预训练。由于这一模块有500MB左右,网络运行时下载极为缓慢,建议事先下载本地使用。根据程序提示网址或官网:https://github.com/fchollet/deep-learning-models/releases下载。本文下载文件:vgg16_weights_tf_dim_ordering_tf_kernels.h5,带fc层,不带fc层的文件在文件名后有notop标识,本文直接用迅雷下载可行。下载好的h5文件放到本地路径:
~/.keras/models
再运行程序可默认调用本地模块,但本文尝试无效,解决方法为命令:
pre_trained_model = VGG16(input_shape=(96, 96, 3) , include_top=False, weights="imagenet")
中,将weights参数改为上述或其他保存的地址,即可调用,但出现报错:ValueError: You are trying to load a weight file containing 16 layers into a model with 13 layers. 该问题的原因在完成本文时并未深入研究,可能涉及嵌套型神经网络问题,再更。解决方法为:模型定义时,先不使用预训练权重,定义好后再用load_weights函数加载权重,命令如下:
base_model = NASNetLarge(weights=None, include_top=False)
base_model.load_weights("你的权重路径", by_name=True)
3)数据增强
安装imgaug工具包时,需要先安装依赖包shapely,本文用Anaconda安装的TensorFlow似乎不需要手动安装,直接安装即可,命令:
pip install imgaug
本文出现报错:OpenSSL.SSL.WantReadError,与前文安装cv2时解决方案一样
其他参考:
1)ValueError: You are trying to load a weight file containing 16 layers into a model with 13 layers.报错的可能原因及解决(嵌套型神经网络问题;多GPU训练):ValueError: You are trying to load a weight file containing 12 layers into a model with 2 layers.
2)Keras内置VGG19介绍(文件下载注意和实例):keras中VGG19预训练模型的使用
3)初期解决保存本地模块后仍默认网络下载(使用flask包):Keras下载预训练模型(例VGG16)文件存放位置以及下载太慢的解决办法
4)初期解决下载模块的本地存放路径(~/.keras/datasets/):Keras自带数据集与预训练model下载太慢