テンソルフロー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ネットワークへの入力は、2進数のシーケンスです。各番号は配列に入れられます。たとえば、seuquenceの形式は次のとおりです。
[[1],[0],[0],[1],[1],[0],[1],[1],[1],[0]]
入力の形状は、バッチサイズ、シーケンスサイズ、埋め込みサイズの[なし、10,1]です。動的RNNは、可変入力形状を受け入れることができるので、次のように今、私は、コードを変更:
data = tf.placeholder(tf.float32, [None, None,1])
基本的に、私は可変長配列を使用する(同じバッチ内のすべての配列についてのコースと同じ長さが、間で異なりますバッチ)。私は2番目の次元がget_shape()[0]
で使用することはできませんNone
、であることを理解し
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)
:しかし、それはエラーがスローされます。しかし、RNNは一般的に可変のlenth入力を受け入れるため、これを克服する方法が必要であると私は信じています。 どうすればいいですか?
この[ブログ](https://danijar.com/variable-sequence-lengths-in-tensorflow/)の記事をチェックしてください。 – TheM00s3
あなたはそれが正しいと確信していますか? 'sequence = tf.placeholder(tf.float32、[None、max_length、frame_size])'を使用します。これは、シーケンス長が固定であることを意味します。 – lenhhoxung
なんらかの理由で、私は実際には動的な長さではなく、埋め込まれているという印象を持っています。 –