PyTorch:访问nn.Sequential()中特定模块的权重
PyTorch: access weights of a specific module in nn.Sequential()
当我在 PyTorch 中使用预定义模块时,我通常可以很容易地访问它的权重。但是,如果我先将模块包装在 nn.Sequential()
中,我该如何访问它们? r.g:
class My_Model_1(nn.Module):
def __init__(self,D_in,D_out):
super(My_Model_1, self).__init__()
self.layer = nn.Linear(D_in,D_out)
def forward(self,x):
out = self.layer(x)
return out
class My_Model_2(nn.Module):
def __init__(self,D_in,D_out):
super(My_Model_2, self).__init__()
self.layer = nn.Sequential(nn.Linear(D_in,D_out))
def forward(self,x):
out = self.layer(x)
return out
model_1 = My_Model_1(10,10)
print(model_1.layer.weight)
model_2 = My_Model_2(10,10)
现在如何打印重量?
model_2.layer.0.weight
无效。
访问权重的一种简单方法是使用模型的 state_dict()
。
这应该适用于您的情况:
for k, v in model_2.state_dict().iteritems():
print("Layer {}".format(k))
print(v)
另一种选择是获取 modules()
迭代器。如果您事先知道图层的类型,这也应该有效:
for layer in model_2.modules():
if isinstance(layer, nn.Linear):
print(layer.weight)
来自PyTorch forum,这是推荐的方式:
model_2.layer[0].weight
您可以使用 _modules
按名称访问模块:
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(3, 3, 3)
def forward(self, input):
return self.conv1(input)
model = Net()
print(model._modules['conv1'])
当我在 PyTorch 中使用预定义模块时,我通常可以很容易地访问它的权重。但是,如果我先将模块包装在 nn.Sequential()
中,我该如何访问它们? r.g:
class My_Model_1(nn.Module):
def __init__(self,D_in,D_out):
super(My_Model_1, self).__init__()
self.layer = nn.Linear(D_in,D_out)
def forward(self,x):
out = self.layer(x)
return out
class My_Model_2(nn.Module):
def __init__(self,D_in,D_out):
super(My_Model_2, self).__init__()
self.layer = nn.Sequential(nn.Linear(D_in,D_out))
def forward(self,x):
out = self.layer(x)
return out
model_1 = My_Model_1(10,10)
print(model_1.layer.weight)
model_2 = My_Model_2(10,10)
现在如何打印重量?
model_2.layer.0.weight
无效。
访问权重的一种简单方法是使用模型的 state_dict()
。
这应该适用于您的情况:
for k, v in model_2.state_dict().iteritems():
print("Layer {}".format(k))
print(v)
另一种选择是获取 modules()
迭代器。如果您事先知道图层的类型,这也应该有效:
for layer in model_2.modules():
if isinstance(layer, nn.Linear):
print(layer.weight)
来自PyTorch forum,这是推荐的方式:
model_2.layer[0].weight
您可以使用 _modules
按名称访问模块:
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(3, 3, 3)
def forward(self, input):
return self.conv1(input)
model = Net()
print(model._modules['conv1'])