gpt4 book ai didi

python - 如何重构 cnn 层的输出张量以供简单的 pytorch 模型中的线性层使用

转载 作者:行者123 更新时间:2023-12-05 02:48:54 26 4
gpt4 key购买 nike

给定一个具有维度的 pytorch 输入数据集:

dat.shape = torch.Size([128, 3, 64, 64])

enter image description here

这是一个监督学习问题:我们有一个单独的 labels.txt 文件,其中包含用于每个输入观察的 C 类之一。 C 的值是根据 labeles 文件中不同值的数量计算的,目前为个位数。

我可以在如何对执行多类分类的卷积层和线性层网络的简单混合网络的层进行网格化方面寻求帮助。意图是通过:

  • 两个 cnn 层,每个层后都有最大池化
  • 线性“读出”层
  • 在输出/标签之前激活 softmax

这是我的(故障/损坏的)网络的核心。我无法确定所需的正确尺寸/形状:

 Output of Convolutional layer -> Input of Linear [Readout] layer
class CNNClassifier(torch.nn.Module):

def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(3, 16, 3)
self.maxpool = nn.MaxPool2d(kernel_size=3,padding=1)
self.conv2 = nn.Conv2d(16, 32, 3)
self.linear1 = nn.Linear(32*16*16, C)
self.softmax1 = nn.LogSoftmax(dim=1)

def forward(self, x):
x = self.conv1(x)
x = self.maxpool(F.leaky_relu(x))
x = self.conv2(x)
x = self.maxpool(F.leaky_relu(x))
x = self.linear1(x) # Size mismatch error HERE
x = self.softmax1(x)
return x

模型的训练开始于:

        Xout = model(dat)

这导致:

RuntimeError: size mismatch, m1: [128 x 1568], m2: [8192 x 6]

linear1 输入。这里需要什么?注意我已经看到通配符输入大小的使用,例如通过 view:

    ..
x = x.view(x.size(0), -1)
x = self.linear1(x) # Size mismatch error HERE

如果包含,则错误更改为

RuntimeError: size mismatch, m1: [28672 x 7], m2: [8192 x 6]

非常感谢有关如何考虑和计算 cnn 层/线性层输入/输出大小的一些指示。

最佳答案

错误

您计算错了卷积堆栈的输出大小。它实际上是 [batch, 32, 7, 7] 而不是 [batch, 32, 16, 16]

您必须使用 reshape(或 view),因为 Conv2d 的输出有 4 个维度([batch, channels, width , height]),而 nn.Linear 的输入需要有 2 个维度 ([batch, features])。

将此用于 nn.Linear:

self.linear1 = nn.Linear(32 * 7 * 7, C)

这在 forward 中:

x = self.linear1(x.view(x.shape[0], -1))

其他可能性

当前的新架构使用跨 channel 池化(通常称为全局池化)。在 PyTorch 中有一个 torch.nn.AdaptiveAvgPool2d (或 Max 池化)。使用这种方法可以使输入图像的高度和宽度大小可变,因为每个 channel 只有一个值用作 nn.Linear 的输入。这是它的样子:

class CNNClassifier(torch.nn.Module):
def __init__(self, C=10):
super().__init__()
self.conv1 = nn.Conv2d(3, 16, 3)
self.maxpool = nn.MaxPool2d(kernel_size=3, padding=1)
self.conv2 = nn.Conv2d(16, 32, 3)
self.pooling = torch.nn.AdaptiveAvgPool2d(output_size=1)
self.linear1 = nn.Linear(32, C)
self.softmax1 = nn.LogSoftmax(dim=1)

def forward(self, x):
x = self.conv1(x)
x = self.maxpool(F.leaky_relu(x))
x = self.conv2(x)
x = self.maxpool(F.leaky_relu(x))
x = self.linear1(self.pooling(x).view(x.shape[0], -1))
x = self.softmax1(x)
return x

现在 torch.Size([128, 3, 64, 64])torch.Size([128, 3, 128, 128]) 的图像可以传递到网络。

关于python - 如何重构 cnn 层的输出张量以供简单的 pytorch 模型中的线性层使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64263839/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com