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

     2023-03-12     170

关键词:

【中文标题】如何在简单的pytorch模型中重构cnn层的输出张量以供线性层使用【英文标题】:How to restructure the output tensor of a cnn layer for use by a linear layer in a simple pytorch model 【发布时间】:2021-01-23 13:53:07 【问题描述】:

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

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

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

我可以帮助我了解如何对执行多类分类的卷积层和线性层的简单混合网络的层进行网格划分。意图是通过:

两个 cnn 层,每个层后都有 maxpooling 线性“读出”层 在输出/标签之前激活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:尺寸不匹配,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:尺寸不匹配,m1:[28672 x 7],m2:[8192 x 6]

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

【问题讨论】:

【参考方案1】:

错误

您错误地计算了卷积堆栈的输出大小。实际上是[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))

其他可能性

当前的新架构使用跨渠道池(通常称为全局池)。在 PyTorch 中有一个 torch.nn.AdaptiveAvgPool2d(或 Max 池)。使用这种方法,您可以拥有可变大小的输入图像的高度和宽度,因为每个通道只有一个值用作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]) 的图像可以传递到网络。

【讨论】:

添加AdaptiveAvgPool2d 非常适合您可能有多种图像尺寸的情况;我想自己添加它。 +1 谢谢!对于第一种方法和大小32x7x7 你是通过O = (W - K + 2*P)/S + 1 计算出来的吗? @javadba 您可以在 PyTorch 文档中找到确切的公式。这次我在linear 之前添加了printed shape 属性。此外,通常,在 Conv 中使用 kernel_size=3 时,您使用 padding=1,因此形状保持不变(整个事情更容易理解)。【参考方案2】:

所以问题在于您定义nn.Linear 的方式。您将输入大小设置为32*16*16,这不是输出图像的形状,但数字32/16 表示Conv2d 期望输入的“通道”暗淡的数量以及它将输出什么.

如果你在全连接层入口前加上print(x.shape)你会得到:

torch.Size([Batch, 32, 7, 7])

所以你的计算应该是7*7*32:

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

然后使用:

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

可以正常工作。您可以阅读view 的作用:How does the "view" method work in PyTorch?

【讨论】:

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

】如何在Pytorch中获取神经网络每一层的输出维度?【英文标题】:HowtogetanoutputdimensionforeachlayeroftheNeuralNetworkinPytorch?【发布时间】:2019-09-1610:05:31【问题描述】:classModel(nn.Module):def__init__(self):super(Model,self).__init__()self.net=nn.Sequent... 查看详情

最后一层的张量输出在 PyTorch 中的形状错误

】最后一层的张量输出在PyTorch中的形状错误【英文标题】:TensoroutputfromfinallayerisofthewrongshapeinPyTorch【发布时间】:2020-06-1715:02:17【问题描述】:我正在构建一个序列到标签的分类器,其中输入数据是文本序列,输出标签是二进... 查看详情

pytorch闪电模型的输出预测

】pytorch闪电模型的输出预测【英文标题】:outputpredictionofpytorchlightningmodel【发布时间】:2021-04-2416:52:53【问题描述】:这可能是一个非常简单的问题。我刚开始使用PyTorch闪电,不知道如何在训练后接收模型的输出。我对y_train和... 查看详情

取出预训练模型中间层的输出(pytorch)

1遍历子模块直接提取对于简单的模型,可以采用直接遍历子模块的方法,取出相应name模块的输出,不对模型做任何改动。该方法的缺点在于,只能得到其子模块的输出,而对于使用nn.Sequensial()中包含很多层的模型,无法获得其... 查看详情

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

】我们如何在PyTorch中将线性层的输出提供给Conv2D?【英文标题】:HowcanweprovidetheoutputofaLinearlayertoaConv2DinPyTorch?【发布时间】:2020-07-2610:16:47【问题描述】:我正在构建一个自动编码器,我需要将图像编码为长度为100的潜在表示... 查看详情

pytorch中实现cnn,对cnn的理解心得

将卷积核与图像进行卷积是在空间上滑动图像,计算点积卷积核总是扩展输入卷的全部深度卷积层在卷积核和图像的一个小的5x5x3块之间取一个点积的结果对所有空间位置进行卷积(滑动)卷积神经网络是一个卷积层... 查看详情

pytorch中实现cnn,对cnn的理解心得

将卷积核与图像进行卷积是在空间上滑动图像,计算点积卷积核总是扩展输入卷的全部深度卷积层在卷积核和图像的一个小的5x5x3块之间取一个点积的结果对所有空间位置进行卷积(滑动)卷积神经网络是一个卷积层... 查看详情

如何在 Pytorch 中应用分层学习率?

】如何在Pytorch中应用分层学习率?【英文标题】:Howtoapplylayer-wiselearningrateinPytorch?【发布时间】:2019-01-1823:06:53【问题描述】:我知道可以冻结网络中的单个层,例如仅训练预训练模型的最后一层。我正在寻找一种将某些学习... 查看详情

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

】在pytorch中通过具有线性输出层的RNN发送的填充批次的掩码和计算损失【英文标题】:MaskingandcomputinglossforapaddedbatchsentthroughanRNNwithalinearoutputlayerinpytorch【发布时间】:2020-04-0503:26:59【问题描述】:虽然是一个典型的用例,但我... 查看详情

如何获得每一层的权重形状?

...2019-02-2709:19:54【问题描述】:有一个很好的问题,如何在pytorch中获取模型摘要Modelsummaryinpytorch但它不输出权重形状。是否也可以输出每一层的权重形状?【问题讨论】:【参考方案1】:看起来有可能,这里有一个例子:importtorc... 查看详情

pytorch实现tpu版本cnn模型(代码片段)

...时间的问题,我们使用TPU运行时环境来加速训练。为此,PyTorch一直在通过提供最先进的硬件加速器 查看详情

基于pytorch使用实现cnn如何使用pytorch构建cnn卷积神经网络(代码片段)

基于pytorch使用实现CNN如何使用pytorch构建CNN卷积神经网络本文是一个基于pytorch使用CNN在生物信息学上进行位点预测的例子基于pytorch实现CNN,基于CNN进行位点预测,将CNN代码进行封装,可以非常简单的使用代码,基... 查看详情

如何在 Theano 中更改 CNN 中卷积层的大小

】如何在Theano中更改CNN中卷积层的大小【英文标题】:HowtochangethesizeofconvolutionallayerinCNNinTheano【发布时间】:2015-12-1500:42:08【问题描述】:我正在使用Theanolibrary进行深度学习分类。在convolutional_mlp代码中,它使用两个大小为(5,5)... 查看详情

Pytorch CNN 不学习

】PytorchCNN不学习【英文标题】:PytorchCNNnotlearning【发布时间】:2021-04-1523:37:17【问题描述】:我目前正在尝试训练PyTorchCNN,以根据MRI扫描对痴呆和非痴呆个体进行分类。然而,在训练期间,模型的损失保持不变,并且在尝试区... 查看详情

Pytorch 预训练模型中的类数

】Pytorch预训练模型中的类数【英文标题】:TheNumberofClassesinPytorchPretrainedModel【发布时间】:2021-10-2900:08:20【问题描述】:我想使用Pytorch中的预训练模型在自己的数据集中进行图像分类,但是我应该如何在冻结特征提取层的参数... 查看详情

pytorch-4nn.dataparallel数据并行详解

参考技术A本文源自http://studyai.com/pytorch-1.4/beginner/blitz/data_parallel_tutorial.html在本教程中,我们将学习如何使用多个GPU:DataParallel的用法.与PyTorch一起使用GPU非常容易。您可以将模型放在GPU上:请注意,只要调用my_tensor.to(device),就... 查看详情

如何解释 CNN 中的 model.summary() 输出?

】如何解释CNN中的model.summary()输出?【英文标题】:Howtointerpretmodel.summary()outputinCNN?【发布时间】:2020-07-1812:09:21【问题描述】:我是深度学习和CNN的新手。如果已经创建了一个CNN,如屏幕截图所示,那么如何解释model.summary()描... 查看详情

PyTorch - 如何在评估模式下停用辍学

】PyTorch-如何在评估模式下停用辍学【英文标题】:PyTorch-Howtodeactivatedropoutinevaluationmode【发布时间】:2019-05-2115:03:36【问题描述】:这是我定义的模型,它是一个带有2个全连接层的简单lstm。importcopyimporttorchimporttorch.nnasnnimporttorc... 查看详情