欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-10-27 15:34:33
上一篇讲到初始化了输入层和隐藏层,以及隐藏层和输出层的权重矩阵 这一次我们要彻底结束掉①初始化神经网络②查询网络,这两个功能 ①初始化神经网络 上一次我们的初始权重矩阵是 还有一种更加好的随机初始权重的方法,加入有100条传入链接,每个从-1到+1进行随机,乘以权重矩阵之后依旧是一个非常庞大的数值 ......

  上一篇讲到初始化了输入层和隐藏层,以及隐藏层和输出层的权重矩阵

  这一次我们要彻底结束掉①初始化神经网络②查询网络,这两个功能

①初始化神经网络

  上一次我们的初始权重矩阵是

 #初始化权重函数
        #初始化输入层到隐藏层的权重矩阵
        self.wih = np.random.rand(self.hnodes,self.inodes)-0.5  #-0.5为了能出现负数
        #初始化隐藏层到输出层的权重矩阵
        self.who = np.random.rand(self.onodes,self.hnodes)-0.5

  还有一种更加好的随机初始权重的方法,加入有100条传入链接,每个从-1到+1进行随机,乘以权重矩阵之后依旧是一个非常庞大的数值

  所以根据数学家们的经验规则,我们可以在一个节点传入链数平方根的倒数范围内随机取样,比如100条传入链接,我们就在Make your own neural network(Python神经网络编程)二

  这个区间里面进行取样。概率分布的角度解释就是从均值是0,标准方差等于传入链数平方根的倒数的正态分布里面取样

  fyi:权重不能设定成相同的值,或者0,相同的值无法有效的学习,0直接不学习。

  用代码实现这个功能就是

#按照均值为0,标准方差为传入链接数的根号的倒数的正态分布的随机取样,获得更好的初始化权重
        #初始化输入层到隐藏层的权重矩阵
        self.wih = np.random.normal(0.0,pow(self.hnodes,-0.5),(self.hnodes,self.inodes))#pow就是标准方差的表示形式
        #初始化隐藏层到输出层的权重矩阵
        self.who = np.random.normal(0.0,pow(self.onodes,-0.5),(self.onodes,self.hnodes))

②查询网络

  查询网络就是query函数

  它所要做的只是接受神经网络的输入,乘以权重矩阵,然后代入权重函数,一直到输出层,然后输出最后的结果

  我们的输入矩阵乘以权重矩阵是Make your own neural network(Python神经网络编程)二,对于输入层和隐藏层就是Make your own neural network(Python神经网络编程)二

  这个用python代码实现起来有多么容易呢

hidden_inputs = numpy.dot(self.wih,inputs)

  就这样,然后我们只需要把这个隐藏层的输入矩阵代到s函数中得到结果即可

  s函数也有现成的定义scipy的库里面就已经有了s函数,expit(),我们只需要导入。

import scipy.special

  s函数也是我们要多次引用的,所以我们把它放到我们的初始化里面,定义一次即可,为了不让这个函数特地占位置,

  使用句柄函数来简洁的定义我们的s函数

      #设置激活函数
        self.activation_function = lambda x:scipy.special.expit(x)

  所以query()函数就是

#查询神经网络的结果
    def query(self,inputs_list):#需要传入输入列表
        inputs = np.array(inputs_list,ndmin=2).t    #将输入列表编程numpy数组,转置成列向量
        #计算隐藏层的输入
        hidden_inputs = np.dot(self.wih,inputs)    #
        #计算隐藏层的输出
        hidden_outputs = self.activation_function(hidden_inputs) 
        #计算输出层的输入
        final_inputs = np.dot(self.who,hidden_outputs)
        #计算输出层的输出
        final_outputs = self.activation_function(final_inputs)
        #返回最终结果
        return final_outputs
        pass

  至此,我们初始函数的优化,以及查询结果都结束,下一次就是最重要的训练网络了

  附上到现在为止所有的代码

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

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

import numpy as np
import scipy.special

#神经网络类定义
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
        
        #按照均值为0,标准方差为传入链接数的根号的倒数的正态分布的随机取样,获得更好的初始化权重
        #初始化输入层到隐藏层的权重矩阵
        self.wih = np.random.normal(0.0,pow(self.hnodes,-0.5),(self.hnodes,self.inodes))#pow就是标准方差的表示形式
        #初始化隐藏层到输出层的权重矩阵
        self.who = np.random.normal(0.0,pow(self.onodes,-0.5),(self.onodes,self.hnodes))
        
         #设置激活函数
        self.activation_function = lambda x:scipy.special.expit(x)
        pass
    
    #训练神经网络
    def train():
        pass
    
    #查询神经网络的结果
    def query(self,inputs_list):#需要传入输入列表
        inputs = np.array(inputs_list,ndmin=2).t    #将输入列表编程numpy数组,转置成列向量
        #计算隐藏层的输入
        hidden_inputs = np.dot(self.wih,inputs)    #
        #计算隐藏层的输出,代入s函数
        hidden_outputs = self.activation_function(hidden_inputs) 
        #计算输出层的输入
        final_inputs = np.dot(self.who,hidden_outputs)
        #计算输出层的输出,代入s函数
        final_outputs = self.activation_function(final_inputs)
        #返回最终结果
        return final_outputs
        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神经网络编程)二

  可能我们的数值不一样,因为初始权重不一样,只要输出了就挺好的。