框架: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神经网络的参数
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()))