深度学习为什么保存模型_深度学习——keras模型的保存和加载

4c56bfbaaafdb3b3702a7d2b6828f73e.png

点击上方蓝色文字关注我们吧

a99d28ae9bbaf7a16de82d31e06a7f88.png

有你想要的精彩

20e0169cf07f60776eb9b9158507343e.png

作者 | 那个百分十先生 出品 | Python知识学堂

在上一篇关于深度学习的推文中,我们介绍了使用Keras来实现机器学习中的线性回归和非线性回归算法。不过在那期的推文当中我们没有介绍如何保存我们的训练的模型和加载我们训练的模型,所以在本次的推文中我们将向大家介绍一下Keras中如何进行模型的保存、加载和接着训练。

Keras模型的保存

我们将使用手写字体识别的案例来进行说明。

我们先看一下之前的代码:

from keras.datasets import mnistfrom keras.utils import np_utilsfrom keras.models import Sequentialfrom keras.layers import Dense,Activation
path = r'F:\kerasdataset\mnist.npz'
(X_train, y_train), (X_test, y_test) = mnist.load_data(path)
X_train = X_train.reshape(len(X_train),-1)
X_test = X_test.reshape(len(X_test), -1)
X_train = X_train.astype('float32')/255
X_test = X_test.astype('float32')/255
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
model = Sequential()
model.add(Dense(512, input_shape=(28*28,),activation='relu'))
model.add(Dense(10,activation='softmax'))
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=10, batch_size=64, verbose=1, validation_split=0.05)
loss, accuracy = model.evaluate(X_test, y_test)
Testloss, Testaccuracy = model.evaluate(X_test, y_test)
print('Testloss:', Testloss)
print('Testaccuracy:', Testaccuracy)

在Keras中,我们常用到的保存模型的方式有四种:

1model.save()2model.save_weights()3model.to_json()4model.to_yaml()

model.save()

这种方法是将Keras模型和权重保存在一个HDF5文件中,具体的方法:

save_path = r'F:\kerasdataset\mnist_test.h5'
model.save(save_path)

我们只要在手写字体识别的代码最后加上上述代码即可。在上述的两行代码中我们设置了“mnist_test.h5”文件的保存路径,并且使用model.save()进行模型的保存。我们可以使用HDFView软件来打开这个保存的文件,如下所示。我们可以使用这个软件来查看模型中的dense和相应的权重信息:

45047f2543dff54e5b39e734428faf5f.png

当然了,除了这种方法以外,我们也可以使用代码来进行读取:

import h5py# 模型地址
MODEL_PATH = r'F:\kerasdataset\mnist_test.h5'# 获取每一层的连接权重及偏重
print("读取模型中...")with h5py.File(MODEL_PATH, 'r') as f:
   dense_1 = f['/model_weights/dense_1/dense_1']
   dense_1_bias =  dense_1['bias:0'][:]
   dense_1_kernel = dense_1['kernel:0'][:]
   dense_2 = f['/model_weights/dense_2/dense_2']
   dense_2_bias = dense_2['bias:0'][:]
   dense_2_kernel = dense_2['kernel:0'][:]
print("第一层的连接权重矩阵:\n%s\n"%dense_1_kernel)
print("第一层的连接偏重矩阵:\n%s\n"%dense_1_bias)
print("第二层的连接权重矩阵:\n%s\n"%dense_2_kernel)
print("第二层的连接偏重矩阵:\n%s\n"%dense_2_bias)

model.save_weights()

这种也是获取网络权重的方法,其使用方法如下:

model_save_path =r'F:\kerasdataset\mnist_test.h5'
model.save_weights(model_save_path, by_name=True)

by_name这个参数有两种情况,默认为False:

by_name=False 的时候按照网络的拓扑结构来进行加载权重的。

by_name=True 的时候就是按照网络层名称进行加载权重的。

model.to_json()

这种方法只保存了模型结构,没有包含其权重信息,其使用方法如下:

json_save = model.to_json()with open("modelsave.json", "w") as f:
  f.write(json_save)

JSON中的字符内容如下所示:

34e62c0b27ffc2af73619730dece8602.png

model.to_yaml()

这种方法和model.to_json()一样,其用法如下:

yaml_save = model.to_yaml()with open("modelsave.yaml", "w") as f:
  f.write(yaml_save)

上述方法中,最常用的还是model.save() 和model.save_weights()两种方式。

Keras模型的加载

模型的加载很简单,我们对不同的保存方式进行不同的加载即可:

model.save()方式模型的加载

from keras.models import load_model
save_path = r'F:\kerasdataset\mnist_test.h5'
model = load_model(save_path)

model.save_weights()方式模型的加载

model_save_path =r'F:\kerasdataset\mnist_test.h5'
model = model.load_weights(model_save_path)

model.to_json()和model.to_yaml()方式模型的加载

from keras.models import model_from_jsonfrom keras.models import model_from_yaml
model_json = model_from_json(json_save)
model_yaml = model_from_yaml(yaml_save)

我们来总结一下他们的区别:

9c28a76b5fb5f8354155f8dd58a50929.png

Keras模型的继续训练

在实际的项目中,如果一个模型的训练时间很长(或者某种情况先要暂停),我们可以训练到某一个周期以后暂停模型的训练,等到需要的时候接着训练。那么这样的方案该怎么解决:

假设我们在模型的训练结尾使用

model.save(r'F:\kerasdataset\mnist_test.h5')

保存模型的操作。

接下来我们来看怎么继续加载这个模型进行训练,我们只需load后进行fit:

# 载入模型
model = load_model(r'F:\kerasdataset\mnist_test.h5')# 继续训练模型2个epochs
model.fit(X_train, y_train, batch_size=64, epochs=2)

以上就是模型的加载和接着训练,下面如果要进行模型的评价和预测的话,可以参照手写字体识别的代码。

往期精选(?猛戳可查看)

深度学习——Keras实现线性和非线性回归

2020-09-12

7f3d707943a59c7d0af99fe4a7ba3aa1.png

深度学习——keras中的Sequential和Functional API

2020-08-23

92d306c9326383be71c286df1546946f.png

深度学习——keras教程系列基础知识

2020-08-16

b375bed84497fa0a6b9bf6ac23035d18.png

点赞和在看一下吧

2f99edd37175e8a3ab1e816d7007b871.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值