搜公众号
推荐 原创 视频 Java开发 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库
Lambda在线 > asprouts > 神经网络BP算法实现

神经网络BP算法实现

asprouts 2019-04-05
举报

微信上Latex公式得通过图片显示,所以还得搞个图床,搞完了还得自己排版,很复杂,不知道哪位公号大佬有绝招。这里我偷个懒,直接全用图片。昨天研究了一下怎么在微信上放代码,下了个插件好霸道,总感觉它时时刻刻都在干预我,而且还只能免费使用15天。但是没办法,它的效果贼好,只能用它(文末能看到效果)。该文章的演变是从markdown直接转PDF,再用PDF转图片,不知道在手机上效果如何呢

对了,我已经两个星期没有上王者峡谷了,有的时候很想玩,可是一想到自己上次被坑了一天就没有想法了,感谢坑我的人,帮我戒游戏,希望寒假不会复发!

组合优化好玄学啊,感觉自己现在啥都不懂。仿佛就跟当初进软件学院一样,刚开始自己还是信心满满,整个军训期间都在养老看《易中天品三国》。到后来别人都学了一个月的技术,自己啥也不会,最后只能艳羡别人进很厉害的技术社团,心里老不平衡了,以至于我都想转专业神经网络BP算法实现。这种第一步就失去先机的感觉就像《春风十里不如你》里面肖红在电影院里眼睁睁看着赵英男把秋水抢走了一样。然后我就漫无目的地过完了大一。不过好在我没有付出实际行动,不然舍弃互联网行业真是太亏了,哈哈。后面大二不知道为啥,居然死鱼翻身,一举奠定了我保研的基础,现在我想想都觉得奇怪。想到这里,我觉得自己现在啥都搞不懂反而是很正常的,或许在未来某一段时期自己就突然开窍了,然后又开始追赶着别人前进,就像当初大二开窍之后一样。我越发觉得自己是个后知后觉的人了,就是说我这人很慢热,很迟钝,必须得受到很多打击才能热起来,想到这里我好害怕呀,前面又会有多少残酷的打击等着我靠近呢?姑且不去想了。我觉得这些打击都不会伤到我的,我还是好好爱惜自己为妙。希望自己以后能够爱上组合优化,爱上自己的研究方向。我觉得我应该是热衷于此的,但是我不知道怎么研究,无法找到突破点,可能还是对此了解太少了。我相信不久后我就会找到突破点的。

另外,这篇文章理论知识来源都是周志华老师的《机器学习》,我觉得讲的非常好,通俗易懂,因为我看懂了,😄。代码是我自己写的,基本照着推导公式写的,也不是很难,主要是帮助自己熟悉一下神经网络的底层实现大概是什么样的,解决了自己上个星期云计算手写数字识别实验中的一些困惑。最近几天我都在看这本书,也不去想如何组合优化了。

好了,抱怨完了。话不多说,直接上图上代码。

神经网络BP算法实现

神经网络BP算法实现

神经网络BP算法实现

神经网络BP算法实现

神经网络BP算法实现

神经网络BP算法实现

神经网络BP算法实现

神经网络BP算法实现

# -*- coding :utf-8 -*-

import pandas as pd
import numpy as np

class NeuralNetwork():
   def __init__(self):
       # 固定随机种子,保证每次结果相同,便于重现结果
       np.random.seed(1)
       # 权重矩阵,范围-1~1,均值为零
       # cw1第一层,cw2第二层
       self.cw1 = 2 * np.random.random((2, 2)) - 1
       self.cw2 = 2 * np.random.random((2, 1)) - 1
       # 阈值,隐层两个神经元,输出层一个神经元
       self.bias1 = 2 * np.random.random((2, 1)) - 1
       self.bias2 = 2 * np.random.random() - 1
       # 学习率
       self.rate = 0.1

   def load_train_data(self,data_path='./watermelon3_0_Num.csv'):
       """
       该函数只会在训练时被使用(train函数中)
       有的时候(直接加载训练好的模型时)并不需要读取训练集,所以不放在构造函数中
       """

       # 读取数据集
       data = pd.read_csv(open(data_path))
       # root表示西瓜根蒂,umbilicus表示西瓜脐部,label表示是否为好瓜
       data = data[['root', 'umbilicus', 'label']]
       self.m = len(data) # 训练集大小
       self.input_data = (data.iloc[0:17, 0:2]).values
       self.output_data = (data.iloc[0:17, 2:3]).values

   def train(self,round=10000):
       """
       accumulated error back propagation(BP) algorithm
       :param round: training round
       :return: trained network parameters
       """

       self.load_train_data()
       for i in range(round):
           in0 = self.input_data   # 输入层输入
           y = self.output_data    # 输出层输出
           in1 = np.dot(in0, self.cw1) # 隐层输入
           out1 = self.sigmoid(in1 - self.bias1.T) # 隐层输出
           in2 = np.dot(out1, self.cw2)            # 输出层输入
           out2 = self.sigmoid(in2 - self.bias2)   # 输出层输出(结果)

           # 累积误差计算
           # err=out2-output_data
           # err=err*err
           # err=np.sum(err)/(2*m)

           g = out2 * (1 - out2) * (y - out2)
           e = out1 * (1 - out1) * g * self.cw2.T
           # 更新连接权和阈值
           self.cw2 = self.cw2 + self.rate * np.sum(g * out1, axis=0).reshape(2, 1) / self.m
           self.bias2 = self.bias2 - self.rate * np.sum(g, axis=0) / self.m
           self.cw1 = self.cw1 + self.rate * np.dot(in0.T, e) / self.m
           self.bias1 = self.bias1 - self.rate * np.sum(e, axis=0).reshape(2, 1) / self.m

   def predict(self,inputs):
       """
       :param inputs: samples to be predicted (narray)
       :return: predict result
       """

       in1 = np.dot(inputs, self.cw1)
       out1 = self.sigmoid(in1 - self.bias1.T)
       in2 = np.dot(out1, self.cw2)
       out2 = self.sigmoid(in2 - self.bias2)
       print(out2)

   def load_model(self):
       # 50000次迭代结果
       self.cw1 = np.array([[2.37153116, 6.14766157], [-5.00204499, 4.53010674]])
       self.cw2 = np.array([[3.88821976], [-5.4591637]])
       self.bias1 = np.array([[-5.44175786], [0.65462487]])
       self.bias2 = np.array([-1.31396574])

   def print_param(self):
       print(self.cw1)
       print(self.cw2)
       print(self.bias1)
       print(self.bias2)

   # sigmoid function,d=True表示求导
   def sigmoid(self,x, d=False):
       if(d==True):
           return x*(1-x)
       return 1/(1+np.exp(-x))

def test_load_model():
   nn=NeuralNetwork()
   nn.load_model()
   nn.predict(np.array([[0,0],[0,1],[1,1],[1,2],[0,2],[2,2]]))

def test_train():
   nn=NeuralNetwork()
   nn.train(50000)
   print('network param after train:')
   nn.print_param()
   print('prediction by trained network:')
   nn.predict(np.array([[0, 0], [0, 1], [1, 1], [1, 2], [0, 2], [2, 2]]))

if __name__=="__main__":
   # test_train()
   test_load_model()


版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《神经网络BP算法实现》的版权归原作者「asprouts」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注asprouts微信公众号

asprouts微信公众号:asprouts

asprouts

手机扫描上方二维码即可关注asprouts微信公众号

asprouts最新文章

精品公众号随机推荐

举报