设为首页 加入收藏

TOP

Make your own neural network(Python神经网络编程)二(一)
2018-11-08 14:11:42 】 浏览:178
Tags:Make your own neural network Python 神经 网络编程

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

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

①初始化神经网络

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

 #初始化权重函数
        #初始化输入层到隐藏层的权重矩阵
        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条传入链接,我们就在

  这个区间里面进行取样。概率分布的角度解释就是从均值是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函数

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

  我们的输入矩阵乘以权重矩阵是,对于输入层和隐藏层就是

  这个用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

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

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

 

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)

   最后的最后我们来试验一下我们是否成功了

  

  可能我们的数值不一样,因为初始权重不一样,只

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇centos7 安装pip 下一篇按值传递 vs. 按指针传递

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目