Tensorflow 使用的内存越多,它完成的 epoch 越多

数据挖掘 Python 张量流
2022-02-09 16:16:35

我为 Tensorflow 创建了一个遗传算法“优化器”,但它是用 python 编写的。我知道 TensorFlow 不是这样设计的,我需要使用他们的 API 在 C++ 中创建优化器,但我只是在我已经编写了优化器之后才发现它,而且我真的没有时间研究如何创建一个 tf.train.Optimizer()。我的 GA“优化器”并不是真正的优化器,因为它更像是一个 tf.Variable.assign() 调用。请参阅下面的代码

“优化器”在进化发生后更新了一系列权重矩阵变量。每个变量代表两层之间的权重矩阵。如果它是一个具有输入、一个隐藏层和输出的网络,那么将有两个变量。输入到隐藏然后隐藏到输出之间的权重。虽然这是一个 2d 矩阵,但我的权重在我的人口中充当一个个体,所以我有一个 3d 矩阵。1维表示人口数量,2d矩阵作为权重。然后通过交叉或变异来完成权重更新,其中包括许多乘法、matmul 和求和操作。我的猜测是我为新图层创建的变量不是垃圾收集的。我猜 tensorflow 使变量保持活动状态,因为自从我创建了自己的类以来,我从未调用过 tf.train.Optimzer 类提供的训练步骤。

这是我运行 GA 优化器的代码

for i in range(epochs):
    sess.run(fitness_per_individual, feed_dict={x: train_data, y: train_labels},
                 options=run_options,
                 run_metadata=run_metadata)    
    evolved_layers = evolve_layer(nn_layers, fitness_per_individual, population)
    for tensor_idx in range(len(nn_layers)):
        layer = nn_layers[tensor_idx]
        evolved_layer = evolved_layers[tensor_idx]
        layer = layer.assign(evolved_layer)

        # I don't have to feed my training data again I just do it here to keep tensorflow happy.
        sess.run(layer, feed_dict={x: train_data, y: train_labels},
                 options=run_options,
                 run_metadata=run_metadata)

有没有办法可以处理由 tf.multiply 创建的变量矩阵,或者如果不创建 tf.train.Optimizer 就没有办法解决它。还有一个我可以阅读 TensorFlow 的良好实践指南。

1个回答

似乎您正在将节点添加到此行中的计算图中:layer = layer.assign(evolved_layer). -assign操作就像图中的一个节点的乘法或加法一样,您在每一步都构造一个新节点。tf.Graph.finalize()定义模型后调用。每当将节点添加到图中时,这都会引发错误并帮助您调试代码。理想情况下,您希望在构建后修复图表。我怀疑您会在优化器中遇到错误。

您希望在运行训练循环之前定义所有操作,然后只运行相应的节点。在您的情况下,您将layer_assign = layer.assign(evolved_layer)在循环之前定义并且在循环中仅使用sess.run(layer_assign). 当然,您必须以evolve_layers相同的方式处理所有操作。