resnet18实现cifar10分类

实验步骤

搭建resnet18网络
数据集加载
模型训练和改进
分析评估
Kaggle提交

网络构建

实验初期拟采用torchvision中实现的resnet18作为网络结构,为了方便修改网络结构,于是重新实现了resnet18网络

resnet18由一个7x7的降采样卷积,一个max pooling层,8个basicblock,一个全局池化层,最后接一个全连接层组成,如下图

image-20211223160315574image-20211223160156154

tensorboard网络结构可视化,左图为torchvision中的resnet实现,右图为自定义实现

代码如下

定义残差块
class IdentityBlock(nn.Module):
    def __init__(self, in_channels, out_channels, down_sampling=False):
        super().__init__()
        self.down_sampling = down_sampling
        self.in_channels = in_channels
        self.out_channels = out_channels
        self.conv1 = nn.Sequential(OrderedDict([
            ('conv1', nn.Conv2d(in_channels=in_channels, out_channels=out_channels, kernel_size=3,
                                stride=(1 if in_channels == out_channels else 2), padding=1,
                                bias=False)),
            ('bn1', nn.BatchNorm2d(out_channels)),
            ('relu1', nn.ReLU())
        ]))
        self.shortcut = nn.Sequential(OrderedDict([
            (
                'conv',
                nn.Conv2d(in_channels=in_channels, out_channels=out_channels, kernel_size=1, stride=2, bias=False)),
            ('bn', nn.BatchNorm2d(out_channels))
        ])) if in_channels != out_channels else nn.Sequential()
        self.conv2 = nn.Sequential(OrderedDict([
            ('conv2', nn.Conv2d(in_channels=out_channels, out_channels=out_channels, kernel_size=3, stride=1, padding=1,
                                bias=False)),
            ('bn2', nn.BatchNorm2d(out_channels))
        ]))
        self.relu2 = nn.ReLU()

    def forward(self, x):
        fx = self.conv1(x)
        fx = self.conv2(fx)
        x = self.shortcut(x)
        hx = fx + x
        hx = self.relu2(hx)
        return hx
定义模型网络
class Resnet18(nn.Module):
    def __init__(self, num_classes):
        super(Resnet18, self).__init__()
        self.conv1 = nn.Sequential(OrderedDict([
            ('conv', nn.Conv2d(in_channels=3, out_channels=64, kernel_size=7, stride=2, padding=3, bias=False)),
            ('bn', nn.BatchNorm2d(64)),
            ('relu', nn.ReLU()),
        ]))
        self.max_pool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
        self.layer1 = self.make_layer(64
  • 8
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1.项目代码功能经验证ok,确保稳定可靠运行。欢迎下载使用! 2.主要针对各个计算机相关专业,包括计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师或企业员工使用。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行二次开发。在使用过程中,如有问题或建议,请及时私信沟通。 5.期待你能在项目中找到乐趣和灵感,也欢迎你的分享和反馈! 【资源说明】 基于ResNet50和Cifar10数据集的全卷积图像识别分类源码+项目说明(Jupyter Notebook运行).zip **全卷积模型**:本项目将**CNN**模式后面的**全连接层换成卷积层**,所以整个网络都是**卷积层**。其最后输出的是一张已经标记好的**热图**,而**不是一个概率值**。 通常的CNN网络中,在最后都会有几层全连接网络来融合特征信息,然后再对融合后的特征信息进行softmax分类,如下图所示: 假设最后一层的**feature_map**的大小是**7x7x512**,那么**全连接层**做的事就是用**4096个7x7x512**的滤波器去卷积这个最后的**feature_map**。所以可想而知这个参数量是很大的!! 但是**全卷积网络**就简单多了。**FCN**的做法是将最后的全连接层替换为**4096个1x1x512**的**卷积核**,所以最后得出来的就是一个二维的图像,然后再对这个二维图像进行**上采样**(反卷积),然后再对最后反卷积的图像的每个像素点进行softmax分类。 我们都知道卷积层后的**全连接目的**是将 卷积输出的二维特征图(feature map)转化成($N\times 1$)**一维的一个向量**因为传统的卷积神经网络的输出都是分类(一般都是**一个概率值**),也就是几个别的概率甚至就是一个别号,那么全连接层就是高度提纯的特征了,方便交给最后的分类器或者回归。 根据全连接的目的,我们完全可以利用卷积层代替全连接层,在输入端使用 $M\times M$ 大小的卷积核将数据“扁平化处理”,在使用 $1\times 1$ 卷积核对数据进行降维操作,最终卷积核的通道数即是我们预测数据的维度。这样在输入端不将数据进行扁平化处理,还可以使得图片保留其空间信息: 使用全卷积层的优点: * 全卷积层能够兼容不同大小的尺寸输入。 * 与global avg pooling似,可以大大减少网络参数量 **CIFAR-10**是一个更接近**普适物体**的彩色图像数据集。CIFAR-10 是由Hinton 的学生Alex Krizhevsky 和Ilya Sutskever 整理的一个用于识别普适物体的小型数据集。一共包含**10 个别**的**RGB**彩色图片:**飞机**(airplane)、**汽车**(automobile)、**鸟**(bird)、**猫**(cat)、**鹿**(deer)、**狗**(dog)、**蛙**(frog)、**马**(horse)、**船**(ship)和**卡车**(truck). 每个图片的尺寸为$32\times 32$,每个别有**6000**个图像,数据集中一共有**50000**张训练图片和**10000**张测试图片。
1.项目代码功能经验证ok,确保稳定可靠运行。欢迎下载使用!在使用过程中,如有问题或建议,请及时私信沟通,帮助解答。 2.主要针对各个计算机相关专业,包括计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师或企业员工使用。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 深度学习基于AVEC2014数据集和Resnet网络实现的抑郁症诊断系统python源码+运行说明+数据集.zip 项目介绍 ResNet网络的应用—抑郁症诊断 使用数据集:**AVEC2014** 数据集下载地址 <a href="https://pan.baidu.com/s/1Dt6BhVnRoTaxJ4edk0w7aQ?pwd=AVEC">AVEC2014</a> 提取码:AVEC 预处理: ​ 1.**采样**,AVEC2013每个视频取100帧,保留原始label ​ 2.**人脸对齐裁剪**,使用**MTCNN**工具 ### 文件介绍 ``` preprocess.py 主要用于预处理视频信息,从中提取帧,并在视频帧中提取人脸 函数:generate_label_file() 将运来的label合并为一个csv文件 函数:get_img() 抽取视频帧,每个视频按间隔抽取100-105帧 函数:get_face() 使用MTCNN提取人脸,并分割图片 model.py 模型的网络结构 ``` ``` load_data.py 获取图片存放路径以及将标签与之对应 writer.py 创建Tensorboard记录器,保存训练过程损失 dataset.py 继承torch.utils.Dataset,负责将数据转化为torch.utils.data.DataLoader可以处理的迭代器 train.py 模型训练 validate.py 验证模型 test.py 测试模型的性能,并记录预测分数,保存在testInfo.csv,记录了每张图片的路径,label,预测分数 main.py 模型训练入口文件 ``` ``` img 提取的视频帧文件 log Tensorboard日志文件 model_dict 训练好的模型参数文件 processed 存放预处理完成之后的人脸图片,label文件 AVEC2014 数据集存放位置 ``` ``` 查看训练日志方法: 安装tensorboard库之后,输入命令tensorboard --lofdir log_dir_path,打开命令执行后出现的网址即可 log_dir_path是存放Tensorboard日志文件的文件夹路径 ``` ``` 运行顺序:preprocess.py--->main.py--->test.py ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孤独腹地

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值