ITPub博客

首页 > 数据库 > 数据库开发技术 > 源码系列三之—BP神经网络

源码系列三之—BP神经网络

原创 数据库开发技术 作者:quincyqiang 时间:2021-06-02 09:17:00 0 删除 编辑

本篇文章是源代码系列的第三节,BP神经网络的源代代码。该系列主要是分享一些本人在学习的过程中手写过的一些简单模型的代码,在学习理论知识的时候结合代码一起学习会更加得心应手。之前的两节分别是隐形马尔可夫链和决策树代码,大家可以在该公众号以往的文章中查找。虽然在目前所处的深度学习时代,tensorflow和pytorch的流行,已经不会有机会要自己手写BP神经网络做什么了。但是BP神经网络作为打开深度学习的一把及其重要的钥匙,我们还是有了解一下的它的必要的。

本文还是纯代码向的,有关于BP神经网络的推导,大家可以去知乎上查找,下面来看一下代码吧(还是用python写的)。

代码分为三个部分:第一部分是定义网络间的激活函数。

class SquareLoss:
    def forward(self,y,t):
        self.loss=y-t
        return np.sum(self.loss*self.loss)/self.loss.shape[1]/2   #返回输出层误差
    def backward(self):
        return self.loss

第二部分是定义向前向后的函数,以及变量。

class FC:
    def init(self, in_num, out_num, lr=0.01):
        self._in_num=in_num
        self._out_num=out_num
        self.w=np.random.rand(in_num,out_num)  #生成out行,in列矩阵
        self.b=np.zeros(out_num)
        self.lr=lr

    def _sigmoid(self,in_data):
        return 1/(1+np.exp(-in_data))

    def forward(self,in_data):
        self.top_val=self._sigmoid(np.dot(self.w.T,in_data)+self.b)   #将w转置然后与in_data相乘
        self.bottom_val=in_data
        return self.top_val

    def backward(self,loss):
        residual_z=loss*self.top_val*(1-self.top_val)  #采用sigmiod函数的,将误差e转化为 delta
        grad_w=np.dot(self.bottom_val,residual_z.T)    #该层输入的量,乘以上一层的delta为梯度
        grad_b=np.sum(residual_z)
        self.w-=self.lr*grad_w
        self.b-=self.lr*grad_b
        residual_x=np.dot(self.w,residual_z)
        return residual_x

第三部分,定义整个网络框架

class Net:
    def __init__(self,input_num=2,hidden_num=4,out_num=1,lr=0.1):
        self.fc1=FC()
        self.fc1.init(input_num,hidden_num,lr)
        self.fc2=FC()
        self.fc2.init(hidden_num,out_num,lr)
        self.loss=SquareLoss()

    def trian(self,x,y):
        for i in range(10000):
            layer1out=self.fc1.forward(x)
            layer2out=self.fc2.forward(layer1out)
            loss=self.loss.forward(layer2out,y)
            layer2loss=self.loss.backward()
            layer1loss=self.fc2.backward(layer2loss)
            saliency=self.fc1.backward(layer1loss)
        layer1out = self.fc1.forward(X)
        layer2out = self.fc2.forward(layer1out)
        print(X)
        print(y)
        print(layer2out)

最后附上下面的代码就可以直接运行了。

import numpy as np
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]).T  # 2 x 4
y=np.array([[0],[0],[0],[1]]).T
net=Net()
net.__init__(2,4,1,0.1)
net.trian(X,y)

以上就是一个简单的BP神经网络的例子,只有2层中间层,在刚开始接触BP神经网络是还是很有帮助的。

上面的代码是我初学的时候跟着网上的教程还是自己慢慢摸索写出来的,可能与网上的有些雷同,那纯属我借鉴啦。

想了解更多算法,数据分析,数据挖掘等方面的知识,欢迎关注ChallengeHub公众号,添加微信进入微信交流群,或者进入QQ交流群。关注公众号或者进群可以直接获得上面的代码,而且也有很多机器学习的资料可以获取。

分享,点赞,在看,
都在这儿,点我不香吗?
扫描下方的二维码进入ChallengeHub粉丝群,也可以添加管理员微信拉您入群。
与爱好AI的朋友们共同成长
ChallengeHub粉丝群
管理员微信



原文作者:ChallengeHub;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2019-01-07

  • 博文量
    350
  • 访问量
    161006