我为 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 的良好实践指南。