Pytorch 统计模型参数量的操作 param.numel()

首先, numel() 是 PyTorch 中一个用于获取张量中元素数量的方法,它可以统计模型的参数数量。

代码示例一:

import torch
import torch.nn as nn

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, kernel_size=5)
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
        self.conv2 = nn.Conv2d(6, 16, kernel_size=5)
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        x = self.pool(torch.relu(self.conv1(x)))
        x = self.pool(torch.relu(self.conv2(x)))
        x = x.view(-1, 16 * 5 * 5)
        x = torch.relu(self.fc1(x))
        x = torch.relu(self.fc2(x))
        x = self.fc3(x)
        return x

net = Net()
model_parameters = filter(lambda p: p.requires_grad, net.parameters())
params = sum([np.numel() for np in model_parameters])
print(params)

在上述代码中,我们定义了一个基本的神经网络,包含了两个卷积层和三个全连接层。然后我们使用了 filter() 方法来过滤出需要计算参数量的参数,即 requires_grad 为 True 的参数。最后,我们使用了列表推导式的方法将所有参数的大小相加,得到了神经网络的参数量。

代码示例二:

import torch
import torch.nn as nn

class VGG16(nn.Module):
    def __init__(self, num_classes=1000):
        super(VGG16, self).__init__()
        self.features = nn.Sequential(
            nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(128, 128, kernel_size=3, stride=1, padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.Conv2d(256, 512, kernel_size=3, stride=1, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2, stride=2),
        )

        self.avgpool = nn.AdaptiveAvgPool2d((7, 7))
        self.classifier = nn.Sequential(
            nn.Linear(512 * 7 * 7, 4096),
            nn.ReLU(inplace=True),
            nn.Dropout(),
            nn.Linear(4096, 4096),
            nn.ReLU(inplace=True),
            nn.Dropout(),
            nn.Linear(4096, num_classes),
        )

    def forward(self, x):
        x = self.features(x)
        x = self.avgpool(x)
        x = x.view(x.size(0), -1)
        x = self.classifier(x)
        return x

vgg16 = VGG16()
model_parameters = filter(lambda p: p.requires_grad, vgg16.parameters())
params = sum([np.numel() for np in model_parameters])
print(params)

在上述代码中,我们定义了一个 VGG16 的深度神经网络,包含了 13 个卷积层和 3 个全连接层。我们依然使用了 filter() 方法来过滤出需要计算参数量的参数,即 requires_grad 为 True 的参数,并使用了列表推导式的方法将所有参数的大小相加,得到了深度神经网络的参数量。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Pytorch 统计模型参数量的操作 param.numel() - Python技术站

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

相关文章

  • 【论文笔记】FCN全卷积网络

      全卷积网络(FCN)是用于图片语义分割的一种卷积神经网络(CNN),由Jonathan Long,Evan Shelhamer 和Trevor Darrell提出,由此开启了深度学习在语义分割中的应用。语义分割是计算机视觉领域很重要的一个分支,在自动驾驶、地面检测等方面都起到很重要作用。与简单区分前景后景的图像分割技术不同,语义分割则不仅是区分每个像素的…

    2023年4月5日
    00
  • 用python实现对图像的卷积(滤波) – swuxyj

    用python实现对图像的卷积(滤波)   之前在看卷积神经网络,很好奇卷积到底是什么,最后看到了这篇文章http://blog.csdn.net/zouxy09/article/details/49080029,讲得很清楚,这篇文章中提到了对图像的滤波处理就是对图像应用一个小小的卷积核,并给出了以下例子:   对图像的卷积,opencv已经有实现的函数fi…

    2023年4月8日
    00
  • 卷积层池化和激活函数的顺序

    卷积层池化和激活函数的顺序 简单来讲,先池化后激活和先激活后池化得到的效果是一样的,先池化进行了下采样,那么在激活函数的时候就减少了消耗Activation function after pooling layer or convolutional layer?

    卷积神经网络 2023年4月8日
    00
  • Convolutional neural network (卷积神经网络)

    我们都知道CNN常常被用在影像处理上,当然也可以用一般的neural network来做影像处理,不一定要用CNN。比如说你想要做影像的分类, 那么你就是training一个neural network,input一张图片,那么你就把这张图片表示成里面的pixel,也就是很长很长的vector。output就是(假如你有1000个类别,output就是100…

    2023年4月6日
    00
  • 11 圆周卷积

    圆周运算 其实圆周运算是针对周期序列而言的,由于周期序列在每一个周期内的取值都相同,所以我们只关注它的主值区间,比如,如果一个序列的长度为(N)的话,那么它的主值区间就是(0leq nleq N-1)。 虽然圆周运算是源自于对周期信号的处理,但是经过一般化的扩展之后,对有限长序列也可以进行圆周运算。具体就是,你可以把有限长序列以它的长度为周期,进行周期延拓成…

    2023年4月6日
    00
  • 理解图像分割中的卷积(Understand Convolution for Semantic Segmentation)

          以最佳的101 layer的ResNet-DUC为基础,添加HDC,实验探究了几种变体: 无扩张卷积(no dilation):对于所有包含扩张卷积,设置r=1 扩张卷积(dilation Conv ):对于所有包含扩张卷积,将2个block和为一组,设置第一个block的r=1 Dilation-RF:对于r=3,4,5. Dilation-B…

    2023年4月8日
    00
  • Paper:基于图卷积神经网络(Graph Convolutional Networks GCN)的半监督分类

    本文为“SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS”, 作者ThomasN.Kipf。 本文是基于谱的图卷积网络用来解决半监督学习的分类问题,输入为图的邻接矩阵A,和每一个节点的特征向量H 本问对应的代码为 https://github.com/tkipf/gcn. 半监督…

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