Python 手工制作三维卷积神经网络的形状误差

Python 手工制作三维卷积神经网络的形状误差,python,numpy,machine-learning,array-broadcasting,Python,Numpy,Machine Learning,Array Broadcasting,我有以下二维卷积的代码: matrix = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]]) kernel = np.array([[1,-1],[1,-1]]) kr, kc = kernel.shape mr, mc = matrix.shape output = np.empty((mc-kc+1, mr-kr+1)) for row in range(mc-kc+1): for column in range(mr-kr+1):

我有以下二维卷积的代码:

matrix = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
kernel = np.array([[1,-1],[1,-1]])

kr, kc = kernel.shape
mr, mc = matrix.shape

output = np.empty((mc-kc+1, mr-kr+1))

for row in range(mc-kc+1):
    for column in range(mr-kr+1):
        output[row][column] = (matrix[row:row+kr,column:column+kc]*kernel).sum()

print(output)
我想在真彩色图像上试试这个,以下是我尝试过的

#matrix is now 3D
print(matrix.shape)
Out: (340, 360, 3)

#kernel is now 3D
print(kernel.shape)
Out: (34, 36, 3)

kr, kc, kdim = kernel.shape
mr, mc, mdim = matrix.shape

output = np.empty((mc-kc+1, mr-kr+1, 3))

for row in range(mc-kc+1):
    for column in range(mr-kr+1):
        for dim in range(3):
            output[row][column][dim] = (matrix[row:row+kr,column:column+kc]*kernel).sum()

print(output)
Out: ValueError: operands could not be broadcast together with shapes (33,36,3) (34,36,3)

我认为深度维度有问题,但我仍然不知道如何修复它。帮助?

您已经在
输出
声明中以及在行和列上的循环中交换了行和列。请尝试以下版本:

# note: [rows, columns, channel]
output = np.empty((mr - kr + 1, mc - kc + 1, 3))

# note: `row` loops over matrix rows, `column` - over columns
for row in range(mr - kr + 1):
  for column in range(mc - kc + 1):
    for dim in range(3):
      output[row][column][dim] = (matrix[row:row + kr, column:column + kc] * kernel).sum()

print(output)

您已经在
output
声明中交换了行和列,并在行和列的循环中交换了行和列。请尝试以下版本:

# note: [rows, columns, channel]
output = np.empty((mr - kr + 1, mc - kc + 1, 3))

# note: `row` loops over matrix rows, `column` - over columns
for row in range(mr - kr + 1):
  for column in range(mc - kc + 1):
    for dim in range(3):
      output[row][column][dim] = (matrix[row:row + kr, column:column + kc] * kernel).sum()

print(output)

output=np.empty((mc-kc+1,mr-kr+1,3))
行中,您使用的是
mc
而不是
mcm
。您的意思是在这里使用来自3d矩阵的
mcm
?或者,将
mr,mcm,mdim=matrix.shape
更改为
mr,mc,mdim=matrix.shape
这是一个打字错误,很抱歉。已经改变了它,但问题仍然是矩阵秩应该大于核秩:2D卷积使用4D张量(通常是批次的一维),3D卷积使用5D张量等等。在
output=np.empty((mc-kc+1,mr-kr+1,3))
行中,您使用的是
mc
而不是
mcm
。您的意思是在这里使用来自3d矩阵的
mcm
?或者,将
mr,mcm,mdim=matrix.shape
更改为
mr,mc,mdim=matrix.shape
这是一个打字错误,很抱歉。已经改变了它,但问题仍然是矩阵秩应该大于核秩:2D卷积与4D张量一起工作(通常为批量1维),3D卷积与5D张量一起工作,等等。