首页 > 其他分享 >残差神经网络(李沐老师课程)

残差神经网络(李沐老师课程)

时间:2024-09-12 17:53:11浏览次数:3  
标签:nn self 残差 channels 神经网络 num blk 李沐

resnet实现的细节:

各种残差块

各模型对比图

代码:

import torch
from torch import nn
from torch.nn import functional as F
from d2l import torch as d2l
​
"""
ResNet沿用了VGG完整的3*3卷积层设计。 残差块里首先有2个有相同输出通道数的3*3卷积层。
 每个卷积层后接一个批量规范化层和ReLU激活函数。 然后我们通过跨层数据通路,跳过这2个卷积运算,将输入直接加在最后的ReLU激活函数前。 这样的设计要求2个卷积层的输出与输入形状一样,从而使它们可以相加。 
 如果想改变通道数,就需要引入一个额外的1*1卷积层来将输入变换成需要的形状后再做相加运算。 残差块的实现如下:
"""
class Residual(nn.Module):  #@save
    def __init__(self, input_channels, num_channels,
                 use_1x1conv=False, strides=1):
        super().__init__()
        self.conv1 = nn.Conv2d(input_channels, num_channels,
                               kernel_size=3, padding=1, stride=strides)
        self.conv2 = nn.Conv2d(num_channels, num_channels,
                               kernel_size=3, padding=1)
        if use_1x1conv:
            self.conv3 = nn.Conv2d(input_channels, num_channels,
                                   kernel_size=1, stride=strides)
        else:
            self.conv3 = None
        self.bn1 = nn.BatchNorm2d(num_channels)
        self.bn2 = nn.BatchNorm2d(num_channels)
​
    def forward(self, X):
        Y = F.relu(self.bn1(self.conv1(X)))
        Y = self.bn2(self.conv2(Y))
        if self.conv3:
            X = self.conv3(X)
        Y += X
        return F.relu(Y)
​
"""
​
来查看输入和输出形状一致的情况
"""
blk = Residual(3,3)
X = torch.rand(4, 3, 6, 6)
Y = blk(X)
print(Y.shape)
"""
也可以在增加输出通道数的同时,减半输出的高和宽
"""
blk = Residual(3,6, use_1x1conv=True, strides=2)
print(blk(X).shape)
​
"""
ResNet每个卷积层后增加了批量规范化层
"""
b1 = nn.Sequential(nn.Conv2d(1, 64, kernel_size=7, stride=2, padding=3),
                   nn.BatchNorm2d(64), nn.ReLU(),
                   nn.MaxPool2d(kernel_size=3, stride=2, padding=1))
"""
GoogLeNet在后面接了4个由Inception块组成的模块。 ResNet则使用4个由残差块组成的模块,每个模块使用若干个同样输出通道数的残差块。
 第一个模块的通道数同输入通道数一致。 由于之前已经使用了步幅为2的最大汇聚层,所以无须减小高和宽。 之后的每个模块在第一个残差块里将上一个模块的通道数翻倍,并将高和宽减半
"""
def resnet_block(input_channels, num_channels, num_residuals,
                 first_block=False):
    blk = []
    for i in range(num_residuals):
        if i == 0 and not first_block:
            blk.append(Residual(input_channels, num_channels,
                                use_1x1conv=True, strides=2))
        else:
            blk.append(Residual(num_channels, num_channels))
    return blk
"""
ResNet加入所有残差块,这里每个模块使用2个残差块
"""
b2 = nn.Sequential(*resnet_block(64, 64, 2, first_block=True))
b3 = nn.Sequential(*resnet_block(64, 128, 2))
b4 = nn.Sequential(*resnet_block(128, 256, 2))
b5 = nn.Sequential(*resnet_block(256, 512, 2))
​
​
"""
与GoogLeNet一样,在ResNet中加入全局平均汇聚层,以及全连接层输出
"""
net = nn.Sequential(b1, b2, b3, b4, b5,
                    nn.AdaptiveAvgPool2d((1,1)),
                    nn.Flatten(), nn.Linear(512, 10))
​
​
"""
ResNet中不同模块的输入形状是如何变化
"""
X = torch.rand(size=(1, 1, 224, 224))
for layer in net:
    X = layer(X)
    print(layer.__class__.__name__,'output shape:\t', X.shape)
​
"""
训练
"""
lr, num_epochs, batch_size = 0.05, 10, 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=96)
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())
d2l.plt.show()

标签:nn,self,残差,channels,神经网络,num,blk,李沐
From: https://blog.csdn.net/2401_87085787/article/details/142182465

相关文章

  • 批量归一化(李沐老师课程)
    训练时候存在的问题为什么要做批量归一化批量归一化(BatchNormalization,BN)是一种用于加速深度学习模型训练的技术。它通过标准化每层网络的输入(通常是前一层网络的输出),使得网络中的每一层都能接收到具有相同分布的输入数据。这有助于解决训练过程中出现的一些问题,以下是......
  • 【特征融合】卷积神经网络中的特征融合方式有哪些??让我们一起看看!
    【特征融合】卷积神经网络中的特征融合方式总结与探索…【特征融合】卷积神经网络中的特征融合方式总结与探索…前言:**在深度学习中,**特征融合(FeatureFusion)是一种将不同特征图或不同层的输出进行组合的技术,旨在提升模型的表现。特征融合主要用于增强特征表示能力,特别......
  • 神经网络--深度学习(1)
    上一章我们学习了感知机。关于感知机,既有好消息,也有坏消息。好消息是,即便对于复杂的函数,感知机也隐含着能够表示它的可能性。上一章已经介绍过,即便是计算机进行的复杂处理,感知机(理论上)也可以将其表示出来。坏消息是,设定权重的工作,即确定合适的、能符合预期的输入与输出的权......
  • 神经网络基础
      神经网络组件 :简单神经元;多层神经元;前馈神经网络;非线性等。如何训练 :目标;梯度;反向传播。词表示:Word2Vec:常见的神经网络 :RNN(循环神经网络) :序列记忆;语言模型。RNN的梯度问题。变体:GRU;LSTM;双向RNN。CNN(卷积神经网络) :NLP流水线教程(PyTorch)......
  • 【Python机器学习】循环神经网络(RNN)——循环网络的记忆功能
    文档中的词很少是完全独立的,它们的出现会影响文档中的其他词或者收到文档中其他词的影响:Thestolencarspedintothearena.Theclowncarspedintothearena.这两句话可能会产生两种完全不同的情感感受。这两个句子的形容词、名词、动词、介词短语结构式完全相同的,但......
  • 数学建模之BP神经网络+函数代码解释
    神经网络原理~大样本数据-分类/预测~几百个是小样本神经网络——最易懂最清晰的一篇文章-CSDN博客误差大:Matlab中newff函数使用方法和搭建BP神经网络的方法_newff函数用法-CSDN博客net=newff(PR,[S1,S2],{'tansig','purelin'},'traingd')函数 newff:构建BP神经网络PR:训练......
  • 每天五分钟玩转深度学习框架PyTorch:获取神经网络模型的参数
    本文重点当我们定义好神经网络之后,这个网络是由多个网络层构成的,每层都有参数,我们如何才能获取到这些参数呢?我们将再下面介绍几个方法来获取神经网络的模型参数,此文我们是为了学习第6步(优化器)。获取所有参数Parametersfromtorchimportnnnet=nn.Sequential(nn.Linear(4......
  • 卷积神经网络多输入和多输出的通道数(李沐老师课程)
    多通道卷积计算特殊的卷积层1*1卷积核代码:"""​多输入多输出的互相关运算"""importtorchfromtorchimportnnfromd2limporttorchasd2l​"""实现多输入通道互相关运算"""​​defcorr2d_multi_in(x,k): returnsum(d2l.corr......
  • 关于神经网络过拟合的问题,我来解答一下!
    我们可以逐一进行分析:一.为什么模型很快就过拟合了,也就是验证集的损失在几十次迭代后就开始上升了?模型很快出现过拟合的原因可能有几个:模型复杂度过高:如果模型(如神经网络)的容量(即参数数量、层数等)相对于数据集的规模来说过大,那么模型很容易学习到训练数据中的噪声和细节,导......
  • *Python*机器学习算法——神经网络和深度学习
            神经网络和深度学习是现代机器学习的重要组成部分,它们在图像识别、语音识别、自然语言处理等多个领域取得了显著的成功。本文将详细介绍神经网络和深度学习的基本函数概念,并通过一个简单的例子来展示如何使用Python和Keras库构建一个神经网络模型。1、前置库......