如果标题中的术语奇怪或不正确,我深表歉意,我尝试参考以下场景:
作为一个最小的例子,我定义一个网络如下:
class Convolution_Layers(nn.Module):
def __init__(self, in, out, kernel):
super(Convolution_Layers, self).__init__()
self.conv2d = nn.Conv2d(in_channels=in, out_channels=out, kernel_size=kernel)
self.conv2d_layers = nn.Sequential(
self.conv2d,
nn.ReLU,
)
forward(self,x):
return self.conv2d_layers(x)
class Network_Model(nn.Module):
def __init__(self):
super(Network_Model, self).__init__()
self.basic_conv = Convolution_layers(1,1,3)
self.subnetwk_1 = nn.ModuleList().append([self.basic_conv])
self.subnetwk_2 = nn.ModuleList().append([self.basic_conv])
def forward(self,x1,x2):
out1, out2 = x1, x2
for l in self.subnetwk_1:
out1 = l(x1)
for l in self.subnetwk_2:
out2 = l(x2)
return out1,out2
我想知道这是否会导致子网 1 和 2 中的权重被共享,因为它们来自同一卷积层实例。
理想情况下,我希望权重是分开的,但只能创建一次基本卷积块,然后在其他地方重复使用它。可能有更好的方法来实现这一点。
您的代码中有一个拼写错误,在附加到模块列表时不应调用该实例。为了回答您的问题,是的,两个子网络将共享相同的权重,因为您附加了一个唯一的实例而不是两个。
“只能创建一次基本卷积块”是什么意思?如果您希望两个子网络共享相同的架构但具有不同的权重,那么您需要初始化两层:
如果您想要单独的子网络但共享它们的参数,您可以使用关键字参数并将唯一的字典多次传递给 init 函数:
或者根据初始化的复杂性,使用辅助函数,也许这就是
self.basic_conv()
代码片段中“”的含义: