5 TensorFlow入门笔记之RNN实现手写数字识别
————————————————————————————————————
写在开头:此文参照莫烦python教程(墙裂推荐!!!)
————————————————————————————————————
循环神经网络RNN
相关名词:
- LSTM:长短期记忆
- 梯度消失/梯度离散
- 梯度爆炸
- 输入控制:控制是否把当前记忆加入主线网络
- 忘记控制:控制是否暂时忘记主线网络,先看当前分线
- 输出控制: 控制输出是否要考虑要素
- 数据有顺序的/序列化
- 前面的影响后面的
RNN LSTM 之分类
识别手写数字
- 识别手写数字
- mnist数据集
- 一行一行地识别
rnn使用错误及修正
- 错误一:
错误描述: ValueError: Variable tf.nn.dynsmic_rnn/rnn/basic_lstm_cell/kernel already exists, disallowed. Did you mean to set reuse=True or reuse=tf.AUTO_REUSE in VarScope? Originally defined at:
错误解决:看你的训练数据和测试数据是否放在同一个文件下,若是,要加上下面一句:
#如果训练和测试数据存放在同一个文件中,一定要加下面这句!
tf.reset_default_graph()
如果这时候出现了错误二,就用下面的解决方法:
- 错误二
错误描述:ValueError: Tensor(“tf.nn.dynsmic_rnn/rnn/Const:0”, shape=(1,), dtype=int32) must be from the same graph as Tensor(“ExpandDims:0”, shape=(1,), dtype=int32).
错误解决:
#把tf.reset_default_graph() 改为:
tf.Graph()
完整代码
下面是完整的分类代码及结果
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
#load data
mnist = input_data.read_data_sets('MNIST_data',one_hot = True)
#参数
lr = 0.001
training_iters = 100000 #循环次数
batch_size = 128
n_inputs = 28 #因为照片是28*28,而每次都读一行,所以input为28
n_steps = 28 #因为有28行,所以要input28步
n_hidden_unis = 128 #隐藏层,自己设
n_classes = 10 #10个数字(0-9),所以类别有10种
#holder
x = tf.placeholder(tf.float32,[None,n_steps,n_inputs])
y = tf.placeholder(tf.float32,[None,n_classes])
#定义权重
weights = {
#input weights(28,128)
'in':tf.Variable(tf.random_normal([n_inputs,n_hidden_unis])),
#output weights(128,10)
'out':tf.Variable(tf.random_normal([n_hidden_unis,n_classes]))
}
#定义偏置
biases = {
'in':tf.Variable(tf.constant(0.1,shape=[n_hidden_unis,])),
'out':tf.Variable(tf.constant(0.1,shape =[n_classes,]))
}
#定义RNN
def RNN(X,weights,biasis):
#hidden layer
#X(128,28,28) ==>(128*28,28)
X = tf.reshape(X,[-1,n_inputs])
X_in =tf.matmul(X,weights['in']+biases['in']) #(128*28,128)
X_in = tf.reshape(X_in,[-1,n_steps,n_hidden_unis])#(128,28,128)
#cell
#forget_bais推荐初始化为1.0
#with tf.variable_scope('lstm_cell'):
lstm_cell = tf.nn.rnn_cell.BasicLSTMCell(n_hidden_unis,forget_bias=1.0,state_is_tuple=True)
#with tf.variable_scope('init_'):
init_state = lstm_cell.zero_state(batch_size,dtype=tf.float32)
#output是个列表;这里实践维度在行,就是X_in的第二个,所以为false,时间维度为第一个,则true
with tf.variable_scope('tf.nn.dynsmic_rnn'):
outputs,states = tf.nn.dynamic_rnn(lstm_cell,X_in,initial_state=init_state,time_major=False)
#output
results = tf.matmul(states[1],weights['out']+biases['out'])
##other way,这里可用
#outputs = tf.unpack(tf.transpose(outputs,[1,0,2]))
#results = tf.matmuo(outputs[-1],weights['out']+biases['out'])
return results
#如果训练和测试数据存放在同一个文件中,一定要加下面这句!
tf.Graph()
pred = RNN(x,weights,biases)
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=pred))
train_op = tf.train.AdamOptimizer(lr).minimize(cost)
correct_pred = tf.equal(tf.argmax(pred,1),tf.argmax(y,1))
accuracy = tf.reduce_mean(tf.cast(correct_pred,tf.float32))
init = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
step = 0
while step*batch_size < training_iters:
batch_xs,batch_ys = mnist.train.next_batch(batch_size)
batch_xs = batch_xs.reshape([batch_size,n_steps,n_inputs])
sess.run([train_op],feed_dict={x:batch_xs,y:batch_ys,})
if step%50 == 0:
print(sess.run(accuracy,feed_dict = {
x:batch_xs,y:batch_ys,
}))
step += 1
Extracting MNIST_data\train-images-idx3-ubyte.gz
Extracting MNIST_data\train-labels-idx1-ubyte.gz
Extracting MNIST_data\t10k-images-idx3-ubyte.gz
Extracting MNIST_data\t10k-labels-idx1-ubyte.gz
0.2109375
0.78125
0.84375
0.9140625
0.921875
0.921875
0.9375
0.9453125
0.96875
0.9140625
0.953125
0.984375
0.9609375
0.9453125
0.96875
0.9921875
由上面的结果来看,RNN的效果还是很不错的!
*点击[这儿:TensorFlow]发现更多关于TensorFlow的文章*
5 TensorFlow入门笔记之RNN实现手写数字识别的更多相关文章
- TensorFlow使用RNN实现手写数字识别
学习,笔记,有时间会加注释以及函数之间的逻辑关系. # https://www.cnblogs.com/felixwang2/p/9190664.html # https://www.cnblogs. ...
- Pytorch入门——手把手教你MNIST手写数字识别
MNIST手写数字识别教程 要开始带组内的小朋友了,特意出一个Pytorch教程来指导一下 [!] 这里是实战教程,默认读者已经学会了部分深度学习原理,若有不懂的地方可以先停下来查查资料 目录 MNI ...
- SVM学习笔记(二)----手写数字识别
引言 上一篇博客整理了一下SVM分类算法的基本理论问题,它分类的基本思想是利用最大间隔进行分类,处理非线性问题是通过核函数将特征向量映射到高维空间,从而变成线性可分的,但是运算却是在低维空间运行的.考 ...
- TensorFlow(十二):使用RNN实现手写数字识别
上代码: import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data #载入数据集 mnist ...
- Tensorflow项目实战一:MNIST手写数字识别
此模型中,输入是28*28*1的图片,经过两个卷积层(卷积+池化)层之后,尺寸变为7*7*64,将最后一个卷积层展成一个以为向量,然后接两个全连接层,第一个全连接层加一个dropout,最后一个全连接 ...
- TensorFlow(十):卷积神经网络实现手写数字识别以及可视化
上代码: import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist = inpu ...
- mnist手写数字识别——深度学习入门项目(tensorflow+keras+Sequential模型)
前言 今天记录一下深度学习的另外一个入门项目——<mnist数据集手写数字识别>,这是一个入门必备的学习案例,主要使用了tensorflow下的keras网络结构的Sequential模型 ...
- TensorFlow卷积神经网络实现手写数字识别以及可视化
边学习边笔记 https://www.cnblogs.com/felixwang2/p/9190602.html # https://www.cnblogs.com/felixwang2/p/9190 ...
- 【问题解决方案】Keras手写数字识别-ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接
参考:台大李宏毅老师视频课程-Keras-Demo 在载入数据阶段报错: ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接 Google之 ...
随机推荐
- Oracle(2)数据库
1.使用"||"连接多个字段,合并成一列 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFudGluZ21laQ==/font/5a ...
- 【Mac + Android】之Android Studio 环境搭建,AVD模拟器运行(包括:命令行运行AVD,并且Genymotion模拟器插件配置运行)
目录: 前提.Mac环境下手动配置Android SDK 一. Android Studio下载及配置 二.AVD模拟器配置运行 扩展:命令行运行AVD模拟器 三.在Android Studio 中配 ...
- hdu1027(n个数的按字典序排列的第m个序列)
题目信息:给出n.m,求n个数的按字典序排列的第m个序列 http://acm.hdu.edu.cn/showproblem.php? pid=1027 AC代码: /** *全排列的个数(次序) ...
- Java将视频转为缩略图--ffmpeg
Java生成视频缩略图 对于上传视频生成缩略图使用的是ffmpeg进行生成的. 自己在网上找了如何进行编译ffmpeg的方法 但是感觉太复杂了 就到csdn上找到了编译好的ffmpeg文件 体会到ff ...
- unity 打开文件夹并鼠标选中某文件
System.Diagnostics.Process p = new System.Diagnostics.Process(); p.StartInfo.FileName = "explor ...
- VC++ 在Watch窗口显示GetLastError值以及详细信息
You can display the value GetLastError() will return by putting "@err" in your watch windo ...
- win7物理主机与虚拟XP系统互相ping不通解决方法
安装了虚拟XP系统,win7物理主机与XP系统ping不通,原因在于安装虚拟XP系统网络连接方式选的仅主机网络,则win7物理主机上的网卡应为VMnet1,而自己的win7VMnet1网卡处于禁用状态 ...
- Volley 的使用以及自定义Request
Volley 的使用以及自定义Request 一.什么是 Volley 2013年Google I/O大会上推出了一个新的网络通信框架.Volley是Android平台上的网络通信库,能使网络通信更快 ...
- 利用wireshark抓取远程linux上的数据包
原文发表在我的博客主页,转载请注明出处. 前言 因为出差,前后准备总结了一周多,所以博客有所搁置.出差真是累人的活计,不过确实可以学习到很多东西,跟着老板学习做人,学习交流的技巧.入正题~ wires ...
- vs git .vs12.suo
GIT无法自动忽略SUO文件的解决方法 最近发现一个巨烦人的问题,项目里明明已经通过gitignore忽略了.suo文件,但是每次git pull的时候总是还得到.suo文件冲突的提示,也就是说git ...