【代码实验】CNN实验——利用Imagenet子集训练分类网络(AlexNet/ResNet)

这篇具有很好参考价值的文章主要介绍了【代码实验】CNN实验——利用Imagenet子集训练分类网络(AlexNet/ResNet)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

Imagenet是计算机视觉的经典分类比赛,但是Imagenet数据集本身太大了,我们穷学生没有这么大的算力,2016年google DeepMind团队从Imagnet数据集中抽取的一小部分(大小约3GB)制作了Mini-Imagenet数据集(也就是Imagenet的子集),共有100个类别,每个类别都有600张图片,共60000张图片。这个大小的数据集是可以训练得动的。


一、数据准备

首先下载数据集,链接:miniimagenet,提取码:hl31

【代码实验】CNN实验——利用Imagenet子集训练分类网络(AlexNet/ResNet)
下载完成后,文件里面应该有4个文件夹,iamges文件夹包含了60000张从Imagenet中选出来的图片。还有三个csv文件:train、val、test,对应训练集、验证集、测试集,csv文件里面是图片的文件名和对应的标签。

├── mini-imagenet
     ├── images
     ├── train.csv
     ├── val.csv
     └── test.csv

【代码实验】CNN实验——利用Imagenet子集训练分类网络(AlexNet/ResNet)

但是这三个csv文件不能直接使用,因为train.csv包含38400张图片,共64个类别。val.csv包含9600张图片,共16个类别。可以看出作者将60000张图片共100类分在了这三个csv文件,所以我们肯定不能按照他的CSV文件来划分训练集和验证集(自己跑实验就没必要分三个了,分训练集和验证集就足够了)。

下面是60000张图片划分为训练集和验证集的脚本,只需要修改imagenet的根目录和验证集的比例即可。

import csv
import glob
import os
import random
import shutil
# 找出所有csv文件


def concat_csv(csv_list):
    file_with_label = {}
    for csv_path in csv_list:
        with open(csv_path) as csvfile:
            reader = csv.reader(csvfile)
            header = next(reader)
            for line in reader:
                if (line[1] not in file_with_label.keys()):
                    file_with_label[line[1]] = [line[0]]
                else:
                    file_with_label[line[1]].append(line[0])
    return file_with_label


def split_dataset(file_with_label, root, ratio):
    for label in file_with_label.keys():
        if not os.path.exists(os.path.join(root, "train", label)) and not os.path.exists(os.path.join(root, "val", label)):
            os.makedirs(os.path.join(root, "train", label))
            os.makedirs(os.path.join(root, "val", label))
        for file_name in file_with_label[label]:
            shutil.move(os.path.join(root, "images", file_name),
                        os.path.join(root, "train", label))
    for label in os.listdir(os.path.join(root, "train")):
        samples = random.sample(os.listdir(
            os.path.join(root, "train", label)), int(len(os.listdir(os.path.join(root, "train", label))) * ratio))
        for files in samples:
            shutil.move(os.path.join(root, "train", label, files),
                        os.path.join(root, "val", label))
    print("数据集划分完成!")

def main():
    root = "F:/Mini-ImageNet"  # 修改imagenet根目录
    csv_list = glob.glob(os.path.join(root, "*.csv"))  # 获取三个csv文件
    file_with_label = concat_csv(csv_list)  # 整合csv文件
    split_dataset(file_with_label, root, 0.2)  # 分成训练集和验证集,修改验证集比例,默认0.2

if __name__ == "__main__":
    main()

运行代码后会看到增加了两个文件夹,train文件夹是训练图片,存放格式是:

├── train
     ├── label 1
     	├── image
     ├── label 2
     	├── iamge
...

【代码实验】CNN实验——利用Imagenet子集训练分类网络(AlexNet/ResNet)

train文件夹里面有100个文件夹,对应100分类。每个文件夹的文件名就是对应的label。每个label下存放着训练图片。这样我们可以直接用Pytorch的内置数据模块torchvision.datasets.ImageFolder来加载数据。val文件夹同理。

使用torchvision.datasets.ImageFolder加载数据集时,是按照文件夹顺序来索引的。比如经过softmax后输出最大概率值索引是0,那么就对应类别为n01532829;最大概率值索引是1,那么就对应类别为n01558993

【代码实验】CNN实验——利用Imagenet子集训练分类网络(AlexNet/ResNet)
我们可以看到label都是n01532829这种,我们可以通过Imagenet的json文件来查找对应的具体类别。
json文件参考:label
我把100类对应的具体类别挑了出来:

label_class = {'n01532829': 'house_finch',
 'n01558993': 'robin',
 'n01704323': 'triceratops',
 'n01749939': 'green_mamba',
 'n01770081': 'harvestman',
 'n01843383': 'toucan',
 'n01855672': 'goose',
 'n01910747': 'jellyfish',
 'n01930112': 'nematode',
 'n01981276': 'king_crab',
 'n02074367': 'dugong',
 'n02089867': 'Walker_hound',
 'n02091244': 'Ibizan_hound',
 'n02091831': 'Saluki',
 'n02099601': 'golden_retriever',
 'n02101006': 'Gordon_setter',
 'n02105505': 'komondor',
 'n02108089': 'boxer',
 'n02108551': 'Tibetan_mastiff',
 'n02108915': 'French_bulldog',
 'n02110063': 'malamute',
 'n02110341': 'dalmatian',
 'n02111277': 'Newfoundland',
 'n02113712': 'miniature_poodle',
 'n02114548': 'white_wolf',
 'n02116738': 'African_hunting_dog',
 'n02120079': 'Arctic_fox',
 'n02129165': 'lion',
 'n02138441': 'meerkat',
 'n02165456': 'ladybug',
 'n02174001': 'rhinoceros_beetle',
 'n02219486': 'ant',
 'n02443484': 'black-footed_ferret',
 'n02457408': 'three-toed_sloth',
 'n02606052': 'rock_beauty',
 'n02687172': 'aircraft_carrier',
 'n02747177': 'ashcan',
 'n02795169': 'barrel',
 'n02823428': 'beer_bottle',
 'n02871525': 'bookshop',
 'n02950826': 'cannon',
 'n02966193': 'carousel',
 'n02971356': 'carton',
 'n02981792': 'catamaran',
 'n03017168': 'chime',
 'n03047690': 'clog',
 'n03062245': 'cocktail_shaker',
 'n03075370': 'combination_lock',
 'n03127925': 'crate',
 'n03146219': 'cuirass',
 'n03207743': 'dishrag',
 'n03220513': 'dome',
 'n03272010': 'electric_guitar',
 'n03337140': 'file',
 'n03347037': 'fire_screen',
 'n03400231': 'frying_pan',
 'n03417042': 'garbage_truck',
 'n03476684': 'hair_slide',
 'n03527444': 'holster',
 'n03535780': 'horizontal_bar',
 'n03544143': 'hourglass',
 'n03584254': 'iPod',
 'n03676483': 'lipstick',
 'n03770439': 'miniskirt',
 'n03773504': 'missile',
 'n03775546': 'mixing_bowl',
 'n03838899': 'oboe',
 'n03854065': 'organ',
 'n03888605': 'parallel_bars',
 'n03908618': 'pencil_box',
 'n03924679': 'photocopier',
 'n03980874': 'poncho',
 'n03998194': 'prayer_rug',
 'n04067472': 'reel',
 'n04146614': 'school_bus',
 'n04149813': 'scoreboard',
 'n04243546': 'slot',
 'n04251144': 'snorkel',
 'n04258138': 'solar_dish',
 'n04275548': 'spider_web',
 'n04296562': 'stage',
 'n04389033': 'tank',
 'n04418357': 'theater_curtain',
 'n04435653': 'tile_roof',
 'n04443257': 'tobacco_shop',
 'n04509417': 'unicycle',
 'n04515003': 'upright',
 'n04522168': 'vase',
 'n04596742': 'wok',
 'n04604644': 'worm_fence',
 'n04612504': 'yawl',
 'n06794110': 'street_sign',
 'n07584110': 'consomme',
 'n07613480': 'trifle',
 'n07697537': 'hotdog',
 'n07747607': 'orange',
 'n09246464': 'cliff',
 'n09256479': 'coral_reef',
 'n13054560': 'bolete',
 'n13133613': 'ear'}

二、训练

搭建AlexNet/ResNet或者其他网络可以自己写模型也可以直接加载torchvision.models 里写好的网络架构。如果是自己搭建网络,按照自己写的模板来就行.
推荐大佬的github项目:https://github.com/WZMIAOMIAO/deep-learning-for-image-processing/tree/master/pytorch_classification/mini_imagenet

import torch
import torchvision

# 数据集路径
# 根据数据集保存的格式我们用torchvision.datasets.ImageFolder加载数据集
train_set = torchvision.datasets.ImageFolder("F:/DLdata/mini-imagenet/train", transform=data_transform["train"] )
test_set = torchvision.datasets.ImageFolder("F:/DLdata/mini-imagenet/val",  transform=data_transform["val"])

train_loader = torch.utils.data.DataLoader(train_set, batch_size=128, shuffle=True) 
test_loader = torch.utils.data.DataLoader(test_set, batch_size=256, shuffle=False) 
    

如果是调用models模块的网络结构,则可以省略很多工作,但是要记得修改最后一层softmax的输出维度。官方模型是1000分类,这里是100分类。修改模型网络结构可以参考另一篇:加载预训练模型与修改网络结构

三、结果

在ResNet34中训练了80多个epoch,达到了74%的准确率。AlexNet就要差一些了,只有62%,毕竟是很早之前的模型了,也可以再调调参。

ResNet50:重新训练了一些ResNet50,最后能达到82%的准确率,如果再多加一点Mixup等数据增强方法的话,精度应该还能再高一点。
【代码实验】CNN实验——利用Imagenet子集训练分类网络(AlexNet/ResNet)

ResNet34:
【代码实验】CNN实验——利用Imagenet子集训练分类网络(AlexNet/ResNet)
AlexNet:
【代码实验】CNN实验——利用Imagenet子集训练分类网络(AlexNet/ResNet)文章来源地址https://www.toymoban.com/news/detail-437258.html

到了这里,关于【代码实验】CNN实验——利用Imagenet子集训练分类网络(AlexNet/ResNet)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 卷积神经网络CNN原理+代码(pytorch实现MNIST集手写数字分类任务)

    前言 若将图像数据输入全连接层,可能会导致丧失一些位置信息 卷积神经网络将图像按照原有的空间结构保存,不会丧失位置信息。 卷积运算: 1.以单通道为例: 将将input中选中的部分与kernel进行数乘 : 以上图为例对应元素相乘结果为211,并将结果填入output矩阵的左上角

    2024年02月04日
    浏览(59)
  • 【故障分类】基于注意力机制的卷积神经网络结合双向长短记忆神经网络CNN-BiLSTM-attention实现数据分类附matlab代码

    ntion机制加权 4. 加权后的特征进行分类 本文旨在实现一个通用的数据分类模型,可应用于不同领域的数据分类任务。 设计一个CNN网络结构,提取输入数据的特征 将特征序列输入到BiLSTM网络,进行时序建模 在BiLSTM的输出上应用注意力机制,关注重要特征 最后将加权特征输入

    2024年03月11日
    浏览(69)
  • 【深度学习&NLP】基于卷积神经网络(CNN)实现中文文本情感分析(分类)附代码以及数据集链接

    【注】:本文所述的实验的完整实现代码包括数据集的仓库链接会在文末给出(建议读者自行配置GPU来加速TensorFlow的相关模型,运行起来会快非常多) 目录 一、研究的背景和目的 二、文本数据集描述 1、数据集来源以及使用目的 2、数据规模、以及如何划分数据集 3、数据集的

    2024年02月04日
    浏览(59)
  • 算法设计与分析实验4 :利用动态规划的方法解决子集等和分割判断问题

    实验4  利用动态规划的方法解决子集等和分割判断问题 一、实验目的 1. 了解动态规划的主要思想。 2. 掌握背包问题解决方法用以解决该问题。 3. 分析核心代码的时间复杂度和空间复杂度。 二、实验内容和要求 题目:给定一个只包含正整数的非空数组。是否可以将这个数组

    2024年04月23日
    浏览(39)
  • 基于深度神经网络的图像分类与训练系统(MATLAB GUI版,代码+图文详解)

    摘要:本博客详细介绍了基于深度神经网络的图像分类与训练系统的MATLAB实现代码,包括GUI界面和数据集,可选择模型进行图片分类,支持一键训练神经网络。首先介绍了基于GoogleNet、ResNet进行图像分类的背景、意义,系统研究现状及相关算法。然后展示了系统的界面演示效

    2024年02月05日
    浏览(42)
  • 深度学习实战46-基于CNN的遥感卫星地图智能分类,模型训练与预测

    大家好,我是微学AI,今天给大家介绍一下深度学习实战46-基于CNN的遥感卫星地图智能分类,模型训练与预测。随着遥感技术和卫星图像获取能力的快速发展,卫星图像分类任务成为了计算机视觉研究中一个重要的挑战。为了促进这一领域的研究进展,EuroSAT数据集应运而生。

    2024年02月14日
    浏览(45)
  • ImageNet1000分类,英文原版,中文翻译版

    在训练模型时,可以用imagenet或者 CIFAR进行分类训练,下面是一些分类介绍 imagenet官网网址 1-398:动物 399-924:物品 925-1000:食物 CIFAR10官网 这些分类是完全互斥的。比如“汽车”包括轿车、SUV 等。“卡车”只包括大型卡车,不包括皮卡车。 两个分类是无重叠的 CIFAR100官网

    2024年02月14日
    浏览(44)
  • 什么是 CNN? 卷积神经网络? 怎么用 CNN 进行分类?(2)

    参考视频:https://www.youtube.com/watch?v=E5Z7FQp7AQQlist=PLuhqtP7jdD8CD6rOWy20INGM44kULvrHu 视频4:CNN 中 stride 的概念 如上图,stride 其实就是 ”步伐“ 的概念。 默认情况下,滑动窗口一次移动一步。而当 stride = 2 时,则一次移动两步,垂直移动和水平移动都是。 当我们提高 stride 的值的时

    2024年02月06日
    浏览(34)
  • 什么是 CNN? 卷积神经网络? 怎么用 CNN 进行分类?(1)

    先看卷积是啥,url: https://www.bilibili.com/video/BV1JX4y1K7Dr/?spm_id_from=333.337.search-card.all.clickvd_source=7a1a0bc74158c6993c7355c5490fc600 下面这个式子就是卷积 看完了,感觉似懂非懂 下一个参考视频:https://www.youtube.com/watch?v=E5Z7FQp7AQQlist=PLuhqtP7jdD8CD6rOWy20INGM44kULvrHu 视频1:简单介绍卷积神经网络

    2024年02月08日
    浏览(42)
  • 什么是 CNN? 卷积神经网络? 怎么用 CNN 进行分类?(3)

    参考视频:https://www.youtube.com/watch?v=E5Z7FQp7AQQlist=PLuhqtP7jdD8CD6rOWy20INGM44kULvrHu 视频7:CNN 的全局架构 卷积层除了做卷积操作外,还要加上 bias ,再经过非线性的函数,这么做的原因是 “scaled properly” 通常滑动窗口(filter) 不止一个,如下图 如下图是一个 CNN 的全部流程 如上图,

    2024年02月06日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包