pytorch之resnet18模型保存再训练

Resnet18训练CIFAR10 准确率95% Resnet18训练CIFAR10 准确率95%方法 要点 避坑 阅读详情
  • 参考这里写的
  • 学习率0.01在测试集上最高89%的准确率
  • 增加了测试集准确率的记录,多次降低学习率,0.000001时最高准确率93%
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
import os, cv2
from PIL import Image
from tensorboardX import SummaryWriter

class MyData(torch.utils.data.Dataset):
    def __init__(self, train=True, transform=None, target_transform=None):
        self.transform = transform
        self.target_transform = target_transform
        self.train = train
        if self.train:
            data_file = "/home/lwd/data/cifar10/train/train.txt"
        else:
            data_file = "/home/lwd/data/cifar10/test/test.txt"
        self.data=[]
        self.targets = []
        cnt = 0
        for line in open(data_file):
            str_list = line.split()
            img = cv2.imread(str_list[0])
            # img = cv2.resize(img, (224,224), interpolation=cv2.INTER_AREA)
            self.data.append(img)
            self.targets.append(str_list[1])
            cnt+=1
            if(cnt % 10000 == 0):
                print(cnt)

    def __getitem__(self, index):
        img, target = self.data[index], int(self.targets[index])
        img = Image.fromarray(img)
        if self.transform is not None:
            img = self.transform(img)
        if self.target_transform is not None:
            target = self.target_transform(target)
        return img, target

    def __len__(self):
        return len(self.data)

#定义残差块ResBlock
class ResBlock(nn.Module):
    def __init__(self, inchannel, outchannel, stride=1):
        super(ResBlock, self).__init__()
        #这里定义了残差块内连续的2个卷积层
        self.left = nn.Sequential(
            nn.Conv2d(inchannel, outchannel, kernel_size=3, stride=stride, padding=1, bias=False),
            nn.BatchNorm2d(outchannel),
            nn.ReLU(inplace=True),
            nn.Conv2d(outchannel, outchannel, kernel_size=3, stride=1, padding=1, bias=False),
            nn.BatchNorm2d(outchannel)
        )
        self.shortcut = nn.Sequential()
        if stride != 1 or inchannel != outchannel:
            #shortcut,这里为了跟2个卷积层的结果结构一致,要做处理
            self.shortcut = nn.Sequential(
                nn.Conv2d(inchannel, outchannel, kernel_size=1, stride=stride, bias=False),
                nn.BatchNorm2d(outchannel)
            )
            
    def forward(self, x):
        out = self.left(x)
        #将2个卷积层的输出跟处理过的x相加,实现ResNet的基本结构
        out = out + self.shortcut(x)
        out = F.relu(out)
        
        return out

class ResNet(nn.Module):
    def __init__(self, ResBlock, num_classes=10):
        super(ResNet, self).__init__()
        self.inchannel = 64
        self.conv1 = nn.Sequential(
            nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1, bias=False),
            nn.BatchNorm2d(64),
            nn.ReLU()
        )
        self.layer1 = self.make_layer(ResBlock, 64, 2, stride=1)
        self.layer2 = self.make_layer(ResBlock, 128, 2, stride=2)
        self.layer3 = self.make_layer(ResBlock, 256, 2, stride=2)        
        self.layer4 = self.make_layer(ResBlock, 512, 2, stride=2)        
        self.fc = nn.Linear(512, num_classes)
    #这个函数主要是用来,重复同一个残差块    
    def make_layer(self, block, channels, num_blocks, stride):
        strides = [stride] + [1] * (num_blocks - 1)
        layers = []
        for stride in strides:
            layers.append(block(self.inchannel, channels, stride))
            self.inchannel = channels
        # print(*layers)
        return nn.Sequential(*layers)
    def forward(self, x):
        #在这里,整个ResNet18的结构就很清晰了
        out = self.conv1(x)
        out = self.layer1(out)
        out = self.layer2(out)
        out = self.layer3(out)
        out = self.layer4(out)
        out = F.avg_pool2d(out, 4)
        out = out.view(out.size(0), -1)
        out = self.fc(out)
        return out

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
log_dir = './snapshot/'
last = 0
ptt = 92
pth='/home/lwd/Downloads/5/snapshot/'+str(ptt)+'.pth'
writer = SummaryWriter('./resnet_result')

#set hyperparameter
EPOCH = 1000
pre_epoch = 0
BATCH_SIZE = 128
LR = 0.01

#prepare dataset and preprocessing
transform_train = transforms.Compose([
    transforms.RandomCrop(32, padding=4),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
    transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
])

transform_test = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
])

trainset = MyData(train=True, transform=transform_train)
# trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=False, transform=transform_train)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=BATCH_SIZE, shuffle=True)

testset = MyData(train=False, transform=transform_test)
# testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform_test)
testloader = torch.utils.data.DataLoader(testset, batch_size=100, shuffle=False)

#labels in CIFAR10
classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')

#define ResNet18
net = ResNet(ResBlock).to(device)

#define loss funtion & optimizer
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=LR, momentum=0.9, weight_decay=5e-4)

if os.path.exists(pth):
    checkpoint = torch.load(pth)
    net.load_state_dict(checkpoint['model'])
    optimizer.load_state_dict(checkpoint['optimizer'])
    pre_epoch = checkpoint['epoch']
    last = ptt / 100.0

#train
for epoch in range(pre_epoch, EPOCH):
    print('\nEpoch: %d' % (epoch + 1))
    net.train()
    sum_loss = 0.0
    correct = 0.0
    total = 0.0
    for i, data in enumerate(trainloader, 0):
        #prepare dataset
        length = len(trainloader)
        inputs, labels = data
        inputs, labels = inputs.to(device), labels.to(device)
        optimizer.zero_grad()
        
        #forward & backward
        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()
        
        #print ac & loss in each batch
        sum_loss += loss.item()
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += predicted.eq(labels.data).cpu().sum()
        print('[epoch:%d, iter:%d] Loss: %.03f | Acc: %.3f%% ' 
              % (epoch + 1, (i + 1 + epoch * length), sum_loss / (i + 1), 100. * correct / total))
        
    #get the ac with testdataset in each epoch
    print('Waiting Test...')
    with torch.no_grad():
        correct = 0
        total = 0
        for data in testloader:
            net.eval()
            images, labels = data
            images, labels = images.to(device), labels.to(device)
            outputs = net(images)
            _, predicted = torch.max(outputs.data, 1)
            total += labels.size(0)
            correct += (predicted == labels).sum()
        print('Test\'s ac is: %.3f%%' % (100 * torch.true_divide(correct, total)))
    now = (100. * correct / total).item()
    writer.add_scalars('acc', {'test_acc': now}, epoch)
    if now > last:
        state = {'model':net.state_dict(), 'optimizer':optimizer.state_dict(), 'epoch':epoch}
        torch.save(state, log_dir+str(int(now))+'.pth')
        last = now
        # break
利用pytorch训练网络---垃圾分类,(resnet18) 数据集包含6种垃圾,分别为cardboard(纸箱),glass(玻璃)、metal(金属)、paper(纸)、plastic(塑料)、其他废品(trash),数据数量较小,仅供学习。 数据集标准备工作,包括将数据集分为训练集和测试集,制作标签文件。代码utils.py import os import shutil import json path="e://dataset//Garb... 阅读详情

相关推荐

resnet18下载与保存,转换为ONNX模型,导出 .wts 格式的权重文件

net.eval()print(net)main()main()import osnet.eval()#returnmain()

淘特 1837

Resnet-18-训练实验-warm up操作

实验数据:cat-dog 二分类,训练集:19871 验证集:3975 实验模型:resnet-18 batchsize:128*2 (一个K80吃128张图片) 存在的问题: 对训练集 accuracy可达0.99 loss=1e-2 -3,然而验证集 accuracy 0.5,loss 很高,试了多个初始学习率(0.1 — 0.0001)都不行 解决上述问题: 采取warm up方法 ...

云中寻雾的博客 2329

【Pytorch】用自己训练的resnet18模型进行推理

在网上看了这篇博客: 【Pytorch】使用ResNet-50迁移学习进行图像分类训练 https://blog.youkuaiyun.com/heiheiya/article/details/103028543 有的小伙伴就有疑问,模型训练好后,怎么进行推理。于是,我写了这篇关于使用自己训练的resnet18模型进行推理,关于训练的部分请参考上面那篇。 # *_* coding : UTF-8 *_* # 开发人员: csu·pan-_-|| # 开发时间: 2020/12/29 19:16 # 文件名称: re

qq_36563273的博客 3962

ResNet模型的训练和推理

ResNet是一种残差网络,咱们可以把它理解为一个子网络,这个子网络经过堆叠可以构成一个很深的网络。本项目旨在实现ResNet模型,并且支持多种数据集,目前该模型可以支持单通道的数据集,如:MNIST、KMNIST、FashionMNIST数据集,也可以支持多通道的数据集,如:CIFAR10、SVHN、STL-10数据集。模型最终将数据集分类为10种类别,可以根据需要增加分类数量。训练轮次默认为4轮,同样可以根据需要增加训练轮次。

hepucuncao的博客 1514

pytorch resnet18网络动物分类完整的模型训练、验证、测试过程

先重写resnet18的模型,其实不用写也行,可以直接在models中调用 import torch import torch.nn as nn from torch.nn import functional as F class RestNetBasicBlock(nn.Module): def __init__(self, in_channels, out_channels, stride): super(RestNetBasicBlock, self).__init__()

weixin_52646021的博客 5972

Pytorch CIFAR10图像分类 ResNet篇

Pytorch CIFAR10图像分类 ResNet篇 文章目录Pytorch CIFAR10图像分类 ResNet篇4.定义网络(ResNet)残差结构ResNet18/34 的Residual结构ResNet50/101/152的Bottleneck结构ResNet网络结构配置BasicBlockBottleneck BlockResNet5. 定义损失函数和优化器6. 训练损失函数曲线准确率曲线学习率曲线7.测试查看准确率查看每一类的准确率抽样测试并可视化一部分结果8. 保存模型9. 预测读取本地图片

风信子的猫Redamancy的快乐星球 9200

如何从resnet等建好的模型中删掉一部分,保留想要的

我正在研究resnet,但是不想要最后的全连接层。而是希望输出保持 2,3,224,224,这样,batch,通道,长,宽,的格式。

Arsmart的博客 1093

Geneformer实战指南:基于Hugging Face Transformers的基因序列分类模型解析

本文详细解析了基于Hugging Face Transformers的Geneformer模型在基因序列分类任务中的应用。通过介绍模型架构、数据处理流程和实战案例,帮助生物信息学研究者掌握这一前沿技术,实现高效的基因表达数据分析与分类。

weixin_28224217的博客 581

【Pytorch】ResNet-18实现Cifar-10图像分类

一、ResNet-18网络结构 ResNet全名Residual Network残差网络。Kaiming He 的《Deep Residual Learning for Image Recognition》获得了CVPR最佳论文。他提出的深度残差网络在2015年可以说是洗刷了图像方面的各大比赛,以绝对优势取得了多个比赛的冠军。而且它在保证网络精度的前提下,将网络的深度达到了1...

AMG_GT的博客 2万+

达芬奇Pro开发板硬件验证全流程指南

FPGA开发板硬件验证是嵌入式系统可靠性的基石,其核心在于理解SoC启动时序、IO资源映射与高速接口物理层约束。基于Xilinx Zynq-7000异构架构的开发平台,需围绕电源完整性、时钟稳定性、信号完整性及软硬协同启动链路展开分层测试。技术价值体现在规避量产失效率、支撑高可靠工业控制与实时图像处理等场景。典型应用涵盖千兆以太网通信验证、DVP摄像头与RGB LCD显示链路调试、以及SFP+光纤接口PRBS误码率测试。本文聚焦达芬奇Pro系列开发板,深入解析JTAG下载、QSPI Flash重烧录、RGM

weixin_42453228的博客 122

matlab相机标定_实战 | 相机标定

点击“计算机视觉life”关注,置顶更快接收消息!本文阅读时间约5分钟什么是相机标定?我们为什么需要相机标定?相机标定就是确定相机内参和外参的过程,其结果精度会直接影响视觉系统后续工作的准确性。坐标系相机标定涉及到了四大坐标系,分别为:像素坐标系图像物理坐标系相机坐标系世界坐标系为了进行相机标定,必须已知世界坐标系中足够多的三维空间点坐标,找到这些空间点在图像中投影点的二维图像坐标,并建...

weixin_39747334的博客 763

ResNet18持续学习方案:云端保存checkpoint,随时继续训练

通过本文,你已经学会了如何实现ResNet18的云端持续学习方案。云端checkpoint的重要性:解决了长时间训练中的中断风险,支持灵活暂停和继续训练关键实现步骤:定期保存模型状态、优化器状态和训练进度到云端存储完整生产级代码:提供了可直接使用的训练脚本,包含checkpoint保存和恢复功能最佳实践建议:合理的保存频率、命名规范和存储组织方式常见问题解决方案:处理大文件、慢速传输、多GPU训练等实际问题现在你就可以尝试在自己的项目中实现这个方案了。

GarnetFalcon73的博客 968

配置权重_高盛都在用的资产配置模型,BL贝叶斯框架改进Markowitz

前面我们说到,markoviz的均值-方差模型,第一次,用数学的方式严格证明了投资组合存在最优的权重,但它的学术意义大于实战。主要原因有两个:1,人们很难有效的预测期望收益率;2,最优资产组合配置对输入非常敏感,结果往往难以被人理解。还有就是在投资中,定量只是完成初步构建,同步的定性判断依然非常重要:第一,投资者的认知偏好:倾向于关注他们认为被低估,但有发展潜力或者可以确定相对交易价值的小部分股票...

weixin_39892309的博客 715

【亲测免费】 PyTorch图像识别实战:使用ResNet18实现花朵分类

PyTorch图像识别实战:使用ResNet18实现花朵分类 【下载地址】PyTorch图像识别实战使用ResNet18实现花朵分类分享 本资源文件提供了一个使用PyTorch框架和ResNet18模型进行花朵分类的实战代码,并附有详细的注解。通过本项目,您可以学习如何使用预训练模型进行迁移学习,并对图像数据进行预处理、...

gitblog_06539的博客 487

【AI实战】用Coze工作流打造抖音视频文案提取神器——从单链接到批量处理的进阶指南

本文详细介绍了如何利用Coze工作流打造抖音视频文案提取工具,从单链接处理到批量提取的进阶指南。通过AI技术和工作流的结合,用户可以高效提取抖音视频的ASR和OCR文本,大幅提升内容创作效率。文章还涵盖了性能优化、异常处理及实际应用场景扩展,助力开发者快速实现抖音文案自动化提取。

weixin_29210759的博客 278

Mamba与iTransformer融合:时间序列预测中的曼巴注意力机制创新实践

本文探讨了Mamba与iTransformer融合在时间序列预测中的创新实践,重点介绍了曼巴注意力机制的设计与优势。通过双路径信息流设计,该方案在保持O(n)复杂度的同时,显著提升了预测精度和训练效率。实验证明,混合架构在电力负荷、气象数据等多变量长序列场景中表现优异,预测误差降低至0.083,内存占用仅4.2GB。

weixin_29292535的博客 219

【Pytorch】本地预训练模型加载

1、预训练模型加载 【Pytorch】快速下载预训练模型并修改保存路径 最最最重要的是要将pretrained=False,如果是Ture的话,还是会去官方定义的路径下载pth。

littlemichelle 1775

Allegro Design Entry CIS 与 OrCAD Capture CIS:PCB设计工具链中的双雄对决

本文深入对比了Cadence旗下两大原理图设计工具Allegro Design Entry CIS与OrCAD Capture CIS。Allegro Design Entry CIS源自Concept HDL,定位高端,强调自顶向下的层次化设计和与Allegro PCB Editor的无缝约束管理,适合大型复杂系统及团队协作。OrCAD Capture CIS则以其出色的易用性、广泛的兼容性和强大的CIS数据库功能著称,是中小型项目及跨工具链协作的通用选择。文章从历史渊源、核心功能、适用场景等多维度剖析,

bush的博客 486

【pytorch】基于pytorch和resnet18的图片二分类网络微调(Fine Tune)全过程

然后,我们将介绍resnet50模型的结构,以及如何使用pytorch的nn.Module模块来定义模型。最后,我们将介绍如何使用pytorch的nn.Module模块来定义模型,以及如何使用pytorch的optimizer模块来优化模型参数,以及如何使用pytorch的nn.Module模块来实现图片二分类网络微调(Fine Tune)的全过程。此外,Pytorch还提供了nn.Module模块,可以帮助开发者快速构建深度学习模型,以及optimizer模块,可以帮助开发者优化模型参数。

种一棵树最好的时间是十年前,其次是现在 3807

8.9华为OD机试真题 新系统 - 灯带颜色变换 (Java/Py/C/C++/Js/Go)

8.9华为OD机试真题 新系统 - 灯带颜色变换 (Java/Py/C/C++/Js/Go)

算法大师! 663

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Python知识点:基于Python工具,如何使用PyTorch进行图像分类

开篇,先说一个好消息,截止到2025年1月1日前,翻到文末找到我,赠送定制版的开题报告和任务书,先到先得!过期不候!在深度学习的领域中,图像分类是最受欢迎的任务之一。它涉及到构建一个模型,该模型能够识别和区分图像中的不同对象和场景。在本文中,我们将详细介绍如何使用Python和PyTorch框架来构建和训练一个图像分类器。首先,确保你已经安装了PyTorch和torchvision库。如果没有,你可以通过以下命令进行安装: 数据集准备 我们将使用经典的CIFAR-10数据集,它包含了10个类别,每个类别有6

码农超哥的博客 1251

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

使用Flask将pytorch模型部署在本地服务器

整个项目的思路 训练模型 使用pytorch对resnet18 进行迁移学习,实现对自己的数据进行图像分类。需要将最后一个全连接层中的输出节点数目修改,因为我的数据集中包含有5中图像,所以这里的输出节点数目修改成5 DEVICE = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') # 使用GPU # 加载预训...

qq_41121879的博客 3265

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

迁移学习——基于残差网络ResNet18的表面缺陷检测

定义了6种表面缺陷类型的标签缩写,对应注释中给出的完整名称。(1)迁移学习:使用预训练的ResNet18模型((2)模型修改:获取原始全连接层的输入特征数(num_ftrs),替换最后一层全连接层,输出6个节点(对应6种表面缺陷类型)(3)前向传播:使用修改后的ResNet进行前向计算return out。

qq_45746227的博客 840

PyTorch 实例 - 图像分类项目

本文提供了一个完整的PyTorch图像分类项目示例,使用CIFAR-10数据集和ResNet18模型。项目包含数据预处理(包括数据增强和标准化)、模型定义(支持从头训练或预训练)、训练循环(含学习率调度)、验证和测试功能,以及模型保存和加载机制。代码详细注释并支持CPU/GPU运行,适合初学者快速上手。最终通过测试集评估模型性能,并提供了推理示例,实现10类图像分类任务。

likuoelie的博客 975

resnet18图像分类

网上搜的代码,加了个损失曲线可视化,需要改下,保存最优模型,懒得改,没力气,代码就是拿着搜到的代码改来改去,感觉结果还不错,数据集再多点应该更好。import osn_classes = 3 # 几种分类的preteain = False # 是否下载使用训练参数 有网true 没网falseepoches = 100 # 训练的轮次]))]))total = 0.total = 0.

m0_51583439的博客 826

运动鞋识别

🍨 本文为🔗365天深度学习训练营中的学习记录博客 🍖 原作者:K同学啊 一、导入数据 import torch import torch.nn as nn import torchvision.transforms as transforms from torchvision import datasets import torchvision.models as models from PIL import Image import os import pathlib

sunboon的博客 1030
上一篇: cifar-10-batches-py转图片
下一篇: 使用docker安装openvino
刀么克瑟拉莫
博客等级 码龄14年 68粉丝 268原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

刀么克瑟拉莫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值