tf.keras中预训练模型的使用及报错解决

本机环境:
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)

(参见:https://blog.csdn.net/liumoude6/article/details/82762578?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3
我已运行,状态良好~

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下载太慢

### 回答1: 下面是一个保存tf.keras.datasets.mnist训练好的模型的示例代码: ``` import tensorflow as tf from tensorflow import keras # 加载MNIST数据集 (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data() # 数据预处理 x_train = x_train.reshape(x_train.shape[0], 28, 28, 1) x_test = x_test.reshape(x_test.shape[0], 28, 28, 1) x_train = x_train.astype('float32') x_test = x_test.astype('float32') x_train /= 255 x_test /= 255 # 构建模型 model = keras.Sequential([ keras.layers.Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)), keras.layers.MaxPooling2D(pool_size=(2, 2)), keras.layers.Flatten(), keras.layers.Dense(10, activation='softmax') ]) # 编译模型 model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy']) # 训练模型 model.fit(x_train, y_train, epochs=5, validation_data=(x_test, y_test)) # 保存模型 model.save('mnist_model.h5') ``` 在这个例子,我们使用tf.keras构建一个简单的卷积神经网络模型,并使用MNIST数据集进行训练。在训练完成后,我们使用model.save()方法将模型保存到磁盘上的mnist_model.h5文件。您可以使用类似以下的代码加载已保存的模型: ``` from tensorflow import keras model = keras.models.load_model('mnist_model.h5') ``` ### 回答2: 要保存训练好的模型代码,我们可以使用tf.keras自带的保存和加载模型的功能。具体操作如下: 1. 导入所需的库 ```python import tensorflow as tf from tensorflow import keras ``` 2. 加载mnist数据集 ```python (x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data() ``` 3. 数据预处理 ```python x_train = x_train / 255.0 x_test = x_test / 255.0 ``` 4. 构建模型 ```python model = keras.Sequential([ keras.layers.Flatten(input_shape=(28, 28)), keras.layers.Dense(128, activation='relu'), keras.layers.Dense(10, activation='softmax') ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) ``` 5. 训练模型 ```python model.fit(x_train, y_train, epochs=5) ``` 6. 保存模型 ```python model.save('mnist_model.h5') ``` 以上代码将保存训练好的模型为一个名为"mnist_model.h5"的文件。 如果要加载保存的模型,可以使用以下代码: ```python loaded_model = keras.models.load_model('mnist_model.h5') ``` 通过这样保存和加载模型的方式,我们可以方便地保存和复用训练好的模型代码。 ### 回答3: 要保存tf.keras.datasets.mnist训练好的模型,我们可以使用以下代码: ```python import tensorflow as tf from tensorflow import keras # 加载MNIST数据集 (x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data() # 数据预处理 x_train = x_train / 255.0 x_test = x_test / 255.0 # 构建模型 model = keras.Sequential([ keras.layers.Flatten(input_shape=(28, 28)), keras.layers.Dense(128, activation='relu'), keras.layers.Dense(10, activation='softmax') ]) # 编译模型 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 训练模型 model.fit(x_train, y_train, epochs=5) # 保存模型 model.save('mnist_model.h5') ``` 以上代码首先加载了MNIST数据集,然后对数据进行预处理,构建了一个包含两个Dense层的Sequential模型,并对模型进行了编译。接着,通过调用`fit`方法来训练模型,训练5个epochs。最后,使用`save`方法将训练好的模型保存为`mnist_model.h5`文件。 这样就完成了将tf.keras.datasets.mnist训练好的模型保存的代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值