2017-11-23 14 views
0

tf.nn.dynamic_rnn API와 함께 tf.contrib.rnn.ConvLSTMCell API를 사용하여 tensorflow (1.4)에서 seq2seq 모델을 작성하려고하지만 치수에 오류가 있습니다. 입력의.ValueError : ConvLSTMCell and dynamic_rnn

내 코드입니다 : 내가 TF 구현을 보면 다음과 같은 오류

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

을 얻을

# 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) 

, dynamic_rnn하는 입력이 숨겨진 반대 만 3 차원 것 같다 상태, 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/1RNN을 수동으로 만들어야합니다.

예는 설명서에 제공되어, 내가 필요한 의견 위의 예에 따라 코드를 수정 한 아래 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 **을 지원하지 않습니다. 내 코드가 작동하지 않는 이유를 설명합니다. 아무도 이것을 확인할 수 있습니까? 나는 나를 위해 itwoooo 자신의 convlstm 세포를 만들었는데, 이것은 tensorflow 작전에서 작동하지 않는다. 그러나 ConvLSTMCell [https://www.tensorflow.org/api_docs/python/tf/contrib/rnn/ConvLSTMCell]의 공식적인 텐서 플로우 구현은 어떨까요? 또는이 구현은 tf가 채택한 것입니까? (최소한 비슷하게 보입니다)? 왜 높이와 너비가 같아야합니까? 나는 그것을 얻지 않는다. – seb

0

그동안 2 개의 API를 함께 사용하는 방법을 알아 냈습니다. 트릭은 tf.nn.dynamic_rnn()에 입력으로 5D-Tensor를 전달하는 것입니다. 여기서 마지막 차원은 "공간 격자의 벡터"크기입니다 (이는 2D에서 3D 로의 입력 변환에서 비롯됩니다. 구현이 기반이되는 논문에서 영감을 얻은 것 : https://arxiv.org/pdf/1506.04214.pdf). 내 경우에는 벡터 크기가 1입니다, 어쨌든 차원을 확장해야합니다.

이 오류를 수정하는 동안 또 다른 문제가 나타났습니다. 위에서 설명한 3.1 절의 문서에서 convLSTM에 대한 수식을 설명합니다. 그들은 셀 출력 C에 연결된 가중치에 Hadamard 제품을 사용합니다. Tensorflow에서 ConvLSTMCell의 가중치를 인쇄하면 Wci, Wcf 및 Wco 가중치를 전혀 사용하지 않는 것처럼 보입니다. 그렇다면 누구나 TF ConvLSTMCell의 정확한 구현을 말할 수 있습니까?

btw. tensorflow ConvSTMCell의 출력은 C 또는 H (종이 표기법)입니까?