我们如何在 PyTorch 中将线性层的输出提供给 Conv2D?

Posted

技术标签:

【中文标题】我们如何在 PyTorch 中将线性层的输出提供给 Conv2D?【英文标题】:How can we provide the output of a Linear layer to a Conv2D in PyTorch? 【发布时间】:2020-07-26 10:16:47 【问题描述】:

我正在构建一个自动编码器,我需要将图像编码为长度为 100 的潜在表示。我正在为我的模型使用以下架构。

        self.conv1 = nn.Conv2d(in_channels = 3, out_channels = 32, kernel_size=3)
        self.conv2 = nn.Conv2d(in_channels=32,out_channels=64,kernel_size=3,stride=2)
        self.conv3 = nn.Conv2d(in_channels=64,out_channels=128,kernel_size=3,stride=2)

        self.linear = nn.Linear(in_features=128*30*30,out_features=100)

        self.conv1_transpose = nn.ConvTranspose2d(in_channels=128,out_channels=64,kernel_size=3,stride=2,output_padding=1)
        self.conv2_transpose = nn.ConvTranspose2d(in_channels=64,out_channels=32,kernel_size=3,stride=2,output_padding=1)
        self.conv3_transpose = nn.ConvTranspose2d(in_channels=32,out_channels=3,kernel_size=3,stride=1)  

有什么方法可以将Linear 层的输出提供给Conv2DConvTranspose2D 层,以便重建图像?如果我删除 Linear 层,输出将恢复。我想知道如何重建图像并保留Linear

任何帮助将不胜感激。谢谢!

【问题讨论】:

【参考方案1】:

你可以使用另一个线性层:

self.linear2 = nn.Linear(in_features=100, out_features=128*30*30)

然后将输出重塑为 3D 体积并将其传递到您的反卷积层。

【讨论】:

非常感谢!我不敢相信我没有想到这个想法 但是,尽管输出形状具有所需的输出,但我在训练时仍然遇到错误。 RuntimeError: shape '[8, 115200]' is invalid for input of size 2113536。你能看看这里的代码吗 - colab.research.google.com/drive/… 这很奇怪,我尝试了你的代码,它在第一个反卷积层之后返回了正确的暗淡。我有一个张量 torch.Size([n=2, 64, 62, 62]) 您好,感谢您的帮助。尽管已经定义了它们,但我实际上忘记在我的 DataLoader 中实际应用我的转换它现在可以正常工作了。

以上是关于我们如何在 PyTorch 中将线性层的输出提供给 Conv2D?的主要内容,如果未能解决你的问题,请参考以下文章

在 pytorch 中通过具有线性输出层的 RNN 发送的填充批次的掩码和计算损失

如何正确地为 PyTorch 中的嵌入、LSTM 和线性层提供输入?

动手学习pytorch——多层感知机

如何在 Pytorch 中获取神经网络每一层的输出维度?

如何使用 Pytorch 实现将 Alexnet 中的附加输入数据与最后一个 dropout 层的输出连接起来?

Pytorch - 推断线性层 in_features