我正在写一个程序,使用单词嵌入,然后在一个简单的CNN上训练它。嵌入的dim等于768,隐藏的dim等于100。我使用PyTorch Conv2d:
创建嵌入后,这是init()部分:
self.conv = nn.Conv2d(1, params.hidden_dim, kernel_size=(3, params.embedding_dim))
nn.init.xavier_uniform_(self.conv.weight)
nn.init.constant_(self.conv.bias, 0.0)
self.fc = nn.Linear(params.hidden_dim, params.num_of_tags)
这是forward()部分:
print(x.shape) # [4, 39, 768]
x = x.unsqueeze(1)
x = self.conv(x).squeeze(3)
x = x.permute(0, 2, 1)
print(x.shape) # [4, 37, 100]
x = x.contiguous()
x = x.view(-1, x.shape[2])
x = self.dropout(x)
x = self.fc(x)
我真的不明白为什么形状会改变(见印刷品)。这是在句子的字数(已经填补,所以在所有4个句子有相同的字数)。
有没有人知道为什么形状会改变,以及如何避免它?
我尝试在最后填充x,但我想这没有意义,因为我可能会丢失重要的输入(两个删除的单词)。我希望形状保持不变。
2条答案
按热度按时间zujrkrfu1#
使用卷积核〉1时,会“丢失”部分信号。例如,如果核大小为3,则需要三个输入特征来计算每个输出特征。在这种情况下,与第一个输入特征对应的输出特征会发生什么情况?此输出特征在其receptive field中没有三个输入特征。
要保持相同大小的输出,您需要填充输入。请尝试:
vsnjm48y2#
输出层的形状会自动减小。这样可以获得性能更好的模型并避免过度学习。它还可以使训练更快更容易。但是,如果您仍然希望具有相同的输入和输出层,可以执行以下操作:
这样做不太明智...