首页 > 解决方案 > 无法找出我的代码有什么问题?(使用 numpy 进行二维矩阵卷积)

问题描述

我刚刚从 Andrew Ng 的 deeplearning.ai coursera 课程中了解了矩阵卷积,我想尝试使用 numpy 制作我自己的 2D 矩阵卷积,但我不断收到以下错误。(代码底部)

我不明白我在第一次迭代中做错了什么,因为 f = 100 和 w = 0 所以我不明白为什么aSlice = dataColor[vertStart:vertEnd, vertStart:vertEnd]是 100 x 99 矩阵。我尝试对“horiEnd”进行 +1,但它改为 100 x 101。我也试过assert(dataColor.shape == (1200,1200)),但这似乎也不是问题。我认为问题在 for 循环之后开始。任何帮助将不胜感激。

def convSingleStep(aSlice, F = np.full((100,100), 0.000001)):
    #F = f*f filter
    s = aSlice*F
    Z = np.sum(s)
    
    return Z



def convForward(dataColor, F = np.full((100,100), 0.000001)):
    nH, nW = dataColor.shape         #1200 x 1200
    f, f = F.shape                   #100 x 100
    theNewSlice = np.zeros((nH, nW)) #1200 x 1200
    
    for h in range(nH): #nH = 1200
        vertStart = h
        vertEnd = h + f
        
        for w in range(nW): #nW = 1200
            horiStart = w
            horiEnd = w + f
            aSlice = dataColor[vertStart:vertEnd, horiStart:horiEnd]
            theNewSlice[h, w] = convSingleStep(aSlice, F = np.full((100,100), 0.000001))
            
    return theNewSlice
```----> 3     s = aSlice*F
ValueError: operands could not be broadcast together with shapes (100,99) (100,100)```

标签: pythonnumpymatrixconvolution

解决方案


在循环的第一步中,

h = 0, , vertEnd = 100
w = 0, , horiEnd = 100
aSlice.shape = (100,100)

这一切都很好,并且按预期行事。
但是到了第 1,100 步 (11,101)

h = 1100, , vertEnd = 1200 # Note the index is 1200, which requires length of 1201
w = 0, , horiEnd = 100

现在您将形状设置在数据范围之外,使用vertEnd = 1200

aSlice = dataColor[vertStart:vertEnd, horiStart:horiEnd]

aSlice.shape # 99, 100

这里,

aSlice[0] = dataColor[1101:1200] = dataColor[1101:] = dataColor[1101:1200]

推荐阅读