如何改变Pytorch预训练网络的激活层?下面是我的代码:
print("All modules")
for child in net.children():
if isinstance(child,nn.ReLU) or isinstance(child,nn.SELU):
print(child)
print('Before changing activation')
for child in net.children():
if isinstance(child,nn.ReLU) or isinstance(child,nn.SELU):
print(child)
child=nn.SELU()
print(child)
print('after changing activation')
for child in net.children():
if isinstance(child,nn.ReLU) or isinstance(child,nn.SELU):
print(child)
以下是我的输出:
All modules
ReLU(inplace=True)
Before changing activation
ReLU(inplace=True)
SELU()
after changing activation
ReLU(inplace=True)
5条答案
按热度按时间wvmv3b1j1#
._modules
为我解决了这个问题。dhxwm5r42#
以下是用于替换任何图层的通用函数
我为此挣扎了几天,所以,我做了一些挖掘&写了一个kaggle notebook,解释了在pytorch中如何访问不同类型的层/模块。
ldxq2e6h3#
默认的pytorch API对我来说很好用:
model.apply(lambda m: replace_layer(m, nn.Relu, nn.Hardswish(True)))
将替换层并打印“trace”:
t9aqgxwy4#
我假设你使用模块接口
nn.ReLU
来创建激活层,而不是使用函数接口F.relu
。如果是这样,setattr
对我来说是有效的。monwx1rj5#
我将提供一个更通用的解决方案,适用于任何层(并避免其他问题,如在循环遍历字典时修改字典,或者在彼此内部存在递归的
nn.modules
时修改字典)。关键是您需要递归地不断更改图层(主要是因为有时候你会遇到属性本身就有模块的情况)。我认为比上面更好的代码是再加一个if语句(在批处理规范之后)检测是否必须递归,如果必须递归,则递归。上面的工作是,但首先更改外层上的批处理规范(即第一个循环),然后用另一个循环确保没有遗漏其他应该被递归的对象(然后递归)。
原文:https://discuss.pytorch.org/t/how-to-modify-a-pretrained-model/60509/10