大家好~我开设了“深度学习基础班”的线上课程,带领同学从0开始学习全连接和卷积神经网络,进行数学推导,并且实现可以运行的Demo程序

线上课程资料:

本节课录像回放1

本节课录像回放2

加QQ群,获得ppt等资料,与群主交流讨论:106047770

本系列文章为线上课程的复盘,每上完一节课就会同步发布对应的文章

本文为第二节课:“判断性别”Demo需求分析和初步设计(下2)的复盘文章

本课程系列文章可进入索引查看:

深度学习基础课系列文章索引

回顾相关课程内容

  • 第二节课:“判断性别”Demo需求分析和初步设计(下1)

    • 为什么引入损失函数?
    • 损失函数的表达式是什么?
    • 有了损失函数,如何具体判断得到一组权重、偏移是合适的呢?
    • 什么是随机梯度下降?
    • 更新权重、偏移的梯度下降公式是什么?

主问题:如何求梯度

  • 对于“判断性别”的Demo,可以是什么函数?

    答:

  • 如何求\(\frac{dE}{dw_{53}}\)?

    答:



    参考上面的公式,可知:

  • 如何求\(\frac{dE}{db_{5}}\)?

    答:与上面类似

  • 如何求\(\frac{dE}{dw_{31}}\)?

    答:

任务:根据梯度下降算法实现训练

  • 标签、特征是什么?

    标签是我们要预测的事物,即男/女;

    特征是输入变量,即身高和体重;

  • 已知4个有标签样本(同时包含特征和标签)用于训练,2个无标签样本用于推理

  • 请根据梯度下降算法,实现NeuralNetwork_train的train函数?

    • 如何判断是否达到了希望的结果(即收敛)?

      答:打印损失函数返回的误差loss,如果小于0.1,则收敛
    • 如何实现?

      答:答案:NeuralNetwork_train_answer
  • 请运行程序

    • 有什么问题?

      第一轮开始的loss就无限大

任务:改进训练,使其收敛

  • 请找出loss无限大的原因?

    答:输出(y5)太大
  • 应该如何改进?

    答:改进激活函数,使用sigmoid替代线性函数:





    它的导数为:

  • 修改代码,运行结果?

    答:修改后的相关代码为:
let _activateFunc = x => {
1. /. (1. +. Js.Math.exp(-.x))
} let _deriv_Sigmoid = x => {
let fx = _activateFunc(x) fx *. (1. -. fx)
}

修改后的完整代码为:NeuralNetwork_train_fix_activate_answer

运行结果:loss一直不变

(补充:完整代码有bug:Neural_forward_answer->_activateFunc应该使用sigmoid函数。修改后的完整代码为:NeuralNetwork_train_fix_activate_answer_fix。修改后的运行结果是loss会先下降到0.25然后就不变了,而不是一直不变)

  • 为什么loss一直不变?

    答:输入太大->隐藏层的激活函数的导数为0->梯度为0->loss不变

  • 应该如何改进?

    答:将样本零均值化

  • 修改代码,运行结果?

    答:修改后的相关代码为:

let _mean = values => {
values->ArraySt.reduceOneParam((. sum, value) => {
sum +. value
}, 0.) /. ArraySt.length(values)->Obj.magic
} let _zeroMean = features => {
let weightMean = features->ArraySt.map(feature => feature.weight)->_mean->Js.Math.floor->Obj.magic
let heightMean = features->ArraySt.map(feature => feature.height)->_mean->Js.Math.floor->Obj.magic features->ArraySt.map(feature => {
weight: feature.weight -. weightMean,
height: feature.height -. heightMean,
})
} let features = features->_zeroMean let state = state->train(features, labels) let featuresForInference = [
{
weight: 89.,
height: 190.,
},
{
weight: 60.,
height: 155.,
},
] featuresForInference->_zeroMean->Js.Array.forEach(feature => {
inference(state, feature)->Js.log
}, _)
这里的内容是错误的,可忽略

运行结果:loss可能会逐渐增大

  • 为什么会出现loss逐渐增大的情况?

    答:学习率太大

    如下图所示:



    因为步长过大,可能会跨过谷底
  • 如何解决?

    答:有两个方法:

    减小学习率,增加轮数;

    使用优化算法动态调整学习率。

    这里使用前者
  • 修改代码,运行结果?

    答:修改后的相关代码为:
let train = (state: state, features: array<feature>, labels: array<label>): state => {
//let learnRate = 0.1
//let epochs = 1000 let learnRate = 0.001
let epochs = 100000
...

修改后的完整代码为:NeuralNetwork_train_fix_zeroMean_answer

运行结果:大部分情况下loss会收敛

(补充:完整代码仍然有同样的bug:Neural_forward_answer->_activateFunc应该使用sigmoid函数。修改后的完整代码为:NeuralNetwork_train_fix_zeroMean_answer_fix。修改后的运行结果是loss基本上都会收敛,所以基本上不会出现“loss可能会逐渐增大”的情况,所以就不需要“减小学习率,增加轮数;”)

总结

  • 请回答所有主问题?
  • 如何根据梯度下降算法实现训练代码?
  • 会出现什么问题?如何解决?

参考资料

深度学习基础课: “判断性别”Demo需求分析和初步设计(下2)的更多相关文章

  1. “判断性别”Demo需求分析和初步设计(中)

    大家好~我开设了"深度学习基础班"的线上课程,带领同学从0开始学习全连接和卷积神经网络,进行数学推导,并且实现可以运行的Demo程序 线上课程资料: 本节课录像回放 加QQ群,获得 ...

  2. 基于深度学习的人脸性别识别系统(含UI界面,Python代码)

    摘要:人脸性别识别是人脸识别领域的一个热门方向,本文详细介绍基于深度学习的人脸性别识别系统,在介绍算法原理的同时,给出Python的实现代码以及PyQt的UI界面.在界面中可以选择人脸图片.视频进行检 ...

  3. 【神经网络与深度学习】【CUDA开发】caffe-windows win32下的编译尝试

    [神经网络与深度学习][CUDA开发]caffe-windows win32下的编译尝试 标签:[神经网络与深度学习] [CUDA开发] 主要是在开发Qt的应用程序时,需要的是有一个使用的库文件也只是 ...

  4. [OpenCV实战]1 基于深度学习识别人脸性别和年龄

    目录 1基于CNN的性别分类建模原理 1.1 人脸识别 1.2 性别预测 1.3 年龄预测 1.4 结果 2 代码 参考 本教程中,我们将讨论应用于面部的深层学习的有趣应用.我们将估计年龄,并从单个图 ...

  5. 【课程学习】课程2:十行代码高效完成深度学习POC

    本文用户记录黄埔学院学习的心得,并补充一些内容. 课程2:十行代码高效完成深度学习POC,主讲人为百度深度学习技术平台部:陈泽裕老师. 因为我是CV方向的,所以内容会往CV方向调整一下,有所筛检. 课 ...

  6. 深度学习与CV教程(2) | 图像分类与机器学习基础

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...

  7. 深度学习与CV教程(8) | 常见深度学习框架介绍

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...

  8. 深度学习与CV教程(12) | 目标检测 (两阶段,R-CNN系列)

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...

  9. paper 53 :深度学习(转载)

    转载来源:http://blog.csdn.net/fengbingchun/article/details/50087005 这篇文章主要是为了对深度学习(DeepLearning)有个初步了解,算 ...

  10. 深度学习与CV教程(4) | 神经网络与反向传播

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...

随机推荐

  1. 华企盾DSC客户端连不上服务器(客户端在回收站)

    解决方法:确保该计算机在CLIENT表recyclebin列中的值为False,最好把所有计算机都改成False,改好后重启DSC服务器,最后重新安装客户端. 或者将客户端从回收站移动到正常的工作组.

  2. 什么是 MySQL JDBC 连接池中最高效的连接检测语句?

    在回答这个问题之前,首先我们看看 MySQL 中有哪些常用的 JDBC 连接池: c3p0 DBCP Druid Tomcat JDBC Pool HikariCP 这些连接池中,c3p0 是一个老牌 ...

  3. 复习:Java基础-泛型方法

    泛型 大家都很熟悉了 泛型方法呢 可能很多小伙伴都有混淆,今天来稍微复习一下 泛型方法(普通方法) public class Test<T> { public T f(T c) { //注 ...

  4. ElasticSearch之Exists API

    检查指定名称的索引是否存在. 命令样例如下: curl -I "https://localhost:9200/testindex_002?pretty" --cacert $ES_ ...

  5. 学会@ConfigurationProperties月薪过三千

    学习 @ConfigurationProperties 之前我们需要一些前置知识点: @Value是个什么东西 首先明确:@ConfigurationProperties 是 SpringBoot 注 ...

  6. Python——第四章:推导式(Comprehensions)

    推导式: 推导式是为了简化代码. 语法: 列表推导式:[数据 for循环 if判断] 集合推导式:{数据 for循环 if判断} 字典推导式:{k:v for循环 if判断} 元组推导式:不存在(因为 ...

  7. 关于windows激活程序的木马病毒分析及处置方法

    客户电脑中毒,锁定几个病毒进程.EDR杀毒.木马专杀工具无法处置,该现象是和深信服外网AF防火墙联动后发现的行为,EDR无感知. 该病毒特征为,每日早上用户开机,均检查到外链du.testjj.com ...

  8. 码农的转型之路-PLC异地组网与远程控制

    PLC异地组网与远程控制,需求是基于园子认识的朋友提供,大体是实现PLC多个局域网异地组网,并实现远程控制.大屏展示.手机端控制.预警推送等功能.其他就是可以方便二次开发界面,以满足不同客户的需求. ...

  9. 面试Java时碰到过的那些问题

    项目终于忙完了,难得不加班,但回到家中却不知道干啥,打开自己的云笔记,看到了以前面试时碰到的一些面试题,下面将会把以前面试时被问到的问题都分享出来,下面的题看看小伙伴们可以答的怎样吧 HashMap实 ...

  10. 技术实操丨使用ModelArts和HiLens Studio完成云端验证及部署

    前言 HiLens Studio公测也出来一阵子了,亮点很多,我前些天也申请了公测,通过后赶快尝试了一下,不得不说真的很不错啊,特别是支持云端编辑代码,调试,甚至可以直接运行程序,即使自己的HiLen ...