tensorflow RNN和简单例子

一、用LSTM单层的网络来做分类的问题

用lstm对mnist的数据集进行分类

 1 #!/usr/bin/python
 2 # -*- coding: UTF-8 -*-
 3 import tensorflow as tf
 4 from tensorflow.examples.tutorials.mnist import input_data
 5 import tensorflow.contrib as contrib
 6 tf.set_random_seed(1)
 7 
 8 ##导入数据
 9 mnist = input_data.read_data_sets('../mnist_data',one_hot=True)
10 
11 ##超参数
12 lr = 0.001    # learning rate
13 training_iters = 100000  # train step 上限
14 batch_size = 128
15 n_inputs = 28       # MNIST data input (img shape: 28*28)
16 n_steps = 28      # time steps
17 n_hidden_units = 128   # neurons in hidden layer
18 n_classes = 10   # MNIST classes (0-9 digits)
19 
20 ## x,y placeholder
21 x = tf.placeholder(tf.float32,[None,n_steps,n_inputs])
22 y = tf.placeholder(tf.float32,[None,n_classes])
23 
24 ## 对 weights biases 的初始值的定义
25 weights ={
26     # shape (28, 128)
27     "in":tf.Variable(tf.truncated_normal([n_inputs,n_hidden_units])),
28     # shape (128, 10)
29     'out':tf.Variable(tf.truncated_normal([n_hidden_units,n_classes]))
30 }
31 biases ={
32     # shape (128, )
33     'in':tf.Variable(tf.constant(0.1,shape=[n_hidden_units,])),
34     # shape (10, )
35     'out':tf.Variable(tf.constant(0.1,shape=[n_classes,]))
36 }
37 # 定义 RNN 的主体结构(input_layer, cell, output_layer)
38 def RNN(X,weights,biases):
39     # 原始的 X 是 3 维数据, 我们需要把它变成 2 维数据才能使用 weights 的矩阵乘法
40     # X ==> (128 batches * 28 steps, 28 inputs)
41     X = tf.reshape(X,[-1,n_inputs])
42     # X_in = W*X + b
43     X_in = tf.matmul(X,weights['in'])+biases['in']
44     # X_in ==> (128 batches, 28 steps, 128 hidden) 换回3维
45     X_in = tf.reshape(X_in,[-1,n_steps,n_hidden_units])
46 
47     # 使用 basic LSTM Cell.
48     lstm_cell = contrib.rnn.BasicLSTMCell(num_units=n_hidden_units,forget_bias=1.0,state_is_tuple=True)
49     init_state = lstm_cell.zero_state(batch_size, dtype=tf.float32)
50     ## 如果 inputs 为 (batches, steps, inputs) ==> time_major=False; 如果 inputs 为 (steps, batches, inputs) ==> time_major=True;
51     outputs, final_state = tf.nn.dynamic_rnn(cell=lstm_cell,inputs=X_in,initial_state=init_state,time_major=False)
52 
53     ###最后是 output_layer 和 return 的值. 因为这个例子的特殊性, 有两种方法可以求得 results.
54     ### 方法一: 直接调用final_state 中的 h_state (final_state[1]) 来进行运算
55     results = tf.matmul(final_state[1],weights['out'])+biases['out']
56     ## 调用最后一个 outputs (在这个例子中,和上面的final_state[1]是一样的)
57     # 把 outputs 变成 列表 [(batch, outputs)..] * steps
58     # outputs = tf.unstack(tf.transpose(outputs, [1, 0, 2]))
59     # results = tf.matmul(outputs[-1], weights['out']) + biases['out']  # 选取最后一个 output
60     return results
61 
62 
63 
64 # 定义好了 RNN 主体结构后, 我们就可以来计算 cost 和 train_op
65 pred = RNN(x, weights, biases)
66 cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred,labels=y))
67 train_op = tf.train.AdamOptimizer(lr).minimize(cost)
68 # train_op = tf.train.AdadeltaOptimizer(lr).minimize(cost)  ## 这出错了啦!!!!!!
69 
70 correct_pred = tf.equal(tf.argmax(pred,1),tf.argmax(y,1))
71 accuracy = tf.reduce_mean(tf.cast(correct_pred,tf.float32))
72 
73 init_op = tf.global_variables_initializer()
74 with tf.Session() as sess:
75     sess.run(init_op)
76     step = 0
77     while step * batch_size < training_iters:
78         batch_xs,batch_ys = mnist.train.next_batch(batch_size)
79         batch_xs = batch_xs.reshape([batch_size,n_steps,n_inputs])
80         sess.run([train_op],feed_dict={x:batch_xs,y:batch_ys})
81 
82         if step % 20 ==0:
83             print(sess.run(accuracy,feed_dict={x:batch_xs,y:batch_ys}))
84         step += 1
View Code

上例中,使用到关于LSTM的方法主要是

1)  tensorflow.contrib.rnn.BasicLSTMCell

 

 

2) tf.nn.dynamic_rnn

cell: RNNCell的对象. 
inputs: RNN的输入,当time_major == False (default) 的时候,必须是形状为 [batch_size, max_time, ...] 的tensor, 
          要是 time_major == True 的话, 必须是形状为 [max_time, batch_size, ...] 的tensor. 前面两个维度应该在所有的输入里面都应该匹配. sequence_length: 可选,一个int32/int64类型的vector,他的尺寸是[batch_size]. 对于最后结果的正确性,
           这个还是非常有用的.因为给他具体每一个序列的长度,能够精确的得到结果,排除了之前为了把所有的序列弄成一样的长度padding造成的不准确. initial_state: 可选,RNN的初始状态. 要是cell.state_size 是一个整形,那么这个参数必须是一个形状为 [batch_size, cell.state_size] 的tensor.
         要是cell.state_size 是一个tuple, 那么这个参数必须是一个tuple,其中元素为形状为[batch_size, s] 的tensor,s为cell.state_size 中的各个相应size. dtype: 可选,表示输入的数据类型和期望输出的数据类型.当初始状态没有被提供或者RNN的状态由多种形式构成的时候需要显示指定. parallel_iterations: 默认是32,表示的是并行运行的迭代数量(Default:
32).
             有一些没有任何时间依赖的操作能够并行计算,实际上就是空间换时间和时间换空间的折中,当value远大于1的时候,
             会使用的更多的内存但是能够减少时间,当这个value值很小的时候,会使用小一点的内存,但是会花更多的时间. swap_memory: Transparently swap the tensors produced
in forward inference but needed for back prop from GPU to CPU.
        This allows training RNNs which would typically not fit on a single GPU, with very minimal (or no) performance penalty. time_major: 规定了输入和输出tensor的数据组织格式,如果 true, tensor的形状需要是[max_time, batch_size, depth].
       若是false, 那么tensor的形状为[batch_size, max_time, depth].
       要是使用time_major
= True 的话,会更加高效率一点,因为避免了在RNN计算的开始和结束的时候对于矩阵的转置 ,
       然而,大多数的tensorflow数据格式都是采用的以batch为主的格式,所以这里也默认采用以batch为主的格式. scope: 子图的scope名称,默认是”rnn”

import tensorflow as tf
import numpy as np
inputs = tf.placeholder(np.float32, shape=(32,40,5)) # 32 是 batch_size
lstm_cell_1 = tf.contrib.rnn.BasicLSTMCell(num_units=128)
print("output_size:",lstm_cell_1.output_size) ## 128
print("state_size:",lstm_cell_1.state_size) ## LSTMStateTuple(c=128, h=128)
output,state=tf.nn.dynamic_rnn(
    cell=lstm_cell_1,
    inputs=inputs,
    dtype=tf.float32
)
print("output.shape:",output.shape) ##(32,40,128)
print("len of state tuple",len(state)) ## 2
print("state.h.shape:",state.h.shape) ## (32,128)
print("state.c.shape:",state.c.shape) ##(32,128)

其实在运用时,很简单,如在 mnist的例子中,使用如下:

 # X_in ==> (128 batches, 28 steps, 128 hidden) 换回3维
    X_in = tf.reshape(X_in,[-1,n_steps,n_hidden_units])
    # 使用 basic LSTM Cell.
    lstm_cell = contrib.rnn.BasicLSTMCell(num_units=n_hidden_units,forget_bias=1.0,state_is_tuple=True)
    init_state = lstm_cell.zero_state(batch_size, dtype=tf.float32)
    ## 如果 inputs 为 (batches, steps, inputs) ==> time_major=False; 如果 inputs 为 (steps, batches, inputs) ==> time_major=True;
    outputs, final_state = tf.nn.dynamic_rnn(cell=lstm_cell,inputs=X_in,initial_state=init_state,time_major=False)

------

参考:

TensorFlow学习(十三):构造LSTM超长简明教程

TensorFlow入门(五)多层 LSTM 通俗易懂版

 

转载于:https://www.cnblogs.com/vincentbnu/p/9502246.html

目 录 序言 前言 第1章 网络互连介绍 1 1.1 认证目标1.01:网络互连模型 1 1.1.1 网络的发展 2 1.1.2 OSI模型 2 1.1.3 封装 3 1.2 认证目标1.02:物理层和数据链路层 4 1.2.1 DIX和802.3 Ethernet 5 1.2.2 802.5令牌环网 7 1.2.3 ANSI FDDI 8 1.2.4 MAC地址 9 1.2.5 接口 9 1.2.6 广域网服务 12 1.3 认证目标1.03:网络层和路径确定 17 1.3.1 第3层地址 17 1.3.2 已选择路由协议和路由选择协议 17 1.3.3 路由选择算法和度 18 1.4 认证目标1.04:传输层 18 1.4.1 可靠性 18 1.4.2 窗口机制 18 1.5 认证目标1.05:上层协议 18 1.6 认证目标1.06:Cisco路由器、交换机 和集线器 18 1.7 认证目标1.07:配置Cisco交换机 和集线器 20 1.8 认证总结 20 1.9 2分钟练习 22 1.10 自我测试 23 第2章 从Cisco IOS软件开始 31 2.1 认证目标 2.01:用户界面 31 2.1.1 用户模式和特权模式 31 2.1.2 命令行界面 32 2.2 认证目标2.02:路由器基础 35 2.2.1 路由器元素 35 2.2.2 路由器模式 35 2.2.3 检查路由器状态 37 2.2.4 Cisco发现协议 38 2.2.5 远程访问路由器 39 2.2.6 基本测试 39 2.2.7 调试 40 2.2.8 路由基础 41 2.3 认证目标2.03:初始配置 43 2.3.1 虚拟配置注册表设置 46 2.3.2 启动序列:引导系统命令 47 2.3.3 将配置传送到服务器或从服务器 上复制配置 47 2.4 认证目标2.04:自动安装配置数据 49 2.5 认证总结 49 2.6 2分钟练习 50 2.7 自我测试 51 第3章 IP寻址 58 3.1 认证目标3.01:IP地址类 58 3.1.1 IP地址的结构 58 3.1.2 特殊情况:回路、广播和网 络地址 59 3.1.3 识别地址类 60 3.1.4 子网掩码的重要性 61 3.1.5 二进制和十进制互相转换 62 3.2 认证目标3.02:子网划分和子网掩码 64 3.2.1 子网划分的目的 65 3.2.2 在默认子网掩码中加入位 65 3.3 认证目标3.03:子网规划 66 3.3.1 选择子网掩码 66 3.3.2 主机数目的影响 66 3.3.3 确定每个子网的地址范围 67 3.4 认证目标3.04:复杂子网 68 3.4.1 子网位穿越8位位组边界 68 3.4.2 变长子网掩码 69 3.4.3 超网划分 70 3.5 认证目标 3.05:用Cisco IOS配 置IP地址 71 3.5.1 设置IP地址和参数 71 3.5.2 主机名称到地址的映射 71 3.5.3 使用ping 72 3.5.4 使用IP TRACE和Telnet 73 3.6 认证总结 73 3.7 2分钟练习 74 3.8 自我测试 75 第4章 TCP/IP协议 88 4.1 认证目标 4.01:应用层服务 89 4.2 认证目标 4.02:表示和会话层服务 89 4.2.1 远程过程调用 89 4.2.2 Socket 89 4.2.3 传输层接口 90 4.2.4 NetBIOS 90 4.3 认证目标4.03:协议的详细结构 90 4.3.1 传输层 91 4.3.2 TCP 91 4.3.3 UDP 93 4.4 认证目标4.04:网络层 94 4.4.1 网际协议 94 4.4.2 地址解析协议 95 4.4.3 反向地址解析协议 96 4.4.4 逆向地址解析协议 96 4.4.5 网际控制消息协议 96 4.5 认证目标4.05:操作系统命令 97 4.5.1 UNIX 97
简介 第1章 网际互联  网际互联基础知识  网际互联模型   分层的方法   参考模型的优点  OSI参考模型   应用层   表示层   会话层   传输层   网络层   数据链路层   物理层  以太网(Ethernet)组网   半双工和全双式以太网   以太网的数据链路层   以太网的物理层  以太网电缆的连接   直通电缆   交叉电缆   反转电缆  数据封装  Cisco的3层分层模型   核心层(Core Layer) 分配层(Distribution Layer)   接入层(Access Layer) 小结  考试要点  书面实验1   书面实验1.1:有关OSI的问题   书面实验1.2:定义OSI的各层和相应的设备   书面实验1.3:识别冲突域和广播域   书面实验1.4:二进制数、十进制数和十六进制数之间的转换  复习题  复习题答案   书面实验1.1答案   书面实验1.2答案   书面实验1.3答案   书面实验1.4答案 第2章 TCP/IP简介  TCP/IP和DoD模型   过程/应用层协议   主机到主机层协议   因特网层协议  IP 寻址   IP术语   分层的IP寻址方案   私有IP地址  广播地址   小结  考试要点  书面实验2   复习题  复习题答案  书面实验2答案 第3章 子网划分、变长子网掩码(VLSM)和TCP/IP排错  子网划分基础   IP零子网   如何创建子网   子网掩码   无类的内部域路由   C类地址的子网划分   B类地址子网划分   A类地址的子网划分  可变长度子网掩码(VLSM)   VLSM设计   实现VLSM网络  汇总  IP寻址排错   判断IP地址问题  小结  …… 第4章 Cisco的互联网络操作系统(IOS)和安全设备管理器(SDM) 第5章 管理Cisco互联网络 第6章 IP路由 第7章 增强IGRP(EIGRP)和开放最短路径优先(OSPF) 第8章 第2层交换和生成树协议(STP) 第9章 虚拟局域网(VLAN) 第10章 安全 第11章 网络地址转换 第12章 Cisco无线网络技术 第13章 广域网 词汇表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值