Make your own neural network(Python神经网络编程)一
Posted powerzzjcode
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Make your own neural network(Python神经网络编程)一相关的知识,希望对你有一定的参考价值。
这本书应该算我第一本深度学习的代码入门书了吧,之前看阿里云云栖社和景略集智都有推荐这本书就去看了,
成功建立了自己的第一个神经网络,也了解一些关于深度学习的内容,再加上这学期的概率论与数理统计的课,
现在再来看李大大的机器学习课程,终于能看懂LogisticsRegression概率那部分公式!不至于像之前暑假看的那么懵逼了。
如果有大佬看了我的博客发现错误。请一定要告诉我,毕竟我才学了1个月都不到,博客是我强制自己去总结去反思的。有错误一定要告诉我啊!!!
废话不多说了,我整理了这本书中的内容,再加上一点我自己的收集,直接从第二章的Python实现开始写,第一章内容穿插在里面进行讲解。我是用的是jupyter,具体安装过程就不细说了。
将神经网络写成一个类,可以适用于各种场景,可以用来创景不同大小的网络,这本书写的是一个三层神经网络,输入层,隐藏层,输出层
大体框架就是
①初始化函数 -- 设定输入层节点数,隐藏层节点数,输出层节点数
②训练 --学习给定训练集的样本,优化权重
③查询--给定的输入,输出结果
我分几次博客来写吧。。。一次太长了。。。。
#神经网络类定义 class neuralNetwork: #初始化神经网络 def __init__(): pass #训练神经网络 def train(): pass #查询神经网络的结果 def query(): pass
首先先是①初始化神经网络
我们需要设置的是输入层节点数,隐藏层节点数,输出层节点数,以及学习率(每一次迭代的步长),然后给到类里面
#初始化神经网络 def __init__(self,inputnodes,hiddennodes,outputnodes, learningrate): #设置的是输入层节点数,隐藏层节点数,输出层节点数 self.inodes = inputnodes self.hnodes = hiddennodes self.onodes = outputnodes #设置学习率 self.lr = learningrate pass
然后初始化设置每层三个节点,看看是否运行成功。
#输入层节点数,隐藏层节点数,输出层节点数 input_nodes = 3 hidden_nodes = 3 output_nodes = 3 #learning rate is 0.3 learning_rate = 0.3 #实例化神经网络 n = neuralNetwork(input_nodes,hidden_nodes,output_nodes, learning_rate)
虽然没实现任何功能,但是至少没报错。
之后先来说说S阈值函数
S阈值函数是什么?干什么?怎么用?
神经网络模拟人的大脑的神经元的工作方式,神经元的工作方式是抑制输入,直到输入增强到一定的阈值就可以触发输出
,因为神经元不希望传递微小的噪声信号。有许多激活函数可以使用,我们这里使用最常用的S函数用单词sigmoid表示,也叫逻辑函数。
具体这个S函数怎么来的,是从贝叶斯公式发展过来的,这里就不细说了。
它是用来干什么的?是为了让输入的值和输出的值不是线性的,为了后面的权重优化非线性误差梯度。但是说到底还是为了模仿神经元的工作原理
它怎么用?就是一个代入x得到y的简单代数公式罢了。
回到我们的主题。接下来就是神经网络的核心--权重的初始化了。
神经网络中的权重是什么?干什么?怎么用?这三个问题先来说明一下。
我先以一个两层每层两个节点的神经网络进行说明。
首先权重是什么。一个神经网络会若干个输入,第一层输入层,只做输入(重点)!
权重就是赋予图中绿线一定的数值,代表前一个节点的输出的数值传到后一个节点的输入的占比,权重最初是随机出来的,之后要一点点调节,这个后面再说。
权重干什么?
这张图应该就能看出来权重的作用了,得到输入值,各自和权重相乘然后求和,然后代入我们的S函数中得到一个值,就作为我们的输出y
假设给两层神经网络随机以下权重。是指前一层的第一个节点到下一层第一个节点的权重
那么第二层的节点1,的计算过程就是x = (1.0*0.9)+(0.5*0.3) = 1.05
然后把x的值代入S函数中 y = 1/(1+e^1.05) = 0.7408
到此,我们经历了一个节点的全过程,但是很明显这种枯燥乏味的活不适合人去做,我们需要计算机来帮我们做
但是,每一个节点都有不同的权重,难道我们对每一个节点都要单独敲一行代码吗?
权重怎么用?我们用矩阵来完成全部计算过程,计算机已经很好的和矩阵一起工作了,矩阵相乘的计算基础也不多说了
直接看看结果
第一个矩阵就是权重矩阵,权重矩阵第一列是前一层第一个节点到下一层所有节点依次的权重。
第二个矩阵就是输入矩阵,必须是列向量,否则,你也乘不出来我们要的结果啊。
右边就是矩阵相乘的结果,也是一个列向量,从上到下依次代表下一层节点的输入值
然后把这个矩阵简化一下就是,这样不管矩阵里面有2个还是200个,都能用这个公式表示
最后就是把我们的输入矩阵X,代入我们的S函数中,输出矩阵O就是sigmoid(X)
回到我们的程序之中,我们现在要处理三层每层三个神经网络的问题,但是精髓是不变的
我们要随机一个输入层和隐藏层的权重矩阵,还要随机一个隐藏层和输出层的权重矩阵,取值是-1到+1
这里讲解一下,为什么要随机呢,因为后面训练要从不同的初始值找极值,来优化权重,所以我们不能在一棵树上吊死。
其次为什么是-1到+1,可以看我们的S函数的图,在<-1和>1的情况下都是斜率很小的,不适合后面优化权重,为了电脑不会跑宕机,就选-1到1。
当然权重矩阵有一种经验上的较好的取值方法,我最后再讲,
随机数的生成我用numpy来实现
#初始化权重函数 #初始化输入层到隐藏层的权重矩阵 self.wih = np.random.rand(self.hnodes,self.inodes)-0.5 #rand只出现0-1,所以-0.5为了能出现负数 #初始化隐藏层到输出层的权重矩阵 self.who = np.random.rand(self.onodes,self.hnodes)-0.5
特比说明一下权重矩阵的大小一定是(后一层的节点数X前一层的节点数),一列中每一行对应下一层的每一个节点,所以行数为下一层的节点数,
可以看看前面那个权重矩阵的解释自己感受一下那个feel。
至此我们的初始化快要完成了。时间不早了,后面的就下一次博客写了。附上我的代码
import numpy as np #神经网络类定义 class neuralNetwork: #初始化神经网络 def __init__(self,inputnodes,hiddennodes,outputnodes, learningrate): #设置的是输入层节点数,隐藏层节点数,输出层节点数 self.inodes = inputnodes self.hnodes = hiddennodes self.onodes = outputnodes #设置学习率 self.lr = learningrate #初始化权重函数 #初始化输入层到隐藏层的权重矩阵 self.wih = np.random.rand(self.hnodes,self.inodes)-0.5 #-0.5为了能出现负数 #初始化隐藏层到输出层的权重矩阵 self.who = np.random.rand(self.onodes,self.hnodes)-0.5 pass #训练神经网络 def train(): pass #查询神经网络的结果 def query(): pass #输入层节点数,隐藏层节点数,输出层节点数 input_nodes = 3 hidden_nodes = 3 output_nodes = 3 #learning rate is 0.3 learning_rate = 0.3 #实例化神经网络 n = neuralNetwork(input_nodes,hidden_nodes,output_nodes, learning_rate)
以上是关于Make your own neural network(Python神经网络编程)一的主要内容,如果未能解决你的问题,请参考以下文章
Be Your Own Teacher: Improve the Performance of Convolutional Neural Networks via Self Distillation
论文翻译:2020_RESIDUAL ACOUSTIC ECHO SUPPRESSION BASED ON EFFICIENT MULTI-TASK CONVOLUTIONAL NEURAL NETW
Design Your Own Protocol In Five Minutes