【调参实战】如何开始你的第一个深度学习调参任务?不妨从图像分类中的学习率入手。...

深度学习算法 | Python实现深度学习调参(RNN、CNN) 阅读详情

大家好,欢迎来到专栏《调参实战》,虽然当前自动化调参研究越来越火,但那其实只是换了一些参数来调,对参数的理解和调试在机器学习相关任务中是最基本的素质,在这个专栏中我们会带领大家一步一步理解和学习调参。

本次主要讲述图像分类项目中的学习率的调参实践。

作者&编辑 | 言有三

本文资源与结果展示

本文篇幅:3500字

背景要求:会使用Python和任一深度学习开源框架

附带资料:Caffe代码和数据集一份

同步平台:有三AI知识星球(一周内)

1 项目背景与准备工作

对于很多初入机器学习/深度学习领域的朋友来说,往往只会套用公开的模型,对参数的理解和调试非常欠缺经验,很多经验丰富的老鸟则往往自称“炼丹师”,这就是因为参数的调试对于模型性能的影响确实非常大,轻则损害模型性能,重则甚至使得模型无法正常收敛。

图像分类是整个计算机视觉领域中最基础的任务,实验起来比较简单,在学术界也常用于新模型的比较,因此我们选择图像分类任务来进行调参的学习。

本次项目开发需要以下环境:

(1) Linux系统,推荐ubuntu16.04或者ubuntu18.04。使用windows系统也可以完成,但是使用Linux效率更高。

(2) 最好拥有一块显存不低于6G的GPU显卡,如果没有使用CPU进行训练速度较慢。

(3) 安装好的Caffe开源框架。

2 数据集和基准模型

下面我们首先介绍一下数据集和基准模型。

2.1 数据集

在计算机视觉领域中,MNIST,CIFAR,ImageNet常常被用于任务比较,但是它们都有各自的问题。MNIST和CIFAR数据集图像太小,与真实的计算机视觉任务相去甚远。ImageNet数据集超过100G,对于大部分个人研究者来说,不适合拿来快速进行学习验证。

基于此,我们选择了GHIM-10k数据集,这是一个图像检索数据集,包含20个类别,分别是日落,船舶,花卉,建筑物,汽车,山脉,昆虫等自然图像,各个类别拥有较好的多样性,而类别之间也有比较好的区分度。数据集共10000张图像,每个类别包含500张JPEG格式的大小为400×300或300×400的图像。

这个数据集有以下几个比较重要的优点。

(1) 数据集规模不大,获取也很容易,所有的读者都可以轻易验证我们的实验结果。

(2) 全部都是真实图片,来自于用户相机拍摄,而且图片清晰度足够高。

(3) 数据集多样性适中,包含了20类场景的自然场景,每一类的场景非常的均匀。图片的尺寸是300*400或者400*300,规格统一,符合大多数深度学习图像任务的处理分辨率,尤其是图像分类。

(4) 数据集类别分布非常的均匀,我们选择数据集的方式也是随机但均匀的选取。我们将数据集按照9:1的比率进行划分,训练集中包含20类,每一类450张图,测试集中包含20类,每一类50张图。

2.2 基准模型

如今深度学习模型已经有了非常多的变种,而它的本质并没有变,就是以卷积+非线性激活函数组成的基础单元进行叠加的模式。

经典的AlexNet是一个8层的网络,包含了5层卷积和3层全连接,这里我们也选择一个类似的模型,包括5层卷积,1层全局池化,1层全连接,因为公开的学术研究表明全连接层并不需要过多。

采用Caffe和Proto协议来定义网络,这样的模型配置可以手动进行,非常适合一边调试一边进行可视化,模型细节如下:

layer {

   name: "data"

   type: "ImageData"

   top: "data"

   top: "label"

   include {

     phase: TRAIN

   }

   transform_param {

     mirror: true

     crop_size: 224

     mean_value: 104.0

     mean_value: 117.0

     mean_value: 124.0

   }

   image_data_param {

     source: "list_train_shuffle.txt"

     batch_size: 16

     shuffle: true

     new_height: 256

     new_width: 256

   }

 }

layer {

   name: "data"

   type: "ImageData"

   top: "data"

   top: "label"

   include {

     phase: TEST

   }

   transform_param {

     mirror: false

     crop_size: 224

     mean_value: 104.0

     mean_value: 117.0

     mean_value: 124.0

   }

   image_data_param {

     source: "list_val_shuffle.txt"

     batch_size: 16

     shuffle: false

     new_height: 224

     new_width: 224

   }

 }

layer {

  bottom: "data"

  top: "conv1"

  name: "conv1"

  type: "Convolution"

  param {

    lr_mult: 1

    decay_mult: 1

  }

  param {

    lr_mult: 2

    decay_mult: 0

  }

  convolution_param {

    num_output: 64

    pad: 1

    kernel_size: 3    

    stride: 2

    weight_filler {

      type: "gaussian"

      std: 0.01

    }

    bias_filler {

      type: "constant"

      value: 0

    }

  }

}

layer {

  bottom: "conv1"

  top: "conv1"

  name: "relu1"

  type: "ReLU"

}

layer {

  bottom: "conv1"

  top: "conv2"

  name: "conv2"

  type: "Convolution"

  param {

    lr_mult: 1

    decay_mult: 1

  }

  param {

    lr_mult: 2

    decay_mult: 0

  }

  convolution_param {

    num_output: 64

    pad: 1

    kernel_size: 3

    stride: 2

    weight_filler {

      type: "gaussian"

      std: 0.01

    }

    bias_filler {

      type: "constant"

      value: 0

    }

  }

}

layer {

  bottom: "conv2"

  top: "conv2"

  name: "relu2"

  type: "ReLU"

}

layer {

  bottom: "conv2"

  top: "conv3"

  name: "conv3"

  type: "Convolution"

  param {

    lr_mult: 1

    decay_mult: 1

  }

  param {

    lr_mult: 2

    decay_mult: 0

  }

  convolution_param {

    num_output: 128

    pad: 1

    kernel_size: 3

    stride: 2

    weight_filler {

      type: "gaussian"

      std: 0.01

    }

    bias_filler {

      type: "constant"

      value: 0

    }

  }

}

layer {

  bottom: "conv3"

  top: "conv3"

  name: "relu3"

  type: "ReLU"

}

layer {

  bottom: "conv3"

  top: "conv4"

  name: "conv4"

  type: "Convolution"

  param {

    lr_mult: 1

    decay_mult: 1

  }

  param {

    lr_mult: 2

    decay_mult: 0

  }

  convolution_param {

    num_output: 128

    pad: 1

    stride: 2

    kernel_size: 3

    weight_filler {

      type: "gaussian"

      std: 0.01

    }

    bias_filler {

      type: "constant"

      value: 0

    }

  }

}

layer {

  bottom: "conv4"

  top: "conv4"

  name: "relu4"

  type: "ReLU"

}

layer {

  bottom: "conv4"

  top: "conv5"

  name: "conv5"

  type: "Convolution"

  param {

    lr_mult: 1

    decay_mult: 1

  }

  param {

    lr_mult: 2

    decay_mult: 0

  }

  convolution_param {

    num_output: 256

    pad: 1

    stride: 2

    kernel_size: 3

    weight_filler {

      type: "gaussian"

      std: 0.01

    }

    bias_filler {

      type: "constant"

      value: 0

    }

  }

}

layer {

  bottom: "conv5"

  top: "conv5"

  name: "relu5"

  type: "ReLU"

}

layer {

    bottom: "conv5"

    top: "pool5"

    name: "pool5"

    type: "Pooling"

    pooling_param {

        kernel_size: 7

        stride: 1

        pool: AVE

    }

}

layer {

  bottom: "pool5"

  top: "fc"

  name: "fc"

  type: "InnerProduct"

    inner_product_param {

        num_output: 20

        weight_filler {

            type: "xavier"

        }

        bias_filler {

            type: "constant"

            value: 0

        }

    }

}

layer {

  name: "accuracy_at_1"

  type: "Accuracy"

  bottom: "fc"

  bottom: "label"

  top: "accuracy_at_1"

  accuracy_param {

    top_k: 1

  }

}

layer {

  name: "accuracy_at_5"

  type: "Accuracy"

  bottom: "fc"

  bottom: "label"

  top: "accuracy_at_5"

  accuracy_param {

    top_k: 5

  }

}

layer {

  bottom: "fc"

  bottom: "label"

  top: "loss"

  name: "loss"

  type: "SoftmaxWithLoss"

}

使用在线工具http://ethereon.github.io/netscope/#/editor

对模型的可视化结果如下:

YOLOv8训练流程-原理解析[目标检测理论篇] 本篇文章主要介绍了YOLOv8训练的流程,主要介绍了Task Aligned Assigner正负样本匹配策略以及YOLOv8的损失计算。 阅读详情

相关推荐

setup time和hold time的计算

内容仅仅为了方便记忆,与原理无关

sddhyl的博客 7819

【技术综述】深度学习新手如何开始合适的“调参”任务

言有三毕业于中国科学院,计算机视觉方向从业者,有三工作室等创始人作者 | 言有三编辑 | 言有三深度学习工程师被称为“炼丹工程师”,自然是因为在日常工作中需要各种各样的调...

hacker_long的专栏 548

PID温控实验平台搭建(二)——PID进阶知识介绍及源码分享

最近,我突发奇想去翻阅了一些我本科期间所做的一些小项目,发现都挺有意思的!希望通过我的讲解文章可以帮助你们少走一些弯路!今天,我要分享的是一个PID温控实验平台的搭建,这是一个系列文章,手把手地教你学习和认识PID算法,了解这种算法在温度控制中的应用。由于我知识有限,如果出现一些错误,希望大家可以帮助我指出来,我们一起学习进步!!!

qq_35953617的博客 8050

机器学习 4 个常用超参数调试方法!

作者:Sivasai,来源:AI公园导读ML工作流中最困难的部分之一是为模型找到最好的超参数。ML模型的性能与超参数直接相关。介绍维基百科上说,“Hyperparameter optim...

lsxxx2011的专栏 2128

Cadence元件库介绍

Cadence安装完之后,在安装目录下,会有默认自带的一些常用元件库。例如,我的Candece安装目录为: D:\Cadence\Cadence_SPB_17.2-2016 元件库所在目录为: D:\Cadence\Cadence_SPB_17.2-2016\tools\capture\library 各个元件库对应的内容如下: AMPLIFIER.OLB 共 182 个零件,存放模拟放大器 IC,如 CA3280,TL027C,EL4093 等。 ARITHMETIC.OLB 共 182 个零件,存放

年少时的棉花糖 1万+

C# 操作Excel的时候,出现"被呼叫方拒绝接受呼叫的异常"的解决方案(参考官方给出的解决方案)

首先官方有对这个错误给出解释和解决方案,连接如下: https://docs.microsoft.com/zh-cn/previous-versions/ms228772(v=vs.120)#%E5%8F%AF%E9%9D%A0%E7%BC%96%E7%A8%8B 简单来说,貌似是线程问题,我猜。。。 之前我尝试着在代码中添加 Thread.Sleep(1000); 来进行解决,这种办...

Ck_Max的博客 5770

21个深度学习调参技巧,一定要看到最后一个

点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达 本文转自|AI算法与图像处理训练深度神经网络是困难的。它需要知识和经验,以适当的训练和获得一个最优...

小白学视觉 846

【Claude】Claude Code 子代理(Subagents)完全指南:多 AI 编排与并行任务管理

子代理是在独立上下文窗口特性主代理子代理上下文窗口与你对话的主上下文完全独立的上下文工具权限拥有所有工具可自定义限制生命周期整个会话完成任务后结束通信方式直接对话结果返回给主代理模型继承主会话设置可指定不同模型你可以创建专属子代理,指定模型、工具权限和系统提示。在对话中,Claude 会根据任务自动选择合适的子代理。

博客 5538

速看!deep learning(rnn、cnn)调参的经验

点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达 本文转自|视觉算法话说三人行,必有我师焉。有哪些deep learning(rnn、cnn)调参的...

小白学视觉 2633

基于Python实现学习进度跟踪系统

{{ task }}: {{ "%.1f"|format(hours) }}小时

寒寒豆豆软件公司的博客 196

华为OD机试真题 新系统 2026-04-26 Python&JS 实现【最大化游戏试玩资格分发】

新研发了一台游戏设备可以面向用户接受试玩。现有 n 个试玩申请,每个试玩有开始时间和结束时间。作为协调员,为了能让更多人体验到游戏,你需要对试玩申请进行选择,使得:

MISAYAONE的博客 291

循环神经网络的训练策略:优化和调参

1.背景介绍 循环神经网络(Recurrent Neural Networks,RNNs)是一种特殊的神经网络,它们具有时间序列处理的能力。这使得它们成为处理自然语言、音频和图像等序列数据的理想选择。在这篇文章中,我们将深入探讨 RNNs 的训练策略,包括优化和调参。 2.核心概念与联系 在理解 RNNs 的训练策略之前,我们需要了解一些基本概念。 2.1 神经网络基础 神经网络是一种模...

AI天才研究院 1334

高效与灵活相结合:Verilog编写的跨时钟域循环缓冲控制器解析

循环缓冲区,也被称作循环队列、环形缓冲区,是一种数据结构,其主要特性是使用一个固定大小的缓冲区作为数据的存储空间,这个缓冲区在逻辑上被视作是首尾相接的。虽然Verilog是一种常用的硬件描述语言,被广泛应用在FPGA和ASIC设计中,但是在描述循环缓冲区时,它并没有提供一种直接且灵活的方式来指定循环缓冲区的参数,如字长、缓冲区深度、缓冲区数量等。这给硬件设计带来了一定的不便。同时,该控制器的设计也充分考虑了硬件资源的利用率,通过优化的算法和数据结构,使得在实现高性能的同时,也能够有效地节省硬件资源。

qq_38334677的博客 1222

Adam优化器实战:图像分类任务中的调参技巧

在深度学习中,优化器的选择直接影响模型的训练效果。本文将以CIFAR-10图像分类任务为例,分享如何在实际项目中高效使用Adam优化器,以及一些调参的实战技巧。平台提供的Jupyter环境让代码编写和调试变得简单,一键运行功能省去了配置环境的麻烦,训练过程的可视化结果也能直接展示。为了充分展示Adam的优化效果,我们设计了一个中等复杂度的CNN架构,包含多个卷积层、池化层和全连接层。我们通过实验发现,在图像分类任务中,适当提高beta2值(如0.9995)可以带来更好的性能。

EmeraldWolf23的博客 445

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

深度学习调参指南

O How to train a network KR 数据预处理 模型训练只是毕竟一个函数能逼近的极限,数据清洗和特征才是决定识别的上限。 数据的shuffle 和augmentation。这个没啥好说的, aug也不是瞎加,比如行人识别一般就不会加上下翻转的,因为不会碰到头朝下的异型种 数据预处理方法一般也就采用数据归一化即可。 模型选择 如果数据很少,低于百万,直接拿imagenet预训练的模型微调即可。 模型方面,可以先用2或3层LSTM试一下,通常效果都不错。 结构化数据用机器学

贵在坚持 1431

假人有限元模型

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

深度学习之图像分类

深度学习是一种基于神经网络的机器学习技术。与传统的机器学习算法相比,深度学习的模型具有更深的结构,可以更好地处理大规模的数据,并且可以自动地学习特征。深度学习的基本思想是模仿人脑中神经元之间的连接方式,通过训练神经网络来实现从输入数据到输出结果的映射。在深度学习中,通常使用反向传播算法来训练神经网络。深度学习是一种人工智能领域中的机器学习技术,它的基础是人工神经网络。它利用大量的数据和计算资源来训练神经网络,从而实现各种任务,例如图像识别、自然语言处理、语音识别和推荐系统等。深度学习的主要优势在于它可以。

weixin_52068631的博客 3570

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

深度学习调参实战:如何用BatchSize和学习率组合让你的模型快速收敛(附实验对比)

本文通过实战实验对比,深入探讨了Batch Size与学习率组合对深度学习模型收敛速度与泛化性能的关键影响。文章分析了不同参数配置下训练损失与测试准确率的变化,揭示了小Batch高学习率易震荡、大Batch高学习率易导致泛化鸿沟等现象,并提供了从确定可行范围到动态监控的四步调参工作流,帮助开发者高效实现模型快速收敛。

wine的专栏 1059

用深度学习做图像分类任务模型训练经验

前言 用深度学习做图像分类任务摸索中踩了很多坑,也总结出了一些经验。现在将一些自己觉得非常实用的模型训练经验写下来作为记录,也方便后来者借鉴验证。 调参经验 模型选择 通常我会使用一个简单的CNN模型(这个模型一般包含5个卷积层)将数据扔进去训练跑出一个baseline,这一步工作主要是为了验证数据集的质量。如果这个模型训练结果很差就不要先调试模型,需要检查一下你的训练集数据,看看图像的质量,图...

daydayup_668819的博客 5955

花卉分类神器:基于CNN的调参优化实战

花卉分类神器:基于CNN的调参优化实战 【下载地址】基于CNN的花卉分类调参记录 基于CNN的花卉分类调参记录本资源文件记录了基于卷积神经网络(CNN)对5类花卉植物数据进行分类的调参过程,逐步提升分类准确率 项目地址: http...

gitblog_06571的博客 1084

学习率在图像分类实战中的关键作用

我先用PyTorch的DataLoader加载数据,并添加了随机水平翻转、标准化等基础数据增强操作,这能有效防止过拟合。损失函数曲线也很直观:固定学习率的曲线后期像锯齿状,而自适应方法的曲线平滑下降。最近在做一个图像分类的项目,用CIFAR-10数据集测试不同学习率策略的效果,收获了不少实践经验。这里分享下我的学习过程,特别是学习率这个超参数对模型训练的影响。上完成的很顺利,网页端直接运行代码,还能一键部署训练好的模型供测试。这个实验让我意识到,学习率不仅影响训练速度,更决定了模型最终性能。

SilvermistRaven28的博客 287

人工智能:深度学习模型的优化策略与实战调参

深度学习模型优化与调参指南 本文系统介绍了深度学习模型优化的核心策略和实战技巧。主要内容包括: 模型问题诊断:识别欠拟合(训练/测试集准确率均低)和过拟合(训练集准确率高但测试集低)的特征及成因。 正则化技术: L1正则化实现特征稀疏化 L2正则化(权重衰减)抑制参数过大 Dropout随机失活神经元提升鲁棒性 优化器选择:对比SGD、Momentum、Adam等优化器特点及适用场景,提供学习率调整策略(固定/衰减/自适应)。 训练参数配置:指导批量大小选择原则(8-256)和训练轮次确定方法(早停机制)。

今天比昨天更努力一点! 1万+

ADAM优化器实战:在图像分类任务中的应用案例

最棒的是可以一键部署模型演示,直接把训练好的模型变成可交互的网页应用,省去了很多部署的麻烦。随着训练进行,更新幅度会逐渐减小。经过调参后,模型在测试集上的准确率达到了约78%,对于这样一个简单的网络结构来说已经不错了。我最初使用的是默认参数(lr=0.001, beta1=0.9, beta2=0.999, epsilon=1e-8),效果还不错,但还想看看能不能调得更好。如果你也在做类似的图像分类项目,不妨试试ADAM优化器,配合InsCode这样的云平台,能让你更专注于模型本身而不是环境配置。

MoonbeamRaven28的博客 567

深度学习调参必备:全面解析PyTorch中的学习率调度器实战指南

本文全面解析PyTorch中的学习率调度器(lr_scheduler)实战应用,涵盖StepLR、MultiStepLR、CyclicLR等12种策略。通过真实案例和代码示例,展示如何动态调整学习率以提升模型性能,特别适合图像分类、NLP和医学影像分析等场景。掌握这些技巧可显著提高训练效率和模型准确率。

weixin_30342209的博客 385

【调参实战】那些优化方法的性能究竟如何,各自的参数应该如何选择?

大家好,欢迎来到专栏《调参实战》,虽然当前自动化调参研究越来越火,但那其实只是换了一些参数来调,对参数的理解和调试在机器学习相关任务中是最基本的素质,在这个专栏中我们会带领大家一步一步...

hacker_long的专栏 1076

CNN网络调参实战:如何用VGG16和ResNet50提升你的图像分类准确率

本文聚焦CNN网络调参实战,详细对比了VGG16和ResNet50在图像分类任务中的性能差异与应用策略。通过数据预处理、迁移学习、学习率调度及高级优化技巧(如标签平滑与TTA)的全链路解析,提供了一套提升模型准确率的可落地调参方案,帮助开发者在实际项目中高效优化模型性能。

websocket5live的博客 613

深度学习调参利器:LR Finder 的原理、实践与案例分析

学习率查找器(LRFinder)是一种高效确定深度学习模型最佳学习率范围的技术。该方法通过系统化短时测试(1-2个epoch)监控不同学习率下的损失变化,生成直观曲线来识别最佳区间。相比传统试错法,LRFinder具有可视化、高效(节省90%以上调参时间)和数据驱动等优势。主流框架如PyTorch、TensorFlow和Fast.ai均提供集成支持。实践表明,合理使用LRFinder可使模型准确率提升2%以上,尤其适用于图像分类和NLP任务。

Dfreedom.的博客 1188
上一篇: 【杂谈】有三AI秋季划增加生成对抗网络小组,你准备好大GAN一场了吗
下一篇: 【调参实战】那些优化方法的性能究竟如何,各自的参数应该如何选择?
言有三
言有三 领域专家: 人工智能技术领域 领域专家: 人工智能技术领域
博客等级 码龄15年 3635粉丝 976原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

言有三

三人行必有AI

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

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

打赏作者

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

抵扣说明:

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

余额充值