我是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/