1. 程式人生 > >BP神經網路基於Tensorflow的實現(程式碼註釋詳細)

BP神經網路基於Tensorflow的實現(程式碼註釋詳細)

BP(back propagation)神經網路是1986年由Rumelhart和McClelland為首的科學家提出的概念,是一種按照誤差逆向傳播演算法訓練的多層前饋神經網路,是目前應用最廣泛的神經網路。

在一般的BP神經網路中,單個樣本有m個輸入和n個輸出,在輸入層和輸出層之間還有若干個隱藏層h,實際上 1989年時就已經有人證明了一個萬能逼近定理 :

在任何閉區間的連續函式都可以用一個隱藏層的BP神經網路進行任意精度的逼近。

所以說一個三層的神經網路就可以實現一個任意從m維到n維的一個對映,這三層分別是 輸入層、隱藏層、輸出層

一般來說,在BP神經網路中,輸入層和輸出層的節點數目都是固定的,關鍵的就是在於隱藏層數目的選擇,隱藏層數目的選擇決定了神經網路工作的效果。

這裡有一個選擇隱藏層數目的經驗公式:選擇隱藏層數目的經驗公式
- h 隱藏層
- m 輸入層
- n 輸出層
- a 調節常數數(一般介於1~10之間,如果資料多的話我們可以設a稍微大一點,而資料不是太多的時候就設定的小一點防止過擬合。)

BP神經網路的工作原理分為兩個過程 :
1. 工作訊號正向傳遞子過程
2. 誤差訊號逆向傳遞過程

標準BP神經網路的缺陷:
(1)容易形成區域性極小值而得不到全域性最優值。
BP神經網路中極小值比較多,所以很容易陷入區域性極小值,這就要求對初始權值和閥值有要求,要使得初始權值和閥值隨機性足夠好,可以多次隨機來實現。
(2)訓練次數多使得學習效率低,收斂速度慢。
(3)隱含層的選取缺乏理論的指導。
(4)訓練時學習新樣本有遺忘舊樣本的趨勢。
通常BP神經網路在訓練之前會對資料歸一化處理,即將資料
對映到更小的區間內,比如[0,1]或[-1,1]。

下面是基於tensorflow實現的BP神經網路的例子:

import tensorflow as tf 
from  tensorflow.examples.tutorials.mnist  import  input_data
import numpy as np 

mnist = input_data.read_data_sets('./data/', one_hot = True)

num_classes = 10  # 輸出大小
input_size = 784  # 輸入大小
hidden_units_size = 30  # 隱藏層節點數量
batch_size = 100
training_iterations = 10000
X = tf.placeholder(tf.float32, shape = [None, input_size]) Y = tf.placeholder(tf.float32, shape = [None, num_classes]) W1 = tf.Variable(tf.random_normal ([input_size, hidden_units_size], stddev = 0.1)) B1 = tf.Variable(tf.constant (0.1), [hidden_units_size]) W2 = tf.Variable(tf.random_normal ([hidden_units_size, num_classes], stddev = 0.1)) B2 = tf.Variable(tf.constant (0.1), [num_classes]) hidden_opt = tf.matmul(X, W1) + B1 # 輸入層到隱藏層正向傳播 hidden_opt = tf.nn.relu(hidden_opt) # 啟用函式,用於計算節點輸出值 final_opt = tf.matmul(hidden_opt, W2) + B2 # 隱藏層到輸出層正向傳播 # 對輸出層計算交叉熵損失 loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=Y, logits=final_opt)) # 梯度下降演算法,這裡使用了反向傳播演算法用於修改權重,減小損失 opt = tf.train.GradientDescentOptimizer(0.05).minimize(loss) # 初始化變數 init = tf.global_variables_initializer() # 計算準確率 correct_prediction =tf.equal (tf.argmax (Y, 1), tf.argmax(final_opt, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, 'float')) sess = tf.Session () sess.run (init) for i in range (training_iterations) : batch = mnist.train.next_batch (batch_size) batch_input = batch[0] batch_labels = batch[1] # 訓練 training_loss = sess.run ([opt, loss], feed_dict = {X: batch_input, Y: batch_labels}) if i % 1000 == 0 : train_accuracy = accuracy.eval (session = sess, feed_dict = {X: batch_input,Y: batch_labels}) print ("step : %d, training accuracy = %g " % (i, train_accuracy))

目前,在人工神經網路的實際應用中,絕大部分的神經網路模型都採用BP網路及其變化形式。它也是前向網路的核心部分,體現了人工神經網路的精華。
BP網路主要用於以下四個方面。
1)函式逼近:用輸入向量和相應的輸出向量訓練一個網路逼近一個函式。
2)模式識別:用一個待定的輸出向量將它與輸入向量聯絡起來。
3)分類:把輸入向量所定義的合適方式進行分類。
4)資料壓縮:減少輸出向量維數以便於傳輸或儲存。

參考:https://blog.csdn.net/zhelong3205/article/details/78688476
參考:https://www.baidu.com/link?url=QtggY8ZFEMUGhqFBBn6g2ZrzuVYLJx6oXvais1_bBHolMtdgmMhar6EQL26oa7lfQwOYNugBBLyxHP9iAhI0qDvoNdYCtUysRnbvI6r4fIVxg0VL7yzpqeFrEYJlJJrS&wd=&eqid=9a8a614000082d7c000000065b8649d9