如何统计神经网络模型中的参数数量(基于pytorch)

引言

上篇博客介绍了搭建简单的全连接神经网络模型结构 如何搭建神经网络--基于pytorch搭建全连接神经网络-CSDN博客 为了对我们自己搭建的网络模型有进一步的了解,我们往往需要对模型中的参数进行统计,本篇博客就跟大家一起分享如何用代码实现对网络模型参数的统计


神经网络模型的参数

在深度学习中,参数通常被理解为模型想要从数据中学习的一种表示。这些参数通常被分为两类,权重(weights)和偏置项(biases)。权重决定了输入特征对于预测目标的重要性,偏置项则用来调整输出预测的基线值。

模型的参数个数反映了模型的复杂度。参数越多,模型越复杂,其理论上的拟合能力也就越强。换句话说,参数更多的模型可以更好的适应训练数据,而且更有可能抓住数据中的复杂模式。 具有大量参数的模型可以拟合多样的函数形式,因此它们具有高度的灵活性。

然而,模型参数越多,模型越倾向于产生过拟合现象,即在训练数据上表现良好,但在测试数据上表现差。因此,在实践中,为了避免过拟合并得到泛化能力强的模型,我们往往需要进行正则化操作,如权重衰减或早期停止等。 同时,模型的参数数量也影响到计算和存储需求。更多的参数意味着更大的计算负担,也需要更多的存储空间。这是在设计和选择模型时需要考虑的实际因素。 总结起来,模型中参数的数量对模型的能力、泛化性、计算需求和存储需求都有影响,是设计和选择模型的重要因素。

代码实现

需要导入的库

import torch
import torch.nn as nn
import torch.nn.functional as F

先搭建好一个简单的全连接网络模型

class Net(nn.Module):
    def __init__(self,input_dim,layer1_dim,layer2_dim,output_dim):  
        super(Net,self).__init__()
        self.flatten = nn.Flatten() 
        self.layer1 = nn.Sequential(nn.Linear(input_dim,layer1_dim),nn.ReLU())
        self.layer2 = nn.Sequential(nn.Linear(layer1_dim,layer2_dim),nn.ReLU())
        self.out = nn.Sequential(nn.Linear(layer2_dim,output_dim),nn.ReLU())

    def forward(self,x):
        x = self.flatten(x)
        x = self.layer1(x)
        x = self.layer2(x)
        x = self.out(x)
        return x

初始化网络参数

# 初始化网络中的值
input_dim,layer1_dim,layer2_dim,output_dim=32*32,512,128,10
model = Net(input_dim,layer1_dim,layer2_dim,output_dim)

统计网络模型的中参数个数

# 统计网络各层的参数个数之和
Net_num = sum(x.numel() for x in model.parameters())
print("网络模型中的参数总数为:", Net_num)

打印输出

网络模型中的参数总数为: 591754

可见我们搭建的神经网络中含有591754个参数,其中包括了权值和偏移量,可见即使是简单的全连接层,也包括了相当数量的参数,在如此大规模的参数计算下,深度学习的网络模型训练无疑需要使用GPU进行并行运算提高计算的效率

代码中,使用for循环遍历model中的各层级的参数,即model.parameters(),numel()表示获取张量中元素的总数,获取每一层参数的数量后再用sum()函数进行求和获取整个网络模型的参数总数

大家也可以通过这个方法去比较不同的神经网络含有参数的规模大小,对网络模型的训练有一个直观的量化认识

欢迎大家讨论交流~


猜你喜欢

转载自blog.csdn.net/weixin_57506268/article/details/135168838