我有一个非常大的张量图,并且有两组变量: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的优化比我自己单独优化图的那部分要慢得多(2倍)。我没有任何摘要。
为什么会发生这种现象?我该如何解决?如有必要,我可以提供更多详细信息。
答案 0 :(得分:0)
我猜这是一个由损失和参数之间的关系给出的生成对抗网络。似乎第一组参数是生成模型,第二组参数组成了检测器模型。
如果我的猜测是正确的,那么这意味着第二个模型使用第一个模型的输出作为其输入。诚然,与 TF 相比,我对 PyTorch 的了解要多得多。我相信有一条评论是说第一个模型可以包含在第二个图表中。我也认为这是真的。我将实施类似于以下内容的内容。最重要的部分是创建一个没有图的 generate_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)
我希望这会有所帮助。如果有人知道如何在 TF 中做到这一点,那可能会非常宝贵。