0609-搭建ResNet网络

利用 torch 实现 ResNet34 网络
import torch as t
from torch import nn
from torch.nn import functional as F

class ResidualBlock(nn.Module):
“”"
实现子 module:Residual Block
“”"

def __init__(self, inchannel, outchannel, stride=1, shortcut=None):
    super(ResidualBlock, self).__init__()

    # 由于 Residual Block 分为左右两部分,因此定义左右两边的 layer
    # 定义左边
    self.left = nn.Sequential(
        # Conv2d 参数:in_channel,out_channel,kernel_size,stride,padding
        nn.Conv2d(inchannel, outchannel, 3, stride, 1, bias=False),
        nn.BatchNorm2d(outchannel),
        nn.ReLU(inplace=True),
        nn.Conv2d(outchannel, outchannel, 3, 1, 1, bias=False),
        nn.BatchNorm2d(outchannel))
    # 定义右边
    self.right = shortcut

def forward(self, x):
    out = self.left(x)
    residual = x if self.right is None else self.right(x)  # 检测右边直连的情况
    out += residual
    return F.relu(out)

class ResNet(nn.Module):
“”"
实现主 module:ResNet34
ResNet34 包含多个 layer,每个 layer 又包含多个 residual block
用子 module 实现 residual block,用 _make_layer 函数实现 layer
“”"

def __init__(self, num_classes=1000):
    super(ResNet, self).__init__()
    # 前几层图像转换
    self.pre = nn.Sequential(
        nn.Conv2d(3, 64, 7, 2, 3, bias=False),
        nn.BatchNorm2d(64),
        nn.ReLU(inplace=True),
        nn.MaxPool2d(3, 2, 1),
    )

    # 重复的 layer 分别有 3,4,6,3 个 residual block
    self.layer1 = self._make_layer(64, 128, 3)
    self.layer2 = self._make_layer(128, 256, 4, stride=2)
    self.layer3 = self._make_layer(256, 512, 6, stride=2)
    self.layer4 = self._make_layer(512, 512, 3, stride=2)

    # 分类用的全连接
    self.fc = nn.Linear(512, num_classes)

def _make_layer(self, inchannel, outchannel, block_num, stride=1):
    """
    构建 layer,包含多个 residual block
    """
    shortcut = nn.Sequential(
        nn.Conv2d(inchannel, outchannel, 1, stride, bias=False),
        nn.BatchNorm2d(outchannel))

    layers = []
    layers.append(ResidualBlock(inchannel, outchannel, stride, shortcut))

    for i in range(1, block_num):
        layers.append(ResidualBlock(outchannel, outchannel))

    return nn.Sequential(*layers)

def forward(self, x):
    x = self.pre(x)

    x = self.layer1(x)
    x = self.layer2(x)
    x = self.layer3(x)
    x = self.layer4(x)

    x = F.avg_pool2d(x, 7)
    x = x.view(x.size(0), -1)

    return self.fc(x)

res_net = ResNet()
inp = t.autograd.Variable(t.randn(1, 3, 224, 224))
output = res_net(inp)
output.size()
torch.Size([1, 1000])
不到 50 行代码便实现了这样一个网络,看起来是那么不可思议,如果对此感兴趣的同学还可以取消尝试实现 Google 的 Inception 网络。

三、torchvision 中的 resnet34网络调用
前面我们讲过一个 hub 模块,里面存储了很多网络结构。不仅如此,和 torch 配套的图像工具包 torchvision 也实现了深度学习中的大多数经典的模型,其中就包括了 ResNet34,非常简单,可以通过以下两行代码调用这个网络:

from torchvision import models
res_net = models.resnet34()
inp = t.autograd.Variable(t.randn(1, 3, 224, 224))
output = res_net(inp)
output.size()
torch.Size([1, 1000])
本例中的 ResNet34 的实现参考了 torchvision 中的实现并做了一定的调整,有兴趣的同学可以去阅读相对应的源码。
USB Microphone https://www.soft-voice.com/
Wooden Speakers https://www.zeshuiplatform.com/
亚马逊测评 www.yisuping.cn
深圳网站建设www.sz886.com

### 回答1: ResNet深度学习网络可以通过在卷积神经网络(CNN)中使用残差块,每一层的输入会添加到输出上来构建。残差块的主要目的是解决深层网络训练中的梯度消失问题,它可以减少训练数据集大小,提高准确率和模型效率。 ### 回答2: 搭建ResNet深度学习网络可以通过以下步骤实现。 1.导入必要的库和模块:首先,需要导入深度学习框架的库,例如TensorFlow或PyTorch,并且还要导入其他必要的库,例如numpy用于数值计算和matplotlib用于可视化。 2.定义ResNet网络的基本块:ResNet网络的基本单位是残差模块(Residual Block)。一个残差模块由两个卷积层和一个跳跃连接组成。这个跳跃连接将输入直接添加到卷积层的输出,以便于梯度的流动,避免梯度消失的问题。根据网络深度的不同,可以定义多个残差模块。 3.定义ResNet网络结构:根据需要的深度,将多个残差模块按顺序连接起来,组成整个ResNet网络结构。在实践中,通常使用层数较少的ResNet-18或ResNet-34进行快速训练和调试,或者使用层数较多的ResNet-50、ResNet-101或ResNet-152等进行更复杂的任务。 4.定义前向传播函数:根据ResNet网络结构,定义前向传播函数。这个函数将输入数据作为输入,并通过每个残差模块向前传播,直到最后一层输出预测结果。 5.定义损失函数和优化器:根据任务的特点,选择适当的损失函数,例如均方误差损失函数(Mean Squared Error)或交叉熵损失函数(Cross Entropy)。然后,选择适当的优化器,例如随机梯度下降(SGD)或Adam优化器等。 6.训练模型:将数据集分为训练集和验证集,通过模型的前向传播计算预测值,并与真实值进行比较,计算损失函数并反向传播更新参数。重复这个过程多次,直到模型收敛。 7.评估和调优模型:通过验证集对模型进行评估,可以计算准确率、精确率、召回率等指标。根据评估结果,对模型进行调优,例如调整学习率、增加训练数据或调整网络结构等。 8.使用模型进行预测:对于未知的输入数据,使用训练好的模型进行预测,并获取预测结果。 综上所述,搭建ResNet深度学习网络包括导入库和模块、定义基本块和网络结构、定义前向传播函数、定义损失函数和优化器、训练模型、评估和调优模型以及使用模型进行预测。 ### 回答3: 搭建一个 ResNet 深度学习网络可以分为以下几个步骤: 1. 数据预处理:收集和准备用于训练的图像数据集。对图像进行预处理,如大小调整、归一化、裁剪等操作,以便于网络的训练和测试。 2. 构建残差块(Residual Block):ResNet 的核心是残差学习,通过添加残差块来增加网络的深度。残差块由两个或三个卷积层组成,其中包含一个跳跃连接(shortcut connection),可以绕过一部分网络层直接连到后续层。 3. 构建 ResNet 模型:使用多个残差块构建 ResNet 模型。根据任务的复杂度和要求,可以选择不同深度的 ResNet(如 ResNet-18、ResNet-34、ResNet-50 等)。 4. 添加全局平均池化层:在 ResNet 的最后一部分添加一个全局平均池化层,将特征图转换为一个固定长度的向量。 5. 添加全连接层和输出层:在全局平均池化层后添加一个全连接层和一个输出层,用于对输入进行分类或回归等任务。 6. 模型训练:使用训练数据对搭建好的 ResNet 模型进行训练。选择合适的损失函数和优化算法,并根据训练集的大小和模型的复杂度设置适当的训练参数。 7. 模型评估:在测试数据上对训练好的模型进行评估,计算模型的准确率、精度、召回率等指标,判断模型的性能。 8. 模型优化:根据评估结果对模型进行优化,可以调整网络结构、调整超参数、增加正则化等方法来提高模型性能。 9. 模型应用:将优化后的模型用于实际场景,进行图像分类、对象检测、图像生成等各种深度学习任务。 总之,搭建 ResNet 深度学习网络是一个多步骤的过程,需要根据具体任务和数据集进行选择和调整。通过不断优化和训练,可以得到性能较好的深度学习模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值