python bp神经网络

激活函数: tanh
bp反向传播
误差函数:MSE

from numpy import *
''' 
layer =  神经元层数
number = 每层神经元个数
Input = w0*x0+....+wi*xi
f =  激活函数
Out = f(Input)       节点输出值
PartialDerivation =  节点偏导(每一个神经元的偏导)
PartialThreashold = 权值偏导(每一个权值的偏导)
ThreasholdVaule = 权值
f1    =  每一个节点对下一个节点的倒数函数(直接输出值)
LearnRating   =  学习率
'''
data2 = [[2, 2], [0.5], [1, 1], [0.25]]   #data2就是输入和期望输出
layer = 2        #可更改
number = 2       #可更改
time = 0
c = 0
error1 = 0
alltime = 20000        #训练次数
LearnRating = 0.001
Out = zeros((layer, number), dtype=float)
Input = zeros((layer, number), dtype=float)
Out1 = zeros((layer, number), dtype=float)
Input1 = zeros((layer, number), dtype=float)
PartialDerivation = zeros((layer, number, number), dtype=float)
PartialThreshold = zeros((layer, number, number), dtype=float)
Partial = zeros((layer, number), dtype = float )
node = zeros((number, number), dtype=float )
f1 = zeros((layer, number), dtype=float)
a = zeros(number, dtype=float)
ThresholdVaule = random.rand(layer, number, number)
Constant = random.rand(layer, number)
end = zeros(number, dtype=float)

def f(Input):                    #激活函数,这个用的是函数
   return (e**(Input)-e**(-Input))/(e**(Input)+e**(-Input))
def Partial1(Input):             #激活函数求导,
    return 1-f(Input)**2



while  1:

#正向传播
     Input[0] = data2[c]
     for i in range(0, layer-1):
         Out[i] = f(Input[i])         ##f(x)
         Input[i+1] = dot(ThresholdVaule[i], Out[i])+Constant[i]   ## layer[i+1] x
     Out[layer-1] = f(Input[layer-1])
     error = sum(Out[layer-1]/layer)-data2[c+1]


#逆向传播
     for i in range(len(end)):
         end[i] = (sum(Out[layer-1])/layer - data2[c+1][0])/layer
     PartialDerivation[layer-1] = diag(end)          #sum(Out[layer-1])/5-data2[c+1]
     i = layer-2
     f1 = Partial1(Input)
     while i >= 0:
         node = dot(dot(PartialDerivation[i+1], diag(f1[i+1])), ThresholdVaule[i])      #核心代码:求每个神经元的偏导
         a  = sum(node, axis=0)
         PartialDerivation[i] = diag(a)


         for j in range(0, number):
             node[j] = Out[i]
         PartialThreshold[i] = dot(dot(diag(f1[i+1]), PartialDerivation[i+1]), node)        #核心代码:求权值的偏导
         i = i-1


     ThresholdVaule = ThresholdVaule-PartialThreshold*LearnRating

     for j in range(0, layer):
         Constant[j] = Constant[j] - diag(PartialDerivation[j])*LearnRating

     Input1[0] = data2[c]
     for i in range(0, layer-1):
        Out1[i] = f(Input1[i])
        Input1[i+1] = dot(ThresholdVaule[i], Out1[i])+Constant[i]
     Out1[layer-1] = f(Input1[layer-1])

     if c==0:
         c = 2
     else:
         c = 0

基本上没任何编程技术含量,重点是理论的理解及实现
就是这两句,其他都是粪土

  node = dot(dot(PartialDerivation[i+1], diag(f1[i+1])), ThresholdVaule[i]) 
 PartialThreshold[i] = dot(dot(diag(f1[i+1]), PartialDerivation[i+1]), node)   

本来就这些了,防止本垃圾以后自己看不懂,解释下。

    神经网络的本质,是用神经网络本身这个函数去契合(模拟)任意一个函数
    契合的意义:使两个函数的相似度越来越大(越来越像)
    契合的方法:相似度度量函数的导数就是使得两个函数最接近的路径

后面是具体解释:

        **神经网络的本质,是用神经网络本身这个函数去契合(模拟)任意一个函数**。(为什么神经网络可以
   模拟任何一个函数,听说有论文证明,没看过。但这符合我的世界观,无论多复杂都可以用简单来解释)

       然后**解释任意一个函数是什么意思**: y = f( x ) 就是函数,太数学了,换个说法,有一个输入,
       
   就有对应的一个输出,就是函数,再具体,这个输出可以是任何东西,大自然的任何东西,
   
   一沙一树一世界,一花一叶一菩提,都可以,然后给你一个你想要的输出。输出的形式自然
   
   可以是任何东西,应用不是数学,输入输出自然不可能有限制。那牛逼吹出去了,怎么实现呢。
   
   数学里的输入只能是数字,计算机的输入只能是数据。把目标输入属性用数据描述就好了,最常见
   
   的属性应该是人的五感对应的属性。然后用神经网络的输出与目标(理想)输出进行对比,经过**一定
   
   的方法**使二者靠近最后甚至一毛一样
          
          然后问题来了,神经网络说到底就是模仿吗,我已经有一个正确的模型了(不然我怎么有正确的输出),
          
为什么花这么大的功夫搞一个复制品。直接用正品不好吗。一步到wei(有点长了)如果淘宝模拟出买家大部分

性格呢,如果手机里有一个软件有权利记录你所有的踪迹,且进行模拟,当同样的输入传递给你和它,

你两的输出一致率达到80%,求这个软件的发财程度。

       说明了神经网络的能力与能否再现实社会存在,再说神经网络实现难点。算力不够,没了。就这个,
       
足够的算力下是不需要任何算法的,请直接穷举。那怎么在算力有限的情况下实现最大的功能呢。

联想到一个相似的问题:怎么算一个硬币的正反两面概率呢(正反两面概率不一样的情况)。两个理论方法,

一:把硬币的所有属性,环境,抛硬币的力等等进行建模,算出来
二:把这枚硬币抛无穷次
实际方法:抛一百次,频率代替概率(样本数量越大,频率越接近概率)。

同样的方法:算力有限的情况,用最大的可算样本代替总体,进行神经网络训练(使神经网络越来越靠近
模仿的函数)。然后训练方法呢,**相似度度量**。相似度度量函数就是二者之间的误差,相似度函数的导数方向
就是最快相似的方向
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值