<<< $\color{blue}{ (●’◡’●) 点赞 <(- ●’◡’●) }$
/\\ //>>>>
/__\\ // 关注加RP,AC更容易!
/ \\ //>>>>>
<<< $\color{blue}{ (●’◡’●) 收藏 <(- ●’◡’●) }$
时间有限,直接从线性回归进入卷积神经网络
卷积神经网络的基本组成
- 卷积
- 池化
卷积
卷积操作是滑动窗口,矩阵做点积后相加。
eg:
$$ \left[ \begin{array}{L} 0 & 1 \\\\ 3 & 4 \end{array} \right] * \left[ \begin{array}{L} 0 & 1 \\\\ 2 & 3 \end{array} \right] = 19 $$
对应输入输出维度计算公式:
$$ InputDim = {M, N, K} \\\\ KernelDim = {X, Y, K} \\\\ OutputDim = {M - X + 1, N - Y + 1, 1} $$
对应的代码实现:
import torch
def corr2d(X, K):
h, w = K.shape
Y = torch.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
多输出维度的卷积
卷积在维度上做了累加操作,因此输出的维度都是1;
多输出维度的卷积多个卷积操作的结果堆叠形成。
输入输出维度计算公式:
$$ InputDim = {M, N, Kin} \\\\ KernelDim = {X, Y, Kin, Kout} \\\\ OutputDim = {Kout, M - X + 1, N - Y + 1, 1} $$
def corr2d(X, K):
if len(K.shape) == 2:
h, w = K.shape
Y = torch.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
if len(K.shape) == 3:
s, h, w = K.shape
Y = torch.zeros((s,X.shape[0] - h + 1, X.shape[1] - w + 1))
for k in range(s):
for i in range(Y.shape[1]):
for j in range(Y.shape[2]):
Y[k, i, j] = (X[i:i+h, j:j+w] * K[k]).sum()
return Y
1*1 卷积
11卷积的结构主要用在降低输出的维度,相当于在通道维上做全连接层。
可以直接用矩阵乘法来实现11卷积结构
这在Resnet中是一层重要的结构
代码实现如下:
def corr2d_multi_in_out_1x1(X, K):
c_i, h, w = X.shape
c_o = K.shape[0]
X = X.view(c_i, h * w)
K = K.view(c_o, c_i)
Y = torch.mm(K, X) # 全连接层的矩阵乘法
return Y.view(c_o, h, w)
池化
池化用于提取局部区域的特征,缓解卷积对位置的过分敏感性。
常见的池化操作为均值池化核和最大值池化,torch中对应的实现是torch.nn.MaxPool2d
, torch.nn.AvgPool2d