大家好~我开设了“深度学习基础班”的线上课程,带领同学从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 }, _)
Be First to Comment