优化最大池化算法

人工智能 卷积神经网络 Python
2021-11-18 13:11:52

下面的代码是 CNN 中使用的最大池化算法。我一直面临的问题是,考虑到大量的特征图,它的速度非常慢。其缓慢的原因很明显——计算机必须在每个特征图上执行数万次迭代。那么,我们如何降低算法的计算复杂度呢?

('inputs' 是一个包含所有特征图的 numpy 数组,'pool_size' 是一个包含池维度的元组。)

def max_pooling(inputs, pool_size):

    feature_maps = []
    for feature_map in range (len(inputs)):
        feature_maps.append([])
        for i in range (0, len(inputs[feature_map]) - pool_size[0], pool_size[0]):
            for j in range (0, len(inputs[feature_map]) - pool_size[0], pool_size[0]):    
                feature_maps[-1].append(np.array(max((inputs[feature_map][j:j+pool_size[0], i:i+pool_size[0]]).flatten())))

    return feature_maps
1个回答

其缓慢的原因很明显——计算机必须在每个特征图上执行数万次迭代。那么,我们如何降低算法的计算复杂度呢?

在计算复杂度/算法方面,没有太多收获;最大池化只需遍历所有特征图,通过取最大值来找到要“合并/池化”的每个部分中的最大数量。

不过,在实施方面可能会有很多收获。当前的实现完全是纯 Python 的,而纯 Python 的速度是出了名的慢。使用numpy 操作而不是手动 Python 循环可以显着加快此类循环的运行速度。由于以下原因,此类操作往往要快得多

  1. 运行优化的 C 代码而不是 Python 代码,以及
  2. 在某些情况下,使用矢量化操作同时在不同的索引处执行多个类似的计算,而不是一个接一个地执行它们

我还没有尝试使用 numpy 将纯 Python 代码“翻译”成 Python 代码。但是,可以在 StackOverflow 上对这个问题的各种答案中找到一些基于 numpy 的实现示例


我假设您选择手动实现诸如最大池之类的东西是因为您想了解如何实现它/更好地理解它。相反,如果您的目标只是让某些东西尽快运行,那么考虑使用诸如 Tensorflow 或 PyTorch 之类的框架可能是个好主意。这些都带有你想要的神经网络的许多东西的有效实现,包括 Max Pooling。