42 深度学习(六):调参|保存模型以及再次调用或训练

news2025/7/19 7:46:42

文章目录

  • 卷积神经网络调参
    • optimizer 优化器
      • SGD
      • momentum
      • AdaGrad
      • RMSProp
      • adam
      • 学习率自适应
      • 经验之谈
    • 激活函数
      • Sigmoid
      • Tanh
      • ReLU
      • Leaky-ReLU
      • 指数线性单元(ELU)
      • Maxout(基本不用)
      • 经验之谈
    • 初始化
      • 全部为 0
      • 判断初始化好不好
      • 批归一化(BN)
    • 数据增强
    • 更多的调参方法
  • 保存模型后调用或再次训练

卷积神经网络调参

optimizer 优化器

SGD

SGD就是我们常说的随机梯度下降算法。

在这里插入图片描述

这边应该根据之前的学习,理解这个公式不难。

momentum

momentum 这个单词的意思就是动量,个人理解可以把这个更偏向理解成惯性,具体的含义就是在上面的更新公式上加上一个惯性,也就是说我们每次更新w的时候还要加上上一次运动的效果。

当使用动量时,则把每次 x的更新量v考虑为本次的梯度下降量 −ηdw与上次 w的更新量v乘上一个介于[0, 1]的因子momentum的和,即 v为
在这里插入图片描述

如果这一时刻更新度 vt与上一时刻更新度 vt−1的方向相同,则会加速。反之,则会减速。加动量的优势有两点:

  1. 加速收敛
  2. 提高精度(减少收敛过程中的振荡)

AdaGrad

调整学习率:学习率随着训练次数的增加越来越小。

在这里插入图片描述
这边也可以看一下代码实现:
在这里插入图片描述
AdaGrad 算法
前期,regularizer 较小,放大梯度
后期,regularizer 较大,缩小梯度
梯度随训练次数降低,每个分量有不同的学习率。

AdaGrad 算法缺点
学习率设置太大,导致 regularizer 影响过于敏感
后期,regularizer 累积值太大,提前结束训练

RMSProp

Adagrad 的变种
由累积平方梯度变为平均平方梯度
解决了后期提前结束的问题
在这里插入图片描述

adam

在这里插入图片描述
又加入了一个校准,校准的目的是一开始时,让 first_moment 和second_moment 都变的稍微大一些。

在这里插入图片描述

学习率自适应

在这里插入图片描述
K 是一个系数,t 是迭代次数,也就是 epoch

经验之谈

对于稀疏数据,使用学习率可自适应方法。
SGD 通常训练时间更长,最终效果比较好,但需要好的初始化和 learning rate。
需要训练较深较复杂的网络且需要快速收敛时,推荐使用 adam。设定一个比较小的 learning rate 值,Adagrad,RMSprop ,Adam 是比较相近的算法,在相似的情况下表现差不多。

激活函数

常见的激活函数:
在这里插入图片描述

Sigmoid

特点:

  1. 输入非常大或非常小时没有梯度
  2. 输出均值非 0(但是在归一化后,我们得到的是均值为零,方差为 1 的分布,sigmoid 会造成均值为非 0,又改变了分布)
  3. Exp 计算复杂导致计算机计算会更慢
  4. 梯度消失Sigmoid 1/1+e-x求导 df(x)/dx = f(x)(1-f(x)) 因为 f(x)是 0 到 1 之间的值,1-f(x)也是零到 1 之间的,因此随着层数的增加,梯度就变为 10 的-n 次方,会越乘越小。

Tanh

  1. 依旧没有梯度
  2. 输出均值是 0—相对于 sigmoid 的好处
  3. 计算复杂

ReLU

优点:
1.使用 ReLU 的 SGD 算法的收敛速度比 sigmoid 和 tanh 快。
2. 在 x>0 区域上,不会出现梯度饱和、梯度消失的问题。
3. 计算复杂度低,不需要进行指数运算,只要一个阈值就可以得到激活值。

缺点:

  1. ReLU 的输出不是 0 均值的。
  2. Dead ReLU Problem(神经元坏死现象):ReLU 在负数区域被 kill 的现象叫做 dead relu。ReLU在训练的时很“脆弱”。在 x<0 时,梯度为 0。这个神经元及之后的神经元梯度永远为 0,不再对任何数据有所响应,导致相应参数永远不会被更新。一个非常大的梯度流过神经元,不会再对数据有激活现象了,”很大的梯度流过神经元" 的意思就是指 该神经元相关的参数被梯度下降算法更新了一次。
    比如原来的参数可能是:[-10, 5, 7], 然后突然来了一个梯度是[-100, -100, -100], 这样参数就更新成了 [-110, -95, -93]。 然后如果接下来的收到的数据都是[a, b, c], 其中 a, b, c >=0, 这个时候神经元的输出恒为 0,于是不会再有梯度传回来。因而参数得不到更新,也就变成了 dead cell 了。

产生这种现象的两个原因:参数初始化问题;learning rate 太高导致在训练过程中参数更新太大。
解决方法:采用 Xavier 初始化方法,以及避免将 learning rate 设置太大或使用 adagrad 等自动调节 learning rate 的算法。

Leaky-ReLU

渗漏整流线性单元(Leaky ReLU),为了解决 dead ReLU 现象。用一个类似 0.01 的小值来初始化神经元,从而使得 ReLU 在负数区域更偏向于激活而不是死掉。这里的斜率都是确定的。

指数线性单元(ELU)

具有 relu 的优势,没有 Dead ReLU 问题,输出均值接近 0,实际上 PReLU 和 Leaky ReLU 都有这一优点。有负数饱和区域,从而对噪声有一些鲁棒性。可以看做是介于 ReLU 和 Leaky ReLU 之间的一个函数。当然,这个函数小于零时也需要计算 exp,从而计算量大。

Maxout(基本不用)

ReLU 的泛化版本
没有 dead relu
但是参数翻倍,之前只有一个 w 和 b,现在有两个 w 和 b
优点:

  1. Maxout 的拟合能力非常强,可以拟合任意的凸函数。
  2. Maxout 具有 ReLU 的所有优点,线性、不饱和性。
  3. 不会出现神经元坏死的现象。
    缺点:增加了参数量。显然。。。。这计算量太大了。。。常规的激活函数就只是单纯的函数而已。。而 maxout 还需要反向传播去更新它自身的权重系数。。。

经验之谈

Relu-小心设置 learning rate(初始值不要太大)
不要使用 sigmoid(relu 出现后,就不用它了,收敛太慢)
使用 Leaky Relu、maxout、ELU
可以试试 tanh,但不要抱太大期望(因为计算量大)

初始化

全部为 0

单层网络可以
多层网络会使梯度消失

判断初始化好不好

查看初始化后各层的激活值分布,激活值就是经过激活函数后的值,如果分布是固定的在-1到 1,或者 0 到 1 之间,那没问题,如果集中在某一个值,那就不太好。

均值为 0,方差为 0.02 的正态分布初始化—tanh
如下图所示(一次往后看是经过每一层后的效果):高层均值为 0,没有梯度
在这里插入图片描述
均值为 0,方差为 1 的正态分布初始化-tanh
如下图所示:高层均值为-1,1,已经饱和
在这里插入图片描述
可以看到 Xavier 分布在 tanh 上表现不错
在这里插入图片描述
如下图所示,可以看到 Xavier 分布在 ReLU 上表现并不好
在这里插入图片描述
Resnet 的何凯明发明了 He 的初始化,也就是变为 fan_in/2,从而对Relu效果好一些
在这里插入图片描述

批归一化(BN)

经过上面的一层层激活函数之后,我们会发现数据分明的效果会越来越差,那我们需要做的可能就是批归一化。
在这里插入图片描述

数据增强

之前介绍过图像的数据增强,这边略,知道有这种方法即可。

更多的调参方法

拿到更多的数据
给神经网络添加层次
紧跟最新进展,使用新方法
增大训练的迭代次数
尝试正则化 ||w||2 使用更多的 GPU 来加速训练
可视化工具来检查中间状态

保存模型后调用或再次训练

参考链接:
链接

例子:

# Include the epoch in the file name (uses `str.format`)
checkpoint_path = "training_2/cp-{epoch:04d}.ckpt"
checkpoint_dir = os.path.dirname(checkpoint_path)

batch_size = 32

# Create a callback that saves the model's weights every 5 epochs
cp_callback = tf.keras.callbacks.ModelCheckpoint(
    filepath=checkpoint_path, 
    verbose=1, 
    save_weights_only=True,
    save_freq=5*batch_size)

# Create a new model instance
model = create_model()

# Save the weights using the `checkpoint_path` format
model.save_weights(checkpoint_path.format(epoch=0))

# Train the model with the new callback
model.fit(train_images, 
          train_labels,
          epochs=50, 
          batch_size=batch_size, 
          callbacks=[cp_callback],
          validation_data=(test_images, test_labels),
          verbose=0)

输出:

Epoch 5: saving model to training_2/cp-0005.ckpt

Epoch 10: saving model to training_2/cp-0010.ckpt

Epoch 15: saving model to training_2/cp-0015.ckpt

Epoch 20: saving model to training_2/cp-0020.ckpt

Epoch 25: saving model to training_2/cp-0025.ckpt

Epoch 30: saving model to training_2/cp-0030.ckpt

Epoch 35: saving model to training_2/cp-0035.ckpt

Epoch 40: saving model to training_2/cp-0040.ckpt

Epoch 45: saving model to training_2/cp-0045.ckpt

Epoch 50: saving model to training_2/cp-0050.ckpt
<keras.callbacks.History at 0x7f56e00d5ee0>

现在,检查生成的检查点并选择最新检查点:

os.listdir(checkpoint_dir)

输出:

['cp-0020.ckpt.data-00000-of-00001',
 'cp-0005.ckpt.index',
 'cp-0025.ckpt.data-00000-of-00001',
 'cp-0005.ckpt.data-00000-of-00001',
 'cp-0000.ckpt.data-00000-of-00001',
 'cp-0035.ckpt.index',
 'cp-0045.ckpt.data-00000-of-00001',
 'cp-0015.ckpt.data-00000-of-00001',
 'cp-0040.ckpt.data-00000-of-00001',
 'cp-0050.ckpt.index',
 'cp-0020.ckpt.index',
 'cp-0045.ckpt.index',
 'cp-0025.ckpt.index',
 'cp-0030.ckpt.index',
 'cp-0000.ckpt.index',
 'cp-0030.ckpt.data-00000-of-00001',
 'cp-0040.ckpt.index',
 'cp-0050.ckpt.data-00000-of-00001',
 'cp-0010.ckpt.data-00000-of-00001',
 'cp-0035.ckpt.data-00000-of-00001',
 'checkpoint',
 'cp-0010.ckpt.index',
 'cp-0015.ckpt.index']
latest = tf.train.latest_checkpoint(checkpoint_dir)
latest

输出:

'training_2/cp-0050.ckpt'

要进行测试,请重置模型并加载最新检查点

# Create a new model instance
model = create_model()

# Load the previously saved weights
model.load_weights(latest)

# Re-evaluate the model
loss, acc = model.evaluate(test_images, test_labels, verbose=2)
print("Restored model, accuracy: {:5.2f}%".format(100 * acc))

输出:

32/32 - 0s - loss: 0.4798 - sparse_categorical_accuracy: 0.8800 - 156ms/epoch - 5ms/step
Restored model, accuracy: 88.00%

相同的还有保存整个模型的,这个就看那个链接吧,这边不细说。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1157514.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python项目——识别指定物品

目录 1、百度EasyDL平台数据配置 1.1、训练图像上传 1.2、训练图像进行标注 1.3、训练模型 1.4、检验识别 1.5、申请发布 1.6、控制台权限配置 2、Python调用物体识别API 本项目是基于百度EasyDL平台制作的识别转盘内瓶子&#xff0c;且识别瓶子位置的一个项目。通过在…

10步搭建跨境商城,打造全球销售帝国

我将向您介绍如何通过10个简明步骤搭建一个强大的跨境商城&#xff0c;从而打造一个覆盖全球的销售帝国。在这个全球化时代&#xff0c;跨境电商已成为许多企业扩大业务的关键途径。然而&#xff0c;搭建一个成功的跨境商城并不容易&#xff0c;需要充分了解市场需求、制定合适…

【java学习—十一】枚举类(2)

文章目录 1. 枚举类概述2. 实现接口的枚举类 1. 枚举类概述 在某些情况下&#xff0c;一个类的对象是有限而且固定的。例如季节类&#xff0c;只有4个对象&#xff1b; ①手动实现枚举类&#xff1a; • private 修饰构造器 • 属性使用 private final 修饰 • 把该类的所有实…

pod进阶--02

//示例4&#xff1a;就绪检测 vim readiness-httpget.yaml apiVersion: v1 kind: Pod metadata:name: readiness-httpgetnamespace: default spec:containers:- name: readiness-httpget-containerimage: soscscs/myapp:v1imagePullPolicy: IfNotPresentports:- name: httpcon…

安装pakachu靶场

1.路径 2.修改 3.安装 之后就成功了

众和策略可靠吗?pb是市净率吗?

可靠 市净率既是股市的常用方针&#xff0c;也是价值出资的重要东西之一&#xff0c;而PB也常被用来作为衡量企业估值的规范之一。但是&#xff0c;PB是不是就等同于市净率呢&#xff1f;本文将从多个视点来剖析PB是否等于市净率。 一、市净率和PB的界说 市净率通常指股票的…

Webpack构建慢如蜗牛?提升开发效率的速度优化秘籍!

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一、背…

一个平台搞定数据治理,让数据资产发挥价值

根据北京研精毕智信息咨询发布的调查报告&#xff0c;2018-2021年&#xff0c;全球数据存储量由30ZB上升至55ZB左右&#xff0c;年平均增长率约为27.8%。到2022年&#xff0c;数据总存储量进一步增加至65ZB以上&#xff0c;较2021年同期新增了约10ZB&#xff0c;同比增长18.2%。…

软件开发项目文档系列之八数据库设计说明书

数据库设计说明书是一个关键文档&#xff0c;它提供了有关数据库的详细信息&#xff0c;包括设计、结构、运行环境、数据安全、管理和维护等方面的内容。 1 引言 引言部分&#xff0c;简要介绍数据库设计说明书的目的和内容。这部分通常包括以下内容&#xff1a; 引言的目的…

Python如何使用datetime模块进行日期和时间的操作

目录 一、引言 二、datetime模块的基本使用 三、日期的运算 四、注意事项 总结 本文将对Python的datetime模块进行深入探讨&#xff0c;阐述如何使用该模块进行日期和时间的各种操作。我们将介绍日期和时间的基本操作&#xff0c;以及格式化、时区处理等高级操作&#xff…

区别对比|乐歌IE3智能升降电脑桌有必要买吗?我来告诉你

乐歌IE3作为升降桌产品线的基础升级款&#xff08;E2是基础款&#xff09;&#xff0c;有着很高的性价比&#xff0c;日常售价1799元的价格&#xff0c;就有着大部分实用的功能。就升降桌行业来看&#xff0c;达到这种外观设计和功能设计的程度来说&#xff0c;是已经很亲民的价…

errMsg: “chooseImage:fail api scope is not declared in the privacy agreement

小程序已经设置了隐私保护指引&#xff0c;但是chooseImage会报112错误 小程序后台提交隐私协议&#xff0c;基本设置 》服务内容声明》用户隐私保护指引 》去填写信息提交审核 文档参考&#xff1a;https://developers.weixin.qq.com/community/develop/article/doc/0006e28b…

matab读取包含struct混合类型的mat文件转为txt文件

现有一个mat文件&#xff0c;其内容如下&#xff1a; 目标&#xff1a;要将data.mat中的Obs_Iridium_A转为文本格式。 分析&#xff1a; data.mat里面包含了4个struct结构的成员&#xff0c;Obs_Iridium_A是其中之一&#xff0c;Obs_Iridium_A为1*7496维&#xff0c;7496代表…

使用 PyTorch 构建自定义 GPT

一、介绍 介绍大模型&#xff0c;首先考虑一下使用 ChatGPT、Bing Chat 或 Bard 。您是否想过拥有自己的 ChatGPT 会是什么样子&#xff1f;想象一下创建自己的 GPT 模型的兴奋程度。这确实是一种难以置信的感觉&#xff01; 为了开始构建自定义 GPT 的旅程&#xff0c;让我们仔…

韩山师范学院学子获第四届“火焰杯”软件测试开发选拔赛全国奖项

2023年10月12日&#xff0c;第四届“火焰杯”软件测试开发选拔赛颁奖仪式在信息科技大楼805机房举行。组委会成员测吧&#xff08;北京&#xff09;科技有限公司项目总监王雪冬担任颁奖嘉宾。计算机科学与技术系2020级汤新寅、江湘婷、李若诗同学获得第四届“火焰杯”软件测试开…

idea 配置checkstyle全过程

checkstyle是提高代码质量,检查代码规范的很好用的一款工具&#xff0c;本文简单介绍一下集成的步骤&#xff0c;并提供一份完整的checkstyle的代码规范格式文件&#xff0c;以及常见的格式问题的解决方法。 一&#xff0c;安装 打开idea的文件选项&#xff0c;选择设置&…

Linux权限+Shell和Linux的关系

文章目录 1.Shell存在的意义及作用1.1对于Shell的认知过程1.2Shell/图形化界面外壳程序的意义 2.对Linux权限的理解2.1对Linux权限的认知过程2.2对于Linux下ll指令显示的文件属性的认识 1.Shell存在的意义及作用 1.1对于Shell的认知过程 Linux是什么? Linux是一套免费使用和自…

3.字符集和比较规则简介

3.字符集和比较规则简介 1.字符集和比较规则简介1.1 字符集简介1.2 比较规则简介1.3 一些重要的比较规则 2. MySQL 中支持的字符集和比较规则2.1 MySQL 的 utf8 和 utf8mb42.2 字符集查看2.3 比较规则查看 3. 字符集和比较规则的应用3.1 各级别的字符集和比较规则1. 服务器级别…

多测师肖sir_高级金牌讲师_单个接口性能测试

一、添加聚合报告 聚合报告&#xff1a; jmeter聚合报告名词解释 聚合报告&#xff1a;生成此次性能的测试数据报告 Samples&#xff1a;测试一共发出的请求 &#xff0c;虚拟用户循环次数 Average&#xff1a;平均响应时间&#xff0c;是单个Request的平均响应时间 Median&am…

C语言-指针讲解(2)

文章目录 1.野指针1.1 什么是野指针1.2 造成野指针的原因有哪些呢1.2.1造成野指针具体代码实例&#xff1a; 1.3 如何避免野指针呢?1.3.1如何对指针进行初始化&#xff1f;1.3.2如何才能小心指针越界?1.3.3 指针变量不再使用时&#xff0c;如何及时置NULL,在指针使用之前检查…