pytorch 共享参数的示例

以下是针对“pytorch 共享参数的示例”的完整攻略,包括两个示例说明:

简介

在深度学习中,我们有时候需要共享部分参数来减少训练过程中需要学习的参数数量。pytorch 提供了方便的方法来实现共享参数。在本文中,我们将介绍两个示例来说明如何在 pytorch 中进行共享参数的操作。

示例一

在这个示例中,我们使用 pytorch 中的 nn.ModuleList() 方法来自定义一组层的结构,并且共享一些参数。具体地,我们假设有两个层,第一个层的输出为 $f(x)$,第二个层的输入为 $f(x)+x$,且两个层的某些参数需要共享。

首先,我们定义两个层的结构:

class Layer1(nn.Module):
    def __init__(self):
        super(Layer1, self).__init__()
        self.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1)
        self.bn1 = nn.BatchNorm2d(64)
        self.relu1 = nn.ReLU()

    def forward(self, x):
        out = self.conv1(x)
        out = self.bn1(out)
        out = self.relu1(out)
        return out

class Layer2(nn.Module):
    def __init__(self):
        super(Layer2, self).__init__()
        self.conv2 = nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1)
        self.bn2 = nn.BatchNorm2d(128)
        self.relu2 = nn.ReLU()

    def forward(self, x):
        out = self.conv2(x)
        out = self.bn2(out)
        out = self.relu2(out)
        return out

接下来,我们定义一个包含这两个层的模型,并共享 Layer1 中的卷积核:

class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.layers = nn.ModuleList([Layer1(), Layer2()])
        self_shared_weight = self.layers[0].conv1.weight  # 共享卷积核

    def forward(self, x):
        out1 = self.layers[0](x)
        out2 = self.layers[1](out1+x)
        return out2

上面的代码中,我们通过 ModuleList() 方法来定义一个包含两个层的模型,并通过 self_shared_weight 变量来共享 Layer1 中的卷积核。在 forward() 方法中,我们首先通过第一个层计算出 $f(x)$,并将其与输入 $x$ 相加。这个加操作可以用来保证第二个层可以接受到 $f(x)+x$ 的输入。

最后,我们可以通过如下代码来检查卷积核是否被共享:

model = Model()
shared_weight = (model.layers[1].conv2.weight.data
                 == model_shared_weight.data).sum().item()
print("Is shared:", shared_weight == model.layers[1].conv2.weight.numel())

如果输出结果为 Is shared: True,则说明卷积核成功共享。

示例二

在这个示例中,我们假设有两个模型,模型 A 和模型 B,两个模型的结构是一样的,但是在训练过程中,我们需要共享其中的某些参数。具体地,假设模型 A 和模型 B 中的第一层卷积核需要共享。

首先,我们定义模型 A 和模型 B:

class ModelA(nn.Module):
    def __init__(self):
        super(ModelA, self).__init__()
        self.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1)
        self.bn1 = nn.BatchNorm2d(64)
        self.relu1 = nn.ReLU()
        self.conv2 = nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1)
        self.bn2 = nn.BatchNorm2d(128)
        self.relu2 = nn.ReLU()

    def forward(self, x):
        out = self.conv1(x)
        out = self.bn1(out)
        out = self.relu1(out)
        out = self.conv2(out)
        out = self.bn2(out)
        out = self.relu2(out)
        return out

class ModelB(nn.Module):
    def __init__(self):
        super(ModelB, self).__init__()
        self.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1)
        self.bn1 = nn.BatchNorm2d(64)
        self.relu1 = nn.ReLU()
        self.conv2 = nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1)
        self.bn2 = nn.BatchNorm2d(128)
        self.relu2 = nn.ReLU()

    def forward(self, x):
        out = self.conv1(x)
        out = self.bn1(out)
        out = self.relu1(out)
        out = self.conv2(out)
        out = self.bn2(out)
        out = self.relu2(out)
        return out

然后,我们在模型 B 中引入共享参数:

class ModelBWithSharedConv1(nn.Module):
    def __init__(self, model_a):
        super(ModelBWithSharedConv1, self).__init__()
        self.conv1 = model_a.conv1
        self.bn1 = model_a.bn1
        self.relu1 = nn.ReLU()
        self.conv2 = nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1)
        self.bn2 = nn.BatchNorm2d(128)
        self.relu2 = nn.ReLU()

    def forward(self, x):
        out = self.conv1(x)
        out = self.bn1(out)
        out = self.relu1(out)
        out = self.conv2(out)
        out = self.bn2(out)
        out = self.relu2(out)
        return out

上面代码中,我们定义了一个新的模型 ModelBWithSharedConv1 一并将模型 A 作为参数传入。在这个模型中,我们共享了模型 A 中的第一层卷积核,来代替模型 B 中的第一层卷积核。这样一来,我们就实现了共享参数的效果。

最后,我们可以通过如下代码来检查卷积核是否被共享:

model_a = ModelA()
model_b = ModelB()
model_b_with_shared_conv1 = ModelBWithSharedConv1(model_a)

shared_weight = (model_a.conv1.weight.data
                 == model_b_with_shared_conv1.conv1.weight.data).sum().item()
print("Is shared:", shared_weight == model_a.conv1.weight.numel())

如果输出结果为 Is shared: True,则说明卷积核成功共享。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:pytorch 共享参数的示例 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • 利用卷积神经网络实现MNIST手写数据识别

    代码: import torch import torch.nn as nn import torch.utils.data as Data import torchvision # 数据库模块 import matplotlib.pyplot as plt torch.manual_seed(1) # reproducible # Hyper Parame…

    卷积神经网络 2023年4月6日
    00
  • OpenCV在矩阵上的卷积

    转载请注明出处!!!http://blog.csdn.net/zhonghuan1992            在openCV官网上说是戴面具,事实上就是又一次计算一下矩阵中的每个value,那么怎么计算呢,依据该像素点的周围信息,用一个加权的公式来进行计算。那么如今就要看,周围的信息是怎样被加权的。让我们想一下这种方式,请看以下的公式:          …

    2023年4月8日
    00
  • BZOJ 4827 循环卷积

    题意:求两个手环任意旋转对应位置的差值+c的平方最小 设b旋转到k最小,那么先将b扩张一倍构成一圈,那么答案式子就是                                   将这个式子展开一下,事情就变得有趣了起来                                               这个式子将a[ ]翻转可以化成卷积形式 …

    2023年4月6日
    00
  • CNN—卷积神经网络

      同样的pattern,在image里面,他可能会出现在image不同的部分,但是它们代表的是同样的含义,同样的形状,也有同样的neural,同样的参数,detector就可以侦测出来。   做Subsampling使图片变小对影响辨识没什么影响  整个CNN实现的过程为:    CNN—Convolution   用3*3的矩阵,从左上角开始,与fi…

    2023年4月8日
    00
  • 【DL-2-1】卷积神经网络(CNN)–总体概述

    1、目录 2、简述 3、CNN的结构组成 4、卷积神经网络 VS. 传统神经网络 5、总结 常见问答 二、简述 1980年,一位名为Fukushima的研究员提出了一种分层神经网络模型。他称之为新认知。该模型的灵感来自简单和复杂细胞的概念。neocognitron能够通过了解物体的形状来识别模式。 后来,1998年,卷心神经网络被Bengio,Le Cun,…

    2023年4月5日
    00
  • 卷积层channel数量变化过程

      卷积神经网络的总体架构是金字塔型,如下图。 CNNs架构图 可以看到,每一层的channel数量是变化的。如上图中,左边的第一层只有R、G、B三个channel,第二层有16个channel,第三、四层分别有64、256个。 那么这些channel数量是如何变化的呢?   基本过程: 对于输入图片的每一个patch(下图中的绿色部分),运行一个具有K个输…

    2023年4月6日
    00
  • [深度学习]CNN–卷积神经网络中用1*1 卷积有什么作用

    1*1卷积过滤器 和正常的过滤器一样,唯一不同的是它的大小是1*1,没有考虑在前一层局部信息之间的关系。最早出现在 Network In Network的论文中 ,使用1*1卷积是想加深加宽网络结构 ,在Inception网络( Going Deeper with Convolutions )中用来降维. 由于3*3卷积或者5*5卷积在几百个filter的卷…

    卷积神经网络 2023年4月8日
    00
  • CNN中卷积层 池化层反向传播

    参考:https://blog.csdn.net/kyang624823/article/details/78633897 卷积层 池化层反向传播: 1,CNN的前向传播 a)对于卷积层,卷积核与输入矩阵对应位置求积再求和,作为输出矩阵对应位置的值。如果输入矩阵inputX为M*N大小,卷积核为a*b大小,那么输出Y为(M-a+1)*(N-b+1)大小。  …

    2023年4月8日
    00
合作推广
合作推广
分享本页
返回顶部