Deep learning基于theano的keras学习笔记(0)-keras常用的代码

一. 保存Keras模型

这里不推荐使用pickle或cPickle来保存Keras模型。 1. 一般使用model.save(filepath)将Keras模型和权重保存在一个HDF5文件中,该文件将包含:

  • 模型的结构,以便重构该模型
  • 模型的权重
  • 训练配置(损失函数,优化器等)
  • 优化器的状态,以便于从上次训练中断的地方开始 使用keras.models.load_model(filepath)来重新实例化你的模型,如果文件中存储了训练配置的话,该函数还会同时完成模型的编译,例子如下:
from keras.models import load_model

model.save('my_model.h5')  # creates a HDF5 file 'my_model.h5'
del model  # deletes the existing model

# returns a compiled model
# identical to the previous one
model = load_model('my_model.h5')

2. 如果你只是希望保存模型的结构,而不包含其权重或配置信息,可以使用:

# save as JSON
json_string = model.to_json()

# save as YAML
yaml_string = model.to_yaml()

当然,你也可以从保存好的json文件或yaml文件中载入模型:

# model reconstruction from JSON:
from keras.models import model_from_json
model = model_from_json(json_string)

# model reconstruction from YAML
model = model_from_yaml(yaml_string)

3. 如果需要保存模型的权重,可通过下面的代码利用HDF5进行保存。注意,在使用前需要确保你已安装了HDF5和其Python库h5py

model.save_weights('my_model_weights.h5')

如果你需要在代码中初始化一个完全相同的模型,请使用:

model.load_weights('my_model_weights.h5')

如果你需要加载权重到不同的网络结构(有些层一样)中,例如fine-tune或transfer-learning,你可以通过层名字来加载模型:

model.load_weights('my_model_weights.h5', by_name=True)

例如:

"""
假如原模型为:
    model = Sequential()
    model.add(Dense(2, input_dim=3, name="dense_1"))
    model.add(Dense(3, name="dense_2"))
    ...
    model.save_weights(fname)
"""
# new model
model = Sequential()
model.add(Dense(2, input_dim=3, name="dense_1"))  # will be loaded
model.add(Dense(10, name="new_dense"))  # will not be loaded

# load weights from first model; will only affect the first layer, dense_1.
model.load_weights(fname, by_name=True)

二. 可视化中间层

1. 我们可以建立一个Keras的函数来将获得给定输入时特定层的输出:

from keras import backend as K   #将后端的名字设为K

# with a Sequential model
get_3rd_layer_output = K.function([model.layers[0].input],
                                  [model.layers[3].output])
layer_output = get_3rd_layer_output([X])[0]

当然,我们也可以直接编写Theano和TensorFlow的函数来完成这件事

get_3rd_layer_output = theano.function([model.layers[0].input],
                                  [model.layers[3].output])
layer_output = get_3rd_layer_output([X])[0]

注意,如果你的模型在训练和测试两种模式下不完全一致,例如你的模型中含有Dropout层,批规范化(BatchNormalization)层等组件,你需要在函数中传递一个learning_phase的标记,像这样:

get_3rd_layer_output = K.function([model.layers[0].input, K.learning_phase()],
                                  [model.layers[3].output])
# output in test mode = 0
layer_output = get_3rd_layer_output([X, 0])[ 0]

# output in train mode = 1
layer_output = get_3rd_layer_output([X, 1])[0]

2.另一种更灵活的获取中间层输出的方法是使用泛型模型,例如,假如我们已经有一个 编写一个自编码器并从MNIST数据集训练:

inputs = Input(shape=(784,))
encoded = Dense(32, activation='relu')(inputs)
decoded = Dense(784)(encoded)
model = Model(input=inputs, output=decoded)

编译和训练该模型后,我们可以通过下面的方法得到encoder的输出:

encoder = Model(input=inputs, output=encoded)
X_encoded = encoder.predict(X)

三. 当验证集的loss不再下降时,中断训练

可以定义EarlyStopping来提前终止训练

from keras.callbacks import EarlyStopping
early_stopping = EarlyStopping(monitor='val_loss', patience=2)
model.fit(X, y, validation_split=0.2, callbacks=[early_stopping])

四. 训练数据在训练时会被随机洗乱吗?

如果model.fit的shuffle参数为真,训练的数据就会被随机洗乱。不设置时默认为真。训练数据会在每个epoch的训练中都重新洗乱一次。 验证集的数据不会被洗乱

五. 每个epoch后记录训练/测试的loss和正确率

model.fit在运行结束后返回一个History对象,其中含有的history属性包含了训练过程中损失函数的值以及其他度量指标。

hist = model.fit(X, y, validation_split=0.2)
print(hist.history)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨熹的专栏

TensorFlow-3: 用 feed-forward neural network 识别数字

这一节讲了使用 MNIST 数据集训练并评估一个简易前馈神经网络(feed-forward neural network),input,output 和前两节是...

5100
来自专栏人工智能LeadAI

深度学习与TensorFlow:VGG论文复现

上一篇文章我们介绍了下VGG这一个经典的深度学习模型,今天便让我们通过使用VGG开源的VGG16模型去复现一下该论文.

1253
来自专栏PaddlePaddle

【场景文字识别】场景文字识别

1. STR任务简介 许多场景图像中包含着丰富的文本信息,对理解图像信息有着重要作用,能够极大地帮助人们认知和理解场景图像的内容。场景文字识别是在图像背景复杂、...

5687
来自专栏PaddlePaddle

【FAQ】参数设置相关问题汇总

在使用指南的最后一部分,我们汇总了使用PaddlePaddle过程中的常见问题,本部分推文目录如下: 2.22:【FAQ】模型配置相关问题汇总 2.23:【FA...

4066
来自专栏Python小屋

Python+sklearn使用支持向量机算法实现数字图片分类

关于支持向量机的理论知识,大家可以查阅机器学习之类的书籍或网上资源,本文主要介绍如何使用Python扩展库sklearn中的支持向量机实现数字图片分类。 1、首...

3355
来自专栏开发与安全

算法:Solutions for the Maximum Subsequence Sum Problem

The maximum subarray problem is the task of finding the contiguous subarray wit...

2018
来自专栏Python小屋

Python+pillow计算椭圆图形几何中心

本文所用测试图像文件位于当前文件夹的testimages子文件夹中,并且图像以白色为背景。 from PIL import Image import os ...

3986
来自专栏杨熹的专栏

TensorFlow-3: 用 feed-forward neural network 识别数字

今天继续看 TensorFlow Mechanics 101: https://www.tensorflow.org/get_started/mnist/me...

3548
来自专栏云时之间

深度学习与TensorFlow:VGG论文复现

3408
来自专栏机器学习算法工程师

Tensorflow实战:Discuz验证码识别

本文将使用深度学习框架 Tensorflow 训练出一个用于破解 Discuz 验证码的模型。

4.9K9

扫码关注云+社区

领取腾讯云代金券