
看 RNN 的 paper 大多数集中在 RNNcell 内部构建,少数涉及 units 之间交互,
Tensorflow 提供了几种最流行的 RNN 变种类,但没有 CNN 编写方便,这里分享一段使用 tf.scan 构建 GRUcell 代码,可以作为自定义 RNNcell 的参考。
import numpy as np import pandas as pd import tensorflow as tf import pylab as pl from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("/tmp/data/", one_hot=True) %matplotlib inline class GRUcell(object): def __init__(self): self.in_length= 28 self.in_width= 28 self.hidden_layer_size = 2000 self.out_classes = 10 self.Wr = tf.Variable(tf.zeros([self.in_width, self.hidden_layer_size])) self.Wz = tf.Variable(tf.zeros([self.in_width, self.hidden_layer_size])) self.W_ = tf.Variable(tf.zeros([self.in_width, self.hidden_layer_size])) self.Ur = tf.Variable(tf.truncated_normal([self.hidden_layer_size, self.hidden_layer_size])) self.Uz = tf.Variable(tf.truncated_normal([self.hidden_layer_size, self.hidden_layer_size])) self.U_ = tf.Variable(tf.truncated_normal([self.hidden_layer_size, self.hidden_layer_size])) self.Wout = tf.Variable(tf.truncated_normal([self.hidden_layer_size, self.out_classes], mean=0., stddev=.1)) self.bout = tf.Variable(tf.truncated_normal([self.out_classes], mean=0., stddev=.1)) self.inX = tf.placeholder(shape=[None, self.in_length, self.in_width], dtype=tf.float32) self.initial_hidden = tf.matmul(self.inX[:,0,:], tf.zeros([self.in_width, self.hidden_layer_size])) self.X = tf.transpose(self.inX, perm=[1,0,2]) def GRU(self, hidden_states_previous, current_input_X): """ GRU topology unit Note that the input order above is for the fn function The two tensors are entered for the fn function, the first tensor is the output calculated in the previous step, and the second tensor is the input value at this time """ hp = hidden_states_previous x = current_input_X r = tf.sigmoid(tf.matmul(x, self.Wr) + tf.matmul(hp, self.Ur)) z = tf.sigmoid(tf.matmul(x, self.Wz) + tf.matmul(hp, self.Uz)) h_ = tf.tanh(tf.matmul(x, self.W_) + tf.matmul(r*hp ,self.U_)) h = tf.multiply(hp,z) + tf.multiply((1-z),h_) return h def PRO_TS(self): """ Perform recursive operations in time series Iterates through time/ sequence to get all hidden state Input format : [in_length, batch_size, in_width] Output format : [in_length, batch_size, hidden_layer_size] """ return tf.scan(fn= self.GRU, elems=self.X, initializer=self.initial_hidden) def Full_Connection_Layer(self, batch_hidden_layer_states): """ The hidden layer state input is converted to output through the full connection layer Input format : [batch_size, hidden_layer_size] Output format : [batch_size, out_classes] """ return tf.nn.relu(tf.nn.bias_add(tf.matmul(batch_hidden_layer_states, self.Wout), self.bout)) def deal_hidden_layer(self): """ Handle all state output of hidden layer Input format : [in_length, batch_size, hidden_layer_size] Output format : [in_length, batch_size, out_classes] """ #all_hidden_states = self.PRO_TS() #return tf.map_fn(self.Full_Connection_Layer, all_hidden_states) return tf.map_fn(self.Full_Connection_Layer, self.PRO_TS()) def last_output(self): tp = tf.reverse(self.deal_hidden_layer(), axis=[0])[0,:,:] return tf.nn.softmax(tp) y = tf.placeholder(tf.float32, shape=[None, 10],name='inputs') rnn = GRUcell() output = rnn.last_output() cross_entropy = -tf.reduce_sum(y * tf.log(output)) train_step = tf.train.AdamOptimizer(learning_rate=0.001).minimize(cross_entropy) correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(output,1)) accuracy = (tf.reduce_mean(tf.cast(correct_prediction, tf.float32))) sess=tf.InteractiveSession() sess.run(tf.global_variables_initializer()) batch_size = 32 ss = [] for i in range(5000): batch_x, batch_y = mnist.train.next_batch(batch_size) batch_x = batch_x.reshape((batch_size, 28, 28)) sess.run(train_step, feed_dict={rnn.inX:batch_x, y:batch_y}) t = sess.run(accuracy, feed_dict={rnn.inX:batch_x, y:batch_y}) ss.append(t) ttt = pd.Series(ss) ttt.plot() 使用 Tensorflow version 1.0 python 3.6
源代码地址: https://uqer.io/community/share/58a9332bf1973300597ae209
1 aosp 2017-02-20 20:08:12 +08:00 深度学习……好高端啊 |
2 snnn 2017-02-21 10:28:13 +08:00 via Android 厉害! |