首页 > 解决方案 > 使用分支网络(例如 ResNeXt)的 TensorFlow 图构建缓慢

问题描述

我正在尝试从 TensorFlow 中的论文中实现 ResNeXt 块(B 型):

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 问题

标签: pythontensorflow

解决方案


推荐阅读