当前位置: 移动技术网 > IT编程>脚本编程>Python > Make your own neural network(Python神经网络编程)一

Make your own neural network(Python神经网络编程)一

2018年11月07日  | 移动技术网IT编程  | 我要评论

写真图片,计秋君,虹吸战士黑镜

  这本书应该算我第一本深度学习的代码入门书了吧,之前看阿里云云栖社和景略集智都有推荐这本书就去看了,

  成功建立了自己的第一个神经网络,也了解一些关于深度学习的内容,再加上这学期的概率论与数理统计的课,

  现在再来看李大大的机器学习课程,终于能看懂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)

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网