如何为 4 维权重生成 4 维输入?

How to produce 4-dimensional input for 4-dimensional weight?

我对深度学习还很陌生。我正在处理 CIFAR10 数据集并创建了如下所示的 CNN 模型。

class Net2(nn.Module):
  def __init__(self):
    super(Net2, self).__init__()
    self.conv1 = nn.Conv2d(3, 32, 5, 1)
    self.fc1 = nn.Linear(32 * 5 * 5, 512)
    self.fc2 = nn.Linear(512,10)


  def forward(self, x):
    x = x.view(x.size(0), -1)
    x = F.max_pool2d(F.relu(self.conv1(x)),(2,2))
    x = F.relu(self.fc1(x))
    x = self.fc2(x)
    return x
    

net2 = Net2().to(device)

我的作业要求是创建一个模型:

具有 32 个过滤器的卷积层,内核大小为 5x5,步幅为 1。
最大池化层,内核大小为 2x2,默认步长。
ReLU 激活层。
输出为 512.
的线性层 ReLU 激活层。
输出为 10.

的线性层

我想我写的。但我假设我走错了路。请帮助我编写正确的模型以及 Conv2d 和线性层中这些参数背后的原因。

我从我的代码中得到的错误如下:

RuntimeError: Expected 4-dimensional input for 4-dimensional weight [32, 3, 5, 5], but got 2-dimensional input of size [1024, 3072] instead

请帮帮我!

代码有两个问题:

  1. 输入的扁平化

    x = x.view(x.size(0), -1)
    

    卷积层需要一个维度为(N, C, H, W)的四维输入,其中N是批量大小,C = 3是通道数,(H, W)是维度的图像。通过使用上述语句,您将 (1024, 3, 32, 32) 输入展平为 (1024, 3072)。

  2. 第一个线性层的输入特征数

    self.fc1 = nn.Linear(32 * 5 * 5, 512)
    

    输入为 (1024, 3, 32, 32) 的卷积层的输出维度为 (1024, 32, 28, 28),应用 2 x 2 最大池化后,为 (1024, 32、14、14)。所以线性层的输入特征数量应该是 32 x 14 x 14 = 6272.