AcWing
  • 首页
  • 活动
  • 题库
  • 竞赛
  • 应用
  • 其它
    • 题解
    • 分享
    • 商店
    • 问答
  • 吐槽
  • 登录/注册

$$\Large资深入门者关于PyTorch和深度学习的碎碎念——卷积神经网络$$

作者: 作者的头像   Okamasa店老板 ,  2023-01-25 14:42:57 ,  所有人可见 ,  阅读 88


4


<<< $\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卷积的结构主要用在降低输出的维度,相当于在通道维上做全连接层。
可以直接用矩阵乘法来实现1
1卷积结构
这在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

0 评论

你确定删除吗?
1024
x

© 2018-2023 AcWing 版权所有  |  京ICP备17053197号-1
用户协议  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息