深度学习第五课-训练注意事项与框架使用

说明:本文是七月算法5月深度学习班第五次课听课笔记。黄色标注的部分为自己不太确定的部分。

训练


mini-batch SGD

神经网络使用mini-batch SGD训练得到最优权重。训练过程如下:(以下参考了andrew ng的机器学习课程)

例如训练样本量m=3200,mini-batch 每次取32张

for  i = 1,33,65,...
从i 开始取32个图片样本
前向计算得到中间变量a  z 和 损失函数值
后向计算得到梯度
用这部分梯度更新权重


问:为什么使用batch而不使用一张图片呢?
答:一张图片样本量不够,容易发生振荡。如果是一张图片,就是随机梯度下降了。 

两种去均值方法

第一种:减去图片每个像素的均值。在图片的每个像素位求均值。例如样本图片是[32,32,3],将会得到[32,32,3]数组的平均值。每个样本的不同像素减去对应位置的均值。AlexNet使用该方法。
第二种:减去每个通道(channel)的均值。例如样本图片是[32,32,3],会得到3个平均值,分别表示R、G、B的均值。每个样本不同通道的值减去对应的均值。VGGNet使用该方法。
再次强调:CNN训练不需要做标准化、PCA和白化

权重初始化


SGD参数学习第一步就是权重初始化。权重初始化有多种方法。
al表示每层神经单元值。W1表示从第一层到第二层的权重
方法1  w=0。不可以。所有权重初始化为0,这会发生对称现象。例如a2=g(a1*W1)。所有W1=0,a2所有神经单元的值就都相同了。而神经网络的不同神经元是用来学习不同的知识点。这样就引起了对称性。不能好好工作了。

方法2 w=0.01*np.random.rand(D,H).  初始化权重为一些小的随机数。在python实现中,实现了权重正负数各一半。效果:该方法在包含1-2个隐藏层的网络中是有效的。网络层数加深,带来整个网络激活传递的不对称性(会引起数据在很小或者特别大的范围内变动,也就是说方差趋于0,或者无穷)
实现:使用10层网络(500)神经元,观察 每一层 神经单元的 平均值 和方差。可以看到从第三层开始均值与方差几乎不发生变化,接近0。

方法3 w=np.random.rand(fan_in,fan_out). 说明:fan_in = 这一层输入元素的个数,fan_out=这一层输出元素的个数。效果:会出现梯度为0的情况,类似sigmoid函数出现的情况。
方法4 w=np.random.rand(fan_in,fan_out)/np.sqr(fan_in) 效果:效果还不错可以使用。但是在使用ReLU激活函数的时候,同样带来整个网络激活传递的不对称性
方法5 w=np.random.rand(fan_in,fan_out)/np.sqr(fan_in/2)这是一篇在2015年的论文中提到的方法。可以解决ReLU时发生的问题。

Batch Normalization


        对于权重可能引起网络激活的不对称性问题,谷歌提出了一种解决方法Batch Normalization。思想是期望激励过后的神经元的值仍然能够保持高斯分布。
问:为什么是高斯分布呢?
答:高斯分布简单,方差可控。而且还满足了同一层神经元要有一定的差异性。
问题:BN放在什么问题?
Batch Normalization通常接在全连接之后,激励层之前。全连接层是产生波动最大可能性的地方,也是学习能力最强的地方。
问题:BN的具体操作
求均值;求方差;xi=(xi-均值)/np.sqr(方差+e);最后一步做伸缩和平移且输出:yi=gama * xi+beta     。gama和beta是训练过程中可以获得的。之所以有最后一步,是因为BN过程中对原始数据做了修改,表达的信息会有部分丢失。通过伸缩平移尽量将信息还原
BN的优点是:学习率设置高一点也可以;对初始化数据依赖少了。


开始训练

首先先用小数据集训练(10个分类,每个分类下10个样本)测试训练模型是否OK。接着可以改变正则化,从无到有。
需要监控的参数 1const function的值是不是振荡下降;2 训练集上的准确率是否能到100%。
几个现象:准确率低(0.6),cost function值不变=>有问题,学习率太大了?
训练集准确率>>交叉验证集准确率   =>过拟合,试试调大正则化项?
训练集准确率 约等于 交叉验证集准确率   如果都很高,那模型不错,可以使用。如果都很低(0.6),数据问题?模型问题?样本倾斜了?

Dropout ---神经网络正则化

L2 正则化    l = ... + lamda*(权重和)    用于神经网络,参数个数多,计算量大。所以不是最好的选择。
Dropout 语言描述:1 别一次打开所有学习单元;别让神经元记住那么多东西;每次关掉一部分感知器,得到新的模型,最后融合。
设置一个概率p=允许通过的概率。在dropout层,会有n*(1-p)个节点关闭,神经单元的值为0。注意:不是权重为0。由于训练的时候有一个概率,在预测的时候同样需要概率。所以工业上一般是在训练过程中,将输入数据x=x*p。预测的时候就不需要再乘以p了。


Caffe使用


主要模块

Blob 存储数据和梯度值
Layer 传递层与层的输入输出
Net   网络,利用前向后向计算梯度
Solver 用梯度更新权重

                                                        

使用过程

网上有很多资料讲使用过程,这里不详细记录。
1 Resize图片,转存为LMDB/LevelDB格式。注意分类下表从0开始。
2 定义网络结构
3 定义solver,训练参数
4 训练

模型库选择  model zoo

1 如果层次不变,改变输入输出
输入是 data层 data_param 和transform_param 参数段。输出是layer {  name: "fc8"  ,name 需要修改

2 如果添加/删除层次,注意顺序。一般把前面层学习率调低,从修改层开始调高学习率。一般fine-tuning的前期loss下降非常快,中间有个瓶颈期,要有耐心。
3 在solver调整学习率(1/10,1/100)。利用snapshot 存储中间结果。如果发生宕机,可以接着继续训练。


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

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

相关文章

next_permutation算法(基于交换)

nextpermutation 算法 这个算法如何实现 我们要观察对于任意的123456 对于一个任意的字符串 我们如果要找他的下一个全排列 就应该变动其数字 使得其数值增大 且是最小的增大 那么仅使用以上数字 如何才能使其变大 但变大的数字 是所有变大范围内最小的可能 我们称其为 最小变大…

【Vue】【Router】手动跳转用 this.$router.push() 时 $router 未定义的问题

初入Vue,手写路由跳转时的问题: toXxxRoute: () > {this.$router.push({path: /xxx, name: xxx}) } 由于使用了箭头函数,this的指向与传统 js 里不同 所以报错 TypeError: Cannot read property $router of undefined 与其保持一个this变量…

[Letcode]第[34]题[JAVA][在排序数组中查找元素的第一个和最后一个位置][暴力][二分]

【问题描述】[中等] 【解答思路】 1. 线性扫描(不符合题意) 时间复杂度:O(N) 空间复杂度:O(1) class Solution {public int[] searchRange(int[] nums, int target) {int[] targetRange {-1, -1};// find the index of the lef…

习题2-3 求平方与倒数序列的部分和

本题要求对两个正整数m和n(m≤n)编写程序,计算序列和m​2​​1/m(m1)​2​​1/(m1)⋯n​2​​1/n。 输入格式: 输入在一行中给出两个正整数m和n(m≤n),其间以空格分开。 输出格式: 在一行中按照“sum S”的…

用对拍程序来debug错误程序的错误数据

对拍就是通过把自己写的程序的结果和一个完全正确的程序结果进行比较 从而得出自己写的错误程序的漏洞 比如这道题 24点游戏 EOlymp - 44 The number of ones In arithmetic expression you are allowed to use the number 1, operations of addition, multiplication and …

[剑指offer]面试题第[41]题[Leetcode][第235题][JAVA][数据流中的中位数][优先队列][堆]

【问题描述】[困难] 【解答思路】 1. 思路1 时间复杂度&#xff1a;O(logN) 空间复杂度&#xff1a;O(N) import java.util.PriorityQueue;public class MedianFinder {/*** 当前大顶堆和小顶堆的元素个数之和*/private int count;private PriorityQueue<Integer> maxh…

学习笔记,单例

class test(object):flog Noneflog1 Falsedef __new__(cls, *args, **kwargs):if cls.flog is None:cls.flog super().__new__(cls)return cls.flogdef __init__(self):if not test.flog1:print("初始化")test.flog1 Trueabc test() bcd test() print(abc) pri…

SpingBoot+Mybaits+Vue,更新学习

1.DTO 2.实体类 3.Controller层&#xff0c;UpdatePrize/{id}为接口 4.Service层 5.Impl实现层 之后就可以更新数据了。6.Vue链接接口 7.请求&#xff0c;解析&#xff0c;返回值 8.init方法&#xff0c;初始化使用 增删查与更相仿&#xff0c;只是实现层方法不同增加实现层中的…

[剑指offer]面试题第[35]题[Leetcode][第138题][JAVA][复杂链表的复制][暴力][HashMap][复制链表]

【问题描述】[中等] 【解答思路】 1. 暴力 直接复制 将链表从头节点一个一个复制下去&#xff0c; 在根据记录的总长度num&#xff0c;遍历原来的每个节点的random到尾节点个数count&#xff0c;然后顺序遍历找到新链表的该指针在num-count上 。 时间复杂度&#xff1a;O(N^2…

C语言中的四舍六入五成双 和 四舍五入

%.mf 可以让浮点数保留 m 位小数输出 保留的是精度为 四舍六入五成双 就是 5以下舍弃 5以上进位 而当下一位为5时要讨论&#xff1a; 被化简的小数位后面一位的数字等于5时 要看5前面的数字&#xff0c;若是奇数则进位&#xff0c; 若是偶数则将5舍掉&#xff0c;即修约后…

第二十七期:德国工业4.0眼里“工业互联网”与“智能制造”

工业4.0在德国被认为是第四次工业革命&#xff0c;主要是指&#xff0c;在“智能工厂”利用“智能备”将“智能物料”生产成为“智能产品”&#xff0c;整个过程贯穿以“网络协同”&#xff0c;从而提升生产效率&#xff0c;缩短生产周期&#xff0c;降低生产成本。 工业4.0在德…

【复习】快速幂算法详解

快速幂算法 就是求一个高精度幂次取余时的一个快速算法 比如我们要求aba^bab%m的时候 应用于快速幂算法 也就是将O&#xff08;n&#xff09;转化为O&#xff08;logn&#xff09;的算法 他的原理就是&#xff1a; 252^525 2∗2∗2∗2∗22*2*2*2*22∗2∗2∗2∗2 21012^{101}2…

vue监听移动设备的返回事件

在公共方法文件common.js中实现一个存储当前历史记录的方法 common.js // 存储当前历史记录点,实现控制手机物理返回键的按钮事件 var pushHistory function () {let state {title: ,url: }window.history.pushState(state, state.title, state.url) } vue页面 mounted () {p…

[剑指offer]面试题第[36]题[JAVA][二叉搜索树与双向链表][递归]

【问题描述】[中等] 【解答思路】 中序遍历 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(N) class Solution {Node pre, head;public Node treeToDoublyList(Node root) {if(root null) return null;dfs(root);head.left pre;pre.right head;return head;}void …

深度学习第一次课-数学

说明&#xff1a;本文是七月算法5月深度学习班第一次课听课笔记。只记录关键知识点&#xff0c;有些没具体展开。帮助复习用。文中使用了老师课件中的公式。 微积分 导数 定义常用函数导数导数法则加法 乘法 除法 链式法则一元函数与多元函数一阶导 一元函数 f(x) 多元函…

使用CUPS打印服务

目录1. 测试环境 22. CUPS介绍 32.1 CUPS的配置文件 32.1.1 cupsd.conf 32.1.2 cups-files.conf 32.1.3 printcap 32.1.4 printers.conf 32.2 SPOOL假脱机 42.3 CUPS 支持各种打印机&#xff0c;包括&#xff1a; 42.4 CUPS的beh 42.5 使用beh 52.6 安装cups&#xff0c;并激活…

深度学习第三次课-梯度下降与反向传播

梯度下降 损失函数可视化 得分函数 fW*X损失函数 cW*X-y 目标 损失函数最小 最优化过程可视化 一维二维 热力图如果损失函数是一个凸函数&#xff0c;例如SVM。凸函数 正系数加和凸函数神经网络 costfunction 非凸 因为系数有正有负。凸优化与最优化…

[Leetcode][第1025题][JAVA][除数博弈][数学][递推]

【问题描述】[中等] 【解答思路】 1. 数学证明 找规律 时间复杂度&#xff1a;O(1) 空间复杂度&#xff1a;O(1) 2. 递推 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(1) class Solution {public boolean divisorGame(int N) {boolean[] f new boolean[N 5];f[1]…

《App后台开发运维与架构实践》第2章 App后台基础技术

2.1 從App業務邏輯中提煉API接口    業務邏輯思維導圖    功能-業務邏輯思維導圖    基本功能模塊關系    功能模塊接口UML&#xff08;設計出API&#xff09;    在設計稿標注API    編寫API文檔    2.2 設計API的要點    根據對象設計API  …

[Leetcode][第410题][JAVA][分割数组的最大值][动态规划][二分]

【问题描述】[中等] 【解答思路】 1. 动态规划 第 1 步&#xff1a;设计状态 令 f[i][j] 表示将数组的前 i 个数分割为 j 段所能得到的最大连续子数组和的最小值。 &#xff08; i ≥ j &#xff09; 第 2 步&#xff1a;状态转移方程 第 3 步&#xff1a;考虑初始化 f[i][…