我正在 Python while 循环中训练神经网络,该循环将持续到达到某个停止条件为止。我注意到,当我训练网络时,我可以看到“锯齿”/类似波浪的内存使用模式,如下所示:
我已经成功地使用比我的生产模型简单得多的示例来重现这一点。显然,这有些不同,因为我不更新参数,但我相信它复制了我所看到的行为。
import tensorflow as tf
import numpy as np
def main(x_vals):
x = tf.placeholder(tf.float32, [500, 1000, 1000])
rs = tf.reduce_sum(x)
sess = tf.Session()
v = sess.run(rs, feed_dict={x:x_vals})
print(v)
if __name__ == "__main__":
x_vals = np.random.rand(500, 1000, 1000)
while True:
main(x_vals)
锯齿的大小似乎与输入数据的大小大致成比例。可以理解的是,每次循环迭代似乎都有一个周期。
这里发生了什么? Tensorflow 是否会复制我在每次 session 评估中的所有数据?这本身不是问题,但如果我可以避免在每次训练循环迭代中复制数据(因为我的整个数据集适合内存),我想这样做,因为我认为分配非常昂贵。我是否在某些地方偏离了最佳实践?
最佳答案
使用 feed_dict 通常会复制数据。最近添加了新功能,可以避免复制,但您必须确保您的数据是字对齐的,请参阅
中的讨论
https://github.com/tensorflow/tensorflow/issues/9690
关于python - 训练循环迭代期间 Tensorflow 锯齿形内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43947241/