我試圖在Tensorflow中實現overlap-add,但我努力將numpy output_seq[start:end] += chunk
轉換爲Tensorflow。現在我是output_seq = output_seq + tf.pad(chunk, [[start, length - end]])
,但是這對於長序列來說確實很慢。Tensorflow高效重疊添加
我也有一種預感,可能有一些技巧可以用來收集/分散,但我無法弄清楚。下面是我的蠻力嘗試:
import tensorflow as tf
input = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
def overlap_add(overlap):
with tf.Graph().as_default(), tf.Session() as sess:
x = tf.constant(input)
num_chunks = tf.shape(x)[0]
chunk_size = tf.shape(x)[1]
hop_length = chunk_size - overlap
out_len = chunk_size + hop_length * (num_chunks - 1)
y = tf.zeros((out_len,), dtype=tf.int32)
def body(i, y):
j = i * hop_length
padding = [[j, out_len - (j + chunk_size)]]
chunk = x[i]
y = y + tf.pad(chunk, padding)
return (i + 1, y)
i = tf.constant(0)
i, y = tf.while_loop(
cond=lambda i, _: tf.less(i, num_chunks),
body=body,
loop_vars=[i, y])
return sess.run(y)
for i in range(4):
print 'overlap_add(%d): %s' % (i, overlap_add(i))
# overlap_add(0): [ 1 2 3 4 5 6 7 8 9 10 11 12]
# overlap_add(1): [ 1 2 3 9 6 7 17 10 11 12]
# overlap_add(2): [ 1 2 8 10 16 18 11 12]
# overlap_add(3): [ 1 7 18 21 19 12]
謝謝!這就提出了'Sliced賦值只支持變量'。我將'y'改爲tf.Variable,但在while_loop體內,'y'不再是一個變量,而是' dtype = int32>',錯誤依然存在。 –