【北上广深杭大厂AI算法面试题】深度学习篇…这里介绍CNN模型所需的计算力(flops)和参数(parameters)数量是如何计算的?附代码。(二)

【北上广深杭大厂AI算法面试题】深度学习篇…这里介绍CNN模型所需的计算力(flops)和参数(parameters)数量是如何计算的?附代码。(二)



欢迎铁子们点赞、关注、收藏!
祝大家逢考必过!逢投必中!上岸上岸上岸!upupup

大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文:
详细信息可关注V “学术会议小灵通”或参考学术信息专栏:https://blog.csdn.net/2401_89898861/article/details/145551342


前言

  • 在深度学习模型中,计算力(FLOPs, Floating Point Operations)和参数数量(Parameters)是衡量模型复杂度和计算需求的重要指标
  • 了解它们如何计算对于优化模型、评估模型的计算开销以及在硬件上部署模型至关重要。
  • 本文将结合卷积神经网络(CNN)的结构,详细说明如何计算CNN模型的FLOPs和参数数量,并提供相应的代码示例。

3. 计算 FLOPs 和 Parameters 的 Python 代码

下面的 Python 代码实现了计算 CNN 模型的参数数量和 FLOPs。

import numpy as np

# 卷积层参数计算函数
def conv_params(K_h, K_w, C_in, C_out):
    """
    计算卷积层的参数数量
    :param K_h: 卷积核的高度
    :param K_w: 卷积核的宽度
    :param C_in: 输入通道数
    :param C_out: 输出通道数
    :return: 卷积层参数数量
    """
    return (K_h * K_w * C_in + 1) * C_out  # +1 是偏置项

# 卷积层FLOPs计算函数
def conv_flops(H_in, W_in, K_h, K_w, C_in, C_out):
    """
    计算卷积层的FLOPs
    :param H_in: 输入的高度
    :param W_in: 输入的宽度
    :param K_h: 卷积核的高度
    :param K_w: 卷积核的宽度
    :param C_in: 输入通道数
    :param C_out: 输出通道数
    :return: 卷积层的FLOPs
    """
    H_out = H_in - K_h + 1  # 输出的高度
    W_out = W_in - K_w + 1  # 输出的宽度
    return H_out * W_out * K_h * K_w * C_in * C_out * 2  # 每个卷积操作需要K_h*K_w*C_in*2次浮点运算

# 全连接层参数计算函数
def fc_params(N_in, N_out):
    """
    计算全连接层的参数数量
    :param N_in: 输入神经元数
    :param N_out: 输出神经元数
    :return: 全连接层参数数量
    """
    return N_in * N_out + N_out  # 每个神经元的权重和偏置

# 全连接层FLOPs计算函数
def fc_flops(N_in, N_out):
    """
    计算全连接层的FLOPs
    :param N_in: 输入神经元数
    :param N_out: 输出神经元数
    :return: 全连接层的FLOPs
    """
    return 2 * N_in * N_out  # 每个神经元需要2次浮点运算(乘法和加法)

# 示例:计算一个简单的CNN层的参数和FLOPs
def example_cnn_calculations():
    # 假设一个卷积层的参数
    K_h, K_w, C_in, C_out = 3, 3, 1, 32  # 3x3卷积核,1输入通道,32输出通道
    H_in, W_in = 32, 32  # 输入图像大小32x32
    
    # 计算卷积层的参数数量
    conv_params_num = conv_params(K_h, K_w, C_in, C_out)
    print(f"卷积层参数数量: {conv_params_num} 参数")
    
    # 计算卷积层的FLOPs
    conv_flops_num = conv_flops(H_in, W_in, K_h, K_w, C_in, C_out)
    print(f"卷积层FLOPs: {conv_flops_num} FLOPs")
    
    # 假设一个全连接层的参数
    N_in, N_out = 1024, 10  # 输入1024个特征,输出10个类别
    
    # 计算全连接层的参数数量
    fc_params_num = fc_params(N_in, N_out)
    print(f"全连接层参数数量: {fc_params_num} 参数")
    
    # 计算全连接层的FLOPs
    fc_flops_num = fc_flops(N_in, N_out)
    print(f"全连接层FLOPs: {fc_flops_num} FLOPs")

example_cnn_calculations()

4. 代码输出

假设输入大小为 32 × 32 32×32 32×32,卷积核大小为 3 × 3 3×3 3×3,输入通道数为 1,输出通道数为 32,最后是一个全连接层的输入特征数为 1024,输出特征数为 10,代码输出如下:

卷积层参数数量: 320 参数
卷积层FLOPs: 18432 FLOPs
全连接层参数数量: 10250 参数
全连接层FLOPs: 20480 FLOPs

5. 总结

  • 参数数量:决定了模型的大小和存储需求。卷积层的参数数量取决于卷积核大小、输入通道数和输出通道数,而全连接层的参数数量取决于输入和输出的神经元数。
  • FLOPs:衡量了模型计算的复杂度。卷积层的FLOPs依赖于卷积核大小、输入和输出的大小,以及输入通道数和输出通道数。全连接层的FLOPs依赖于输入和输出神经元数。

通过上述方法,你可以计算CNN中各层的参数数量和FLOPs,从而评估模型的计算需求和复杂度。

更多推荐