【调参实战】如何开始你的第一个深度学习调参任务?不妨从图像分类中的学习率入手。...
大家好,欢迎来到专栏《调参实战》,虽然当前自动化调参研究越来越火,但那其实只是换了一些参数来调,对参数的理解和调试在机器学习相关任务中是最基本的素质,在这个专栏中我们会带领大家一步一步理解和学习调参。
本次主要讲述图像分类项目中的学习率的调参实践。
作者&编辑 | 言有三
本文资源与结果展示
本文篇幅: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
对模型的可视化结果如下:
【调参实战】如何开始你的第一个深度学习调参任务?不妨从图像分类中的学习率入手。...相关推荐
- 深度学习调参体验(二)
深度学习调参体验(二) 激活函数选择: 常用的激活函数有relu.leaky-relu.sigmoid.tanh等.对于输出层,多分类任务选用softmax输出,二分类任务选用sigmoid输出,回归 ...
- 深度学习调参体验(一)
深度学习调参体验(一) 基本原则: 快速试错 一.一些大的注意事项: 1.先上小规模数据, 模型往大了放, 只要不爆显存, 能用256个filter就别用128个.直接奔着过拟合去.就是训练过拟合网络 ...
- 深度学习调参有哪些技巧?
点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要15分钟 Follow小博主,每天更新前沿干货 来自 | 知乎 链接 | https://www.zhihu.com/question/250 ...
- 【DLML】深度学习调参有哪些技巧?
深度学习调参有哪些技巧? 编辑:Amusi | 来源:知乎 https://www.zhihu.com/question/25097993 目录 一.为什么要学习调参? 二.调参技巧 1. 评价指 ...
- 深度学习这么调参训练_深度学习调参及训练技巧(转)
深度学习调参及训练技巧(转) 作者:婉儿飞飞 链接:https://www.jianshu.com/p/0b116c43eb16 来源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并 ...
- 深度学习调参(炼丹)指南来了!
Datawhale干货 方向:深度学习调参,编辑:机器之心 「大量的实践经验已被提炼成这份强大的深度学习模型调参指南.」--Geoffrey Hinton. 众所周知,AI 的超参数决定着模型学习效果 ...
- 【CV实战】年轻人的第一个深度学习图像分割项目应该是什么样的(Pytorch框架)?...
我们上次给新手们介绍了第一个合适入门的深度学习CV项目,可阅读[CV实战]年轻人的第一个深度学习CV项目应该是什么样的?(支持13大深度学习开源框架),本次我们再给大家介绍一个新的任务,图像分割,包括 ...
- Deep Learning Tuning Playbook(深度学习调参手册中译版)
前言 由五名研究人员和工程师组成的团队发布了<Deep Learning Tuning Playbook>,来自他们自己训练神经网络的实验结果以及工程师的一些实践建议,目前在Github上 ...
- 深度学习调参炼丹术(总结向)
补充:调参大法 1 训练调参打榜技巧 调参控制变量,每次调一个值. 1.初始化方式:FC/CNN用kaiming uniform或normalize,Emendding选截断normalize 2.a ...
最新文章
- 太多人关注,太少人理解,这就是“量子计算”
- EXSI中Linux安装tools
- WebView 实现JS效果和a标签的点击事件
- 科大星云诗社动态20210412
- linux系统键盘记录器,可截获到 QQ 密码 键盘记录器源码
- 作者:朱怀球(1970-),男,北京大学教授。
- linux目录与文件
- MySQL复制 自动监控脚本
- 中科院分区和JCR分区查询
- UCI数据集汇总及描述
- IoTDB MPP框架源码解读之SQL的一生(襁褓)
- 从 Stream 到 Kotlin 再到 SPL
- 利用百度身份证识别服务和python语言实现身份证信息的提取和保存
- 重写虫虫项目犯的低级错误
- 求1-1/2+1/3-1/4+……+1/99-1/100 的值
- 设置服务器防火墙对应的出入站规则
- Python3.7,在Anaconda中安装PIL
- Bt(宝塔面板)安装wordpress以及如何开启最简单实用的动静分离优化
- 深入理解 Linux 2.6 的 initramfs 機制 (上)
- AIOT产业技术全景结构-数字化架构设计(8)