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%

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

android 8.1 disable unsupported sensor

如果device不支持某种sensor,可以在android/frameworks/base/core/java/android/hardware/SystemSensorManager.java里将其disabled掉。以disable proximity sensor为例。 public SystemSensorManager(Context context, Looper mainLooper) {synchronized(sLock) {if (!sNativ…

一文带你速通Sentinel限流规则(流控)解读

目录 前置知识速补 基本介绍 流控模式 直接模式 关联模式 链路模式 流控效果 直接失败 Warm Up&#xff08;预热&#xff09; 排队等待 前置知识速补 QPS每秒查询率(Query Per Second)&#xff1a;每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多…

Python项目——识别指定物品

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

【备忘录】SpringBoot+ dynamic-datasource配置自定义多数据源

一、 业务场景解释 由于公司业务需要开发设计一款文件读取导入工具&#xff0c;导入的配置和目标数据库并不一定在同一个数据库地址&#xff0c;故需要使用到自定义数据源&#xff0c;并且支持数据源切换 大致场景如下&#xff1a; 二、工具选择 鉴于市面上有很多工具&#…

大数据之LibrA数据库系统告警处理(ALM-12005 OKerberos资源异常)

告警解释 告警模块对Manager中的Kerberos资源的状态进行监控&#xff0c;当Kerberos资源异常时&#xff0c;系统产生此告警。 当Kerberos资源恢复时&#xff0c;且告警处理完成时&#xff0c;告警恢复。 告警属性 告警参数 对系统的影响 Manager中的Kerberos资源异常&#…

CV论文阅读大合集

YearNameAreamodeldescriptiondrawback2021 ICMLClip &#xff08;Contrastive Language-Image Pre-training&#xff09;contrastive learning、zero-shot learing、mutimodel用文本作为监督信号来训练可迁移的视觉模型CLIP’s zero-shot performance, although comparable to…

车载以太网解决方案

近年来&#xff0c;为了满足智能网联汽车的开发要求&#xff0c;车载以太网技术开始逐渐进入人们的视野。而以太网技术已经成为下一代车载网络架构的趋势之一&#xff0c;其发展之迅猛&#xff0c;使得各主机厂纷纷产生了浓厚的兴趣并投入研发。 一 为什么使用车载以太网 | 对…

JDK环境变量配置

windows系统 1. win建 r 输入sysdm.cpl打开系统属性界面。选择高级栏目&#xff0c;点击环境变量菜单。 2. 选择系统变量中的新建&#xff0c;变量名输入JAVA_HOME&#xff0c;变量值输入jdk安装目录&#xff0c;例如&#xff1a;D:\Java\jdk1.8.0_91。 3. 选择编辑系统变量中…

企业通过ISO/IEC 27001的必要性阐述

文章目录 什么是ISO 27001?ISO 27001认证的必要性1&#xff0c;保护信息资产2&#xff0c;合规性要求3&#xff0c;提高客户信任4&#xff0c;降低安全风险5&#xff0c;提高内部效率6&#xff0c;改进供应链安全7&#xff0c;提高员工意识8&#xff0c;连续改进 推荐阅读 什么…

智能问答进阶之路:RAG(大模型检索增强生成)框架详解与实战,融合检索与生成助力智能系统更上层楼

搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术…

MyBatis-Plus返回getOne返回null疑惑

getOne返回null 问题描述分析过程总结 问题描述 在数据库建了一张表主要包括两个字段master_id和slave_id;主要的额外字段max_lots 默认值是null&#xff1b;当调用getOne进行查询是&#xff0c;返回是null 分析过程 总结

【深度学习】pytorch——快速入门

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ pytorch快速入门 简介张量&#xff08;Tensor&#xff09;操作创建张量向量拷贝张量维度张量加法函数名后面带下划线 _ 的函数索引和切片Tensor和Numpy的数组之间的转换张量&#xff08;tensor&#xff09;与标量…

【MATLAB】全网唯一的13种信号分解+FFT傅里叶频谱变换联合算法全家桶

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 大家吃一顿火锅的价格便可以拥有13种信号分解FFT傅里叶频谱变换联合算法&#xff0c;绝对不亏&#xff0c;知识付费是现今时代的趋势&#xff0c;而且都是我精心制作的教程&#xff0c;有问题可随时反馈~也可单独获取某一…

机器学习(六)构建机器学习模型

1.9构建机器学习模型 我们使用机器学习预测模型的工作流程讲解机器学习系统整套处理过程。 整个过程包括了数据预处理、模型学习、模型验证及模型预测。其中数据预处理包含了对数据的基本处理&#xff0c;包括特征抽取及缩放、特征选择、特征降维和特征抽样&#xff1b;我们将…

【Redis】认识Redis-特点特性应用场景对比MySQL重要文件及作用

文章目录 认识redisredis的主要特点redis的特性&#xff08;优点&#xff09;redis是单线程模型&#xff0c;为什么效率这么高&#xff0c;访问速度这么快redis应用场景redis不可以做什么MySQL和Redis对比启动RedisRedis客户端Redis重要文件及作用 认识redis redis里面相关的小…

通讯网关软件033——利用CommGate X2OPC实现PI数据写入OPC Server

本文推荐利用CommGate X2OPC实现从PI服务器读取数据并写入OPC Server。CommGate X2OPC是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;实现从PI实时数据库获取数据并写入OPC Server。 【解决…

贪心算法总结

贪心的定义&#xff08;摘自百度百科&#xff09; 贪心算法&#xff08;greedy algorithm&#xff0c;又称贪婪算法&#xff09;是指&#xff0c;在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上加以考虑&#xff0c;算法得到的…

EasyRecovery易恢复16中文免费版下载

最近一直在加班码方案&#xff0c;抓bug&#xff0c;熬夜都成了家常便饭。原本以为这种艰难的生活快要迎来胜利的曙光&#xff0c;偏偏老天还要给我再来当头一棒&#xff01;写完方案被我误删了&#xff0c;而且还彻底清空了废纸篓&#xff0c;团队几天几夜的成果毁于一旦&…

[极客大挑战 2019]Secret File 1

题目环境&#xff1a; 网页什么都没有&#xff0c;GET那里也没有任何参数和文件 F12查看隐藏文件发现隐藏文件点进去看看发现一个可点击按钮SECRET 好家伙&#xff0c;什么都没有 这里猜测还有隐藏文件目录扫描使用工具dirsearch命令&#xff1a;python dirsearch.py -u [http:…

微服务-Feign

文章目录 Feign介绍Feign的基本使用自定义Feign的配置Feign性能优化Feign最佳实践 Feign介绍 RestTemplate远程调用存在的问题&#xff1a;代码可读性差&#xff0c;java代码中夹杂url&#xff1b;参数复杂很难维护 String url "http://userservice/user/" order.g…