【问题标题】:Why is my image convolution function so slow?为什么我的图像卷积函数这么慢?
【发布时间】:2019-08-08 07:20:03
【问题描述】:

我不确定我应该将这个发布在机器学习板上还是这个,但我选择了这个,因为我的问题更多地与优化有关。我正在尝试在 python 中从头开始构建一个 YOLO 模型,但是每个卷积操作需要 10 秒。显然我做错了什么,因为 YOLO 应该是超快的(能够实时产生结果)。我不需要网络实时运行,但如果在一张图像上运行需要几个小时,那么尝试训练它将是一场噩梦。我该如何优化下面的代码?显然还有很大的改进空间。

这是我的卷积函数:

def convolve(image, filter, stride, modifier):
    new_image = np.zeros ([image.shape[0], _round((image.shape[1]-filter.shape[1])/stride)+1, _round((image.shape[2]-filter.shape[2])/stride)+1], float)

    #convolve
    for channel in range (0, image.shape[0]):
        filterPositionX = 0
        filterPositionY = 0
        while filterPositionX < image.shape[1]-filter.shape[1]+1:
            while filterPositionY < image.shape[2]-filter.shape[2]+1:
                sum = 0
                for i in range(0,filter.shape[1]):
                    for j in range(0,filter.shape[2]):
                        if filterPositionX+i<image.shape[1] and filterPositionY+j<image.shape[2]:
                            sum += image[channel][filterPositionX+i][filterPositionY+j]*filter[channel][i][j]
                new_image[channel][int(filterPositionX/stride)][int(filterPositionY/stride)] = sum*modifier
                filterPositionY += stride
            filterPositionX += stride
            filterPositionY = 0

    #condense
    condensed_new_image = np.zeros ([new_image.shape[1], new_image.shape[2]], float)
    for i in range(0, new_image.shape[1]):
        for j in range(0, new_image.shape[2]):
            sum = 0
            for channel in range (0, new_image.shape[0]):
                sum += new_image[channel][i][j]
            condensed_new_image[i][j] = sum

    condensed_new_image = np.clip (condensed_new_image, 0, 255)

    return condensed_new_image

在 448x448 灰度图像上使用 7x7 滤镜和步幅为 2 运行该函数大约需要 10 秒。我的电脑有一个 i7 处理器。

【问题讨论】:

  • "因为 YOLO 应该超级快" ...基于什么?这在很大程度上取决于运行它的机器和处理器类型

标签: python optimization conv-neural-network convolution yolo


【解决方案1】:

为什么慢:因为你编码的函数的时间复杂度是 O(n*n*n*k*k),其中图像大小为n*n,过滤器大小为k*k

如何使其更快:避免循环并使用矩阵运算(向量化)。矩阵运算是并行的。

【讨论】:

  • 我将不得不对矩阵运算进行一些研究。我之前听说过它们,但我一直认为它们仍然在引擎盖下使用循环。
【解决方案2】:

因为它在普通的 python 代码中传递了很多信息;即您的操作是逐个元素执行的。你应该对它们进行矢量化。请查看本指南:https://wiseodd.github.io/techblog/2016/07/16/convnet-conv-layer/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-14
    • 2011-04-15
    • 2022-12-04
    • 2020-05-08
    • 2018-11-05
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多