欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

卷积神经网络:二维卷积层

程序员文章站 2022-06-26 11:30:19
...


一、简介

CNN中最常见的就是二维卷积层,它有高、宽两个维度,常用来处理图像数据。

二、互相关运算与卷积运算

1. 互相关运算

在二维互相关运算中,一个二维输入数组 X X X和一个二维核 K K K(kernel)数组进行互相关运算,输出一个二维数组。

卷积神经网络:二维卷积层
其中,核数组在卷积计算中称为卷积核过滤器(filter)

具体运算方式:

  • 卷积核从输入的最左上方开始,从左往右、从上往下进行滑动
  • 当滑到某一位置时,窗口中的元素与输入的对应元素相乘,然后将所有乘积的结果相加,得到当前位置的输出

以图中阴影部分为例:
0 ∗ 0 + 1 ∗ 1 + 3 ∗ 2 + 4 ∗ 3 = 19 0*0+1*1+3*2+4*3=19 00+11+32+43=19

另外,输出的形状可以根据输入和卷积核的形状计算。假设输入 X X X的形状为 ( h x , w x ) (h_x,w_x) (hx,wx),卷积核 K K K的形状为 ( h k , w k ) (h_k,w_k) (hk,wk),则输出 Y Y Y的形状:
h y = h x − h k + 1 w y = w x − w k + 1 h_y=h_x-h_k+1 \\ w_y=w_x-w_k+1 hy=hxhk+1wy=wxwk+1

2. 卷积运算

将核数组左右翻转、上下翻转,再与输入进行互相关运算,即得到卷积运算的输出。

三、二维卷积层

卷积层的模型参数包括:卷积核、标量偏差。在训练模型的时候,通常先对参数初始化,然后通过迭代来优化参数。

下面简单实现一个自定义二维卷积层:

from mxnet import autograd, nd
from mxnet.gluon import nn

# 卷积操作
def corr2d(X, K):
	h = X.shape[0] - K.shape[0] + 1
	w = X.shape[1] - K.shape[1] + 1
	Y = nd.zeros((h, w))
	for i in range(h):
		for j in range(w):
			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()

四、特征图和感受野

二维卷积层的输出称为特征图(feature map)

以下图为例:
卷积神经网络:二维卷积层
输入中的阴影部分称为输出中阴影部分的感受野

相关标签: 深度学习