Pytorch 计算深度模型的大小

计算模型大小的方法

卷积 时间复杂度 与 空间复杂度 的计算方式:
在这里插入图片描述

C 通道的个数,K卷积核大小,M特征图大小,C_l-1是输入通道的个数,C_l是输出通道的个数

1 模型大小 MB

计算模型的大小的原理就是计算保存模型所需要的存储空间的大小,一般以字节为单位,由于模型常常较大,通常使用 MB (million byte)为单位,在算法层面是就是空间复杂度。

NOTE: 有的地方算 参数量 or 模型大小 会x4,因为模型参数一般都是FP32存储的,FP32是单精度,占4个字节

计算方式:

# 计算了
total_params = sum(p.numel() for p in model.parameters())
total_params += sum(p.numel() for p in model.buffers())

print(f'{total_params:,} total parameters.')
print(f'{total_params/(1024*1024):.2f}M total parameters.')
total_trainable_params = sum(p.numel() for p in model.parameters() if p.requires_grad)
    
print(f'{total_trainable_params:,} training parameters.')
print(f'{total_trainable_params/(1024*1024):.2f}M training parameters.')

2 计算量 FLOPs

算法的时间复杂度,每秒浮点数运算的次数

  • 计算量的要求是在于芯片的floaps(指的是gpu的运算能力)
  • 参数量取决于显存大小

3 相关第三方库

3.1 torchstat

安装

pip install torchstat

用法

from torchstat import stat

model = CNN()
stat(model, (3, 224, 224))

版本报错解决:https://blog.csdn.net/u013963578/article/details/133672751

输出:

  • params: 网络的参数量
  • memory: 节点推理时候所需的内存
  • Flops: 网络完成的浮点运算
  • MAdd网络完成的乘加操作的数量。一次乘加=一次乘法+一次加法,所以可以粗略的认为Flops ≈2*MAdd
  • MemRead: 网络运行时,从内存中读取的大小
  • MemWrite: 网络运行时,写入到内存中的大小
  • MemR+W: MemR+W = MemRead + MemWrite

torchstat存在的问题:

1.torchstat bug

版本问题输入为None

解决:修改源码 torchstat/reporter.py

df = df._append(total_df)

2.不能计算含有Transformer结构的模型大小

3.2 torchsummary

安装

pip install torchsummary

使用

model.to(torch.device("cuda:0"))
torchsummary.summary(model, input_size, batch_size=-1, device="cuda")

BUG修复

修改torchsummary.py源码

# 注销源码
# summary[m_key]["input_shape"] = list(input[0].size())
# summary[m_key]["input_shape"][0] = batch_size

# input 为 None的时候等于input
if len(input) != 0:
    summary[m_key]["input_shape"] = list(input[0].size())
    summary[m_key]["input_shape"][0] = batch_size
else:
    summary[m_key]["input_shape"] = input

torchsummary支持对Transformer模型大小的计算

3.3 thop

安装:

pip install thop

使用:

from thop import profile
input_size = (1, 3, 512, 512)
a = torch.randn(input_size)
flops, params = profile(model=model, inputs=(a, ))  # 注意 逗号

print(f"flops: {flops / 1e9} GFlops")
print(f"params: {params / 1e6} MB")

参考:

计算原理:https://blog.csdn.net/hxxjxw/article/details/119043464
计算Param 和 GFlops https://blog.csdn.net/qq_41573860/article/details/116767639
torchstat 输出参数解析 https://blog.csdn.net/m0_56192771/article/details/124672273
torchsummary bug 解决 tuple out of index https://blog.csdn.net/onermb/article/details/116149599
thop:https://blog.csdn.net/qq_21539375/article/details/113936308
参数大小与计算量:https://blog.csdn.net/qq_40507857/article/details/118764782
总结:https://blog.csdn.net/qq_41573860/article/details/116767639

  • 29
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch深度回归模型可以用于预测连续型数据的值,如股票价格、房价等。下面是一个简单的PyTorch深度回归模型: ```python import torch.nn as nn class RegressionModel(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(RegressionModel, self).__init__() self.layer1 = nn.Linear(input_size, hidden_size) self.layer2 = nn.Linear(hidden_size, output_size) def forward(self, x): x = self.layer1(x) x = nn.ReLU()(x) x = self.layer2(x) return x ``` 这个模型有一个输入层、一个隐藏层和一个输出层。输入层的大小由数据的特征数决定,隐藏层的大小可以根据需要调整,输出层的大小为1,因为我们只预测一个连续值。 在训练模型之前,我们需要定义一个损失函数和优化器。通常在回归模型中,我们使用均方误差作为损失函数,Adam优化器作为优化器。下面是一个示例: ```python import torch.optim as optim model = RegressionModel(input_size, hidden_size, output_size) criterion = nn.MSELoss() optimizer = optim.Adam(model.parameters(), lr=learning_rate) ``` 接下来,我们可以使用PyTorch的数据加载器来加载数据并训练模型。下面是一个示例: ```python from torch.utils.data import DataLoader, TensorDataset train_data = TensorDataset(torch.Tensor(X_train), torch.Tensor(y_train)) train_loader = DataLoader(train_data, batch_size=batch_size, shuffle=True) for epoch in range(num_epochs): for i, (inputs, targets) in enumerate(train_loader): optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, targets) loss.backward() optimizer.step() ``` 在每个epoch中,我们遍历数据加载器并训练模型。在每个迭代中,我们计算输出和损失,并使用反向传播更新模型权重。最后,我们可以使用训练好的模型来预测新数据: ```python with torch.no_grad(): predictions = model(torch.Tensor(X_test)) ``` 这个模型可以根据实际需求进行修改和调整,例如增加更多的隐藏层、使用不同的激活函数和正则化等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值