python - 使用分支网络(例如 ResNeXt)的 TensorFlow 图构建缓慢
问题描述
我正在尝试从 TensorFlow 中的论文中实现 ResNeXt 块(B 型):
为此,我使用了一个循环来根据基数参数生成每个路径(cardinality = 32
在上图中)
def resnext_block(input_tensor, filters, stride=1, projection=False, cardinality=32, depth=4):
residual = input_tensor
# Split
branches = []
for i in range(cardinality):
with tf.variable_scope("branch%i" % i):
branch = tf.layers.conv2d(inputs=input_tensor, filters=depth, kernel_size=1, padding='same')
branch = tf.layers.batch_normalization(branch, training=train_flag)
branch = activation(branch)
branch = tf.layers.conv2d(inputs=branch, filters=depth, kernel_size=3, strides=stride, padding='same')
branch = tf.layers.batch_normalization(branch, training=train_flag)
branch = activation(branch)
branches.append(branch)
# Merge
merged = tf.concat(branches, -1)
# Transform
transformed = tf.layers.conv2d(inputs=merged, filters=filters, kernel_size=1, padding='same')
transformed = tf.layers.batch_normalization(transformed, training=train_flag)
if projection:
residual = tf.layers.conv2d(inputs=input_tensor, filters=filters, kernel_size=1, strides=stride)
residual = tf.layers.batch_normalization(residual, training=train_flag)
return activation(transformed + residual)
如果我针对低基数 (< 4) 运行我的模型,则图形会快速构建并且训练开始。
对于基数较高的值,TensorFlow 会花费很长时间来构建图形(即 1 个 CPU 内核处于 100% 且没有其他活动)。事件文件变得非常大(> 1GB)大概是因为图中的节点太多(尽管事实上可训练参数的数量可以通过减少来保持在相似的数量depth
)。
我是否缺少任何技巧来加快/优化此过程?
我在 TensorFlow 中没有看到很多 ResNeXt 示例(我发现那些将基数设置为小数字的示例),这让我认为 TF 中的图形架构可能不适合这些类型的模型。
更新
看起来分组卷积是实现这一目标的最佳方式(论文中的块样式 C)。然而,这些还没有在 TF 1.10 中实现。请参阅此GitHub 问题
解决方案
推荐阅读
- grep - 具有至少一个匹配值和至少一个不匹配的 Grep
- iframe - Headless Moodle:Iframe 身份验证
- python - 从python中的字典列表中获取最大值字典
- python - xlsxwriter:根据数据框排序值创建多个工作表
- javascript - 我如何遍历具有相同列表的列表
- stm32 - HAL_SPI_Transmit 比直接寄存器操作更快,为什么?
- python - 如何从熊猫数据框中的团队名称中提取带有reg的城市名称
- python - 在 virtualenv (Linux) 中选择了错误版本的 Python
- google-chrome - 如何使用量角器在 chrome 中设置具有纬度经度位置输入的传感器?
- office365 - 如何本地化 Outlook Web 插件清单文件中的文本字符串