文章目录
1、计算模型参数量:
def get_model_parameters_number(model):
params_num = sum(p.numel() for p in model.parameters() if p.requires_grad)
return params_num
2、(字节跳动)计算模型FLOPs:
1.1注册钩子:
handle = module.register_forward_hook(conv_flops_counter_hook)
模型正向传播时执行 conv_flops_counter_hook 函数,register_forward_hook 是 PyTorch 中的一个方法,用于注册前向钩子(forward hook)。前向钩子是在模型前向传播过程中执行的函数,允许用户在每次模型进行前向计算时执行自定义操作。
具体来说,register_forward_hook 允许用户在模型的每一层(即每个 torch.nn.Module)的前向传播过程中注册一个函数,该函数将在前向传播的特定阶段被调用。这个函数可以访问输入和输出张量,以及该层的状态信息,例如权重和偏置。
1.2计算每个算子的FLOPs:
def conv_flops_counter_hook(conv_module, input, output):
# Can have multiple inputs, getting the first one
# input = input[0]c conv_module=Conv2d(3,48,kernel(3,3),stride(1,1),padding=(1,1)) output(1,48,256,256)
batch_size = output.shape[0]
output_dims = list(output.shape[2:])
kernel_dims = list(conv_module.kernel_size)
in_channels = conv_module.in_channels
out_channels = conv_module.out_channels
groups = conv_module.groups
filters_per_channel = out_channels // groups
conv_per_position_flops = np.prod(kernel_dims) * in_channels * filters_per_channel
active_elements_count = batch_size * np.prod(output_dims)
overall_conv_flops = int(conv_per_position_flops) * int(active_elements_count) # Cin*Cout*K*K * B*H*W
# overall_flops = overall_conv_flops
conv_module.__flops__ += int(overall_conv_flops)
def linear_flops_counter_hook(module, input, output):
input = input[0]
if len(input.shape) == 1:
batch_size = 1
module.__flops__ += int(batch_size * input.shape[0] * output.shape[0]) # Cin*Cout* B
else:
batch_size = input.shape[0]
module.__flops__ += int(batch_size * input.shape[1] * output.shape[1])
def relu_flops_counter_hook(module, input, output):
active_elements_count = output.numel() # relu =max(0.0,x) 所以Relu的Flops为B*C*H*W
module.__flops__ += int(active_elements_count)
# print(module.__flops__, id(module))
# print(module)
1.3删除钩子:
del module.__activation_handle__
3、BN的参数优化有哪些?
对于BN层(推理模式),主要包含4个参数: μ(均值)、 σ 2(方差)、 γ和 β ,其中 μ 和 σ 2
是训练过程中统计得到的, γ 和 β是训练学习得到的。对于特征图第i个通道BN的计算公式如下,其中 ϵ 是一个非常小的常量,防止分母为零。BN在通道上进行Norm,LN在B纬度上Norm。
4、你知道的卷积有哪些?
-
Conv1d( in_channels, out_channels, kernel_size: _size_1_t)利用指定大小的一维卷积核对输入的多通道一维输入信号进行一维卷积操作的卷积层。
-
动态卷积
-
1x1卷积(改变通道)
-
空洞卷积(指数级扩展的感受野)
-
转置卷积(上采样)
-
DW卷积(先用分组3x3卷积在Cin个的通道上生成Cin个特征图,再用Cout个1x1 卷积把特征图改变为Cout个通道)
5、如何解决loss曲线震荡?
6、什么是 准确率?精确率?召回率? F1值?
- 准确率:Accuracy是针对所有类别而言的。Acc=模型预测正确的/模型预测的图片数。
例:10张各种水果图片,让模型预测。Acc=模型预测正确的/10。 - 精确率: Precision是针对某一类别而言的。P=模型正确预测某一类别的数/模型预测该类别的总数 。
例:苹果的精确率,10张各种水果图片,苹果有5张,模型预测成了3张苹果,P=模型正确预测苹果的数量/3。 - 召回率: Recall是针对某一类别而言的。R=模型预测某一类别对的数/该类别的总数 。
例:苹果的召回率,10张各种水果图片,苹果有5张,模型预测成了3张苹果,R=模型正确预测苹果的数量/5。
7、(OPPO)++i为什么比i++快?
++i返回的是i+1后的值,返回的是右值,不需要创建临时变量。
i++先返回i的值,再对i+1, 返回的是左指,需要创建临时变量,这个额外的临时对象的创建和销毁会带来额外的开销,从而导致 i++ 的执行速度相对较慢。
8、什么是逻辑回归和BCE?
总结
提示:这里对文章进行总结:
你喜欢粉色
还是蓝色
这么大够不够
以上就是今天要讲的内容。