前言
本节学习卷积神经网络的基础知识
- 卷积层
- 填充和步幅
- 多输入和多输出通道
- 池化层
- 卷积神经网络
1、卷积层
互相关运算
卷积层来源于卷积运算
但通常会用互相关运算
如图所示,0 * 0 + 1 * 1 + 3 * 2 + 4 * 3 = 19
卷积窗口从输⼊数组的最左上⽅开始
按从左往右、从上往下的顺序,依次在输⼊数组上滑动
实现如下
from mxnet import autograd, nd
from mxnet.gluon import nn
def corr2d(X, K): # 本函数已在d2lzh库中有
h, w = K.shape
Y = nd.zeros((X.shape[0] - h + 1, X.shape[1] - w + 1))
for i in range(Y.shape[0]):
for j in range(Y.shape[1]):
Y[i, j] = (X[i: i + h, j: j + w] * K).sum()
return Y
二维卷积层
- 卷积层的模型参数包括了卷积核和标量偏差
- 在训练模型的时候,通常先对卷积核随机初始化,然后不断迭代卷积核和偏差
class Conv2D(nn.Block):
def __init__(self, kernel_size, **kwargs):
super(Conv2D, self).__init__(**kwargs)
self.weight = self.params.get('weight', shape=kernel_size)
self.bias = self.params.get('bias', shape=(1,))
def forward(self, x):
return corr2d(x, self.weight.data()) + self.bias.data()
例子
使⽤物体边缘检测中的输⼊数据X和输出数据Y来学习我们构造的核数组K
- ⾸先构造⼀个卷积层,将其卷积核初始化成随机数组
- 接下来在每⼀次迭代中,⽤平⽅误差来⽐较Y和卷积层的输出
- 然后计算梯度来更新权重
conv2d