我正在使用 word2vec 作為輸入構建 LSTM 模型。我正在使用張量流框架。我已經完成了詞嵌入部分,但我仍然堅持使用 LSTM 部分。這里的問題是我有不同的句子長度,這意味著我必須進行填充或使用具有指定序列長度的 dynamic_rnn 。我和他們兩個都在掙扎。填充。填充的令人困惑的部分是當我做填充時。我的模型就像word_matrix=model.wv.syn0X = tf.placeholder(tf.int32, shape)data = tf.placeholder(tf.float32, shape)data = tf.nn.embedding_lookup(word_matrix, X)然后,我將 word_matrix 的單詞索引序列輸入 X。我擔心如果我將零填充到輸入 X 的序列中,那么我會錯誤地繼續輸入不必要的輸入(在本例中為 word_matrix[0])。所以,我想知道 0 填充的正確方法是什么。如果您讓我知道如何使用 tensorflow 實現它,那就太好了。dynamic_rnn 為此,我聲明了一個包含所有句子長度的列表,并在結尾處將它們與 X 和 y 一起提供。在這種情況下,我不能批量輸入輸入。然后,我遇到了這個錯誤(ValueError: as_list() is not defined on an unknown TensorShape.),在我看來,sequence_length 參數只接受列表?(雖然我的想法可能完全不正確)。以下是我的代碼。X = tf.placeholder(tf.int32)labels = tf.placeholder(tf.int32, [None, numClasses])length = tf.placeholder(tf.int32)data = tf.placeholder(tf.float32, [None, None, numDimensions])data = tf.nn.embedding_lookup(word_matrix, X)lstmCell = tf.contrib.rnn.BasicLSTMCell(lstmUnits, state_is_tuple=True)lstmCell = tf.contrib.rnn.DropoutWrapper(cell=lstmCell, output_keep_prob=0.25)initial_state=lstmCell.zero_state(batchSize, tf.float32)value, _ = tf.nn.dynamic_rnn(lstmCell, data, sequence_length=length, initial_state=initial_state, dtype=tf.float32)我在這部分很掙扎,因此非常感謝任何幫助。
1 回答

守著一只汪
TA貢獻1872條經驗 獲得超4個贊
Tensorflow 不支持可變長度的 Tensor。所以當你聲明一個 Tensor 時,list/numpy 數組應該有一個統一的形狀。
從您的第一部分開始,我了解到您已經能夠在序列長度的最后一個時間步長中填充零。這才是理想的情況。這是它應該如何尋找批量大小為 4、最大序列長度為 10 和 50 個隱藏單元的方法 ->
[4,10,50]
將是整個批次的大小,但在內部,當您嘗試可視化填充時,它的形狀可能是這樣的 ->`[[5+5pad,50],[10,50],[8+2pad,50],[9+1pad,50]`
每個墊將代表一個序列長度為 1 的隱藏狀態大小為 50 張量。全都充滿了零。看看這個問題,并且這其中更多地了解墊手動如何。
您將使用動態 rnn 的確切原因是您不想在填充序列上計算它。該tf.nn.dynamic_rnn API將確保通過傳遞的
sequence_length
參數。對于上面的示例,該參數將是:
[5,10,8,9]
對于上面的示例。您可以通過對每個批處理組件的非零實體求和來計算它。一種簡單的計算方法是:data_mask = tf.cast(data, tf.bool) data_len = tf.reduce_sum(tf.cast(data_mask, tf.int32), axis=1)
并將其傳遞到
tf.nn.dynamic_rnn
api 中:tf.nn.dynamic_rnn(lstmCell, data, sequence_length=data_len, initial_state=initial_state)
添加回答
舉報
0/150
提交
取消