当前位置:   article > 正文

BiLSTM_bilstm tensorflow

bilstm tensorflow

https://blog.csdn.net/ifruoxi/article/details/78235270  BILSTM

http://colah.github.io/posts/2015-08-Understanding-LSTMs/

https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/621376/

在tensorflow中实现LSTM的主要三句为:

tf.contrib.rnn.BasicLSTMCell(n_hidden)
init_state = lstm_cell.zero_state(batch_size, dtype=tf.float32)
outputs, final_state = tf.nn.dynamic_rnn(lstm_cell, X_in, initial_state=init_state, time_major=False)

如果使用state_is_tuple=True, 那麼

  1. initial_state = lstm_cell.zero_state(batch_size, dtype=tf.float32)
  2. ...
  3. with tf.Session() as sess:
  4. tf.initialize_all_variables().run()
  5. state = initial_state.eval() #state_is_tuple=True的話,這裡會報錯,不用eval也會報錯
  6. sess.run([train_op, state], #所以我使用了state_is_tuple=False,不知0.11.0會不會正常
  7. feed_dict={
  8. initial_state:state
  9. })

]

目錄 

LSTM & GRU

基本LSTM

tensorflow提供了LSTM實現的一個basic版本,不包含lstm的一些高階擴充套件,同時也提供了一個標準介面,其中包含了lstm的擴充套件。分別為:tf.nn.rnn_cell.BasicLSTMCell(), tf.nn.rnn_cell.LSTMCell()

LSTM的結構

盜用一下Understanding LSTM Networks上的圖 
圖一

圖一 
圖二
圖二 
圖三
圖三 
tensorflow中的BasicLSTMCell()是完全按照這個結構進行設計的

  1. #tf.nn.rnn_cell.BasicLSTMCell(num_units, forget_bias, input_size, state_is_tupe=Flase, activation=tanh)
  2. cell = tf.nn.rnn_cell.BasicLSTMCell(num_units, forget_bias=1.0, input_size=None, state_is_tupe=Flase, activation=tanh)
  3. #num_units:圖一中ht的維數,如果num_units=10,那麼ht就是10維行向量
  4. #forget_bias:遺忘門的初始化偏置
  5. #input_size:[batch_size, max_time, size]。假設要輸入一句話,這句話的長度是不固定的,max_time就代表最長的那句話是多長,size表示你打算用多長的向量代表一個word,即embedding_size(embedding_sizesize的值不一定要一樣)
  6. #state_is_tuple:true的話,返回的狀態是一個tuple:(c=array([[]]), h=array([[]]):其中c代表Ct的最後時間的輸出,h代表Ht最後時間的輸出,h是等於最後一個時間的output
  7. #圖三向上指的ht稱為output
  8. #此函式返回一個lstm_cell,即圖一中的一個A
  9. input_size换句话说 即为 每批次处理的数量 每个句子含的单词数相当于(高度) 词向量维度(相当于宽度)

如果你想要設計一個多層的LSTM網路,你就會用到tf.nn.rnn_cell.MultiRNNCell(cells, state_is_tuple=False),這裡多層的意思上向上堆疊,而不是按時間展開

  1. lstm_cell = tf.nn.rnn_cell.MultiRNNCells(cells, state_is_tuple=False)
  2. #cells:一個cell列表,將列表中的cell一個個堆疊起來,如果使用cells=[cell]*4的話,就是四曾,每層cell輸入輸出結構相同
  3. #如果state_is_tuple:則返回的是 n-tuple,其中n=len(cells): tuple:(c=[batch_size, num_units], h=[batch_size,num_units])

這是,網路已經搭好了,tensorflow提供了一個非常方便的方法來生成初始化網路的state

  1. initial_state = lstm_cell.zero_state(batch_size, dtype=)
  2. #返回[batch_size, 2*len(cells)],或者[batch_size, s]
  3. #這個函式只是用來生成初始化值的

現在進行時間展開,有兩種方法: 
法一: 
使用現成的介面:

  1. tf.nn.dynamic_rnn(cell, inputs, sequence_length=None, initial_state=None,dtype=None,time_major=False)
  2. #此函式會通過,inputs中的max_time將網路按時間展開
  3. #cell:將上面的lstm_cell傳入就可以
  4. #inputs:[batch_size, max_time, size]如果time_major=Flase. [max_time, batch_size, size]如果time_major=True
  5. #sequence_length:是一個list,如果你要輸入三句話,且三句話的長度分別是5,10,25,那麼sequence_length=[5,10,25]
  6. #返回:(outputs, states):output,[batch_size, max_time, num_units]如果time_major=False。 [max_time,batch_size,num_units]如果time_major=True。states:[batch_size, 2*len(cells)]或[batch_size,s]
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/488161
推荐阅读
相关标签
  

闽ICP备14008679号