我不确定该将它发布在机器学习板上还是该发布,但是我选择了这个,因为我的问题更多与优化有关。我试图在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
在具有7x7滤镜且跨度为2的448x448灰度图像上运行该功能大约需要10秒钟。我的计算机装有i7处理器。
答案 0 :(得分:1)
为什么慢?:因为您编码的函数的时间复杂度是
O(n*n*n*k*k)
,其中图片大小为n*n
,过滤器大小为k*k
如何使其更快:避免循环并使用矩阵运算(矢量化)。矩阵运算是并行的。
答案 1 :(得分:0)
因为它在普通的python代码中传递了很多内容;即您的操作是逐个元素执行的。您应该矢量化它们。请查看本指南:https://wiseodd.github.io/techblog/2016/07/16/convnet-conv-layer/