我在看CycleGAN的官方pytorch实现,在那里,作者链接了两个网络的参数,并为两个网络使用了一个单独的优化器。这是怎么回事?这比为两个不同的网络使用两个不同的优化器更好吗?
all_params = chain(module_a.parameters(), module_b.parameters())
optimizer = torch.optim.Adam(all_params)
发布于 2020-05-17 11:18:50
来自chain
文档:https://docs.python.org/3/library/itertools.html#itertools.chain
itertools.chain(*iterables)
Make an iterator that returns elements from the first iterable until it is exhausted, then proceeds to the next iterable, until all of the iterables are exhausted.
由于parameters()
提供了一个迭代器,因此您可以使用优化器同时优化这两个网络的参数。因此,两个模型(Modules
)将使用相同的优化器状态,如果您使用两个不同的优化器,则参数将分别优化。
如果您有一个复合网络,则有必要同时优化(所有)参数,因此对所有参数使用一个优化器是可行的。
发布于 2021-05-14 00:17:00
由于“循环”的原因,同时优化两个发电机(并增加两个损失)是有意义的。循环损耗使用两个生成器- G_B(G_A(A))
和G_A(G_B(B))
。我认为,如果您要使用单独的优化器,则需要在调用step()
之前对这两个损失调用backward()
才能达到相同的效果(对于所有优化算法,这不一定都是真的)。
在官方代码中,鉴别器的参数也是链接的,但您可以很容易地使用单独的优化器(同样,对于其他优化算法,这不一定是真的),因为D_A的损失不依赖于D_B。
https://stackoverflow.com/questions/61846505
复制相似问题