恒源云(GPUSHARE)_CIFAR-10数据集实战:构建ResNet18神经网络

本文通过恒源云社区分享了Mathor大佬的ResNet18模型实现,详细讲解了如何构建Residual Block,并在CIFAR-10数据集上进行实践。在构建过程中,强调了 stride 的设置以控制网络参数数量,以及解决输出维度匹配的问题。最后,文章展示了ResNet18相比于LeNet5在准确率上的提升,但也指出更深的网络会导致运行时间增加。
摘要由CSDN通过智能技术生成

文章来源 | 恒源云社区

原文地址 | 数据集实战

原文作者 | Mathor


实不相瞒,小编我对平台社区内的大佬Mathor很崇拜!这不,今天又来给大家分享大佬论文笔记了,赶紧看看接下来的内容是否有你们需要的知识点吧!

##正文开始:

如果不了解ResNet的同学可以先看我的这篇博客ResNet论文阅读

首先实现一个Residual Block

import torch
from torch import nn
from torch.nn import functional as F

class ResBlk(nn.Module):
    def __init__(self, ch_in, ch_out, stride=1):
        super(ResBlk, self).__init__()
        self.conv1 = nn.Conv2d(ch_in, ch_out, kernel_size=3, stride=stride, padding=1)
        self.bn1 = nn.BatchNorm2d(ch_out)
        
        self.conv2 = nn.Conv2d(ch_out, ch_out, kernel_size=3, stride=1, padding=1)
        self.bn2 = nn.BatchNorm2d(ch_out)
        
        if ch_out == ch_in:
            self.extra = nn.Sequential()
        else:
            self.extra = nn.Sequential(
                
                # 1×1的卷积作用是修改输入x的channel
                # [b, ch_in, h, w] => [b, ch_out, h, w]
                nn.Conv2d(ch_in, ch_out, kernel_size=1, stride=stride),
                nn.BatchNorm2d(ch_out),
            )
        
    def forward(self, x):
        out = F.relu(self.bn1(self.conv1(x)))
        out = self.bn2(self.conv2(out))

        # short cut
        out = self.extra(x) + out
        out = F.relu(out)
        
        return out

Block中进行了正则化处理,以使train过程更快更稳定。同时要考虑,如果两元素的ch_in和ch_out不匹配,进行加法时会报错,因此需要判断一下,如果不想等,就用1×1的卷积调整一下

测试一下

blk = ResBlk(64, 128, stride=2)
tmp = torch.randn(2, 64, 32, 32)
out = blk(tmp)
print(out.shape)

输出的shape大小是torch.Size([2, 128, 16,

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值