我能够在Tensorflow中训练RNN以生成给定长度的正弦波。 例如:当我给出44100个零采样的输入向量时,我将得到44100个以正弦波作为输出的采样。
问题在于,它非常很慢。在配备GeForce 1080Ti的Ryzen 7 2700x上,以44100 / s的采样率生成 3 秒的音频采样需要 22.75 秒,并且我正在使用docker在GPU支持下运行tensorflow。
我显然在这里做错了。
这是我的神经网络架构。没有什么花哨。仅有1个隐藏的递归层,其中OutputProjectionWrapper覆盖了100个神经元,可以从网络获得单个输出:
这是我建立该网络的代码:
# batch size, samples, num_inputs
X = tf.placeholder(tf.float32,[None, None, num_inputs])
# batch size, samples, num_outputs
y = tf.placeholder(tf.float32,[None, None, num_outputs])
# RNN CELL LAYER
cell = tf.contrib.rnn.BasicLSTMCell(num_units=num_neurons,activation=tf.nn.relu)
cell = tf.contrib.rnn.OutputProjectionWrapper(cell,output_size=num_outputs)
outputs, states = tf.nn.dynamic_rnn(cell,X,dtype=tf.float32)
运行RNN的代码:
with tf.Session() as sess:
saver.restore(sess, './rnn_model')
X_new = np.zeros(data_length).reshape(-1,data_length,1)
y_pred = sess.run(outputs, feed_dict={X:X_new})
我可以绘制一个生成的正弦波的漂亮图形,所以我知道我的代码输出正确的结果,但性能却很差。
训练也很慢。这是我的培训代码:
loss = tf.reduce_mean(tf.square(outputs - y))
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)
train = optimizer.minimize(loss)
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
X_batch, y_batch = (rnn_input.reshape(-1, samples_in_batch, 1), sine_values.reshape(-1, samples_in_batch, 1))
for iteration in range(num_train_iterations):
sess.run(train, feed_dict={X:X_batch, y:y_batch})
if(iteration%100==0):
mse = loss.eval(feed_dict={X:X_batch, y:y_batch})
print(iteration,'\t', mse)
saver.save(sess, "./rnn_model")
在对RNN进行评估期间,我的机器似乎工作不多。看起来更像是使用CPU的单核,甚至风扇速度也没有增加太多。