我尝试将新图层添加到现有网络(作为第一层)并在原始输入上进行训练。当我添加一个卷积层时,一切都很完美,但是当我将它改为线性时,它似乎并不能训练。有什么想法吗? 这是整个网络:
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
答案 0 :(得分:1)
如果您提供了错误消息,那将非常有用。从你所写的内容来看,我只能猜测你忘了挤压你的输入。您编写的输入大小为1x1x42x42
,即它是4维的。 nn.Conv2D
需要4维输入。 nn.Linear
反而需要二维输入。
因此,在将其提供给您的模型之前,请尝试调用input = input.squeeze()
。这将删除单个维度,因此将使您的输入为二维,因为有两个单一维度。
作为旁注,nn.Linear
期望输入维batch_size x feat_dim
。线性层是否真的对您的数据有意义?
另外需要注意的是,当人们通常在网络中添加图层时,他们最终会将图层添加到网络中,但我相信您有充分的理由这样做,并知道您在做什么:)
祝你好运!
答案 1 :(得分:0)
由于您正在更改前向功能中的视图,因此尺寸不应该成为问题。我认为在网络启动时添加FCN并没有太大的区别,你可以通过删除图层和重新训练网络进行检查,它会产生类似的结果。
试着想象一下,如果你想要检测猫的特征(胡须,耳朵等),你真的不需要来自图像中所有像素的信息,而只需要相邻的像素,所以完全连接层只会使网络复杂化。