2017-10-31 8 views
1

나는 텐도를 [A, B, C, D]에서 [A, B, C * D]으로 바꾸고 dynamic_rnn에 넣으려고합니다. B, C 및 D를 미리 알지 못한다고 가정합니다 (이들은 길쌈 네트워크의 결과입니다).TensorFlow에서 마지막 텐서의 두 치수를 평평하게하기

x_shape = tf.shape(x) 
x = tf.reshape(x, [batch_size, x_shape[1], tf.reduce_prod(x_shape[2:])] 
:

x = x.flatten(ndim=3) 

TensorFlow 내가 해낸이이 작업을 수행하는 쉬운 방법은 없습니다 지금까지 여기 보인다 :

나는 같을 것이다 Theano 같은 고쳐 생각

x의 모양이 그래프 작성 중에 알려지더라도 (즉, print(x.get_shape())get_shape()[10, None, None]이되는 이후에 [10, 20, 30, 40]과 같이 절대 값을 인쇄합니다. 초기 형상은 알 수 없으므로 절대 값으로 작동 할 수 없습니다.

그리고 나는 dynamic_rnnx을 통과하고있을 때 그것은 실패

ValueError: Input size (depth of inputs) must be accessible via shape inference, but saw value None. 

왜이 사건을 처리 할 수 ​​없습니다 reshape입니까? Tenano가 4 위 이상인 TensorFlow에서 Theano의 flatten(ndim=n)을 복제하는 올바른 방법은 무엇입니까?

답변

0

요구 사항에 따라 간단한 코드를 사용해 보았습니다. CNN 출력을 변형하려고하므로 X 모양은 Tensorflow의 CNN 출력과 동일합니다.

HEIGHT = 100 
WIDTH = 200 
N_CHANELS =3 

N_HIDDEN =64 

X = tf.placeholder(tf.float32, shape=[None,HEIGHT,WIDTH,N_CHANELS],name='input') # output of CNN 

shape = X.get_shape().as_list() # get the shape of each dimention shape[0] =BATCH_SIZE , shape[1] = HEIGHT , shape[2] = HEIGHT = WIDTH , shape[3] = N_CHANELS 

input = tf.reshape(X, [-1, shape[1] , shape[2] * shape[3]]) 
print(input.shape) # prints (?, 100, 600) 

#Input for tf.nn.dynamic_rnn should be in the shape of [BATCH_SIZE, N_TIMESTEPS, INPUT_SIZE]  

#Therefore, according to the reshape N_TIMESTEPS = 100 and INPUT_SIZE= 600 

#create the RNN here 
lstm_layers = tf.contrib.rnn.BasicLSTMCell(N_HIDDEN, forget_bias=1.0) 
outputs, _ = tf.nn.dynamic_rnn(lstm_layers, input, dtype=tf.float32) 

희망이 도움이됩니다.

+0

내가 오해 한 것이 있다면 나를 정정하십시오. 그러나 나는 "모양 [2] *에서 무엇을하는지 절대적 가치로 작동 할 수 없기 때문에 초기 모양을 알 수 없다고 가정합니다. 모양 [3]'. – naktinis

+0

내가 틀렸다고 정정하십시오. 따라서 A는 모델을 학습 할 때 입력 샘플의 수에 따라 달라지는 일괄 처리 크기입니다. 따라서 훈련시 A 만 알 수 있습니다. 그러나 CNN의 출력은 입력 형태, 필터 모양 및 출력 채널 수에 따라 달라지며 get_shape() 메소드를 사용하여 계산하거나 확인할 수 있습니다. 게다가 B, C, D는 None과 같아서는 안됩니다. –

+0

아마 가능할 수도 있지만, 데이터의 단순한 변환을 수행하기 위해 많은 값을 계산하고 하드 코드해야합니다. 이것은 내가 피하려고 시도한 것입니다 (그리고 Lasagne/Theano가 코드의 한 줄을 완성 할 수있게 해줍니다). 주된 질문의 주요 부분은 "왜 '재구성 (reshape)'이이 사건을 처리 할 수 ​​없습니까?" – naktinis