我正在尝试在 NumPy 中实现 CNN,以便更好地了解其内部工作原理
我的架构如下
- 10张图像,1通道,28像素行和列(尺寸:(10X1X28X28))
- 3个卷积滤波器。每个尺寸为 5X5。(尺寸:3X1X5X5)(步幅=1)
- 第一个带维度的卷积输出 (10X3X24X24)
- 第一个最大池化层(stride=2)
- 具有尺寸的第一个最大池输出 (10X3X12X12)
- 6个卷积滤波器。每个尺寸为 3X5X5(尺寸:6X3X5X5)(步幅=1)
- 具有维度 (10X6X8X8) 的第二个卷积输出
- 第二个最大池化层(stride=2)
- 具有维度 (10X6X4X4) 的第二个最大池输出
- 维度的第一个全连接层 (96X10)
- 维度的第二个全连接层 (80X10)
- 维度的输出层(10X10)(Softmax层)
使用反向传播,我已经能够计算出第二个卷积输出的误差,其尺寸为 10X6X8X8。我需要计算第一个最大池输出的误差。这涉及以下步骤
- 采用连接第一个最大池输出和第二个卷积输出的卷积滤波器。这具有尺寸(6X3X5X5)。
- 将第 3 和第 4 轴旋转 180 度。在代码中
resulting_weight = np.rot90(np.rot90(weight,axes(2,3),axes=(2,3)) - 这将产生具有尺寸 (6X3X5X5) 的新旋转矩阵
- 在第二个卷积输出(10X6X8X8)和新旋转矩阵(6X3X5X5)的误差之间进行全卷积
由于尺寸不匹配,我不确定如何实施最后一步。完整的卷积运算应该产生一个尺寸为 (10X3X12X12) 的矩阵。仅当旋转矩阵具有尺寸 (3X6X5X5) 时,这才有可能。我们应该重新塑造旋转矩阵的尺寸(3X6X5X5)吗?还是我对 180 度旋转的理解有误?