李沐pytorch学习-卷积网络及其实现

这篇具有很好参考价值的文章主要介绍了李沐pytorch学习-卷积网络及其实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、卷积概述

1.1 基本定义

        卷积计算过程如图1所示,即输入矩阵和核函数(filter)对应的位置相乘,然后相加得到输出对应位置的数。

李沐pytorch学习-卷积网络及其实现,深度学习,pytorch,学习,人工智能

 图1. 卷积计算过程

        该过程可以形象地从图2中展现。

李沐pytorch学习-卷积网络及其实现,深度学习,pytorch,学习,人工智能

图2. 二维卷积示意图

1.2 实现互相关运算的代码实现

import torch
from torch import nn
from d2l import torch as d2l

def corr2d(X, K): #@save
    """计算二维互相关运算"""
    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

        h,w为卷积核的行、列数

        Y为输出矩阵,它的行、列数为X.shape[0] - h + 1和 X.shape[1] - w + 1X.shape[0] 为输入矩阵的行数,X.shape[0] - h 为卷积核可以向右移动的步数,因为移动步数为零时也会计算出一个值,所以 X.shape[0] - h + 1 为输出结果的行数,列数同理。

        X[i:i + h, j:j + w] * K 表示从输入矩阵中提取一个子矩阵,索引范围为李沐pytorch学习-卷积网络及其实现,深度学习,pytorch,学习,人工智能,即包含左边不包含右边,乘法表示对应元素相乘。

1.3 训练卷积网络的简单实现

import torch
from torch import nn
from d2l import torch as d2l

X = torch.ones((6, 8))
X[:, 2:6] = 0

Y = torch.zeros((6, 7))

# 构造一个二维卷积层,它具有1个输出通道和形状为(1,2)的卷积核
conv2d = nn.Conv2d(1,1, kernel_size=(1, 2), bias=False)

# 这个二维卷积层使用四维输入和输出格式(批量大小、通道、高度、宽度),
# 其中批量大小和通道数都为1
X = X.reshape((1, 1, 6, 8))
Y = Y.reshape((1, 1, 6, 7))
lr = 3e-2 # 学习率

for i in range(10):
    Y_hat = conv2d(X)
    l = (Y_hat - Y) ** 2
    conv2d.zero_grad()
    l.sum().backward()
    # 迭代卷积核
    conv2d.weight.data[:] -= lr * conv2d.weight.grad
    if (i + 1) % 2 == 0:
        print(f'epoch {i+1}, loss {l.sum():.3f}')

二、填充与步幅

        填充(padding)指在输入矩阵周围添加行列,使卷积后得到的结果行列数更多。效果如图3所示。

李沐pytorch学习-卷积网络及其实现,深度学习,pytorch,学习,人工智能

 图3. 卷积填充示意图

import torch
from torch import nn

# 为了方便起见,我们定义了一个计算卷积层的函数。
# 此函数初始化卷积层权重,并对输入和输出提高和缩减相应的维数
def comp_conv2d(conv2d, X):
    # 这里的(1,1)表示批量大小和通道数都是1
    X = X.reshape((1, 1) + X.shape)
    Y = conv2d(X)
    # 省略前两个维度:批量大小和通道
    return Y.reshape(Y.shape[2:])

# 请注意,这里每边都填充了1行或1列,因此总共添加了2行或2列
conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1)

X = torch.rand(size=(8, 8))
comp_conv2d(conv2d, X).shape

# 上下各填充2行,左右各填充1列,总计填充4行2列
conv2d = nn.Conv2d(1, 1, kernel_size=(5, 3), padding=(2, 1))
comp_conv2d(conv2d, X).shape

        步幅(stride)指卷积核每次移动距离,增加步幅可以在不增加卷积核尺寸的条件下使得到的结果行列数更少。效果如图4所示。

李沐pytorch学习-卷积网络及其实现,深度学习,pytorch,学习,人工智能

图4. 卷积步幅示意图

import torch
from torch import nn

# 向右移动的步幅与向下移动的步幅均为2
conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1, stride=2)

X = torch.rand(size=(8, 8))
print(comp_conv2d(conv2d, X).shape) # 输出 torch.Size([4, 4])

X = torch.rand(size=(8, 8))

# padding之后,size=(8,10),输出行数=1+(8-3)/3=2,输出列数=1+(10-5)/4=2
# 行向移动的stride=3,列向移动的stride=4
conv2d = nn.Conv2d(1, 1, kernel_size=(3, 5), padding=(0, 1), stride=(3, 4))
print(comp_conv2d(conv2d, X).shape) # 输出 torch.Size([2, 2])

三、多通道输入与输出

3.1 多通道输入

        多通道输入,输入的通道数与卷积核的通道数应相同,隔层分别进行卷积,然后相加,单个卷积核输出单通道。

李沐pytorch学习-卷积网络及其实现,深度学习,pytorch,学习,人工智能

图5. 多通道输入计算过程

 3.2 多通道输出

        多通道输出需要多个卷积核,每个卷积核生成输出的一个通道,如果输出通道数为10,需要10个卷积核。

李沐pytorch学习-卷积网络及其实现,深度学习,pytorch,学习,人工智能

 图6. 多通道输出计算过程

        每个核(filter)代表一种特定的识别模式(例如是识别边缘、锐化等)

3.3 1×1卷积层(Shared MLP)

         该卷积层不识别空间模式,仅仅融合通道特征,如图7所示。

李沐pytorch学习-卷积网络及其实现,深度学习,pytorch,学习,人工智能

 图7. Shared MLP结构(输入通道3,输出通道2)

四、池化

        池化,可增强容错性,降低网络对局部噪音的敏感度。作用过程类似卷积层,如图2所示,用矩形窗口进行计算,不过计算规则不一样,可用于缩小该层规模,也有padding和stride。但没有可学习的参数。

         例如最大池化(输出每个窗口最强的信号):

李沐pytorch学习-卷积网络及其实现,深度学习,pytorch,学习,人工智能

 图8. 最大池化示意图

        池化的代码手动实现如下:

import torch
from torch import nn
from d2l import torch as d2l

def pool2d(X, pool_size, mode='max'):
    p_h, p_w = pool_size

    # 输出结果的长宽
    Y = torch.zeros((X.shape[0] - p_h +1, X.shape[1] - p_w + 1))
    for i in range(Y.shape[0]):
        for j in range(Y.shape[1]):
            if mode == 'max':
                Y[i, j] = X[i:i + p_h, j:j + p_w].max()
            elif mode == 'avg':
                Y[i, j] = X[i:i + p_h, j:j + p_w].mean()
    return Y

X = torch.tensor([[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]])

print(pool2d(X))

        使用pytorch框架实现如下:

import torch

X = torch.arange(16, dtype = torch.float32).reshape((1, 1, 4, 4))

# pytorch 框架下的最大池化实现,默认 stride 和窗口大小相同
pool2d = nn.MaxPool2d(3)

print(pool2d(X))

# 手动设置 padding 和 stride
pool2d = nn.MaxPool2d(3, padding = 1, stride = 2)

# 2行3列的卷积核,padding 上下各加2行,左右各加1列,行向移动stride为2,列向移动stride为3
pool2d = nn.MaxPool2d((2,3), padding = (2, 1), stride = (2, 3))

        二维池化层用于多通道数据时,在每个通道上单独计算,生成结果的通道数与输入的通道式一致。文章来源地址https://www.toymoban.com/news/detail-667390.html

到了这里,关于李沐pytorch学习-卷积网络及其实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 互联网加竞赛 基于人工智能的图像分类算法研究与实现 - 深度学习卷积神经网络图像分类

    🔥 优质竞赛项目系列,今天要分享的是 基于人工智能的图像分类技术 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/postgraduate 传统CNN包含卷积层、全连接层等组件,并采用softmax多类别分类器和多类交叉熵损失

    2024年02月02日
    浏览(60)
  • 李沐深度学习-d2lzh_pytorch模块实现

    2024年01月21日
    浏览(83)
  • 卷积神经网络——上篇【深度学习】【PyTorch】

    5.1.1、理论部分 全连接层后,卷积层出现的意义? 一个足够充分的照片数据集,输入,全连接层参数,GPU成本,训练时间是巨大的。 (convolutional neural networks,CNN)是机器学习利用自然图像中一些已知结构的创造性方法,需要更少的参数,在处理图像和其他类型的结构化数据

    2024年02月12日
    浏览(36)
  • 人工智能(Pytorch)搭建模型1-卷积神经网络实现简单图像分类

    本文参加新星计划人工智能(Pytorch)赛道:https://bbs.csdn.net/topics/613989052 目录 一、Pytorch深度学习框架 二、 卷积神经网络 三、代码实战 内容: 一、Pytorch深度学习框架 PyTorch是一个开源的深度学习框架,它基于Torch进行了重新实现,主要支持GPU加速计算,同时也可以在CPU上运行

    2024年02月03日
    浏览(66)
  • 鱼类识别Python+深度学习人工智能+TensorFlow+卷积神经网络算法

    鱼类识别系统。使用Python作为主要编程语言开发,通过收集常见的30种鱼类(‘墨鱼’, ‘多宝鱼’, ‘带鱼’, ‘石斑鱼’, ‘秋刀鱼’, ‘章鱼’, ‘红鱼’, ‘罗非鱼’, ‘胖头鱼’, ‘草鱼’, ‘银鱼’, ‘青鱼’, ‘马头鱼’, ‘鱿鱼’, ‘鲇鱼’, ‘鲈鱼’, ‘鲍鱼’, ‘鲑

    2024年02月02日
    浏览(100)
  • 卷积神经网络——下篇【深度学习】【PyTorch】【d2l】

    5.10.1、理论部分 批量归一化可以解决深层网络中梯度消失和收敛慢的问题,通过固定每个批次的均值和方差来加速收敛,一般不改变模型精度。批量规范化已经被证明是一种不可或缺的方法,它适用于几乎所有图像分类器。 批量规划是一个线性变换 ,把参数的均值方差给拉

    2024年02月12日
    浏览(47)
  • 卷积神经网络——中篇【深度学习】【PyTorch】【d2l】

    5.5.1、理论部分 两个⌈ 卷积块 ⌋ 每个卷积块中的基本单元是一个⌈ 卷积层 ⌋、一个 ⌈ sigmoid激活函数 ⌋和 ⌈ 平均汇聚层 ⌋ 三个⌈ 全连接层密集块 ⌋ 早期神经网络,先使用卷积层学习图片空间信息,然后全连接层转换到类别空间。 5.5.2、代码实现 定义一个 Sequential块

    2024年02月11日
    浏览(56)
  • 卷积神经网络——上篇【深度学习】【PyTorch】【d2l】

    5.1.1、理论部分 全连接层后,卷积层出现的意义? 一个足够充分的照片数据集,输入,全连接层参数,GPU成本,训练时间是巨大的。 (convolutional neural networks,CNN)是机器学习利用自然图像中一些已知结构的创造性方法,需要更少的参数,在处理图像和其他类型的结构化数据

    2024年02月12日
    浏览(47)
  • 毕业设计选题-基于深度学习的车道线检测算法识别系统 人工智能 机器学习 卷积神经网络

    目录 前言 课题背景和意义 实现技术思路 一、车道线检测方法 1.1 卷积神经网络 1.2 注意力机制 二、 数据集 三、实验及结果分析 3.1 实验环境搭建 3.2 模型训练 实现效果图样例 最后     📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学

    2024年02月22日
    浏览(79)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包