deep-learning - 填充和膨胀会影响卷积层中的 FLOP 数量吗?
问题描述
据我所知,只有输出大小、内核大小、输入通道数、输出通道数和批量大小会影响卷积层中 FLOP 的数量。
但有些人告诉我,填充和膨胀也会影响 FLOP。
这是真的吗?如果是真的,为什么?
解决方案
填充直接改变输入大小,因此内核必须与更大数量的输入值进行卷积,这会导致更多的 FLOP。
膨胀更有趣:操作的数量不会随着你的增加而改变。然而,卷积核变得更大,适合输入的操作更少。因此,FLOP 的数量下降了。从这个意义上说,膨胀是填充的对应物。
您可以使用Netscope CNN 分析器查看填充和膨胀参数如何更改 MACC 的数量(多次累加 = 2FLOP)。
例如,默认配置:
layer {
name: "data"
type: "Input"
top: "data"
input_param {
shape: { dim: 1 dim: 3 dim: 227 dim: 227 }
}
}
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
convolution_param {
num_output: 96
kernel_size: 3
}
}
估计有 1.3122 亿个 MACC。使用pad: 1
(“相同”填充)它是 133.56M。dilation: 2
只有它变成128.9M 。但是如果你通过填充来补偿膨胀:
layer {
name: "data"
type: "Input"
top: "data"
input_param {
shape: { dim: 1 dim: 3 dim: 227 dim: 227 }
}
}
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
convolution_param {
num_output: 96
kernel_size: 3
dilation: 2
pad: 1
}
}
又是 131.22M。
推荐阅读
- python - 使用 Python 输出多个随机密码
- react-native - 仅反应原生构建(android)
- javascript - 如何使用 ajax 通信 python-mysql 和 js?
- c# - 在 .Net Dynamics CRM 应用程序中保存要联系的父帐户
- asp.net-core - 常规方法和异步方法有什么区别(OnGet vs OnGetAsync)
- firebase - 为什么functions.config() 返回{}?
- python - Python 编写 CSV 文件
- c# - c#定义接收方法作为参数的方法,具有不同的重载
- python - 使用自己的模型作为用户登录
- django - Django 2.0:ModelChoiceField 中的 TextInput 显示 id 而不是值