2017-09-15 1 views
1

"None"차원에서 텐서를 분할하고 싶습니다. 예를 들어Tensorflow에서 None 차원으로 텐서를 분할하는 방법

,

tensor = tf.placeholder(tf.float32, shape=[None, None, 10], name="seq_holder") 
sliced_tensor = tensor[:,1:,:] # it works well! 

하지만

# Assume that tensor's shape will be [3,10, 10] 
tensor = tf.placeholder(tf.float32, shape=[None, None, 10], name="seq_holder") 
sliced_seq = tf.slice(tensor, [0,1,0],[3, 9, 10]) # it doens't work! 

내가 tf.slice위한 크기 매개 변수를 공급하기 위해 다른 place_holder 사용할 때 메시지를 얻을 동일하다().

두 번째 방법은 "입력 크기 (입력 깊이)에 형태 추론을 통해 액세스 할 수 있어야합니다."라는 오류 메시지가 표시됩니다.

저는 두 가지 방법의 차이점과 더 많은 tensorflow-ish 방법을 알고 싶습니다.

[편집 됨] 전체 코드는 아래

import tensorflow as tf 
import numpy as np 

print("Tensorflow for tests!") 

vec_dim = 5 
num_hidden = 10 
# method 1 
input_seq1 = np.random.random([3,7,vec_dim]) 

# method 2 
input_seq2 = np.random.random([5,10,vec_dim]) 
shape_seq2 = [5,9,vec_dim] 
# seq: [batch, seq_len] 
seq = tf.placeholder(tf.float32, shape=[None, None, vec_dim], name="seq_holder") 

# Method 1 
sliced_seq = seq[:,1:,:] 

# Method 2 
seq_shape = tf.placeholder(tf.int32, shape=[3]) 
sliced_seq = tf.slice(seq,[0,0,0], seq_shape) 

cell = tf.contrib.rnn.GRUCell(num_units=num_hidden) 
init_state = cell.zero_state(tf.shape(seq)[0], tf.float32) 

outputs, last_state = tf.nn.dynamic_rnn(cell, sliced_seq, initial_state=init_state) 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    # method 1 
    # states = sess.run([sliced_seq], feed_dict={seq:input_seq1}) 
    # print(states[0].shape) 

    # method 2 
    states = sess.run([sliced_seq], feed_dict={seq:input_seq2, seq_shape:shape_seq2}) 
    print(states[0].shape) 
+0

작업을 정의 할 때 (그 두 줄을 실행할 때) 또는 일부 입력으로 실행 (예 : 세션에서'.run' 호출) 할 때 오류가 발생합니까? 나는이 두 명령을 실행하는 데 문제가 없습니다. – jdehesa

+0

슬라이스 된 텐서 (두 번째 방법)를 동적 인 rnn 함수에 넣을 때 오류가 발생했습니다. dynamic_rnn의 문제입니까? –

+0

흠, 말하기 힘듭니다 ... 질문을 편집하고 세부 정보를 추가 할 수 있습니까? 문제가 나타나는 부분을 최소한으로 재현 할 수 있습니까? – jdehesa

답변

1
귀하의 문제를 정확히 issue #4590

문제는 tf.nn.dynamic_rnn 요구 (입력의 마지막 차원의 크기를 알고 있다는 것입니다 의해 설명

은 " 깊이"). 불행하게도, 문제가 지적했듯이 현재 tf.slice은 그래프 생성시 슬라이스 범위가 완전히 알려지지 않은 경우 출력 크기를 추측 할 수 없습니다. 따라서, sliced_seq은 형상이 (?, ?, ?)이된다.

첫 번째 문제는 세 가지 요소의 자리 표시자를 사용하여 조각의 크기를 결정하는 것입니다. 마지막 차원이 절대로 바뀌면 안되기 때문에 최선의 방법은 아닙니다. 나중에 vec_dim을 전달하더라도 오류가 발생할 수 있습니다. 가장 쉬운 해결책은 사이즈 2 (또는 별도의 두 자리)의 자리에 seq_shape를 켠 다음과 같은 슬라이싱 할 것 : 어떤 이유

sliced_seq = seq[:seq_shape[0], :seq_shape[1], :] 

을의 NumPy와 스타일 인덱스는 더 나은 형태를 갖고있는 것 같아요 추론 기능을 사용하면 마지막 차원의 크기가 sliced_seq으로 유지됩니다.

+0

나는 이것을 얻는다 : 상세한 설명을위한 감사합니다! –

관련 문제