Python 优化大图的子图-比单独优化子图慢

Python 优化大图的子图-比单独优化子图慢,python,tensorflow,Python,Tensorflow,我有一个非常大的tensorflow图和两组变量:a和B。我创建了两个优化器: learning_rate = 1e-3 optimizer1 = tf.train.AdamOptimizer(learning_rate).minimize(loss_1, var_list=var_list_1) optimizer2 = tf.train.AdamOptimizer(learning_rate).minimize(loss_2, var_list=var_list_2) 这里的目标是迭代优化

我有一个非常大的
tensorflow
图和两组变量:a和B。我创建了两个优化器:

learning_rate = 1e-3
optimizer1 = tf.train.AdamOptimizer(learning_rate).minimize(loss_1, var_list=var_list_1)
optimizer2 = tf.train.AdamOptimizer(learning_rate).minimize(loss_2, var_list=var_list_2)
这里的目标是迭代优化变量1和变量2。变量2的权重用于计算损失1,但在优化损失1时,它们不可训练。同时,变量1的权重没有用于优化损失2(我认为这是一个关键的不对称性)

奇怪的是,我发现对
optimizer2
的优化要比我单独优化图形的这一部分慢得多(2x)。我没有做任何总结


为什么会出现这种现象?我怎样才能修好它?如果需要,我可以提供更多细节。

我猜这是一个由损失和参数之间的关系给出的生成性对抗网络。似乎第一组参数是生成模型,第二组参数构成检测器模型

如果我的猜测是正确的,那就意味着第二个模型使用第一个模型的输出作为输入。诚然,我比TF更了解Pytork。我相信有一条评论说第一个模型可以包含在第二个图表中。我也认为这是真的。我将实现类似于下面的内容。最重要的部分是创建生成的_张量的副本,而不使用图形:

// An arbitrary label
label = torch.Tensor(1.0)

// Treat GenerativeModel as the model with the first list of Variables/parameters
generated_tensor = GenerativeModel(random_input_tensor)
// Treat DetectorModel as the model with the second list of Variables/parameters
detector_prediction = DetectorModel(generated_tensor)

generated_tensor_copy = torch.tensor(generated_tensor, requires_grad=False)
detector_prediction_copy = DetectorModel(generated_tensor_copy)

//This is for optimizing the first model, but it has the second model in its graph
// which is necessary.
loss1 = loss_func1(detector_prediction, label)
// This is for optimizing the second model. It will not have the first model in its graph
loss2 = loss_func2(detector_prediction_copy, label)

我希望这是有帮助的。如果有人知道如何在TF中做到这一点,那可能是非常宝贵的。

你是说
loss\u 2
完全独立于
var\u list\u 1
?如果是这样,它可能与硬件有关,例如CPU上的缓存未命中或图形在GPU上的共享内存中交换。是的,loss_2完全独立于var_列表_1(loss_1与var_列表_2无关,但在优化loss_1时var_列表_2的var被锁定)。我不知道为什么这会是一个硬件问题。许多优化损失_2的迭代都是连续发生的,因此大多数优化都应该缓存它。出于类似的原因,我不知道为什么会有很多GPU内存的进出。你如何衡量第二个优化步骤的运行时间?你的意思是,如果按原样删除第二行,那么第二个优化步骤将花费大约两倍的时间来达到某个目标范围?优化每次迭代的壁时间。如果我在loss_2上单独运行优化器,则在loss_2上运行优化器所需的时间是构建loss_1时运行优化器所需时间的一半。也许它是以使用完整图(内存中)的方式实现的,无法避免目标图外区域的额外开销,因为在一般情况下,这会带来太多的开销(例如,需要在内存中构建一个新的图形并来回复制)。显然,构建图形的其他部分会带来一定的开销。这是一个古老的问题,我希望了解TF内部工作原理的人能够解决这个问题,因为我不知道这些图形编译问题的真正原因是什么。但是,FWIW,这不是一个GAN。你能在你的问题中发布一个产生这个问题的示例图吗?