深度学习之LSTM:基于TF的简单示例及说明

  本文以MNIST数据为例,介绍了TensorFlow中实现LSTM循环神经网络的简单示例,并不包含LSTM的详细解说(该部分内容可参看文章 : 深度学习之LSTM:基于TensorFlow模型参数的C语言前向算法实现)。示例代码虽然简单,但是包含了采用TensorFlow实现机器学习的一般步骤:数据准备,模型设计,模型编译,模型训练和模型保存等内容,较为完整的包含了模型训练流程,适合入门学习。

文章目录

深度学习之LSTM:基于TF的简单示例及说明一、基本流程二、完整代码三、参考资料

一、基本流程

  1.数据准备   此处略过,需要注意的是,在用TensorFlow构建LSTM模型时,需要用tf.reshape将数据要按照 [样本数,序列长度,特征维度] 的形式整理,本例中代码如下:

# 整理输入数据[样本数,序列长度,特征维度]

x_train,x_test = tf.reshape(x_train,[len(x_train),28,-1]),tf.reshape(x_test,[len(x_test),28,-1])

  2.模型设计   在TensorFlow中可以用Keras中的Sequential模型来构建自己的网络,全连接神经网络、卷积神经网络和循环神经网络都是可以的。定义好Sequential模型后,通过堆叠不同的层就可以构建自己的模型了。   本例中的网络结构如下,由上至下,分别是输入层,隐藏层,LSTM循环层和输出层。其中LSTM循环层,由于用的是 NN SVG 在线工具所作,无法表示循环层,故在此权且用一个全连接层来表示。   对应代码如下:

# 设计网络结构

model = tf.keras.models.Sequential([

tf.keras.layers.Dense(14,name="Hiddenlayer"),

tf.keras.layers.LSTM(8,name="Lstmlayer"),

tf.keras.layers.Dense(10,activation="sigmoid",name="Outputlayer")

],name="LSTM")

  需要注意的是,以上代码中并没有定义输入层,实际上输入层会在fit时会自动根据输入数据推导,或者也可以在堆叠的第一个隐藏层中通过参数input_shape来定义输入层的节点数。如,示例中我们可以用如下语句明确告知输入层的结构。

tf.keras.layers.Dense(14,input_shape=(28,28),name="Hiddenlayer"),

  3.模型编译   这一步的工作是定义模型使用的优化器optimizer、loss损失函数和metrics模型评估标准。

# 定义代价函数

loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

# 模型编译

model.compile(optimizer='adam',loss=loss_fn,metrics=['accuracy'])

  示例中,优化器optimizer选择的是Adam,该方法的优点是收敛更快;   由于我们的标签不是[0,0,1],[0,1,0],[1,0,0]类型的one-hot形式,而是0,1,…,9类型的数字编码,所以选择分类交叉熵函数SparseCategoricalCrossentropy作为模型编译损失函数loss;   因数据集中各类的分布较为均衡,评估标准metrics选择了准确性。   4.模型训练   模型训练只需要调用fit方法,如下:

# 模型训练

history = model.fit(x_train,y_train,

epochs=100,

batch_size=20,

validation_data=(x_test,y_test))

  示例中,我们将epochs迭代次数设定为100次;批大小batch_size设定为20次。在此简单解释一下,一次epochs指的是,将所有训练数据都被用作更新模型参数,即一轮。而batch_size是在每次更新参数时,使用的样本数目。一次/轮训练中,参数更新次数 = 样本数据 / batch_size,假设训练样本总数为100,batch_size=20,则一次epochs内,模型参数将被更新5次(5=100 / 20);若batch_size=100,则一次epochs内,模型参数将被更新1次(1 = 100 / 100)。   5.模型保存   传入模型,和想要保存的路径即可。

# 模型保存

tf.keras.models.save_model(model,filepath='F:/script/pyscript/LSTMlearningDemo/model/')

二、完整代码

#!/user/bin/env python3

# -*- coding : utf-8 -*-

import tensorflow as tf

# 加载MNIST数据库

mnist = tf.keras.datasets.mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()

x_train, x_test = x_train / 255.0, x_test / 255.0

# train_flatten = [x.flatten() for x in x_train]

# 整理输入数据[样本数,序列长度,特征维度]

x_train,x_test = tf.reshape(x_train,[len(x_train),28,-1]),tf.reshape(x_test,[len(x_test),28,-1])

# 设计网络结构

model = tf.keras.models.Sequential([

tf.keras.layers.Dense(28),

tf.keras.layers.LSTM(28),

tf.keras.layers.Dense(10,activation="sigmoid")

],name="LSTM")

# 定义代价函数

loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

# 模型编译

model.compile(optimizer='adam',loss=loss_fn,metrics=['accuracy'])

# 模型训练

history = model.fit(x_train,y_train,

epochs=100,

batch_size=20,

validation_data=(x_test,y_test))

# 模型保存

tf.keras.models.save_model(model,filepath='F:/script/pyscript/LSTMlearningDemo/model/')

三、参考资料

[1] 初学者的 TensorFlow 2.0 教程 [2] Keras 中的循环神经网络 (RNN) [3] 保存和加载 Keras 模型

文章链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: