深度学习之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 模型

  • 17
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CNN-LSTM 是一种深度学习模型,结合了卷积神经网络 (CNN) 和长短期记忆网络 (LSTM)。这种模型通常用于处理序列数据,如文本、时间序列等。 在 TensorFlow 中,可以使用 `tf.keras` 来构建 CNN-LSTM 模型。首先,你可以使用 `tf.keras.layers.Conv2D` 层来构建 CNN 部分,用于提取图像或文本特征。然后,使用 `tf.keras.layers.LSTM` 层来处理序列数据,并学习其内部的时序关系。 下面是一个简单示例代码,展示了如何构建一个基本的 CNN-LSTM 模型: ```python import tensorflow as tf # 定义模型 model = tf.keras.Sequential() model.add(tf.keras.layers.Conv2D(64, (3, 3), activation='relu', input_shape=(width, height, channels))) model.add(tf.keras.layers.MaxPooling2D(pool_size=(2, 2))) model.add(tf.keras.layers.Conv2D(64, (3, 3), activation='relu')) model.add(tf.keras.layers.MaxPooling2D(pool_size=(2, 2))) model.add(tf.keras.layers.Flatten()) model.add(tf.keras.layers.LSTM(64)) model.add(tf.keras.layers.Dense(10, activation='softmax')) # 编译模型 model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) # 训练模型 model.fit(x_train, y_train, batch_size=32, epochs=10, validation_data=(x_val, y_val)) ``` 上述代码中,我们首先定义了一个 `Sequential` 模型,然后添加了一系列的卷积神经网络层和 LSTM 层。最后,通过编译模型,并使用训练数据进行训练。 请注意,上述代码仅为示例,实际应用中你可能需要根据具体任务和数据的特点进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值