1. 程式人生 > >python實現人工神經網路的一個例子

python實現人工神經網路的一個例子

人工神經網路已經有無數的開源框架,比如tensorflow,caffe等,可以直接用。但最近需要做一個小樣例,把基本思想講一講,因此自己寫了一個demo,以供參考。

 

下面直接上程式碼,程式碼中有註釋,比較容易理解

ANN.py

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

import numpy
import random

class ANN:
    # layers為列表,其長度給出層數,包括輸入和輸出層,每個元素給出每層神經元數量
    # 例如[3, 5, 2]代表輸入引數為3,中間隱藏層有5個神經元,輸出2個結果的神經網路
    def __init__(self, layers):
        self.num_layers = len(layers)
        self.sizes = layers
        self._biases = [numpy.random.randn(y, 1) for y in layers[1:]]
        self._weights = [numpy.random.randn(y, x) for x, y in zip(layers[:-1], layers[1:])]
        
    def _sigmoid(self, z):
        return 1.0/(1.0 + numpy.exp(-z))
        
    # sigmoid函式的導數
    def _Dsigmoid(self, z):
        return self._sigmoid(z)*(1-self._sigmoid(z))
        
    # 計算輸出向量
    def calc(self, input):
        for b, w in zip(self._biases, self._weights):
            input = self._sigmoid(numpy.dot(w, input) + b)
        return input

    # 訓練神經網路
    # trainData: 訓練集
    # epochs:    訓練輪數,對trainData訓練多少輪
    # size:      訓練子集的大小
    # rate:      learning rate,學習速率,步長
    # testData:  測試集    
    def train(self, trainData, epochs, size, rate, testData=None):
        if testData: 
            n_test = len(testData)
        n = len(trainData)
        for j in range(epochs):
            random.shuffle(trainData)
            mini_batches = [trainData[k:k+size] for k in range(0, n, size)]
            for mini_bat in mini_batches:
                self._update(mini_bat, rate)
            if testData:
                error = self.test(testData)
                if (j % (epochs/10) == 0):
                    print("Epoch {0}: error = {1}".format(j, error))
            else:
                if (j % (epochs/10) == 0):
                    print("Epoch {0} complete.".format(j))
                
    def _update(self, mini_batch, rate):
        nabla_b = [numpy.zeros(b.shape) for b in self._biases]
        nabla_w = [numpy.zeros(w.shape) for w in self._weights]
        for x, y in mini_batch:
            delta_b, delta_w = self._backpropagation(x, y)
            nabla_b = [nb + db for nb, db in zip(nabla_b, delta_b)]
            nabla_w = [nw + dw for nw, dw in zip(nabla_w, delta_w)]
        self._weights = [w - (rate/len(mini_batch))*nw for w, nw in zip(self._weights, nabla_w)]
        self._biases = [b - (rate/len(mini_batch))*nb for b, nb in zip(self._biases, nabla_b)]
        
    # 後向傳播演算法
    def _backpropagation(self, x, y):
        nabla_b = [numpy.zeros(b.shape) for b in self._biases]
        nabla_w = [numpy.zeros(w.shape) for w in self._weights]
        # forward
        activation = x
        activations = [x]
        zs = []
        for b, w in zip(self._biases, self._weights):
            z = numpy.dot(w, activation) + b
            zs.append(z)
            activation = self._sigmoid(z)
            activations.append(activation)
        # backward
        delta = self._derivative(activations[-1], y) * self._Dsigmoid(zs[-1])
        nabla_b[-1] = delta
        nabla_w[-1] = numpy.dot(delta, activations[-2].transpose())
        for layer in range(2, self.num_layers):
            z = zs[-layer]
            sp = self._Dsigmoid(z)
            delta = numpy.dot(self._weights[-layer+1].transpose(), delta) * sp
            nabla_b[-layer] = delta
            nabla_w[-layer] = numpy.dot(delta, activations[-layer-1].transpose())
        return (nabla_b, nabla_w)
    
    # 計算測試集誤差,注意此時輸出一定為1維向量
    def test(self, testData):
        test_results = [(self.calc(x), self._translate(y)) for (x, y) in testData]
        err = [output - result for (output, result) in test_results]
        return sum(numpy.dot(ei.transpose(), ei) for ei in err)
    
    # 如有必要,將結果進行編碼,便於和神經網路輸出結果相比較
    # 比如經典的手寫識別,就需要把數字y轉化為向量
    def _translate(self, y):
        return y
        
    # 整個神經網路的導數
    def _derivative(self, output, y):
        return output - y

可以看到,得益於numpy的矩陣運算,程式碼非常簡單。

 

下面是測試,使用上面的程式碼擬合and函式

test.py

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

import ANN

layers = [2, 2, 2]
input = numpy.array([[0,0],[0,1],[1,0],[1,1]])
out = numpy.array([[1,0],[1,0],[1,0],[0,1]])

inputs = [numpy.reshape(i, (2,1)) for i in input]
outputs = [numpy.reshape(o, (2,1)) for o in out]

data = [(inputs[i], outputs[i]) for i in range(len(inputs))]
net = ANN.ANN(layers)
net.train(data, 50000, len(inputs), 0.1, data)
for i in range(len(inputs)):
    print(inputs[i].T, ": ", net.calc(inputs[i]).T)

可以看到,構造了一個2x2x2的神經網路,輸入為2位,輸出為2位,中間層也為2個神經元,即可通過訓練獲得相應的and函式。需要注意的是numpy構造的向量必須和ANN.py中風格一致(如果第一個指標代表行,第二個指標代表列,則輸入輸出均必須為列向量)。計算結果如下:

相關推薦

python實現人工神經網路一個例子

人工神經網路已經有無數的開源框架,比如tensorflow,caffe等,可以直接用。但最近需要做一個小樣例,把基本思想講一講,因

Python人工神經網路(1)——開一個新坑

《教女朋友學Python》基礎篇完結之後,有的人的手就開始熱得發燙了,總想用Python搞點大事情。於是我們就來搞點大事,開個新坑《Python與人工神經網路》,作為《教女朋友學Python》的續作,

使用python實現深度神經網路 1

深度學習基本概念 一、實驗介紹 1.1 實驗內容 深度學習並沒有你想象的那麼難,本課程將會一邊講解深度學習中的基本理論,一邊通過動手使用python實現一個簡單的深度神經網路去驗證這些理論,讓你從原理上真正入門深度學習。 本次實驗將會帶大家學習深度學習中的一些最基本的概念,本次實驗很重要,理解這

【深度學習】Python實現簡單神經網路

Python簡單神經網路 環境介紹 定義神經網路的框架 初始化 建立網路節點和連結 簡單均勻分佈隨機初始權重 正態分佈初始權重 編寫查詢函式 階段性測試 編寫訓練函式

使用python實現深度神經網路 3

快速計算梯度的魔法--反向傳播演算法一、實驗介紹1.1 實驗內容第一次實驗最後我們說了,我們已經學習了深度學習中的模型model(神經網路)、衡量模型效能的損失函式和使損失函式減小的學習演算法learn(梯度下降演算法),還了解了訓練資料data的一些概念。但是還沒有解決梯度下降演算法中如何求損失函式梯度的問

PyBrain-Python人工神經網路

python有一個很好用的神經網路庫。雖然sklearn很強大,但是好像對神經網路的支援並不是那麼那好。 1.安裝 安裝很方便,專案是一個開源的,託管在github上。如果你用的也是Anconda平臺,那麼在Anconda Prompt的命令列中敲下 pip install

使用python實現深度神經網路 5

深度學習 一、實驗介紹 1.1 實驗內容 上次實驗我們使用淺層神經網路達到了0.9的驗證集準確率,本次實驗我們將增加神經網路的深度,進行真正的深度學習。 1.2 實驗知識點 梯度消失問題交叉熵損失函式 1.3 實驗環境 python 2.7numpy 1.12.1

python實現LSTM神經網路模型

''' 用tensorflow實現遞迴迴圈網路(LSTM) ''' from __future__ import print_function import tensorflow as tf from tensorflow.contrib import r

機器學習實戰——python實現SOM神經網路聚類演算法

演算法基礎 SOM網路結構 輸入層:假設一個輸入樣本為X=[x1,x2,x3,…,xn],是一個n維向量,則輸入層神經元個數為n個。 輸出層(競爭層):通常輸出層的神經元以矩陣方式排列在二維空間中,每個神經元都有一個權值向量。 假設輸出層有m個神經元,則有m

用純Python實現迴圈神經網路RNN向前傳播過程(吳恩達DeepLearning.ai作業)

Google TensorFlow程式設計師點讚的文章!   前言 目錄:     - 向量表示以及它的維度     - rnn cell     - rnn 向前傳播 &nbs

一個 11 行 Python 程式碼實現神經網路

概要:直接上程式碼是最有效的學習方式。這篇教程通過由一段簡短的 python 程式碼實現的非常簡單的例項來講解 BP 反向傳播演算法。 程式碼如下: Python 1234567891011X=np.array([

人工神經網路——反向傳播演算法(BP)以及Python實現

人工神經網路是模擬生物神經系統的。神經元之間是通過軸突、樹突互相連線的,神經元收到刺激時,神經脈衝在神經元之間傳播,同時反覆的脈衝刺激,使得神經元之間的聯絡加強。受此啟發,人工神經網路中神經元之間的聯絡(權值)也是通過反覆的資料資訊"刺激"而得到調整的。而反向傳

Python基於K-均值、RLS演算法實現RBF神經網路神經網路與機器學習 第五章 計算機實驗)

1、生成資料集 class moon_data_class(object): def __init__(self,N,d,r,w): self.N=N self.w=w self.d=d self.r=r

python人工神經網路

人工神經網路在模組keras中,實現步驟如下: #bp人工神經網路的實現 #1、讀取資料 #2、匯入對應模組,keras.models  Sequential(建立模型)  |keras.layers.core Dense(建立層)  Activation

用 Keras 編寫你的第一個人工神經網路Python)—— Jinkey 翻譯

譯者:Jinkey(微信公眾號 jinkey-love)英文原版地址:點選跳轉 教程概述 這裡不需要編寫太多的程式碼,不過我們將一步步慢慢地告訴你怎麼以後怎麼建立自己的模型。 教程將會涵蓋以下步驟: 載入資料定義模型編譯模型訓練模型評估模型結合所有步驟在一起這個教程的前

用BP人工神經網路識別手寫數字——《Python也可以》之三

這是我讀工程碩士的時候完成課程作業時做的,放在 dropbox 的角落中生塵已經有若干年頭了,最近 @shugelee 同學突然來了興致搞驗證碼識別,問到我的時候我記起自己做過一點點東西,特發上來給他參考,並趁機補充了一下《Python也可以》系列。影象預處理使用下圖(後方稱

python手寫神經網路實現識別手寫數字

實驗說明 一直想自己寫一個神經網路來實現手寫數字的識別,而不是套用別人的框架。恰巧前幾天,有幸從同學那拿到5000張已經貼好標籤的手寫數字圖片,於是我就嘗試用matlab寫一個網路。 實驗資料:5000張手寫數字圖片(.jpg),圖片命名為

機器學習實驗---人工神經網路MLP基於sklearn的實現

導語 上次寫了隨機森林的基於sklearn庫的大致實現步驟,這次我們來看看人工神經網路的實現步驟吧~ MLP就是多層感知器的意思,我們這裡也是通過引入MLPClassifier來實現的。 步驟詳解: 首先從sklearn中匯入MLPC 匯入待訓練的資料

基於BP人工神經網路的數字字元識別及MATLAB實現

應用背景:在模式識別中,有一種高實用性的分類方法,就是人工神經網路,它被成功應用於智慧機器人、自動控制、語音識別、預測估計、生物、醫學、經濟等領域,解決了許多其他分類方法難以解決的實際問題。這得益於神經網路的模型比較多,可針對不同的問題使用相應的神經網路模型,這裡使用BP神