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

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

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

一、基本流程

  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.模型编译
  这一步的工作是定义模型使用的优化器optimizerloss损失函数和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 模型

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值