我是pytorch的新手,我想使用Vgg进行迁移学习。
我想删除完全连接的层并添加一些新的完全连接的层。另外,我想使用灰度输入而不是RGB输入。为此,我将添加输入层的权重并获得一个权重。因此,将添加三个通道的权重。

我实现了删除完全连接的图层的操作,但是在使用灰度部件时遇到了麻烦。我将三个权重加在一起,形成一个新的权重。然后我尝试更改vgg模型的状态字典,但这给了我错误。网络代码如下:

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
    vgg=models.vgg16(pretrained = True).features[:30]

    w1=vgg.state_dict()['0.weight'][:,0,:,:] #first channel of first input layer's weight
    w2=vgg.state_dict()['0.weight'][:,1,:,:]
    w3=vgg.state_dict()['0.weight'][:,2,:,:]
    w4=w1+w2+w3 # add the three weigths of the channels
    w4=w4.unsqueeze(1) # make it 4 dimensional

    a=vgg.state_dict()#create a new statedict
    a['0.weight']=w4 #replace the new state dict's weigt

    vgg.load_state_dict(a) # this line gives the error,load the new state dict

    self.vgg =nn.Sequential(vgg)
    self.fc1 = nn.Linear(14*14*512, 1000)
    self.fc2 = nn.Linear(1000, 2)

def forward(self, x):
    x = self.vgg(x)
    x = x.view(-1, 14 * 14 * 512)
    x = F.relu(self.fc1(x))
    x = self.fc2(x)
    return x

这将产生以下错误:

RuntimeError:加载state_dict的顺序错误:大小
0.weight不匹配:复制形状为torch.Size([64,1,
3,3])从检查点开始,当前模型中的形状为torch.Size([64,
3,3,3])。

因此,不允许我用其他尺寸的砝码代替砝码。是否有解决此问题的方法,或者我可以尝试其他方法。我要做的就是使用vgg的图层直到完全连接的图层并更改第一层的权重。

最佳答案

您尚未指定VGG类的来源,但我认为它来自torchvision.models

为具有3个通道的图像创建了VGG模型。您可以在 make_layers method on GitHub中看到它。

修改torchvision软件包中的代码可能不是一个好主意,但是您可以在项目中创建一个副本,并使in_channels可设置。

关于python-3.x - Pytorch灰度输入到Vgg,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57296799/

10-09 09:11