卷积神经网络CNN中FLOPs的概念和计算

本文介绍了FLOPs,其全称是每秒浮点运算次数,是衡量硬件计算性能的指标,在CNN中指浮点运算次数。还给出了AlexNet中某卷积层FLOPs的计算示例,计算量级为1e8,同时提醒不同博客计算有差异,可查找文献深入了解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.什么是FLOPs?
FLOPs全称:floating point operation per second
意思是每秒浮点运算次数,理解为计算速度,是一个用来衡量硬件计算性能的指标。
在CNN中用来指浮点运算次数;

2.如何计算?
在AlexNet中某一次卷积过程中,
输入特征图大小:[C_in, H_in, W_in] = 3 * 224 * 224
卷积核大小:[C_in, K_H, K_W] = 3 * 11 * 11
输出特征图大小:[C_out, H_out, W_out] = 96 * 55 * 55
该卷积层的FLOPs量级为多少?
FLOPs:
[(C_in * K_H * K_W) * C_out + C_out] * (H_out * W_out)
即[(3 * 11 * 11) * 96 + 96 ] * (55 * 55) = 105705600
量级为1e8
(
注:可以将上试的C_out提取出来。
num_paras = (C_in * K_H * K_W) * C_out + C_out
= C_out * [(C_in * K_H * K_W) + 1 ]
num_paras也就是该层参数的数目

我也是根据别人的博客参考的,每个大佬回答的都有差异,有的考虑了偏置,有的没有考虑偏置什么的,各种博客各种回答,在此仅做参考,详细深入请查找文献。

参考:
https://baike.baidu.com/item/FLOPS/989494?fr=aladdin

https://www.cnblogs.com/zf-blog/p/10875782.html

https://blog.youkuaiyun.com/weixin_41770169/article/details/94001345

https://www.zhihu.com/question/65305385

仅用来个人学习和分享,如若侵权,留言立删。

### 卷积神经网络中卷积运算的计算方法 #### 1. 基本概念 卷积操作是一维或多维数组之间的线性代数运算,通常用于提取输入数据的空间特征。在卷积神经网络 (Convolutional Neural Network, CNN) 中,卷积核(滤波器)滑动覆盖整个输入张量,并执行逐元素乘法累加的操作[^3]。 #### 2. 输出张量大小的计算公式 假设输入张量的尺寸为 \(H \times W\) (高度 × 宽度),卷积核的尺寸为 \(K_h \times K_w\) ,步幅(stride)为 \(S_h \times S_w\) ,填充(padding)为 \(P_t, P_b, P_l, P_r\) (分别表示顶部、底部、左侧右侧的填充)。那么输出张量的高度宽度可以通过以下公式计算: \[ O_h = \frac{H + P_t + P_b - K_h}{S_h} + 1 \] \[ O_w = \frac{W + P_l + P_r - K_w}{S_w} + 1 \] 其中,\(O_h\) \(O_w\) 表示输出张量的高度宽度[^4]。 #### 3. 参数数量的计算 对于单通道输入的情况,卷积层的参数数量由卷积核的数量决定。如果卷积核的尺寸为 \(K_h \times K_w\) ,并且该层有 \(N_f\) 个过滤器,则总参数数量为: \[ N_{params} = N_f \cdot (K_h \cdot K_w + 1) \] 这里额外加上 1 是因为每个卷积核都有一个偏置项[^1]。 #### 4. Flops计算 浮点运算次数(Floating Point Operations Per Second, FLOPs)衡量的是每秒完成的浮点运算数目。对于一次完整的前向传播,FLOPs 可以通过以下方式估算: \[ FLOPs = O_h \cdot O_w \cdot C_i \cdot K_h \cdot K_w \cdot C_o \] 其中,\(C_i\) 是输入通道数,\(C_o\) 是输出通道数。 #### 5. 感受野的计算 感受野定义了当前节点所能看到的原始输入图像的最大范围。初始情况下,第一层的感受野等于卷积核的大小。随着网络加深,每一层的感受野会逐渐增大。具体而言,第 \(l\) 层的感受野可递归地表示为: \[ R(l) = R(l-1) + (K_h - 1) \cdot S^{l-1} \] 其中,\(S\) 是步幅,\(K_h\) 是卷积核的高度。 #### 示例代码 以下是 Python 实现的一个简单例子,展示如何手动计算卷积后的输出形状以及参数数量: ```python def calculate_output_size(input_height, input_width, kernel_height, kernel_width, padding_top=0, padding_bottom=0, padding_left=0, padding_right=0, stride_height=1, stride_width=1): output_height = ((input_height + padding_top + padding_bottom - kernel_height) / stride_height) + 1 output_width = ((input_width + padding_left + padding_right - kernel_width) / stride_width) + 1 return int(output_height), int(output_width) def calculate_parameters(kernel_height, kernel_width, num_filters, bias=True): params_per_filter = kernel_height * kernel_width total_params = num_filters * params_per_filter if bias: total_params += num_filters return total_params # 输入参数 input_height = 32 input_width = 32 kernel_height = 3 kernel_width = 3 num_filters = 64 padding_top = 1 padding_bottom = 1 padding_left = 1 padding_right = 1 stride_height = 1 stride_width = 1 output_shape = calculate_output_size( input_height, input_width, kernel_height, kernel_width, padding_top, padding_bottom, padding_left, padding_right, stride_height, stride_width ) total_params = calculate_parameters(kernel_height, kernel_width, num_filters) print(f"Output Shape: {output_shape}") # 输出形状 print(f"Total Parameters: {total_params}") # 总参数数量 ``` #### 结论 上述内容涵盖了卷积神经网络中卷积运算的核心计算方法及其相关公式的推导过程。这些理论基础有助于理解并设计高效的卷积神经网络架构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机器不学习我学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值