在Pytorch上向线性图层添加现有模型

时间:2017-10-02 15:47:46

标签: neural-network deep-learning conv-neural-network pytorch

我尝试将新图层添加到现有网络(作为第一层)并在原始输入上进行训练。当我添加一个卷积层时,一切都很完美,但是当我将它改为线性时,它似乎并不能训练。有什么想法吗? 这是整个网络:

class ActorCritic(torch.nn.Module): #original model
    def __init__(self, num_inputs, action_space):
        super(ActorCritic, self).__init__()
        self.conv1 = nn.Conv2d(num_inputs, 32, 3, stride=2, padding=1)
        self.conv2 = nn.Conv2d(32, 32, 3, stride=2, padding=1)
        self.conv3 = nn.Conv2d(32, 32, 3, stride=2, padding=1)
        self.conv4 = nn.Conv2d(32, 32, 3, stride=2, padding=1)

        self.lstm = nn.LSTMCell(32 * 3 * 3, 256)

        num_outputs = action_space.n
        self.critic_linear = nn.Linear(256, 1)
        self.actor_linear = nn.Linear(256, num_outputs)

    def forward(self, inputs):
        inputs, (hx, cx) = inputs
        x = F.elu(self.conv1(inputs))
        x = F.elu(self.conv2(x))
        x = F.elu(self.conv3(x))
        x = F.elu(self.conv4(x))
        x = x.view(-1, 32 * 3 * 3)
        hx, cx = self.lstm(x, (hx, cx))
        x = hx
        return self.critic_linear(x), self.actor_linear(x), (hx, cx)

class TLModel(torch.nn.Module): #new model
    def __init__(self, pretrained_model, num_inputs):
        super(TLModel, self).__init__()
        self.new_layer = nn.Linear(1*1*42*42, 1*1*42*42)
        self.pretrained_model = pretrained_model

    def forward(self, inputs):
        inputs, (hx, cx) = inputs
        x = F.elu(self.new_layer(inputs.view(-1, 1*1*42*42)))
        return self.pretrained_model((x.view(1,1,42,42), (hx, cx)))

我尝试了不同的激活功能(不仅仅是洗脱)。它适用于conv:

 class TLModel(torch.nn.Module):
    def __init__(self, pretrained_model, num_inputs):
        super(TLModel, self).__init__()
        self.new_layer = nn.Conv2d(num_inputs, num_inputs, 1)
        self.pretrained_model = pretrained_model

    def forward(self, inputs):
        inputs, (hx, cx) = inputs
        x = F.elu(self.new_layer(inputs))
        return self.pretrained_model((x, (hx, cx)))

输入数为1,输入大小为1x1x42x42

2 个答案:

答案 0 :(得分:1)

如果您提供了错误消息,那将非常有用。从你所写的内容来看,我只能猜测你忘了挤压你的输入。您编写的输入大小为1x1x42x42,即它是4维的。 nn.Conv2D需要4维输入。 nn.Linear反而需要二维输入。

因此,在将其提供给您的模型之前,请尝试调用input = input.squeeze()。这将删除单个维度,因此将使您的输入为二维,因为有两个单一维度。

作为旁注,nn.Linear期望输入维batch_size x feat_dim。线性层是否真的对您的数据有意义? 另外需要注意的是,当人们通常在网络中添加图层时,他们最终会将图层添加到网络中,但我相信您有充分的理由这样做,并知道您在做什么:)

祝你好运!

答案 1 :(得分:0)

由于您正在更改前向功能中的视图,因此尺寸不应该成为问题。我认为在网络启动时添加FCN并没有太大的区别,你可以通过删除图层和重新训练网络进行检查,它会产生类似的结果。

试着想象一下,如果你想要检测猫的特征(胡须,耳朵等),你真的不需要来自图像中所有像素的信息,而只需要相邻的像素,所以完全连接层只会使网络复杂化。