芝麻HTTP:TensorFlow LSTM MNIST分类

本节来介绍一下使用 RNN 的 LSTM 来做 MNIST 分类的方法,RNN 相比 CNN 来说,速度可能会慢,但可以节省更多的内存空间。

初始化 首先我们可以先初始化一些变量,如学习率、节点单元数、RNN 层数等:

learning_rate = 1e-3
num_units = 256
num_layer = 3
input_size = 28
time_step = 28
total_steps = 2000
category_num = 10
steps_per_validate = 100
steps_per_test = 500
batch_size = tf.placeholder(tf.int32, [])
keep_prob = tf.placeholder(tf.float32, [])

然后还需要声明一下 MNIST 数据生成器:

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets(‘MNIST_data/‘, one_hot=True)

接下来常规声明一下输入的数据,输入数据用 x 表示,标注数据用 y_label 表示:

x = tf.placeholder(tf.float32, [None, 784])
y_label = tf.placeholder(tf.float32, [None, 10])

这里输入的 x 维度是 [None, 784],代表 batch_size 不确定,输入维度 784,y_label 同理。

接下来我们需要对输入的 x 进行 reshape 操作,因为我们需要将一张图分为多个 time_step 来输入,这样才能构建一个 RNN 序列,所以这里直接将 time_step 设成 28,这样一来 input_size 就变为了 28,batch_size 不变,所以reshape 的结果是一个三维的矩阵:

x_shape = tf.reshape(x, [-1, time_step, input_size])

RNN 层 接下来我们需要构建一个 RNN 模型了,这里我们使用的 RNN Cell 是 LSTMCell,而且要搭建一个三层的 RNN,所以这里还需要用到 MultiRNNCell,它的输入参数是 LSTMCell 的列表。

所以我们可以先声明一个方法用于创建 LSTMCell,方法如下:

def cell(num_units):
    cell = tf.nn.rnn_cell.BasicLSTMCell(num_units=num_units)
    return DropoutWrapper(cell, output_keep_prob=keep_prob)

这里还加入了 Dropout,来减少训练过程中的过拟合。

接下来我们再利用它来构建多层的 RNN:

cells = tf.nn.rnn_cell.MultiRNNCell([cell(num_units) for _ in range(num_layer)])

注意这里使用了 for 循环,每循环一次新生成一个 LSTMCell,而不是直接使用乘法来扩展列表,因为这样会导致 LSTMCell 是同一个对象,导致构建完 MultiRNNCell 之后出现维度不匹配的问题。

接下来我们需要声明一个初始状态:

h0 = cells.zero_state(batch_size, dtype=tf.float32)

然后接下来调用 dynamic_rnn() 方法即可完成模型的构建了:

output, hs = tf.nn.dynamic_rnn(cells, inputs=x_shape, initial_state=h0)

这里 inputs 的输入就是 x 做了 reshape 之后的结果,初始状态通过 initial_state 传入,其返回结果有两个,一个 output 是所有 time_step 的输出结果,赋值为 output,它是三维的,第一维长度等于 batch_size,第二维长度等于 time_step,第三维长度等于 num_units。另一个 hs 是隐含状态,是元组形式,长度即 RNN 的层数 3,每一个元素都包含了 c 和 h,即 LSTM 的两个隐含状态。

这样的话 output 的最终结果可以取最后一个 time_step 的结果,所以可以使用:

output = output[:, -1, :]

或者直接取隐藏状态最后一层的 h 也是相同的:

h = hs[-1].h

在此模型中,二者是等价的。但注意如果用于文本处理,可能由于文本长度不一,而 padding,导致二者不同。

输出层 接下来我们再做一次线性变换和 Softmax 输出结果即可:

# Output Layer
w = tf.Variable(tf.truncated_normal([num_units, category_num], stddev=0.1), dtype=tf.float32)
b = tf.Variable(tf.constant(0.1, shape=[category_num]), dtype=tf.float32)
y = tf.matmul(output, w) + b
# Loss
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels=y_label, logits=y)

这里的 Loss 直接调用了 softmax_cross_entropy_with_logits 先计算了 Softmax,然后计算了交叉熵。

训练和评估 最后再定义训练和评估的流程即可,在训练过程中每隔一定的 step 就输出 Train Accuracy 和 Test Accuracy:

# Train
train = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cross_entropy)

# Prediction
correction_prediction = tf.equal(tf.argmax(y, axis=1), tf.argmax(y_label, axis=1))
accuracy = tf.reduce_mean(tf.cast(correction_prediction, tf.float32))

# Train
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for step in range(total_steps + 1):
        batch_x, batch_y = mnist.train.next_batch(100)
        sess.run(train, feed_dict={x: batch_x, y_label: batch_y, keep_prob: 0.5, batch_size: batch_x.shape[0]})
        # Train Accuracy
        if step % steps_per_validate == 0:
            print(‘Train‘, step, sess.run(accuracy, feed_dict={x: batch_x, y_label: batch_y, keep_prob: 0.5,
                                                               batch_size: batch_x.shape[0]}))
        # Test Accuracy
        if step % steps_per_test == 0:
            test_x, test_y = mnist.test.images, mnist.test.labels
            print(‘Test‘, step,
                  sess.run(accuracy, feed_dict={x: test_x, y_label: test_y, keep_prob: 1, batch_size: test_x.shape[0]}))

运行 直接运行之后,只训练了几轮就可以达到 98% 的准确率:

Train 0 0.27
Test 0 0.2223
Train 100 0.87
Train 200 0.91
Train 300 0.94
Train 400 0.94
Train 500 0.99
Test 500 0.9595
Train 600 0.95
Train 700 0.97
Train 800 0.98

可以看出来 LSTM 在做 MNIST 字符分类的任务上还是比较有效的。

原文地址:https://www.cnblogs.com/zhimaruanjian/p/8537525.html

时间: 2024-11-10 17:30:03

芝麻HTTP:TensorFlow LSTM MNIST分类的相关文章

使用tensorflow操作MNIST数据

本节开始学习使用tensorflow教程,当然从最简单的MNIST开始.这怎么说呢,就好比编程入门有Hello World,机器学习入门有MNIST.在此节,我将训练一个机器学习模型用于预测图片里面的数字. MNIST 是一个非常有名的手写体数字识别数据集,在很多资料中,这个数据集都会被用做深度学习的入门样例.而Tensorflow的封装让MNIST数据集变得更加方便.MNIST是NIST数据集的一个子集,它包含了60000张图片作为训练数据,10000张图片作为测试数据.在MNIST数据集中的

TensorFlow深入MNIST笔记[三]

TensorFlow深入MNIST笔记[三] TensorFlow是进行大规模数值计算的强大库.其优点之一是实施和训练深层神经网络. 加载MNIST数据 from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets('MNIST_data', one_hot=True) 这mnist是一个轻量级的类,它将训练,验证和测试集存储为NumPy数组.它还提供了一个迭代数据服务的功

tensorflow识别Mnist时,训练集与验证集精度acc高,但是测试集精度低的比较隐蔽的原因

tensorflow识别Mnist时,训练集与验证集精度acc高,但是测试集精度低的比较隐蔽的原因除了网上说的主要原因https://blog.csdn.net/wangdong2017/article/details/90176323 之外,还有一种是比较隐蔽的原因(可能对于大多数人不会犯这种低级错误),作为新手的我找了半天才找到,原因是在程序中创建了一个会话之后又重新创建了一个会话,代码程序见我博客https://www.cnblogs.com/hujinzhou/p/guobao_2020

Tensorflow之MNIST手写数字识别:分类问题(2)

整体代码: #数据读取 import tensorflow as tf import matplotlib.pyplot as plt import numpy as np from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("MNIST_data/",one_hot=True) #定义待输入数据的占位符 #mnist中每张照片共有28*28=784个像

深度学习原理与框架-Tensorflow卷积神经网络-神经网络mnist分类

使用tensorflow构造神经网络用来进行mnist数据集的分类 相比与上一节讲到的逻辑回归,神经网络比逻辑回归多了隐藏层,同时在每一个线性变化后添加了relu作为激活函数, 神经网络使用的损失值为softmax概率损失值,即为交叉熵损失值 代码:使用的是mnist数据集作为分类的测试数据,数据的维度为50000*784 第一步:载入mnist数据集 第二步:超参数的设置,输入图片的大小,分类的类别数,迭代的次数,每一个batch的大小 第三步:使用tf.placeholder() 进行输入数

Tensorflow的MNIST进阶教程CNN网络参数理解

背景 问题说明 分析 LeNet5参数 MNIST程序参数 遗留问题 小结 背景 之前博文中关于CNN的模型训练功能上是能实现,但是研究CNN模型内部结构的时候,对各个权重系数w,偏差b的shape还是存在疑惑,为什么要取1024,为什么取7*7*64,最近找到了一些相关资料,对这个问题有了新的理解,下面和大家分享一下. 问题说明 # Input Layer x = tf.placeholder('float',[None,784]) y_ = tf.placeholder('float',[N

TensorFlow训练MNIST数据集(3) —— 卷积神经网络

前面两篇随笔实现的单层神经网络 和多层神经网络, 在MNIST测试集上的正确率分别约为90%和96%.在换用多层神经网络后,正确率已有很大的提升.这次将采用卷积神经网络继续进行测试. 1.模型基本结构 如下图所示,本次采用的模型共有8层(包含dropout层).其中卷积层和池化层各有两层. 在整个模型中,输入层负责数据输入:卷积层负责提取图片的特征:池化层采用最大池化的方式,突出主要特征,并减少参数维度:全连接层再将个特征组合起来:dropout层可以减少每次训练的计算量,并可以一定程度上避免过

利用CNN神经网络实现手写数字mnist分类

题目: 1)In the first step, apply the Convolution Neural Network method to perform the training on one single CPU and testing 2)In the second step, try the distributed training on at least two CPU/GPUs and evaluate the training time. 一.单机单卡实现mnist_CNN 1

Tensorflow实现MNIST

#在pycharm上实现print后面加() # Copyright 2015 The TensorFlow Authors. All Rights Reserved.## Licensed under the Apache License, Version 2.0 (the "License");# you may not use this file except in compliance with the License.# You may obtain a copy of th