pytorch Conv2d的_channels发生变化,但Conv2d的权重形状不变?

vpfxa7rd  于 2023-01-26  发布在  其他
关注(0)|答案(1)|浏览(203)
layer = nn.Conv2d(in_channels=1, out_channels=2, kernel_size=(2,2), stride=(2,2))
layer.in_channels=2
print(layer)
print(layer.weight.shape)

我正在尝试修改pytorch模型中的resnet18以用于我自己的工作。定义的resnet18是用于RGB图像的,开始时有3个通道。我想将其更改为用于灰度图像的1个通道。但是,我发现一个问题,改变in_channels参数不能改变权重形状。所以修改后的模型不能正常运行。为什么权重不会相应地改变?我怎样才能解决这个问题呢?这里我举了一个简单的例子来说明这个问题。
输出为:

Conv2d(2, 2, kernel_size=(2, 2), stride=(2, 2))
torch.Size([2, 1, 2, 2])

如您所见,虽然in_channels已从1更改为2,但in_channels的权重形状仍为1。

RuntimeError: Given groups=1, weight of size [64, 3, 7, 7], expected input[2, 1, 224, 224] to have 3 channels, but got 1 channels instead

这是当我将conv1 resnet18的in_channels从3修改为1时控制台显示的内容。正如我所说,我认为这是由于权重形状没有相应地更改。

vfh0ocws

vfh0ocws1#

也可以更改层本身的权重。

layer = nn.Conv2d(in_channels=1, out_channels=2, kernel_size=(2,2), stride=(2,2))
layer.in_channels=2
layer.weight = torch.nn.Parameter(torch.ones(2,2,2,2))
print(layer)
print(layer.weight.shape)

输出:

Conv2d(2, 2, kernel_size=(2, 2), stride=(2, 2))
torch.Size([2, 2, 2, 2])

相关问题