BPNN神經(jīng)網(wǎng)絡(luò)的Python實現(xiàn)

關(guān)于前置的數(shù)學(xué)知識枫虏,可以查看https://blog.csdn.net/cufewxy1/article/details/80445023

首先是bpnn.py,實現(xiàn)了BPNeuralNetwork類爬虱。

import numpy
import scipy.special
import pickle
from datetime import datetime


class BPNeuralNetwork(object):

    def __init__(self, input_size, hidden_size, output_size, activation_func = scipy.special.expit, learning_rate = 0.1):
        self.input_size = input_size
        self.hidden_size = hidden_size
        self.output_size = output_size
        self.activation_func = activation_func
        self.learning_rate = learning_rate

        # self.wih = numpy.random.sample([hidden_size, input_size]) - 0.5
        self.wih = numpy.random.normal(0.0, pow(hidden_size, -0.5), [hidden_size, input_size])
        # wih_{i,j} links input_j with hidden_i
        
        self.bih = numpy.random.sample([hidden_size, 1]) - 0.5
        
        # self.who = numpy.random.sample([output_size, hidden_size]) - 0.5 
        self.who = numpy.random.normal(0.0, pow(output_size, -0.5), [output_size, hidden_size]) 
        # who_{i,j} links hidden_j with output_i
        
        self.bho = numpy.random.sample([output_size, 1]) - 0.5

    @staticmethod
    def load(filename):
        with open(filename, 'rb') as f:
            return pickle.load(f)
        
    def train(self, inputs, targets):
        inputs = numpy.array(inputs, ndmin = 2).T
        targets = numpy.array(targets, ndmin = 2).T

        hidden_in = numpy.dot(self.wih, inputs) + self.bih
        hidden_out = self.activation_func(hidden_in)
        output_in = numpy.dot(self.who, hidden_out) + self.bho
        output_out = self.activation_func(output_in)
        
        delta_output_out = output_out - targets
        delta_output_in = delta_output_out * output_out * (1 - output_out)
        delta_bho = delta_output_in
        delta_who = numpy.dot(delta_output_in, hidden_out.T)
        delta_hidden_out = numpy.dot(self.who.T, delta_output_in)
        delta_hidden_out = numpy.dot(self.who.T, delta_output_out)
        delta_hidden_in = delta_hidden_out * hidden_out * (1 - hidden_out)
        delta_bih = delta_hidden_in
        delta_wih = numpy.dot(delta_hidden_in, inputs.T)

        self.who -= (self.learning_rate * delta_who)
        self.bho -= (self.learning_rate * delta_bho)
        self.wih -= (self.learning_rate * delta_wih)
        self.bih -= (self.learning_rate * delta_bih)
    
    def dump(self, filename = 'bpnn_%s.dat' % datetime.now().strftime('%Y-%m-%d_%H:%M:%S')):
        with open(filename, 'wb') as f:
            pickle.dump(self, f)

    def query(self, inputs):
        inputs = numpy.array(inputs, ndmin = 2).T
        hidden_in = numpy.dot(self.wih, inputs) + self.bih
        hidden_out = self.activation_func(hidden_in)
        output_in = numpy.dot(self.who, hidden_out) + self.bho
        output_out = self.activation_func(output_in)
        return output_out.reshape(self.output_size)

然后是__init__.py隶债,使用mnist手寫數(shù)字?jǐn)?shù)據(jù)集對我們的BPNN進(jìn)行測試,準(zhǔn)確率可達(dá)97%以上饮潦。

import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt

from bpnn import BPNeuralNetwork


def main():
    bp = BPNeuralNetwork(28*28, 500, 10)
    # mnist = keras.datasets.fashion_mnist
    mnist = keras.datasets.mnist
    (train_images, train_labels), (test_images, test_labels) = mnist.load_data()
    train_images = train_images / 255.0
    test_images = test_images / 255.0

    for i in range(5):
        for train_image, train_label in zip(train_images, train_labels):
            inputs = train_image.reshape((1, 28 * 28))
            targets = [0] * 10
            targets[train_label] = 1
            bp.train(inputs, targets)
        print('training complete!')
    cnt = 0
    acc = 0
    for test_image, test_label in zip(test_images, test_labels):
        cnt += 1
        inputs = test_image.reshape((1, 28*28))
        result = bp.query(inputs)
        if np.argmax(result) == test_label:
            acc += 1
    print(acc*100.0/cnt)
    bp.dump()


if __name__ == '__main__':
    main()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末燃异,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子继蜡,更是在濱河造成了極大的恐慌回俐,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稀并,死亡現(xiàn)場離奇詭異仅颇,居然都是意外死亡,警方通過查閱死者的電腦和手機碘举,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門忘瓦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人引颈,你說我怎么就攤上這事耕皮【惩桑” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵凌停,是天一觀的道長粱年。 經(jīng)常有香客問我,道長罚拟,這世上最難降的妖魔是什么台诗? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮赐俗,結(jié)果婚禮上拉队,老公的妹妹穿的比我還像新娘。我一直安慰自己阻逮,他們只是感情好粱快,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著夺鲜,像睡著了一般皆尔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上币励,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天慷蠕,我揣著相機與錄音,去河邊找鬼食呻。 笑死流炕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仅胞。 我是一名探鬼主播每辟,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼干旧!你這毒婦竟也來了渠欺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤椎眯,失蹤者是張志新(化名)和其女友劉穎挠将,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體编整,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡舔稀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了掌测。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片内贮。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出夜郁,到底是詐尸還是另有隱情什燕,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布拂酣,位于F島的核電站秋冰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏婶熬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一埃撵、第九天 我趴在偏房一處隱蔽的房頂上張望赵颅。 院中可真熱鬧,春花似錦暂刘、人聲如沸饺谬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽募寨。三九已至,卻和暖如春森缠,著一層夾襖步出監(jiān)牢的瞬間拔鹰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工贵涵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留列肢,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓宾茂,卻偏偏與公主長得像瓷马,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子跨晴,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容