2016-12-07 1 views
1

시퀀스의 실제 길이가 주어지면 Mean 연산을 수행하려고합니다. (마스킹 제로 벡터)TensorFlow 동적 길이 평균화

내 입력 sequence_outpus은 (BATCH_SIZE, MAX_LEN, 크기) I 일괄 각 시퀀스의 실제 길이를 저장하는 텐서를

의이다.

lengths = length(sequence_outputs) 
lengths = tf.cast(length, tf.float32) 
lengths = tf.expand_dims(lengths,1) 
sentence_outputs = tf.reduce_sum(sentence_outputs,1)/lengths 

그래프 컴파일을하지만이 NaN 손실 값을 얻고있다 : 나는 이렇게

def length(sequence): 
    used = tf.sign(tf.reduce_max(tf.abs(sequence), reduction_indices=2)) 
    length = tf.reduce_sum(used, reduction_indices=1) 
    length = tf.cast(length, tf.int64) 
    return length 

https://danijar.com/variable-sequence-lengths-in-tensorflow/에서 기능을 사용했다. 또한 eval()로 디버깅 할 때 내 길이가 음수 값이됩니다.

이것은 간단한 문제인 것처럼 보이지만 언젠가는 이것으로 붙어있어 도움이됩니다.

감사합니다.

답변

0

나는 문제가 없습니다. 코드가 약간 지나치게 복잡합니다. 다음 코드

import numpy as np 
import tensorflow as tf 

# creating data 
B = 15 
MAX_LEN = 4 
data = np.zeros([B, MAX_LEN], dtype=np.float32) 

for b in range(B): 
    current_len = np.random.randint(2, MAX_LEN) 
    current_vector = np.concatenate([np.random.randn(current_len), np.zeros(MAX_LEN - current_len)], axis=-1) 
    print("{}\t\t{}".format(current_vector, current_vector.shape)) 
    data[b, ...] = current_vector 

data_op = tf.convert_to_tensor(data) 


def tf_length(x): 
    assert len(x.get_shape().as_list()) == 2 
    length = tf.count_nonzero(x, axis=1, keepdims=True) 
    return length 


x = tf.reduce_sum(data_op, axis=1)/tf_length(data_op) 

# test gradients 
grads = tf.gradients(tf.reduce_mean(x), [data_op]) 

with tf.Session() as sess: 
    print sess.run(grads) 

아무 NaN도없이 완벽하게 실행됩니다. 정말이 코드를 사용하고 있습니까? 추측 할 필요가 있다면, 나는 당신의 시퀀스 길이 계산 어딘가에 tf.abs을 잊었을 것입니다.

을 알고 있어야합니다.이 게시물의 길이 함수와 tf_length은 시퀀스에 0이 아닌 값으로 가정합니다. 순서 길이 계산은 데이터 생성자의 작업으로 계산 그래프에 입력해야합니다. 다른 모든 것, 나는 해킹 된 해결책으로 생각합니다.