2017-11-23 5 views
0

tf.nn.dynamic_rnn APIとともにtf.contrib.rnn.ConvLSTMCell APIを使用してtensorflow(1.4)でseq2seqモデルを構築しようとしていますが、ディメンションにエラーがあります入力のValueError:ConvLSTMCell and dynamic_rnn

私のコードは次のとおりです。

# features is an image sequence with shape [600, 400, 10], 
# so features is a tensor with shape [batch_size, 600, 400, 10] 

features = tf.transpose(features, [0,3,1,2]) 
features = tf.reshape(features, [params['batch_size'],10,600,400]) 

encoder_cell = tf.contrib.rnn.ConvLSTMCell(conv_ndims=2, 
              input_shape=[600, 400,1], 
              output_channels=5, 
              kernel_shape=[7,7], 
              skip_connection=False) 

_, encoder_state = tf.nn.dynamic_rnn(cell=encoder_cell, 
            inputs=features, 
            sequence_length=[10]*params['batch_size'], 
            dtype=tf.float32) 

私は

ValueError: Conv Linear expects all args to be of same Dimension: [[2, 600, 400], [2, 600, 400, 5]] 

次のエラーを取得するTFの実装を見てみると、隠しに反するのみで3次元での入力がdynamic_rnnしているようです状態であり、これは4次元である。入力をネストされたタプルとして渡そうとしましたが、動作しませんでした。

問題はTensorFlow dynamic_rnn regressor: ValueError dimension mismatchと似ていますが、私のために働いていたプレーンなLSTMCellを使用しているため、少し異なります。

誰も私にこれら2つのAPIを一緒に使うための最小限の例を教えてもらえますか? ありがとう!私はここhttps://github.com/iwyoo/ConvLSTMCell-tensorflow/issues/2 から理解したよう

答えて

0

現在、 tf.nn.dynamic_rnn ConvLSTMCellをサポートしていません。

したがって、https://github.com/iwyoo/ConvLSTMCell-tensorflow/issues/1のように、RNNを手動で作成する必要があります。

Iは、必要に応じてコメントを上記の例によれば、コードを変更した以下の実施例は、ドキュメントにhttps://github.com/iwyoo/ConvLSTMCell-tensorflow/blob/master/README.md

が設けられています。

height = 400 
width = 400 
time_steps = 25 
channel = 10 
batch_size = 2 

p_input = tf.placeholder(tf.float32, [None, height, width, time_steps, channel]) 
p_label = tf.placeholder(tf.float32, [None, height, width, 3]) 

p_input_list = tf.split(p_input, step_size, 3) # creates a list of leghth time_steps and one elemnt has the shape of (?, 400, 400, 1, 10) 
p_input_list = [tf.squeeze(p_input_, [3]) for p_input_ in p_input_list] #remove the third dimention now one list elemnt has the shape of (?, 400, 400, 10) 

cell = tf.contrib.rnn.ConvLSTMCell(conv_ndims=2, # ConvLSTMCell definition 
            input_shape=[height, width, channel], 
            output_channels=5, 
            kernel_shape=[7, 7], 
            skip_connection=False) 

state = cell.zero_state(batch_size, dtype=tf.float32) #initial state is zero 

with tf.variable_scope("ConvLSTM") as scope: # as BasicLSTMCell # create the RNN with a loop 
    for i, p_input_ in enumerate(p_input_list): 
     if i > 0: 
      scope.reuse_variables() 
     # ConvCell takes Tensor with size [batch_size, height, width, channel]. 
     t_output, state = cell(p_input_, state) 

あなたが入力に同じ高さを持っているイメージを持っていることに注意してください。 の高さがの幅がの場合、埋め込みが必要な場合があります。

これが役に立ちます。

+0

まずはお返事いただきありがとうございます。 ** ** tf.nnの場合。dynamic_rnn **は** ConvLSTMCell **をサポートしていません。なぜコードが機能しないのかを説明しています。誰でもこれを確認できますか? 私にとっては、iwyooが自分のconvlstmセルを作成したように見えるので、それはtensorflow操作では動作しません。しかし、ConvLSTMCell [https://www.tensorflow.org/api_docs/python/tf/contrib/rnn/ConvLSTMCell]の公式テンソルフロー実装はどうでしょうか。または、これは採用された実装です(それは少なくとも非常によく似ています)? なぜ、高さと幅を同じにする必要がありますか?私はそれを得ない – seb

0

一方、私は2つのAPIを一緒に使う方法を考え出しました。このトリックは、tf.nn.dynamic_rnn()に入力として5D-Tensorを渡すことです。ここで、最後の次元は「空間グリッド上のベクトル」のサイズです(2Dから3Dへの入力の変換から得られます)実装が基づいている論文に触発された:https://arxiv.org/pdf/1506.04214.pdf)。私の場合、ベクトルサイズは1ですが、とにかくディメンションを拡張する必要があります。

このエラーを修正している間に、もう1つの問題が浮かび上がっています。上記3.1節の論文では、convLSTMの式が示されています。彼らは、TensorflowでConvLSTMCellの重量を印刷すると、重量Wci、Wcf、Wcoをまったく使用しないようです。だから、誰も私にTF ConvLSTMCellの正確な実装を教えてもらえますか?

Btw。テンソルフローConvSTMCellの出力はCまたはH(紙の表記)ですか?

関連する問題