BiLSTM

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, 那麼

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

]

目錄 

LSTM & GRU

基本LSTM

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

LSTM的結構

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

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

#tf.nn.rnn_cell.BasicLSTMCell(num_units, forget_bias, input_size, state_is_tupe=Flase, activation=tanh)
cell = tf.nn.rnn_cell.BasicLSTMCell(num_units, forget_bias=1.0, input_size=None, state_is_tupe=Flase, activation=tanh)
#num_units:圖一中ht的維數,如果num_units=10,那麼ht就是10維行向量
#forget_bias:遺忘門的初始化偏置
#input_size:[batch_size, max_time, size]。假設要輸入一句話,這句話的長度是不固定的,max_time就代表最長的那句話是多長,size表示你打算用多長的向量代表一個word,即embedding_size(embedding_size和size的值不一定要一樣)
#state_is_tuple:true的話,返回的狀態是一個tuple:(c=array([[]]), h=array([[]]):其中c代表Ct的最後時間的輸出,h代表Ht最後時間的輸出,h是等於最後一個時間的output的
#圖三向上指的ht稱為output
#此函式返回一個lstm_cell,即圖一中的一個A

input_size换句话说 即为 每批次处理的数量   每个句子含的单词数相当于(高度)   词向量维度(相当于宽度)

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

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

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

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

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

tf.nn.dynamic_rnn(cell, inputs, sequence_length=None, initial_state=None,dtype=None,time_major=False)
#此函式會通過,inputs中的max_time將網路按時間展開
#cell:將上面的lstm_cell傳入就可以
#inputs:[batch_size, max_time, size]如果time_major=Flase. [max_time, batch_size, size]如果time_major=True
#sequence_length:是一個list,如果你要輸入三句話,且三句話的長度分別是5,10,25,那麼sequence_length=[5,10,25]
#返回:(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]
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值