Tensorflow循环神经网络

对循环神经网络的理解,对照卷积神经网络来看,一个是空间,一个是时间

  • 循环注意的是时间上的先后顺序,而且更集中体现在插入数据的先后的顺序,其他网络对于一个训练数据是分前后输入的
  • 卷积更注重空间上的周围情况,对于一个数据全部同时输入,但是一个数据内部可能会存在各种前后左右的关系
  • 例子1:如果一张图片100*100的像素,通道为1层,就是一张黑白照片,卷积想的是这张图片的10个像素与10个像素可以提取出眼睛,然后找到另外100个像素找到鼻子,而循环想的是图片形成的时候,可能先画出来上面的眼睛,然后画出来中间的鼻子,然后画出来下面的嘴巴
  • 例子2: 对于自然语言理解来看,一篇文章由100个句子组成,卷积想的是每个句子的某几个词可能反映出重要的信息,循环想的是上一个词和周围的词之间的关系
  • 总结:不要把卷积和循环这两个想的只和图片或者文本对应,这是一种思想,要找到有意义的情景,就可以发挥出相应的效果

具体Tensorflow代码(minst):

#每次输入28个像素
n_inputs = 28
#一个数据输入28次
n_steps = 28
#隐藏层size为256个神经元,然后总体看成一个cell,也被称为STATE_SIZE
n_hidden_units = 256
n_classes = 10
....
#定义cell,利用tf.nn.rnn_cell.BasicLSTMCell去构建,每一个cell里面有n_hidden_units个神经元,
lstm_cell = tf.nn.rnn_cell.BasicLSTMCell(n_hidden_units, forget_bias=1.0, state_is_tuple=True)
#state可被分为(c_state, h_state)
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(lstm_cell, X_in, initial_state=init_state, time_major=False)
pred = tf.matmul(final_state[1], weights['out']) + biases['out']

方式一: 直接调用final_state 中的 h_state (final_state[1]) 来进行运算:

results = tf.matmul(final_state[1], weights['out']) + biases['out']

方式二: 调用最后一个 outputs (在这个例子中,和上面的final_state[1]是一样的):

# 把 outputs 变成 列表 [(batch, outputs)..] * steps
outputs = tf.unstack(tf.transpose(outputs, [1,0,2]))
results = tf.matmul(outputs[-1], weights['out']) + biases['out']
#选取最后一个 out

多层RNN:

Tensorflow中的实现就是使用tf.nn.rnn_cell.MultiRNNCell
声明一个cell
MultiRNNCell中传入[cell]*num_layers就可以了
注意如果是LSTM,定义参数state_is_tuple=True

num_layers = 3
cell = tf.nn.rnn_cell.LSTMCell(num_units=state_size, state_is_tuple=True)
cell = tf.nn.rnn_cell.MultiRNNCell(cells=[cell]*num_layers, state_is_tuple=True)
init_state = cell.zero_state(batch_size, dtype=tf.float32)
'''使用dynamic_rnn方式'''
rnn_outputs, final_state = tf.nn.dynamic_rnn(cell=cell, inputs=rnn_inputs, 
                                                 initial_state=init_state) 

DeepRank

embedding_lookup()
简单的讲就是根据input_ids中的id,寻找embedding中的对应元素。比如,input_ids=[1,3,5],则找出embedding中下标为1,3,5的向量组成一个矩阵返回。
http://blog.csdn.net/u013041398/article/details/60955847

发表评论

电子邮件地址不会被公开。