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

2022-10-22,,,

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

线上课程资料:

本节课录像回放

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

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

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

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

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

目录
回顾相关课程内容
主问题:什么是神经网络
主问题:什么是前向传播
任务:用代码实现神经网络

回顾相关课程内容

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

主问题:什么是神经元?
已知一个人的身高为150厘米,体重为50公斤,如何使用神经元得到该人的性别(应该为女性)?
什么是训练?
什么是推理?

主问题:什么是神经网络

已知两个人的身高和体重,能否使用神经元得到他们的性别(一男一女)?

能,因为权重、偏移为未知量,总数量为3,小于方程的数量(2),所有有无数解,所以可确定一组解(权重、偏移)

如何修改代码?

修改train函数:给出一组权重、偏移,使得结果为分别为0、1;

激活函数不变

已知四个人的身高和体重,能否使用神经元得到他们的性别?

不能

为什么?

因为权重、偏移为未知量,总数量为3,小于方程的数量(4),所以无解

如何扩展,才能有解?

使用神经网络,增加权重、偏移的数量!

请设计一个最简单的神经网络?(有几层?每层有几个神经元?)

如何根据输入层的输入,最终得到输出层的输出?

计算公式如下所示:

现在有几个未知解?能够有解了吗?

有解

主问题:什么是前向传播

“根据输入层的输入,最终得到输出层的输出?”的过程称为前向传播
前向传播算法包括哪些步骤?

从输入层开始,依次传入每层,得到每层的输出;

最后传到输出层,得到最后的输出

任务:用代码实现神经网络

请修改神经元代码,提出神经元的前向传播forward函数?

修改后的相关代码为:

Neural_forward_answer

let forward = (state: state, sampleData: sampleData): float => {
sampleData.height *. state.weight1 +.
sampleData.weight *. state.weight2 +.
state.bias->_activateFunc
} let inference = (state: state, sampleData: sampleData): gender => {
forward(state, sampleData)->_convert
}

请在神经元代码的基础上,实现神经网络的前向传播和推理(训练函数不用实现)?

推理函数需要修改吗?

不需要
神经网络代码如下所示:

NeuralNetwork_answer

type state = {
weight13: float,
weight14: float,
weight23: float,
weight24: float,
weight35: float,
weight45: float,
bias3: float,
bias4: float,
bias5: float,
} type sampleData = {
weight: float,
height: float,
} type gender =
| Male
| Female
| InValid let createState = (): state => {
weight13: Js.Math.random(),
weight14: Js.Math.random(),
weight23: Js.Math.random(),
weight24: Js.Math.random(),
weight35: Js.Math.random(),
weight45: Js.Math.random(),
bias3: Js.Math.random(),
bias4: Js.Math.random(),
bias5: Js.Math.random(),
} // not implement
let train = (state: state, allSampleData: array<sampleData>): state => {
state
} let _activateFunc = x => x let _convert = x =>
switch x {
| 0. => Male
| 1. => Female
| _ => InValid
} let forward = (state: state, sampleData: sampleData): float => {
let y3 = Neural_forward_answer.forward(
(
{
weight1: state.weight13,
weight2: state.weight23,
bias: state.bias3,
}: Neural_forward_answer.state
),
sampleData->Obj.magic,
) let y4 = Neural_forward_answer.forward(
(
{
weight1: state.weight14,
weight2: state.weight24,
bias: state.bias4,
}: Neural_forward_answer.state
),
sampleData->Obj.magic,
) Neural_forward_answer.forward(
(
{
weight1: state.weight35,
weight2: state.weight45,
bias: state.bias5,
}: Neural_forward_answer.state
),
(
{
weight: y3,
height: y4,
}: Neural_forward_answer.sampleData
),
)
} let inference = (state: state, sampleData: sampleData): gender => {
Js.log(forward(state, sampleData)) forward(state, sampleData)->_convert
} let state = createState() let allSampleData = [
{
weight: 50.,
height: 150.,
},
{
weight: 51.,
height: 149.,
},
{
weight: 60.,
height: 172.,
},
{
weight: 90.,
height: 188.,
},
] let state = state->train(allSampleData) allSampleData->Js.Array.forEach(sampleData => {
inference(state, sampleData)->Js.log
}, _)

“判断性别”Demo需求分析和初步设计(中)的相关教程结束。

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

下载本文的Word格式文档,以方便收藏与打印。