网站都有后台吗,受欢迎的惠州网站建设,怎么改网站模板,建设部的网站首页原文链接#xff1a;【动手学深度学习笔记】之二维卷积层mp.weixin.qq.com1.二维卷积层本节介绍卷积神经网络中最常见的二维卷积层。二维卷积层常用来处理图像数据#xff0c;它具有两个空间维度#xff08;高和宽#xff09;。1.1二维互相关运算1.1.1原理分析在二维互相…原文链接【动手学深度学习笔记】之二维卷积层mp.weixin.qq.com1.二维卷积层本节介绍卷积神经网络中最常见的二维卷积层。二维卷积层常用来处理图像数据它具有两个空间维度高和宽。1.1二维互相关运算1.1.1原理分析在二维互相关运算中卷积窗口从左上角开始每次向右滑动一列直到到达最右边然后回到最左边的列并向下滑动一行继续重复上面的动作直到到达右当卷积窗口滑动到某个位置时窗口中的输入子片段与卷积窗口阵列按元素相乘并求和并得到排列中相应位置的元素。听着实在是复杂看个实例吧。我们对大小为的输入二维数组和大小为的二维核数组卷积窗口大小进行二维互相关运算。根据互相关运算的过程首先是核排列会和进行运算然后向右滑动一列核排列与进行运算上一次卷积窗体已经滑到了最右列所以现在卷积窗体返回最垂直列并向下滑动一行核排列与进行运算现在卷积窗口滑动到了右下角核排列与进行运算最后将四次运算的数与窗口同顺序分开在输出二维排列中得到输出二维排列。1.1.2程序实现分析上述过程可知输出数组的大小与输入数组核数组存在关系式中分别为输出数组输入数组和核数组的行数 分别为输出数组输入数组和核数组的列数。并且横向滑动次数和相同初步滑动次数与相同。根据数组行列数之间的关系和运算方法最终程序实现如下。def cross(X,K):H_i X.shape[0]W_i X.shape[1]h K.shape[0]w K.shape[1]Y torch.zeros((H_i-h1,W_i-w1))for i in range(Y.shape[0]):for j in range(Y.shape[1]):Y[i,j] (X[i:ih,j:jw]*K).sum()return Y现在来构造输入多重和核分布测试一下互相关运算函数X torch.tensor([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
K torch.tensor([[0, 1], [2, 3]])
cross(X, K)得到输出相对为tensor([[19., 25.],[37., 43.]])1.2二维卷积层窗口形状为的卷积层。二维卷积层的模型参数为卷积核重量和标量偏差bias。训练模型时同样是线随机初始化模型参数然后不断更新迭代参数。二维卷积层将输入和卷积核做互相关运算并加上一个标量偏差来得到输出。1.2.1实现二维卷积层class Conv(nn.Module):def __init__(self, kernel_size):super(Conv, self).__init__()#类型为Parameter的tensor自动添加到参数列表self.weight nn.Parameter(torch.randn(kernel_size))self.bias nn.Parameter(torch.randn(1)) #只有一组输出所以只需要一个偏差参数def forward(self, x):#正向传播互相关运算之后加上偏差return cross(x, self.weight) self.bias
1.3互相关运算的应用下面使用二维卷积层检测图像中物体的边缘发生变化的位置。首先初始化一张的图像令它的中间四列为黑0其余为白1。X torch.ones(6,8)
X[:,2:6] 0输出X为tensor([[1., 1., 0., 0., 0., 0., 1., 1.],[1., 1., 0., 0., 0., 0., 1., 1.],[1., 1., 0., 0., 0., 0., 1., 1.],[1., 1., 0., 0., 0., 0., 1., 1.],[1., 1., 0., 0., 0., 0., 1., 1.],[1., 1., 0., 0., 0., 0., 1., 1.]])然后构造一个大小为的卷积核K当它与输入做互相关运算时如果横向相邻元素相同输出为0否则输出为非0。K torch.tensor([[1, -1]])最后使用互相关运算计算得到输出值。Y cross(X, K)输出数组Y为tensor([[ 0., 1., 0., 0., 0., -1., 0.],[ 0., 1., 0., 0., 0., -1., 0.],[ 0., 1., 0., 0., 0., -1., 0.],[ 0., 1., 0., 0., 0., -1., 0.],[ 0., 1., 0., 0., 0., -1., 0.],[ 0., 1., 0., 0., 0., -1., 0.]])可以看出我们将从白到黑的边缘和从黑到白的边缘分别检测到1和-1。其余部分的输出全是0。使用卷积核可以有效地表征局部空间。1.4二维卷积层的应用这一部分将使用1.3中的输入数组X和输出数组Y来训练卷积神经网络最终得到卷积核。net Conv(kernel_size (1,2))
step 20#训练周期
lr 0.01#学习率for i in range(step):Y_hat net(X)l ((Y_hat - Y) ** 2).sum()l.backward()net.weight.grad.fill_(0)net.bias.grad.fill_(0)if (i1)%5 0:print(Step %d, loss %.3f % (i 1, l.item()))print(weight:,net.weight.data)
print(bias:,net.bias.data)各个学习周期的损失为Step 5, loss 7.531
Step 10, loss 1.380
Step 15, loss 0.304
Step 20, loss 0.076训练结束后模型参数为weight: tensor([[ 0.8960, -0.9054]])
bias: tensor([0.0053])训练得到的参数与真实参数[1,-1]还是比较接近的。1.5卷积运算为了得到卷积运算的输出我们只需将核重叠到左右并排上下再与输入数组做互相关运算。1.6特征图和感受野二维卷积层输出的二维细分可以被预定输入数组在空间尺寸上某一级的表征也就是特征图。如1.1中输入数组中的是输出数组中的感受野。整个输入样本都是输出样本的感受野。