优化大图的子图 - 比自身优化子图慢

use*_*261 9 python 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)
Run Code Online (Sandbox Code Playgroud)

这里的目标是迭代地优化变量1和变量2.变量2的权重用于计算损失1,但是在优化损失1时它们是不可训练的.同时,变量1的权重不用于优化损失2(我会说这是一个关键的不对称).

奇怪的是,我发现,优化器2的这种优化要慢得多(2倍),而不是仅仅优化图的那部分.我没有运行任何摘要.

为什么会出现这种现象?我该怎么办呢?如有必要,我可以提供更多细节.

Pet*_*man 1

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

如果我的猜测是正确的,那么这意味着第二个模型正在使用第一个模型的输出作为其输入。不可否认,我对 PyTorch 的了解比 TF 更多。我相信有一条评论说第一个模型可以包含在第二个图中。我也认为这是事实。我会实现类似于以下内容的东西。最重要的部分是创建没有图的 generated_tensor 的副本:

// 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)
Run Code Online (Sandbox Code Playgroud)

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