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)
最后的最后我们来试验一下我们是否成功了
可能我们的数值不一样,因为初始权重不一样,只要输出了就挺好的。
上一篇: 浏览器友好的变量输出
下一篇: [日常] HTTP连接管理