Это псевдокод моей программы:
data = float32[100000]
wid = 72 // a moving window to process the data
B, C = float32[72] // use to process data
result = float32[99928]
for i = 0 : length(data) - wid // the main loop
w = data[i : i + wid] // cut a window of data
w = w / mean(w[0 : wid/2]) // a simple scaling
tmp1 = sum((B - w).^2)
tmp2 = sum((C - w).^2)
result[i] = tmp1 / tmp2
end
И я пишу следующий код tensorflow 1.13.2, используя while_l oop для основного l oop и TensorArray для записи результат:
import numpy as np;
import tensorflow as tf;
import time;
def cond(result, i, len, hwid, data, B, C):
return i < len-2*hwid;
def body(result, i, len, hwid, data, B, C):
w = data[i : i+2*hwid ] / tf.reduce_mean(data[i : i+hwid]);
tmp = tf.cast(tf.reduce_sum((B-w)**2)/tf.reduce_sum((C-w)**2), tf.float32);
result = result.write(i, tmp);
i += 1;
return result, i, len, hwid, data, B, C
hwid = 36;
len = 30000;
with tf.device('/cpu:0'):
data = tf.Variable(np.float32(np.random.rand(len)));
B = tf.Variable(np.float32(np.random.rand(1, 2*hwid)));
C = tf.Variable(np.float32(np.random.rand(1, 2*hwid)));
result = tf.TensorArray(tf.float32, len - 2*hwid + 1);
tmp3 = tf.while_loop(cond, body, [result, 0, len, hwid, data, B, C])[0].stack();
t0 = time.clock();
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
res = tmp3.eval();
print(time.clock() - t0);
Кажется, этот код довольно неэффективен, запускайте код с GPU, даже в несколько раз медленнее, чем CPU. Как его улучшить?