深度学习基础课:“判断性别”Demo需求分析和初步设计(下2)
大家好~我开设了“深度学习基础班”的线上课程,带领同学从0开始学习全连接和卷积神经网络,进行数学推导,并且实现可以运行的Demo程序
线上课程资料:
本节课录像回放1
加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可能会逐渐增大”的情况,所以就不需要“减小学习率,增加轮数;”)
总结
- 请回答所有主问题?
- 如何根据梯度下降算法实现训练代码?
- 会出现什么问题?如何解决?
参考资料
- 如何自己从零实现一个神经网络?
- Why is sigmoid or tanh better than linear slope for an activation function?
- 归一化、标准化、零均值化作用及区别
- 训练网络时为什么会出现loss逐渐增大的情况?
深度学习基础课:“判断性别”Demo需求分析和初步设计(下2)的更多相关文章
- “判断性别”Demo需求分析和初步设计(中)
大家好~我开设了"深度学习基础班"的线上课程,带领同学从0开始学习全连接和卷积神经网络,进行数学推导,并且实现可以运行的Demo程序 线上课程资料: 本节课录像回放 加QQ群,获得 ...
- 基于深度学习的人脸性别识别系统(含UI界面,Python代码)
摘要:人脸性别识别是人脸识别领域的一个热门方向,本文详细介绍基于深度学习的人脸性别识别系统,在介绍算法原理的同时,给出Python的实现代码以及PyQt的UI界面.在界面中可以选择人脸图片.视频进行检 ...
- 【神经网络与深度学习】【CUDA开发】caffe-windows win32下的编译尝试
[神经网络与深度学习][CUDA开发]caffe-windows win32下的编译尝试 标签:[神经网络与深度学习] [CUDA开发] 主要是在开发Qt的应用程序时,需要的是有一个使用的库文件也只是 ...
- [OpenCV实战]1 基于深度学习识别人脸性别和年龄
目录 1基于CNN的性别分类建模原理 1.1 人脸识别 1.2 性别预测 1.3 年龄预测 1.4 结果 2 代码 参考 本教程中,我们将讨论应用于面部的深层学习的有趣应用.我们将估计年龄,并从单个图 ...
- 【课程学习】课程2:十行代码高效完成深度学习POC
本文用户记录黄埔学院学习的心得,并补充一些内容. 课程2:十行代码高效完成深度学习POC,主讲人为百度深度学习技术平台部:陈泽裕老师. 因为我是CV方向的,所以内容会往CV方向调整一下,有所筛检. 课 ...
- 深度学习与CV教程(2) | 图像分类与机器学习基础
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...
- 深度学习与CV教程(8) | 常见深度学习框架介绍
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...
- 深度学习与CV教程(12) | 目标检测 (两阶段,R-CNN系列)
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...
- paper 53 :深度学习(转载)
转载来源:http://blog.csdn.net/fengbingchun/article/details/50087005 这篇文章主要是为了对深度学习(DeepLearning)有个初步了解,算 ...
- 深度学习与CV教程(4) | 神经网络与反向传播
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...
随机推荐
- ASR项目实战-决策点
针对语音识别的产品,分别记录设计.开发过程中的决策点. 实时语音识别 对于实时语音识别来说,客户端和服务端之间实时交换语音数据和识别的结果. 客户端在启动识别时,即开始发送语音数据,期望在等待较短的时 ...
- Havoc C2d的初次使用
Havoc C2 简介 Havoc是一款现代化的.可扩展的后渗透命令控制框架 当前的Havoc版本还处于早期开发版,随着框架的不断成熟,可能会对Havoc的API和核心结构进行大量更改 以下的配置部分 ...
- 云MSP服务案例丨某知名制造集团的Oracle RAC部署实践
简介: 随着DT时代到来,移动互联网.物联网开始高速发展,更多的企业意识到了数据库架构选型对业务发展的重要性,如何管理和利用好数据已经变得越来越重要.Oracle作为世界上目前最流行的关系型数据库管理 ...
- java实现一个录像大师
java实现一个录像大师 javacv从入门到入土系列,发现了个好玩的东西,视频处理,于是我想搞了个屏幕录屏大师,这里我使用javafx进行页面显示. 依赖 <!-- 需要注意,javacv主要 ...
- 半小时实现GPT纯血鸿蒙版
仅需半小时,即可实现纯血鸿蒙版本的ChatGPT! 废话少说,先看效果图: 如上图所示,这个小Demo实现了AI智能问答.靠右加粗的文本是用户点击底部提交按钮后出现的:后面靠左对齐的普通文本是来自AI ...
- 斯坦福 UE4 C++ ActionRoguelike游戏实例教程 13.使用GameplayTag实现使用钥匙卡打开箱子
斯坦福课程 UE4 C++ ActionRoguelike游戏实例教程 0.绪论 概述 本篇文章将会展示Gameplay另一个用法,也就是我们最常见的使用特定道具交互特定的机关.例如本文要实现的,获得 ...
- Asp .Net Core 系列:Ocelot结合Consul实现服务注册、服务发现
Consul下载地址:https://www.consul.io/downloads.html 文档:https://learn.hashicorp.com/consul/getting-starte ...
- OSG嵌入QT的简明总结2
正文 我之前在这篇博文<OSG嵌入QT的简明总结>中论述了OSG在QT中显示的可视化问题.其中提到官方提供的osgQt项目(地址:https://github.com/opensceneg ...
- 电商业务容器化遇瓶颈,公有云Docker镜像P2P加速很安全
当前,电商平台会采用基于Docker的容器技术来承载618大促期间的一些关键业务版块,包括最简单的商品图片展示.订单详情页面等等. 通过容器化改造,电商平台的每个业务版块解耦,可以独立开发.部署和上线 ...
- 云小课|MRS基础原理之Hue组件介绍
阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:Hue是一组WEB ...