2016-07-06 5 views
3

나는 tensorflow에서 두 개의 텐서를 가지며 첫 번째 텐서는 3-D이고 두 번째 텐서는 2D입니다. 그리고 나는 이것들을 다음과 같이 곱하고 싶습니다 :텐서 곱셈을위한 텐서 흐름 효율적인 방법

x = tf.placeholder(tf.float32, shape=[sequence_length, batch_size, hidden_num]) 
w = tf.get_variable("w", [hidden_num, 50]) 
b = tf.get_variable("b", [50]) 

output_list = [] 
for step_index in range(sequence_length): 
    output = tf.matmul(x[step_index, :, :], w) + b 
    output_list.append(output) 
output = tf.pack(outputs_list) 

루프를 사용하여 곱하기 연산을 사용하지만, 너무 느립니다. 이 과정을 가능한 한 간단하고 깨끗하게 만드는 가장 좋은 방법은 무엇입니까?

답변

2

batch_matmul을 사용할 수 있습니다. 불행하게도 batch_matmul은 일괄 처리 차원에서 브로드 캐스팅을 지원하지 않으므로 w 행렬을 바둑판 식으로 배열해야합니다. 이것은 더 많은 메모리를 사용하지만, 모든 작업이 TensorFlow

에 남아있을 것입니다
a = tf.ones((5, 2, 3)) 
b = tf.ones((3, 1)) 
b = tf.reshape(b, (1, 3, 1)) 
b = tf.tile(b, [5, 1, 1]) 
c = tf.batch_matmul(a, b) # use tf.matmul in TF 1.0 
sess = tf.InteractiveSession() 
sess.run(tf.shape(c)) 

array([5, 2, 1], dtype=int32) 
+0

답을 고맙습니다.하지만 tf.tile을 사용한 후 변수 b의 크기가 변합니다. 쓸모없는 데이터가 있기 때문입니다. 그래서 tf.nn.l2_loss (b)를 계산하는 것이 어렵습니다. –

+0

Btw 타일 입력은 텐서가 될 수 있으므로 tf.shape (w)에서 동적으로 쉐이프 arg를 생성 할 수 있습니다. –

+1

tensorflow 1.0에서는 tf.matmul 대신에 'tf.batch_matmul'. – holdenlee

1

당신은 첫 번째 차원에 따른 함수를 검색 map_fn을 사용할 수 있습니다.

x = tf.placeholder(tf.float32, shape=[sequence_length, batch_size, hidden_num]) 
w = tf.get_variable("w", [hidden_num, 50]) 
b = tf.get_variable("b", [50]) 

def mul_fn(current_input): 
    return tf.matmul(current_input, w) + b 

output = tf.map_fn(mul_fn, x) 

I used this at one point

는 순서에 따른 스캔 softmax를 구현한다.