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

Paddle your own canoe.

Design Your Own Protocol In Five Minutes

Build your own distribution based on Fedora CoreOS

Build your own distribution based on Fedora CoreOS