我正在嘗試tensorflow RNN的一個非常簡單的例子。 在那個例子中,我使用動態rnn。代碼如下:張量流動的動態張量形狀RNN
data = tf.placeholder(tf.float32, [None, 10,1]) #Number of examples, number of input, dimension of each input
target = tf.placeholder(tf.float32, [None, 11])
num_hidden = 24
cell = tf.nn.rnn_cell.LSTMCell(num_hidden,state_is_tuple=True)
val, _ = tf.nn.dynamic_rnn(cell, data, dtype=tf.float32)
val = tf.transpose(val, [1, 0, 2])
last = tf.gather(val, int(val.get_shape()[0]) - 1)
weight = tf.Variable(tf.truncated_normal([num_hidden, int(target.get_shape()[1])]))
bias = tf.Variable(tf.constant(0.1, shape=[target.get_shape()[1]]))
prediction = tf.nn.softmax(tf.matmul(last, weight) + bias)
cross_entropy = -tf.reduce_sum(target * tf.log(tf.clip_by_value(prediction,1e-10,1.0)))
optimizer = tf.train.AdamOptimizer()
minimize = optimizer.minimize(cross_entropy)
mistakes = tf.not_equal(tf.argmax(target, 1), tf.argmax(prediction, 1))
error = tf.reduce_mean(tf.cast(mistakes, tf.float32))
實際上,代碼取自這個tutorial。 該RNN網絡的輸入是一串二進制數字。每個數字都被放入一個數組中。例如,一個序列的格式如下:
[[1],[0],[0],[1],[1],[0],[1],[1],[1],[0]]
輸入的形狀是[None,10,1],它們分別是批量大小,序列大小和嵌入大小。現在,因爲動態RNN能接受可變輸入的形狀,我更改代碼如下:
data = tf.placeholder(tf.float32, [None, None,1])
基本上,我想使用可變長度序列(在同一批次的所有序列的過程相同的長度,但之間不同批)。然而,它拋出的錯誤:
Traceback (most recent call last):
File "rnn-lstm-variable-length.py", line 48, in <module>
last = tf.gather(val, int(val.get_shape()[0]) - 1)
TypeError: __int__ returned non-int (type NoneType)
據我所知,第二個維度是None
,不能在get_shape()[0]
使用。但是,我相信一定有辦法解決這個問題,因爲RNN一般接受可變的長度輸入。 我該怎麼辦?
簽出此[博客](https://danijar.com/variable-sequence-lengths-in-tensorflow/)帖子。 – TheM00s3
你確定它們是正確的嗎?他們使用'sequence = tf.placeholder(tf.float32,[None,max_length,frame_size])',這意味着序列長度是固定的。 – lenhhoxung
出於某種原因,我有印象的東西實際上不是動態的長度,而是填充。 –