【发布时间】:2016-12-21 17:20:41
【问题描述】:
我正在尝试一个非常简单的 tensorflow 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 通常接受可变长度输入。
我该怎么做?
【问题讨论】:
-
查看此blog 帖子。
-
你确定它们是正确的吗?他们使用
sequence = tf.placeholder(tf.float32, [None, max_length, frame_size]),这意味着序列长度是固定的。 -
出于某种原因,我的印象实际上并不是动态长度,而是填充。
标签: tensorflow recurrent-neural-network