2017-03-10 5 views
0
で完全に接続された層

イムにLSTMの接続:は、次のコードを使用してTensorflowで完全に接続された層へのLSTM層からの接続をしようとしTensorflow

# lstm_outputs has shape 1x10x100 
rnn_out = tf.reshape(lstm_outputs, [-1, 100]) 
# rnn_out has shape 10x100 

は今、私はに1×10ベクトルを追加しますRNNからの出力を受け取り、この新しいテンソルを完全に接続された層に供給する。

extra_params = tf.placeholder(shape=[1,10], dtype=tf.float32) 
fc_input = tf.concat(1,[rnn_out,extra_params]) 
fc1 = slim.fully_connected(fc_input,o_size, 
    activation_fn=tf.nn.relu, 
    weights_initializer=tf.truncated_normal_initializer(), 
    biases_initializer=None) 

コードは私にtf.concatラインに次のエラーを与えるしかし:

TypeError: Expected int32, got list containing Tensors of type '_Message' instead.

私は、このコードに関連する2つの質問があります:私は取得するために何をする必要がありますどのような

  1. を完全に接続された層に供給されると予想されるテンソルは?
  2. 実際には完全に接続されたレイヤーには何が供給されますか?それは1x1010テンソルですか、それとも10x110テンソルですか?沿った軸に続いて、それは最初tf.Tensorオブジェクトのリストを期待:TypeErrorは(いつかTensorFlow 0.12入れ替え)tf.concat()への引数の不適切な順序によって引き起こされる、あなたはTensorFlow 1.0を使用していると仮定すると

答えて

2

あなたはそれらのテンソルを連結したいと思います。

しかし、単に引数を逆にすると(tf.concat([rnn_out, extra_params], 1))、形状に関連するエラーが発生します。 tf.concat()は、すべての入力が連結される軸にを除いて同じ寸法、を必要とします。ただし、rnn_outは10 x 100の行列であり、extra_paramsは1 x 10の行列です。したがって、これらのテンソルは連結には対応していません。

正しい解決策は、extra_paramsが表すと思われるものによって異なります。たとえば、トレーニングでバッチサイズが10の場合は、extra_paramsを10 x 1マトリックスに入れ替えることができます。以下のプログラムが動作するはずです:

rnn_out = tf.reshape(lstm_outputs, [-1, 100]) 
extra_params = tf.placeholder(shape=[10, 1], dtype=tf.float32) 
fc_input = tf.concat([rnn_out, extra_params], 1) 
+0

バッチサイズが1で、LSTMレイヤーへの入力が1x10x25のシェイプです。これはextra_paramsを追加するときに少し混乱しているのですが、入力を完全に連結されたレイヤーを単一の行ベクトル1xNoneにしたいのですが、LSTMレイヤー(10)の各タイムステップごとに1つの行があります。私は実際にこれを行う方法を失った。私の2番目の質問に対するコメント? – user3139545

+1

ええ、その場合は、完全に接続されたレイヤーを各LSTMタイムステップに個別に適用したいと思うかもしれません。その場合、 'tf.reshape()'をそのままにして、 'tf.tile()'を使って 'extra_params'を完全に接続された層の正しい形にすることができます。 'fc_input = tf.concat([rnn、tf.tile(extra_params、[10、1]))' – mrry

関連する問題