Python 将数据加载到占位符一次,然后运行多个计算

Python 将数据加载到占位符一次,然后运行多个计算,python,tensorflow,Python,Tensorflow,问题: 如何将数据加载到占位符中一次,然后对占位符中的数据运行多个计算 用例 我有100个相同形状的numpy数组A1,…,A100。 目标函数取决于输入数据和变量数组B。 例如,A1的损失函数可以是'loss_1=np.sumA_1+np.sumB_1'。 对于每个An,我想找到使相应损失函数lossn最小化的变量Bn数组。 结果应该是100个变量数组,它们是:B1,…,B100 我想加载A1,找到B1,然后对数组的其余部分重复 尝试1 使用tf.constant加载A数组将导致内存不足。在我

问题:

如何将数据加载到占位符中一次,然后对占位符中的数据运行多个计算

用例

我有100个相同形状的numpy数组A1,…,A100。 目标函数取决于输入数据和变量数组B。 例如,A1的损失函数可以是'loss_1=np.sumA_1+np.sumB_1'。 对于每个An,我想找到使相应损失函数lossn最小化的变量Bn数组。 结果应该是100个变量数组,它们是:B1,…,B100 我想加载A1,找到B1,然后对数组的其余部分重复

尝试1

使用tf.constant加载A数组将导致内存不足。在我加载A1并找到B1之后。加载A2时,A1仍将保留在GPU的内存中。一段时间后,程序将耗尽GPU的所有内存

尝试2

使用占位符,并在最小化的每个步骤中加载相同的数据。这会很慢,因为向GPU传输数据很慢

import tensorflow as tf

x = tf.placeholder("float", None)
y = x * 2

with tf.Session() as session:
    for j in range(100):  # Iterate over the 100 A arrays
        A_n = [1, 2, 3]  # The 100 different A arrays.
        for i in range(300):  # Steps of one minimization
            # Why do I have to feed the same data for 300 times??
            result = session.run(y, feed_dict={x: A_n})
            print(result)

这可以通过将x转换为变量来实现。TF 1.X中的变量通过Session.run显式运行其初始值设定项进行初始化。因此,您只需使用占位符初始化变量x:

x_init = tf.placeholder(tf.float32, shape=(3, ))
x = tf.Variable(x_init)
y = x * 2

with tf.Session() as sess:
    for j in range(100):
        A_n = [j, j + 1, j + 2]
        # Reinitialize `x` with the new A_n.
        sess.run(x.initializer, feed_dict={x_init: A_n})
        # `x` is initialized and therefore there is nothing to feed.
        for i in range(300):
            result = sess.run(y)
            print(result)

请注意,这假设A\u n的形状相同。

不能将tf.global\u variables\u初始值设定项用于此方法。这意味着我必须手动初始化优化器的内部变量。我遇到了这个问题:我不建议使用tf.global\u variables\u初始值设定项。答案中的片段只重新初始化了x。这是真的。您的答案在没有tf.global\u variables\u初始值设定项的情况下有效。但我需要重用优化器以避免内存不足错误。如果我不使用tf.global\u variables\u初始值设定项,优化器的行为会非常奇怪。我在这里问了另一个问题:找到了一个解决方案:session.runtf.global\u variables\u initializer,feed\u dict=。。。但是重用优化器仍然会导致奇怪的行为。备选方案: