在一个优化器中设置多个网络参数的写法

框架:pytorch

在使用神经网络的时候有时候会将几个不同的神经网络组合,再采用梯度下降更新参数,那么在设置优化器的时候该如何将多个神经网络的参数进行融合呢?目前网络上的大部分信息都是采用Itertools.chain()将参数融合在一起:

import itertools 
... 
optimizer = optim.Adam(itertools.chain(model1.parameters(), model2.parameters())) 
...
这里涉及到两个知识点,Itertools.chain()和pytorch神经网络的参数

1. Itertools.chain()

链接
Python Itertools.chain()用法及代码示例
将所有可迭代对象组合在一起,并生成一个可迭代对象作为输出。它的输出不能直接使用,因此不能显式转换为可迭代对象。

from itertools import chain 
# some consonants 
consonants =['d', 'f', 'k', 'l', 'n', 'p'] 
# some vowels 
vowels =['a', 'e', 'i', 'o', 'u'] 
# resultatnt list 
res = list(chain(consonants, vowels)) 
# sorting the list 
res.sort() 
print(res)

2. pytorch神经网络的参数

在一个优化器中设置多个网络参数的写法_第1张图片
parameters()函数返回的是一个Module.parameters的对象,实际上相当于参数的容器,而itertools.chain()是将多个模型的参数整合进一个新的容器内。
但是我遇到的一个问题是我的模型的个数不止一个,并且数量是不固定的,而上述方法中又需要把每个模型的参数一一放进itertools.chain()函数中,所以一开始把多个模型的参数统一放进一个列表中,然后把列表传入itertools.chain()函数,但是并不可以,原因是优化器需要传入的参数是一组tensor,但是采用上述方法传入的是Module.parameters的对象,所以此路不通。
考虑到list(net.parameters())实际上就是将Module.parameters解析成模型参数张量的列表,那么直接对参数进行组合:

optimizer = optim.Adam(list(model1.parameters())+list(model2.parameters())) 

你可能感兴趣的:(网络,神经网络,深度学习,pytorch)