1. 程式人生 > >包含啟用函式的多層神經元網路及matlab實現

包含啟用函式的多層神經元網路及matlab實現

1.     兩層神經網路結構

雙輸入單輸出的兩層神經網路結果如下圖所示。其中括號中表示實際的權值、輸出值、閾值等神經網路的引數,括號外的變量表示估計的權值、輸出值、閾值等值。

具體的公式推導可參考周志華的《機器學習》清華大學出版社第5.3節的內容。

對於最後的代價函式的顯示,可以用log函式來對其進行處理,以便能觀察當代價函式的值很小時的變化趨勢。

如果學習速率太大,則神經網可能會發散,如果學習速率太小,則神經網路收斂會很慢。因此,學習速率需要取一個比較合適的值。

有一點要特別注意,神經網路權值的更新必須在所有權值和閾值更新量計算完成後再實施。因為部分神經網路權值和閾值的更新過程中會用到其它部分的神經網的權值和閾值,如果不等全部更新值算出來就進行更新,那麼就會導致權值更新的不同步;部分權值的第

i步的更新量可能是基於其它部分權值的第i-1步的值而獲得的;實際上,部分權值的第i步的更新量應該是基於其它部分權值的第i步的值而獲得的;這樣會導致系統的穩定和魯棒性變差。對於輸入資料和真實權值的接受範圍變小。

 

其中權值和閾值的範圍直接影響網路是否能收斂。如果權值和閾值的值偏大或偏小,都可能導致網路的cost函式停留在一個比較大的值,比如0.21

2.     兩層神經網路梯度下降公式推導

兩層神經網路的輸出層包含一個神經元,這個神經元不包含啟用函式。隱層包含兩個神經元,這兩個神經元包含sigmoid啟用函式。

(1).  前向計算過程

上式中,表示各種權值;a表示隱層第一個神經元的編號;

b表示隱層第二個神經元的編號;s表示這個神經元是輸出神經元。其偏置值對應θs0表示隱層第一個神經元的輸出,也是輸出層神經元的第一個輸入;表示隱層第二個神經元的輸出,也是輸出層神經元的第二個輸入。

(2).  反向誤差傳播過程

    (x1,y1),(x2,y2),(xi,yi),…(xt,yt)是真實的輸入輸出資料。反向誤差傳播的主要目標是,當神經網路的輸入值是x1,x2,xi,…xt時,使得神經網路的輸出值無線逼近輸出資料y1,y2,yi,…yt。因此,定義損失函式如下。

損失函式的(cost Function)的內部構造如下面公式所述:

           (4

誤差反向傳播主要用於減少權值和閾值的誤差,將它們調整至期望的範圍。調整方法主要是在原權值和閾值的基礎上減去一個調整量。這個調整量就是根據梯度下降演算法計算所獲得的損失函式對於權值和閾值的偏導數與學習速率的乘積。

            

上式中r代表所有閾值或權值的下標,r可以包含多個值,比如對於輸出層而言,r的值為s0,s1,s2,對應(f12)

輸出層的神經元的閾值和權值的偏導數如下所示:

                 隱層的第一個神經元(a)的閾值和權值的偏導數如下所示:

                   

隱層的第二個神經元(b)的閾值和權值的偏導數如下所示:

    

3.     Matlab實現不帶啟用函式的兩層神經元網路功能

clear all

clc

close all

pa0=6; pa1=6.7; pa2=0.2;

pb0=13; pb1=0.5; pb2=1.1;

s0=1.2; s1=1.6; s2=0.7;

x1=[7 9 12 5 4 9 23  5];

x2=[1 8 21 3 5 8  3 31];

x1_mean=mean(x1)

x1_max=max(x1)

x1_min=min(x1)

x2_mean=mean(x2)

x2_max=max(x2)

x2_min=min(x2)

x1=(x1-x1_mean)/(x1_max-x1_min)

x2=(x2-x2_mean)/(x2_max-x2_min)

ya=pa0+pa1*x1+pa2*x2;

yb=pb0+pb1*x1+pb2*x2;

ys=s0+s1*ya+s2*yb;

num_sample=size(ys,2);

% gradient descending process

% initial values of parameters

thetaa0=9/100; thetaa1=3/100; thetaa2=9/100;

thetab0=4/100; thetab1=2/100; thetab2=1/100;

thetas0=1/100; thetas1=3/100; thetas2=2/1000;

%learning rate

alpha=0.0001; % good for the system

epoch=8200;

for k=1:epoch

%    v_k=k

if k<=3000

       alpha=0.01;

elseif k<=6000

       alpha=0.01;

else

       alpha=0.001;

end

  ha_theta_x=thetaa0+thetaa1*x1+thetaa2*x2;  % hypothesis function

  hb_theta_x=thetab0+thetab1*x1+thetab2*x2;  % hypothesis function

  hs_theta_x=thetas0+thetas1*ha_theta_x+thetas2*hb_theta_x; % hypothesis function

  Jcosts(k)=sum((hs_theta_x-ys).^2)/num_sample; 

  rs0=sum(hs_theta_x-ys);              thetas0=thetas0-alpha*rs0/num_sample;

  rs1=sum((hs_theta_x-ys).*ha_theta_x);   thetas1=thetas1-alpha*rs1/num_sample;

  rs2=sum((hs_theta_x-ys).*hb_theta_x);   thetas2=thetas2-alpha*rs2/num_sample; 

  ra0=sum((hs_theta_x-ys).*thetas1);    thetaa0=thetaa0-alpha*ra0/num_sample;

  ra1=sum(((hs_theta_x-ys).*thetas1).*x1);thetaa1=thetaa1-alpha*ra1/num_sample;

  ra2=sum(((hs_theta_x-ys).*thetas1).*x2);thetaa2=thetaa2-alpha*ra2/num_sample; 

  rb0=sum((hs_theta_x-ys).*thetas2);    thetab0=thetab0-alpha*rb0/num_sample;

  rb1=sum(((hs_theta_x-ys).*thetas2).*x1);thetab1=thetab1-alpha*rb1/num_sample;

   rb2=sum(((hs_theta_x-ys).*thetas2).*x2);thetab2=thetab2-alpha*rb2/num_sample;  

end

yst=thetas0+thetas1*ha_theta_x+thetas2*hb_theta_x;

v_yst=yst

v_ys=ys

figure

v_Jcosts=Jcosts(k)

plot(log(Jcosts))

v_Jcosts =1.8144e-28

4.     Matlab實現帶sigmoid啟用函式的兩層神經元網路功能

% hidden layer neurons use the activation function

clear all

clc

close all

pa0=0.06; pa1=0.07; pa2=0.02;

pb0=0.03; pb1=0.05; pb2=0.1;

s0=0.02; s1=0.06; s2=0.07;

x1=[7 9 12 5 4 9 23  5];

x2=[1 8 21 3 5 8  3 31];

x1_mean=mean(x1)

x1_max=max(x1)

x1_min=min(x1)

x2_mean=mean(x2)

x2_max=max(x2)

x2_min=min(x2)

x1=(x1-x1_mean)/(x1_max-x1_min)

x2=(x2-x2_mean)/(x2_max-x2_min)

ya=pa0+pa1*x1+pa2*x2; ya_h=1./(1+exp(-ya));

yb=pb0+pb1*x1+pb2*x2; yb_h=1./(1+exp(-yb));

ys=s0+s1*ya_h+s2*yb_h;

num_sample=size(ys,2);

% gradient descending process

% initial values of parameters

thetaa0=9/100; thetaa1=3/100; thetaa2=9/100;

thetab0=4/100; thetab1=2/100; thetab2=1/100;

thetas0=1/100; thetas1=3/100; thetas2=2/1000;

%learning rate

alpha=0.001; % good for the system

epoch=7900;

for k=1:epoch

%    v_k=k

   if k<=3000

       alpha=0.001;

   elseif k<=4000

       alpha=0.0001;

   else

       alpha=0.0001;

    end

  ha_theta_x=thetaa0+thetaa1*x1+thetaa2*x2;ha_out=1./(1+exp(-ha_theta_x));

  hb_theta_x=thetab0+thetab1*x1+thetab2*x2;hb_out=1./(1+exp(-hb_theta_x));

  hs_theta_x=thetas0+thetas1*ha_out+thetas2*hb_out;  % hypothesisfunction

  Jcosts(k)=sum((hs_theta_x-ys).^2)/num_sample; 

  rs0=sum(hs_theta_x-ys);              

   rs1=sum((hs_theta_x-ys).*ha_theta_x);   

  rs2=sum((hs_theta_x-ys).*hb_theta_x);     

  dha_out=ha_out.*(1-ha_out);

  ra0=sum(((hs_theta_x-ys).*thetas1).*dha_out);    

  ra1=sum((((hs_theta_x-ys).*thetas1).*dha_out).*x1);  

ra2=sum((((hs_theta_x-ys).*thetas1).*dha_out).*x2);

  dhb_out=hb_out.*(1-hb_out);

  rb0=sum(((hs_theta_x-ys).*thetas2).*dhb_out);     

  rb1=sum((((hs_theta_x-ys).*thetas2).*dhb_out).*x1);

  rb2=sum((((hs_theta_x-ys).*thetas2).*dhb_out).*x2);

thetas0=thetas0-alpha*rs0/num_sample;

thetas1=thetas1-alpha*rs1/num_sample;

thetas2=thetas2-alpha*rs2/num_sample;

thetaa0=thetaa0-alpha*ra0/num_sample;

thetaa1=thetaa1-alpha*ra1/num_sample;

thetaa2=thetaa2-alpha*ra2/num_sample;

thetab0=thetab0-alpha*rb0/num_sample;

thetab1=thetab1-alpha*rb1/num_sample;

thetab2=thetab2-alpha*rb2/num_sample;

end

yst=thetas0+thetas1*ha_out+thetas2*hb_out;

v_yst=yst

v_ys=ys

figure

v_Jcosts=Jcosts(k)

plot(log(Jcosts))

v_Jcosts =2.3851e-06

5.     Matlab實現帶sigmoid啟用函式的兩層神經元網路功能2

v_Jcosts =7.2385877e-28

% hidden layer neuronsuse the activation function

% update action isperformed after all update values are obtained.

% the above item is veryimportant. because if the update action is

% performed before allupdate values are obtained, the update action may

% use the new updatevalues to update former weights or biases. the newwork

% may be unstable.

clear all

clc

close all

% pa0=2.06; pa1=3.7;pa2=0.02;

% pb0=0.3; pb1=1.5;pb2=0.1;

% s0=0.2; s1=1.6; s2=2.7;

pa0=0.6; pa1=11; pa2=0.2;

pb0=3; pb1=0.5; pb2=8.1;

s0=1.2; s1=5.6; s2=0.7;

% x1=[1 9 12 5 6 8];

% x2=[0 8  4 -9 7 2];

x1=[1 -9 12  -5 6];

x2=[0 8  4 -9 7];

x1_mean=mean(x1);

x1_max=max(x1);

x1_min=min(x1);

x2_mean=mean(x2);

x2_max=max(x2);

x2_min=min(x2);

x1=(x1-x1_mean)/(x1_max-x1_min);

x2=(x2-x2_mean)/(x2_max-x2_min);

% ya=pa0+pa1*x1+pa2*x2;ya_h=1./(1+exp(-ya));

% yb=pb0+pb1*x1+pb2*x2;yb_h=1./(1+exp(-yb));

% ys=s0+s1*ya_h+s2*yb_h;

ya=pa0+pa1*x1.*x1+pa2*x2;ya_h=1./(1+exp(-ya));

yb=pb0+pb1*x1+pb2*x2.*x2;yb_h=1./(1+exp(-yb));

ys=s0+s1*ya_h+s2*yb_h

num_sample=size(ys,2);

% gradient descendingprocess

% initial values ofparameters

thetaa0=9/100; thetaa1=3/100;thetaa2=9/100;

thetab0=4/100; thetab1=2/100;thetab2=1/100;

thetas0=1/100; thetas1=3/100;thetas2=2/1000;

%learning rate

alpha=0.1; % good for the system

epoch=68900;

for k=1:epoch

   v_k=k

if k<=3000

       alpha=0.9;

elseif k<=9000

       alpha=0.09;

elseif k<=30000

       alpha=0.09;

else

       alpha=0.009;

end

   ha_theta_x=thetaa0+thetaa1*x1+thetaa2*x2;ha_out=1./(1+exp(-ha_theta_x));

   hb_theta_x=thetab0+thetab1*x1+thetab2*x2;hb_out=1./(1+exp(-hb_theta_x));

  hs_theta_x=thetas0+thetas1*ha_out+thetas2*hb_out; %hypothesis function

   v_hs_theta_x=hs_theta_x;

  Jcosts(k)=sum((hs_theta_x-ys).^2)/num_sample; 

   rs0=sum(hs_theta_x-ys);             

   rs1=sum((hs_theta_x-ys).*ha_out);   

   rs2=sum((hs_theta_x-ys).*hb_out);   

%    rs1=sum((hs_theta_x-ys).*ha_theta_x);    thetas1=thetas1-alpha*rs1/num_sample;

%    rs2=sum((hs_theta_x-ys).*hb_theta_x);    thetas2=thetas2-alpha*rs2/num_sample; 

   dha_out=ha_out.*(1-ha_out);

  ra0=sum(((hs_theta_x-ys).*thetas1).*dha_out);      

   ra1=sum((((hs_theta_x-ys).*thetas1).*dha_out).*x1);

  ra2=sum((((hs_theta_x-ys).*thetas1).*dha_out).*x2);

   dhb_out=hb_out.*(1-hb_out);

  rb0=sum(((hs_theta_x-ys).*thetas2).*dhb_out);     

  rb1=sum((((hs_theta_x-ys).*thetas2).*dhb_out).*x1);

  rb2=sum((((hs_theta_x-ys).*thetas2).*dhb_out).*x2);  

%update of the weight and threshold

   thetas0=thetas0-alpha*rs0/num_sample;

   thetas1=thetas1-alpha*rs1/num_sample;

   thetas2=thetas2-alpha*rs2/num_sample; 

   thetaa0=thetaa0-alpha*ra0/num_sample;

   thetaa1=thetaa1-alpha*ra1/num_sample;

   thetaa2=thetaa2-alpha*ra2/num_sample; 

   thetab0=thetab0-alpha*rb0/num_sample;

   thetab1=thetab1-alpha*rb1/num_sample;

   thetab2=thetab2-alpha*rb2/num_sample;

end

yst=thetas0+thetas1*ha_out+thetas2*hb_out;

v_yst=yst

v_ys=ys

figure

v_Jcosts=Jcosts(k)

plot(log(Jcosts))

相關推薦

包含啟用函式神經元網路matlab實現

1.     兩層神經網路結構 雙輸入單輸出的兩層神經網路結果如下圖所示。其中括號中表示實際的權值、輸出值、閾值等神經網路的引數,括號外的變量表示估計的權值、輸出值、閾值等值。 具體的公式推導可參考周志華的《機器學習》清華大學出版社第5.3節的內容。 對於最後的代價函式的顯

bp神經網路matlab實現

%讀取訓練資料 [f1,f2,f3,f4,class] = textread('trainData.txt' , '%f%f%f%f%f',150); %特徵值歸一化 [input,minI,maxI] = premnmx( [f1 , f2 , f3 , f4 ]') ;%構造輸出矩陣 s = leng

激勵函式簡介 Tensorflow最簡單的三神經網路matplotlib視覺化 附激勵函式常見型別

激勵函式: 有人說翻譯成“啟用函式”(activation function)會更好,因為主要作用是分割資料,判斷該“神經”是否被啟用。比如說,當你判斷面前的動物是否是一隻貓的時候,你會從各個部分去判斷。比如眼睛,當你覺得確實像貓的眼睛時,判斷眼睛的神經數值會特別高,如果覺

Python之路Python全域性變數與區域性變數、函式巢狀、函式遞迴 Python之路Python全域性變數與區域性變數、函式巢狀、函式遞迴

Python之路Python全域性變數與區域性變數、函式多層巢狀、函式遞迴 一、區域性變數與全域性變數   1、在子程式中定義的變數稱為區域性變數,在程式的一開始定義的變數稱為全域性變數。全域性變數作用域是整個程式,區域性變數作用域是定義該變數的子程式。 全域性變數

人工智慧(4)- 實現神經網路

1.單層神經網路 2.多層神經網路 3.MLP的3個步驟 MLP learning procedure in three simple steps: Starting at the input layer, we forward propagate the patt

六天搞懂“深度學習”之三:神經網路

為了克服單層神經網路只能解決線性可分問題的侷限性,神經網路進化為多層結構。然而,花費了將近30年的時間,才將隱藏層新增到單層神經網路中。很難理解為什麼花費了這麼長時間,其中的主要問題是學習規則。 單層神經網路中的增量規則對於多層神經網路的訓練是無效的,這是因為訓練中在隱藏層產生的誤差並沒

長短期記憶(LSTM)系列_LSTM的建模方法(2)——如何堆疊LSTM網路

導讀: 堆疊式LSTM屬於深度學習,通過新增網路的深度,提高訓練的效率,獲得更高的準確性。 文中介紹了堆疊式LSTM的架構和實現方法 在堆疊式LSTM中,層與層的輸數出通過return_sequences = True引數修改成3D資料,以便供下一層網路使用。 為什麼要增加深度?

TensorFlow 訓練 MNIST (2)—— 神經網路

  在我的上一篇隨筆中,採用了單層神經網路來對MNIST進行訓練,在測試集中只有約90%的正確率。這次換一種神經網路(多層神經網路)來進行訓練和測試。 1、獲取MNIST資料   MNIST資料集只要一行程式碼就可以獲取的到,非常方便。關於MNIST的基本資訊可以參考我的上一篇隨筆。 mnist = i

企業網三架構的搭建--Cisco交換網路

網路拓撲圖:   配置要求: 1、R1為ISP 2、紅圈標記介面為3層介面 3、內網地址為172.16.0.0/16 4、HSRP或VRRP、STP、VLAN、 DTP、TRUNK、VTP均使用 5、控制路由表條目數量 6、全網可達 PC DHCP

深度學習-基於spark的神經網路

最後我們再寫3篇基於spark的深度學習,這篇是手寫識別的,用的是spark的local模式,如果想用叢集模式在submit的時候設定-useSparkLocal false,或者在程式中設定useSparkLocal=false,程式碼如下 public class M

[手把手系列之二]實現神經網路

完整程式碼:>>點我 歡迎star,fork,一起學習 網路用途 或者說應用場景:使用單層神經網路來識別一張圖片是否是貓咪的圖片。 數學表示 給定一張圖片XX 送到網路中,判斷這張圖片是否是貓咪的照片? 網路架構 多層

BCMSN---組建CISCO交換網路

組建CISCO多層交換網路: 拓撲要求: R2為ISP,只可以配置IP地址; 使用VTP使得PC0/PC1/PC2/PC3均屬於不同vlan(vlan 2/3),其他介面均為vlan999; 匯聚層使用快速生成樹或者多生成樹; SW1-SW2-SW3-SW4

深度學習實踐(二)——神經網路

#一、準備 為了更深入的理解神經網路,筆者基本採用純C++的手寫方式實現,其中矩陣方面的運算則呼叫opencv,資料集則來自公開資料集a1a。 實驗環境: Visual studio 2017 opencv3.2.0 a1a資料集 本文緊跟上篇文章深度

TensorFlow實戰4:實現簡單的神經網路案例

這篇文章記錄一下使用TensorFlow實現卷積神經網路的過程,資料集採用的還是MNIST資料集,使用了兩層的卷積來進行計算,整個過程在jupyter notebook中完成,具體步驟和程式碼展示如下: 1.環境設定 import numpy as np

每日學點python之九(神奇的函式)----個返回值不定長引數

今天學習python的函式,發現它與c/c++有很大的區別,感覺很不可思議。 1.函式返回多個值 In [3]: def divid(a,b): ...: result=a//b ...: remain=a%b ...: return resul

神經網路感知機MLP的實現(Python+TensorFlow)

用 MLP 實現簡單的MNIST資料集識別。 # -*- coding:utf-8 -*- # # MLP """ MNIST classifier, 多層感知機實現 """ # Import

跟著吳恩達學深度學習:用Scala實現神經網路-第二課:用Scala實現神經網路

上一章我們講了如何使用Scala實現LogisticRegression,這一張跟隨著吳恩達的腳步我們用Scala實現基礎的深度神經網路。順便再提一下,吳恩達對於深度神經網路的解釋是我如今聽過的最清楚的課,感嘆一句果然越是大牛知識解釋得越清晰明瞭。 本文分為以下四個部分。

tensorflow例項(7)--建立神經網路

本文將建立多層神經網路的函式,這個函式是一個簡單的通用函式,通過最後的測試,可以建立一些多次方程的模型,並通過matplotlib.pyplot演示模型建立過程中的資料變化情況以下三張圖片是生成的效果,每張圖的藍點都表示為樣本值,紅點表示最終預測效果,本例帶有點動畫效果,可以

Tensorlayer學習筆記——神經網路

一、簡單粗暴,先看程式碼 import tensorflow as tf import tensorlayer as tl sess = tf.InteractiveSession() # 匯入資料 X_train, y_train, X_val, y_val, X_t

深度學習DeepLearning.ai系列課程學習總結:8. 神經網路程式碼實戰

轉載過程中,圖片丟失,程式碼顯示錯亂。 為了更好的學習內容,請訪問原創版本: http://www.missshi.cn/api/view/blog/59ac0136e519f50d040001a7 Ps:初次訪問由於js檔案較大,請耐心等候(8s左