ResNet18 微调步骤(冻结骨干微调 / 全参数微调)

resnet预训练模型以及微调 只有分类器训练好了(就是Linear层),才能微调卷积基,不然刚开始训练误差很大,微调之前的卷积层学到的东西会被破坏。共同训练新添加的分类器和部分或者全部卷积层,这允许我们微调基础模型中的高阶特征表示,一是他们与特定任务相关。#训练函数fit 必须要指定 model.train,model.eval Resnet中有BN层。4. 解冻卷积基的一部分也可以解冻全部(一般解冻靠近输出部分的卷积基)"""使用Resnet模型预训练模型+微调"""#微调的时候学习速率要更小一些。#替换掉了全链接层 是可训练。 阅读详情

使用torchvision官方预训练权重,适配自定义数据集(猫狗/CIFAR/小分类),替换最后FC层,工业标准微调流程。

两段式微调的本质逻辑

预训练模型 = 强大的特征提取器(conv) + 随机分类器(fc)
​
你的任务 = 需要 【你的特征】 + 【你的分类器】
两段式 =
1. 先固定特征提取器 (conv)→ 训练分类器(fc)
2. 再轻微调整个模型(conv)+ (fc)→ 让模型更贴合专项数据

最直观的比喻

  • 预训练卷积 = 一位经验丰富的老师傅(会看图)

  • FC = 新来的学徒(不会分类)

两段式训练:

  1. 先让老师傅不动,学徒快速学习分类

  2. 再让老师傅稍微调整经验,配合学徒一起提升

结果:又快又稳,精度最高


微调策略

  1. 方案1:冻结backbone,只训练最后全连接(特征提取,小数据集防过拟合) 冻结conv1~layer4所有卷积BN,只更新fc层。

  2. 方案2:解冻全部参数全量微调(大数据/相似数据集) 全部参数放开训练,学习率比预训练小10~100倍。

【原始预训练ResNet18(ImageNet)】
                ↓
┌─────────────────────────────────────────────────┐
│主干Conv+BN:已学好通用特征(边缘/纹理/轮廓)  宝贵参数   │
│FC层:1000分类→替换成自定义N分类【随机初始化】          │
└───────────────┬─────────────────────────────────┘
                │
        ▼阶段1:冻结主干,仅训练FC
┌─────────────────────────────────────────────────────────┐
│1.冻结所有卷积层 requires_grad=False(锁住通用特征,参数不动)│
│2.只放开FC参数,大学习率 lr=1e-3                          │
│3.数据前向传播→只更新FC权重,快速适配新数据集分类规则        │
│4.训练至val稳定→保存中间权重stage1.pth                     │
│★效果:主干不变,分类头学会基于预训练特征做分类             │
└───────────────┬─────────────────────────────────────────┘
                │
        ▼阶段2:加载stage1权重,全网络解冻微调
┌───────────────────────────────────────────────────┐
│1.全部Conv+BN+FC:requires_grad=True 全部可更新     │
│2.小学习率 lr=1e-4(阶段1的1/10,防止梯度冲垮预训练特征)│
│3.全局轻微迭代:通用特征 → 适配当前数据集的专属特征    │
│4.监控验证集,保存最优模型best.pth │
│★效果:特征+分类头双向优化,模型精度进一步提升        │
└───────────────┬───────────────────────────────────┘
                │
        ▼最终:落地推理部署

微调核心原理(先冻主干→再全量微调)

官方预训练的 ResNet18 已经学会了通用视觉特征(边缘、纹理、形状、物体结构),非常珍贵;而最后的 FC 层是随机初始化的,完全不懂你的数据集。 所以必须分两步:

  1. 先稳住珍贵的预训练特征(冻结通用特征) →只训 FC 快速适配你的任务(训练分类头)

  2. 再用极小学习率精细调整全部特征 → 让模型更贴合你的数据


阶段 1:冻结主干,只训练 FC

原理:保护底层通用特征,只让分类头快速学习

ResNet18 前面的卷积层(conv1 ~ layer4)是在 ImageNet 128万张图 上学到的:

  • 边缘

  • 纹理

  • 颜色

  • 形状

  • 物体结构

这些特征通用、强大、珍贵,不能乱动。而最后的全连接层 fc 是随机初始化的,对你的任务一无所知。

所以第一阶段做的事:

  • 冻结卷积层:不让梯度更新,保住通用特征

  • 只训练 FC:让分类头快速学会“你的类别”

  • 学习率大(1e-3):快速收敛

结果:

模型不会破坏底层特征,又能快速适配你的数据集。


阶段 2:解冻全部,全量微调

原理:小学习率精细调优,让通用特征 → 变成你的任务专用特征

第一阶段只是让 FC 学会分类,但卷积层还是 ImageNet 的通用特征。

你的任务和 ImageNet 不完全一样,所以:

  • 需要轻微调整卷积特征

  • 但不能大改(一改就破坏预训练)

所以第二阶段做的事:

  • 全部解冻:卷积、BN、FC 一起更新

  • 学习率极小(1e-4 是阶段1的 1/10) 防止大梯度冲毁预训练特征

结果:

通用特征 → 你的任务专用特征 精度大幅提升!


为什么不能直接全部一起训?

如果一开始就全部解冻 + 大学习率训练:

  • 随机初始化的 FC 会产生巨大梯度

  • 梯度会直接冲毁前面珍贵的预训练卷积特征

  • 模型直接发散、过拟合、精度暴跌

这就是为什么必须先冻后解。


两段微调的核心优势

  1. 不破坏预训练的优质特征

  2. 训练稳定,不容易过拟合

  3. 小数据集也能训得很好

  4. 收敛更快,精度更高

  5. 工业界最标准的微调方案


实操流程

步骤1:下载预训练权重

resnet18(weights="IMAGENET1K_V1")自动下载imagenet预训练参数,不要自己随机初始化。

步骤2:替换最后一层FC

预训练FC是512→1000,改成512→你的类别数N,唯一需要改动的分类层。

步骤3:选择冻结策略
  1. 小数据集(几百~几千张):冻结全部卷积,只训FC

    • lr:1e-3 ~ 5e-3,epoch:10~20

  2. 中大数据(上万张):先冻FC训5轮,再全放开微调

    两阶段微调: ① 冻骨干训FC,收敛后保存权重 ② 加载权重,解冻全部参数,lr缩小至1e-4继续微调

步骤4:超参配置
微调方式学习率batchepoch
只训FC1e-316/3215~25
全参数微调1e-4~5e-516/3225~40
步骤5:保存&推理
# 推理加载
net = resnet18()
net.fc = nn.Linear(512, num_classes)
net.load_state_dict(torch.load("resnet18_finetune_best.pth"))
net.eval()

完整微调代码

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
from torchvision.models import resnet18
​
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
​
# 1、数据预处理(沿用ImageNet归一化,和预训练一致)
mean = [0.485, 0.456, 0.406]
std = [0.229, 0.224, 0.225]
​
train_transform = transforms.Compose([
    transforms.Resize((256,256)),
    transforms.RandomCrop(224),
    transforms.RandomHorizontalFlip(p=0.5),
    transforms.ToTensor(),
    transforms.Normalize(mean, std)
])
val_transform = transforms.Compose([
    transforms.Resize((224,224)),
    transforms.ToTensor(),
    transforms.Normalize(mean, std)
])
​
# 2、数据集(替换为你的数据集路径,ImageFolder格式)
train_dataset = datasets.ImageFolder(root="./train", transform=train_transform)
val_dataset = datasets.ImageFolder(root="./val", transform=val_transform)
​
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=2)
val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False, num_workers=2)
​
# 3、加载预训练ResNet18
model = resnet18(weights="IMAGENET1K_V1")  # 加载官方imagenet预训练
​
# ======== 【关键1:修改分类头,替换全连接层】 ========
num_classes = 2  # 改成你的类别数:猫狗=2、CIFAR=10
in_features = model.fc.in_features
model.fc = nn.Linear(in_features, num_classes)
​
# ======== 【关键2:选择微调模式】 ========
# 模式A:冻结骨干,只训练fc(小样本首选)
for name, param in model.named_parameters():
    if "fc" not in name:
        param.requires_grad = False
# 模式B:全部解冻全量微调,注释上面代码,打开下面
# for param in model.parameters():
#     param.requires_grad = True
​
model.to(device)
​
# 4、优化器&损失
# 冻结骨干:lr设大一点 1e-3;全量微调:lr设很小 1e-4~1e-5
if any(p.requires_grad for n,p in model.named_parameters() if "fc" in n):
    lr = 1e-3
else:
    lr = 1e-4
​
optimizer = optim.SGD(filter(lambda p: p.requires_grad, model.parameters()),
                      lr=lr, momentum=0.9, weight_decay=1e-4)
scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=30)
criterion = nn.CrossEntropyLoss()
​
# 5、训练&验证函数
def train_one_epoch():
    model.train()
    total_loss = 0.0
    correct = 0
    total = 0
    for img, label in train_loader:
        img, label = img.to(device), label.to(device)
        optimizer.zero_grad()
        out = model(img)
        loss = criterion(out, label)
        loss.backward()
        optimizer.step()
​
        total_loss += loss.item()
        pred = torch.argmax(out, dim=1)
        correct += (pred == label).sum().item()
        total += label.size(0)
    return total_loss/len(train_loader), correct/total
​
def val_one_epoch():
    model.eval()
    total_loss = 0.0
    correct = 0
    total = 0
    with torch.no_grad():
        for img, label in val_loader:
            img, label = img.to(device), label.to(device)
            out = model(img)
            loss = criterion(out, label)
            total_loss += loss.item()
            pred = torch.argmax(out, dim=1)
            correct += (pred == label).sum().item()
            total += label.size(0)
    return total_loss/len(val_loader), correct/total
​
# 6、开始微调
epoch_nums = 30
best_acc = 0.0
for epoch in range(epoch_nums):
    train_loss, train_acc = train_one_epoch()
    val_loss, val_acc = val_one_epoch()
    scheduler.step()
​
    print(f"Epoch:{epoch+1:2d}|TrainLoss:{train_loss:.3f},Acc:{train_acc:.3f}|ValLoss:{val_loss:.3f},Acc:{val_acc:.3f}")
​
    # 保存最优模型
    if val_acc > best_acc:
        best_acc = val_acc
        torch.save(model.state_dict(), "resnet18_finetune_best.pth")
print(f"Best Val Acc:{best_acc:.3f}")

【使用resnet18训练自己的数据集】 针对上一篇【以图搜图代码实现-小例子】的优化,使用自己的数据集微调resnet18 阅读详情

相关推荐

深入ResNet18结构:从ImageNet预训练到PyTorch模型冻结全解析

本文深入解析ResNet18架构,从ImageNet预训练模型加载到PyTorch模型冻结策略,全面探讨了残差连接设计、迁移学习技巧及模型优化方法。通过实战代码示例,帮助开发者掌握ResNet18在图像分类任务中的应用,提升模型训练效率和部署性能。

weixin_29063035的博客 240

Pytorch之模型微调(Finetune)——用Resnet18进行蚂蚁蜜蜂二分类为例

Pytorch之模型微调(Finetune)——手写数字集为例 文章目录Pytorch之模型微调(Finetune)——手写数字集为例前言一、Transfer Learning and Model Finetune1.Transform Learning(迁移学习)2.Model Finetune(模型微调)二、Pytorch中的Finetune1.模型微调的步骤2.模型微调训练方法3.Pytorch——基于Resnet18蚂蚁蜜蜂二分类源码参考 前言 模型微调在迁移学习中(Transfer Learn

垃圾就应该待在垃圾桶里的博客 4550

别再为reg2icg的setup违例头疼了!手把手教你用ICC2/Innovus这3招搞定(附实战数据对比)

本文详细介绍了在ICC2/Innovus中解决reg2icg的setup违例的三种高效方法,包括早期时钟树预估、精准控制时钟延迟与门控检查以及ICG专用优化选项组合。通过实战数据对比,展示了不同策略的效果差异,帮助工程师快速优化时序路径,提升芯片性能。

weixin_42569329的博客 410

ResNet18优化技巧:模型微调与迁移学习

我们以一个实际场景为例:将原本识别 1000 类 ImageNet 物体的 ResNet-18,迁移到一个新的任务——办公室物品识别(如键盘、鼠标、显示器、水杯等共 10 类)。# 加载预训练ResNet-18# 冻结所有卷积层参数# 替换最后的全连接层model.fc = nn.Linear(num_features, 10) # 改为10类输出# 使用较小学习率微调fc层精度高、体积小、推理快、易于部署。

weixin_30798867的博客 1033

PINN——加入物理约束的神经网络

【摘要】 基于物理信息的神经网络(Physics-informed Neural Network, 简称PINN),是一类用于解决有监督学习任务的神经网络,它不仅能够像传统神经网络一样学习到训练数据样本的分布规律,而且能够学习到数学方程描述的物理定律。与纯数据驱动的神经网络学习相比,PINN在训练过程中施加了物理信息约束,因而能用更少的数据样本学习到更具泛化能力的模型。本文主要解析这种神经网络以...

qq_39444290的博客 4585

AXI_IIC读写操作

其实在之前调试过一次AXI_IIC,没调试通,碍于赶进度,就直接使用了zynq-PS侧的IIC,就一直搁置着了,这次抽空将这部分内容继续调试下去,这一次没花多少时间就调通了,现在将我的调试过程,经历,以及参考文档如下: 参考文档:pg090-axi-iic.pdf 参考链接:https://forums.xilinx.com/t5/Design-and-Debug-Techniques-Blog/IIC-Protocol-and-Programming-Sequence/ba-p/1072248 上面的这个

qq_32134427的博客 1万+

cv_resnet18模型结构解析:ResNet18骨干网络原理详解

本文介绍了基于星图GPU平台自动化部署cv_resnet18_ocr-detection OCR文字检测模型 构建by科哥镜像的方法。该平台支持高效部署与运行,适用于文档图像中的文字区域检测、发票识别等OCR场景,助力AI应用开发与模型微调,提升文字检测任务的开发效率与部署便捷性。

weixin_42393362的博客 1024

电容DAC版图布局中的对称艺术:从二维共质心到误差最小化

本文深入探讨了电容DAC版图布局中的对称艺术,重点介绍了二维共质心技术如何有效最小化误差。通过分析系统误差和随机误差的来源,详细解析了共质心布局的核心技术及优化策略,包括梯度误差补偿和寄生参数平衡方法。实战案例展示了该技术在12位SAR ADC设计中的应用效果,为高精度集成电路设计提供了重要参考。

weixin_29300241的博客 585

深度学习07 迁移学习&案例:微调ResNet18层结构

迁移学习之微调残差网络18

m0_69045813的博客 1016

2. Android_逆向的历史与发展

学完本节,希望你能够:了解 Android 逆向工程的发展历程,从早期 APK 破解到现代应用保护;入门先把这几类「在干啥」搞清楚,后面学脱壳、反反调试会顺很多。(反编译 APK 得到的类汇编代码,相当于程序的「菜谱」)就能绕过验证,到后来混淆、加固、反调试一起上,逆向难度越来越高。(第三节 什么是 CPU 指令集),帮你搞清楚「反汇编看到的那些指令」是从哪来的、和 Android 逆向有啥关系。有必要——先搞清「没加固时怎么玩」,再学脱壳和对抗,思路才顺。读起来费劲,但逻辑还在,耐心一点还能跟。

长沙火山 1391

A*搜索算法在三维路径规划(避障)中的MATLAB实现与Python实现

A star algorithmA*搜索算法简介A*搜索算法的Python简化代码MATLAB实现启发函数回溯轨迹RRT算法对比A\*算法在三维路径规划中的一些不足 A*搜索算法简介 A*搜索算法是Greedy Best-First算法的改进,因为Greedy Best-First算法只考虑将预估距离(当前节点到目标点的预估距离)作为遴选开节点集的条件。即: priority=heuristic(goal,next)priority=heuristic(goal, next)priority=heurist

ZYunfei的博客 2万+

ResNet18模型微调:提升特定类别准确率

模型微调是指在预训练模型的基础上,使用特定领域的标注数据对模型参数进行进一步训练,使其适应新任务的过程。相比于从零训练,微调能大幅减少训练时间、降低数据需求,并有效避免过拟合。对于 ResNet-18 这类在 ImageNet 上预训练的模型,其前几层已学习到通用的边缘、纹理、形状等低级特征,而高层则编码了更抽象的语义信息。我们可以通过冻结部分层 + 微调解冻层的方式,实现高效迁移。本文围绕ResNet-18 官方稳定版镜像,系统阐述了如何通过模型微调技术。

weixin_35756373的博客 657

【八股】JUC并发编程篇

👉抽象队列同步器,就是一种锁,内部维护的是一个先进先出的双向队列,队列中存储的是排队的线程,用state来标识是否有线程获得锁【0是无锁状态】👉流程:当一个线程拿到锁后会修改state = 1,这时如果有其他线程访问则会进入队列进行排序,直到state变成0后,队头线程才会拿到锁。在对state进行修改时,用的是CAS操作,所以可以保证原子性。👉它可以实现公平锁或非公平锁【默认】,上述是一个公平锁。如果新线程和队头线程抢锁资源就是非公平锁。

qq_44768318的博客 555

ResNet-18 图像分类实战:从预训练权重到质检微调的完整路径

ResNet-18 是一个在 ImageNet-1k 上预训练好的轻量级残差网络,提供开箱即用的图像分类权重,safetensors、PyTorch、TF 三种格式齐全,整个模型仅 46MB。团队接新视觉任务时,最缺的往往是一个拿来就能跑、改改就能用的基座模型,这个仓库正好补上这块。读完本文,你会完成首次推理、看懂残差块的数据流,并拿到一份可直接套用的工业质检微调方案。 ## 三步跑通 ResN

gitblog_00077的博客 731

uniapp:实现扫描二维码+自定义扫描框+扫一扫功能,支持扫码识别二维码、条形码(条码)、微信/支付宝等二维码功能,自定义扫码页面可添加按钮或文字展示布局(移动端H5网页/小程序/安卓苹果APP端)

UNI-APP实现扫描二维码,uniapp扫描条形码,uniapp实现扫一扫功能,扫码成功后跳转页面,uniApp扫描条码,uniApp-H5 使用摄像头扫码功能(扫一扫),实现手机扫描二维码并跳转全过程示例代码,用户扫码后自动跳转到链接,uniapp怎么调用扫一扫功能,uniapp实现扫一扫功能,uniapp请求相机使用权限,扫一扫权限申请,uniapp调用摄像头扫码,uniapp实现调用相机扫码,UniApp 实现扫描二维码,uniapp APP安卓苹果ios实现扫码扫一扫,Uniapp微信小程序扫描二

✅ 精选推荐文章 4708

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ResNet18教程:模型微调提升准确率方法

微调是指利用在一个大规模数据集(如ImageNet)上预训练好的模型参数,作为初始值,在新的目标任务数据集上继续训练的过程。相比从头训练,微调能大幅减少训练时间,并提高小样本任务的收敛效果。本文围绕ResNet-18 模型微调提升准确率稳定性保障:通过内置 TorchVision 官方权重,杜绝“模型不存在”类异常;高效推理能力:40MB小模型 + CPU毫秒级响应,适合边缘部署;精准场景理解:不仅能识物,更能懂景(如 alp/ski);可扩展性强:支持微调以适应新场景,准确率提升显著;易用性突出。

weixin_29840475的博客 853

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

7天精通ResNet-18微调:从0到1实现工业级图像分类模型

- 训练深度学习模型时遭遇梯度消失,网络越深性能反而下降 - 开源模型在自定义数据集上精度不足,参数调优无从下手 - 部署时模型体积过大,边缘设备无法高效运行 - 论文公式晦涩难懂,实际代码实现困难重重 **读完本文你将获得**: - 掌握ResNet核心创新点——残差连接(Residual Connection)的工作原理 - 学会3种工业级微调策略(冻结微调/部分微调/全量微调)的实施方法 ...

gitblog_02517的博客 477

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

ResNet18模型微调秘籍:云端GPU即开即训,效率翻倍

环境搭建:云端GPU即开即用,省去本地环境配置烦恼数据准备:标准化目录结构+合理数据增强是成功基础模型改造:冻结卷积层+替换全连接层的经典模式训练技巧:学习率调度、渐进解冻等进阶方法显著提升效果问题排查:显存优化、过拟合处理等实战经验实测在RTX 3090上,完成10000张图像的分类任务(5个类别)仅需约30分钟,准确率可达92%+。现在就可以上传你的数据集,体验云端GPU的高效训练!💡获取更多AI镜像想探索更多AI镜像和应用场景?访问优快云星图镜像广场。

OrangeWind56的博客 629

DeepLab_v3 ResNet骨干网络选择指南:50/101/152/200版本对比

DeepLab_v3是一款强大的语义分割框架,其性能很大程度上依赖于骨干网络的选择。ResNet作为最常用的骨干网络之一,提供了50、101、152和200四种不同深度的版本。本文将详细对比这四个版本的结构差异、性能特点和适用场景,帮助你快速选择最适合项目需求的ResNet骨干网络。 ## 📊 ResNet各版本核心结构差异 ResNet系列通过堆叠"瓶颈单元"(bottleneck)构建深

gitblog_00092的博客 1060

ResNet18模型微调教程:云端环境已优化,专注算法

环境准备:使用预配置的云端GPU环境,省去繁琐的安装过程数据适配:学会组织自定义数据集并应用合适的数据增强模型调优:掌握不同微调策略(仅最后一层/完整微调)的选择训练技巧:通过监控指标、调整学习率等方法优化训练过程问题解决:应对过拟合、类别不平衡等常见挑战现在就可以尝试用你自己的数据集微调ResNet18了!实测在工业缺陷检测、医学影像分析等场景都能快速获得不错的效果。💡获取更多AI镜像想探索更多AI镜像和应用场景?访问优快云星图镜像广场。

SilvermistRaven28的博客 1064

深度学习——基于 ResNet18 的图像分类训练

该类通过文本文件(如train2.txt)加载图片路径和标签。使用交叉熵损失函数处理多分类任务,优化器为Adam。模块作用特点ResNet18特征提取主干使用 ImageNet 预训练权重Dataset读取图片与标签支持 transform 自动增强DataLoader批量化输入shuffle 提升训练效果train()前向传播与反向传播更新梯度Test()模型评估计算平均损失与准确率学习率调整自动降低学习率防止过拟合。

2302_78022640的博客 1385

《迁移学习》—— 将 ResNet18 模型迁移到食物分类项目中

迁移学习是指利用已经训练好的模型,在新的任务上进行微调。 迁移学习可以加快模型训练速度,提高模型性能,并且在数据稀缺的情况下也能很好地工作。

weixin_73504499的博客 2266

ResNet18应用技巧:模型微调提升特定场景准确率

ResNet-18 不仅是一个经典的通用图像分类模型,更是一个极具潜力的可定制化视觉引擎。通过本文介绍的微调方法,开发者可以轻松将其转化为面向特定场景的专业识别工具。回顾核心要点:1.利用预训练权重实现高效迁移学习,大幅减少训练成本;2.采用冻结主干+替换分类头策略,适合小样本场景快速迭代;3.结合数据增强与学习率调度,提升模型泛化能力;4.量化与Flask集成,保障模型在CPU环境下的高性能与易用性;5.完整闭环:从训练到部署,无缝对接现有WebUI系统。

weixin_31860973的博客 1017

迁移学习实战:PyTorch_Practice教你用ResNet18实现图像分类微调

迁移学习是深度学习领域的高效技术,尤其适合数据量有限的场景。PyTorch_Practice项目提供了基于ResNet18的图像分类微调完整实现,帮助开发者快速掌握迁移学习核心方法。本文将带你通过实际案例,学习如何利用预训练模型解决自定义图像分类问题。 ## 为什么选择迁移学习? 传统深度学习模型训练需要大量标注数据和计算资源,而迁移学习通过复用预训练模型的特征提取能力,只需少量数据即可实现高

gitblog_00868的博客 1144

深度学习----基于 ResNet-18 的迁移学习详解(教你如何使用别人训练好的模型来优化你自己的训练过程)

迁移学习的核心是 “站在预训练模型的肩膀上,降低任务成本、提升性能”。添加全连接层是迁移学习的 “基础工程”—— 没有它,预训练模型的通用特征无法映射到目标类别,任务无法落地;冻结 backbone 仅训分类头是 “快速验证工具”—— 以最低成本判断预训练特征是否适用,是小数据场景的首选;微调特定层是 “性能优化手段”—— 在数据充足时,通过优化深层特征的适配性,突破 baseline 性能瓶颈。

enlybbq的博客 1397

ResNet18与YOLO对比:cv_resnet18_ocr-detection文本检测优势

本文介绍了在星图GPU平台上,如何自动化部署由科哥构建的cv_resnet18_ocr-detection OCR文字检测模型。该模型基于ResNet18架构,专为文字检测优化,能够输出精准的四边形检测框,特别适用于文档数字化处理、自然场景文字识别等需要高精度文字定位的应用场景。

CrystalwaveEagle34的博客 508
上一篇: ResNet-18网络模型+原理解析+Pytorch实现+手写模型
下一篇: 23种设计模式之工厂模式
王_teacher
博客等级 码龄9年 118粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值