machine-learning - 如何在 Pytorch 中使用 torch.nn.Sequential 实现我自己的 ResNet?

标签 machine-learning neural-network deep-learning conv-neural-network pytorch

我想实现一个 ResNet 网络(或者更确切地说, 残差块 )但我真的希望它采用顺序网络形式。

我所说的顺序网络形式如下:

## mdl5, from cifar10 tutorial
mdl5 = nn.Sequential(OrderedDict([
    ('pool1', nn.MaxPool2d(2, 2)),
    ('relu1', nn.ReLU()),
    ('conv1', nn.Conv2d(3, 6, 5)),
    ('pool1', nn.MaxPool2d(2, 2)),
    ('relu2', nn.ReLU()),
    ('conv2', nn.Conv2d(6, 16, 5)),
    ('relu2', nn.ReLU()),
    ('Flatten', Flatten()),
    ('fc1', nn.Linear(1024, 120)), # figure out equation properly
    ('relu4', nn.ReLU()),
    ('fc2', nn.Linear(120, 84)),
    ('relu5', nn.ReLU()),
    ('fc3', nn.Linear(84, 10))
]))

但当然,NN 乐高积木是“ResNet”。

我知道等式是这样的:

enter image description here

但我不确定如何在 Pytorch AND Sequential 中做到这一点。顺序对我来说很关键!

交叉发布:
  • https://discuss.pytorch.org/t/how-to-have-residual-network-using-only-sequential-blocks/51541
  • https://www.quora.com/unanswered/How-does-one-implement-my-own-ResNet-with-torch-nn-Sequential-in-Pytorch
  • 最佳答案

    您不能仅使用 torch.nn.Sequential 来完成此操作因为它需要操作,顾名思义,按顺序进行,而您的操作是并行的。
    原则上,您可以构建自己的 block真的很容易像这样:

    import torch
    
    class ResNet(torch.nn.Module):
        def __init__(self, module):
            super().__init__()
            self.module = module
    
        def forward(self, inputs):
            return self.module(inputs) + inputs
    
    哪一个可以使用这样的东西:
    model = torch.nn.Sequential(
        torch.nn.Conv2d(3, 32, kernel_size=7),
        # 32 filters in and out, no max pooling so the shapes can be added
        ResNet(
            torch.nn.Sequential(
                torch.nn.Conv2d(32, 32, kernel_size=3),
                torch.nn.ReLU(),
                torch.nn.BatchNorm2d(32),
                torch.nn.Conv2d(32, 32, kernel_size=3),
                torch.nn.ReLU(),
                torch.nn.BatchNorm2d(32),
            )
        ),
        # Another ResNet block, you could make more of them
        # Downsampling using maxpool and others could be done in between etc. etc.
        ResNet(
            torch.nn.Sequential(
                torch.nn.Conv2d(32, 32, kernel_size=3),
                torch.nn.ReLU(),
                torch.nn.BatchNorm2d(32),
                torch.nn.Conv2d(32, 32, kernel_size=3),
                torch.nn.ReLU(),
                torch.nn.BatchNorm2d(32),
            )
        ),
        # Pool all the 32 filters to 1, you may need to use `torch.squeeze after this layer`
        torch.nn.AdaptiveAvgPool2d(1),
        # 32 10 classes
        torch.nn.Linear(32, 10),
    )
    
    通常被忽视的事实(当涉及到浅层网络时没有真正的后果)是应该留下跳过连接 没有 任何非线性,如 ReLU或卷积层,这就是你在上面看到的(来源:Identity Mappings in Deep Residual Networks)。

    关于machine-learning - 如何在 Pytorch 中使用 torch.nn.Sequential 实现我自己的 ResNet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57229054/

    相关文章:

    apache-spark - 在 pyspark.ml 中使用 RandomForestClassifier 时,maxCategories 在 VectorIndexer 中无法按预期工作

    machine-learning - Word2Vec 和向量起源

    tensorflow - 如何在 Tensorflow 中拥有可变数量的隐藏层?

    python - Tensorflow Python 超出范围错误 : Resource Exhausted

    python - 如何在 Keras API 中将数组列表作为输入

    tensorflow - tf.dataset、多个路径输入以及每批映射以加载图像

    machine-learning - Weka机器学习:how to interprete Naive Bayes classifier?

    C# 到 F# : Creating and using a float[][] in F#

    neural-network - 为什么需要自组织映射中的迭代次数?

    algorithm - 哪个是正确的 tripletLoss 反向传播公式?