日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

神经网络(补充)(第五章)

發布時間:2024/1/23 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 神经网络(补充)(第五章) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 神經網絡(補充)(第五章)
    • 感知機
    • 與門
    • 與非門
    • 或門
    • 感知機的局限:異或門
    • 神經網絡開始
    • 激活函數引入
    • 階躍函數
    • sigmoid函數
    • sigmoid函數與階躍函數的比較
    • Relu函數
    • 三層神經網絡的實現
    • 代碼總結
    • 輸出層的激活函數softmax

神經網絡(補充)(第五章)

感知機

感知機是神經網絡(深度學習)的起源算法,所以我們從感知機起步,進入深度學習的世界。
主要使用的Python庫:

  • 感知機接收多個輸入信號,輸出一個信號

  • 水流向前流動,向前方輸送水

  • 電流向前流動,向前方輸送電子

  • 感知機的信號也會向前流動,向前方輸送信息

  • 不同的是,感知機的信號只有“流”和“不流”兩種情況,如分別用1和0表示
    示意圖如下:


與門

與門(AND gate)的真值表如下:

x1x2y
000
100
010
111

思考:如何用感知機實現與門呢?什么樣的權重與閾值是合適的呢?

代碼實現:

def AND(x1,x2):w1,w2,theta = 0.5,0.5,0.7tmp = x1*w1 + x2*w2if tmp <= theta:return 0elif tmp > theta:return 1



使用numpy:

import numpy as npdef AND(x1,x2):x = np.array([x1,x2])w = np.array([0.5,0.5])b = -0.7tmp = np.sum(w*x) + bif tmp <= 0:return 0else:return 1

與非門

與非門(NAND gate)顛倒了與門的輸出,起英文NAND就是Not AND 的
其真值表如下所示:

x1x2y
001
101
011
110

只要把與門的符號取反,即可實現與非門

import numpy as npdef NAND(x1,x2):x = np.array([x1,x2])w = np.array([-0.5,-0.5])b = 0.7tmp = np.sum(w*x) + bif tmp <= 0:return 0else:return 1

或門

其真值表如下:

x1x2y
000
101
011
111

import numpy as npdef OR(x1,x2):x = np.array([x1,x2])w = np.array([0.5,0.5])b = -0.2tmp = np.sum(w*x) + bif tmp <= 0:return 0else:return 1

感知機的局限:異或門

到這里,我們已經知道,使用感知機可以實現與門、與非門、或門三中邏輯電路
現在我們來思考一下異或門(XOR gate)
異或門的真值表如下:

x1x2y
000
101
011
110


下面我們用多層感知機來實現異或門:

總結:先得到與非門和或門,最后用與門即可得到異或門的輸出。


異或門代碼:(調用上方已有的方法)

def XOR(x1,x2):s1 = NAND(x1,x2) #與非門s2 = OR(x1,x2) #或門y = AND(s1,s2) #與門return y

好了,感知機已經基本上理解,接下來神經網絡開始!

神經網絡開始



激活函數引入



階躍函數


階躍函數代碼實現:

def step_function(x):if x > 0:return 1else:return 0


修改后的代碼:

import numpy as npdef step_function2(x):y = x > 0return y.astype(np.int)

調用:

import numpy as npx = np.array([-1.0,1.0,2.0]) x array([-1.0,1.0,2.0]) y = x > 0 y array([False,True,True]) y_int = y.astype(np.int) y_int array([0,1,1])#調用: step_function2(x) array([0,1,1])

看一下階躍函數的圖像:

import numpy as np import matplotlib.pylab as pltdef step_function(x):y = x > 0return y.astype(np.int)x = np.arange(-5.0,5.0,0.1) #x的取值[-5,5),精度0.1,你可以自己查看x是什么 y = step_function(x) plt.plot(x,y) plt.ylim(-0.1,1.1) #指定y軸的范圍 plt.show()


如果將激活函數從階躍函數切換成其他函數,就可以進入神經網絡的世界了!

sigmoid函數


sigmoid函數的實現:

import numpy as npdef sigmoid(x):return 1/(1 + np.exp(-x))

測試能不能適用于數組:

import numpy as np x = np.array([-1.0,1.0,2.0]) print(x) sigmoid(x)#輸出: [-1.,1.,2.] array([0.26894142,0.73105858,0.88079708])


sigmoid函數的圖像:

import numpy as np import matplotlib.pylab as pltx = np.arange(-5.0,5.0,0.1) y1 = sigmoid(x)plt.plot(x,y1) plt.ylim(-0.1,1.1) plt.show()

sigmoid函數與階躍函數的比較


代碼示例:

import numpy as np import matplotlib.pylab as pltdef sigmoid(x):return 1/(1 + np.exp(-x))def step_function(x):return np.array(x > 0,dtype=np.int)x = np.arange(-5.0,5.0,0.1) y1 = sigmoid(x) y2 = step_function(x)plt.plot(x,y1) plt.plot(x,y2,'k--') plt.ylim(-0.1,1.1) plt.show()


Relu函數


relu函數的實現:

def relu(x):return np.maximum(0,x)

relu函數的圖像:

x = np.arange(-5.0,5.0,0.1) y = relu(x)plt.plot(x,y) plt.ylim(-1,6) plt.show()




三層神經網絡的實現


從第0層到第1層:(即輸入層到第一層)


使用numpy多維數組來實現:

import numpy as np#定義X,W1,B1 X = np.array([1.0,0.5]) W1 = np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]]) B1 = np.array([0.1,0.2,0.3])#查看X,W1,B1的形狀 print(X.shape) print(W1.shape) print(B1.shape)#輸出: (2,) (2,3) (3,)#線性代數,矩陣相乘 np.dot(X,W1) #輸出: array([0.2,0.5,0.8])A1 = np.dot(X,W1) + B1 A1 #輸出: array([0.3,0.7,1.1])def sigmoid(x):return 1/(1 + np.exp(-x))Z1 = sigmoid(A1) Z1 array([0.57444252,0.66818777,0.75026011])

位置如下圖紅坨坨圈起來的部分:

從第1層到第2層:

#定義W2,B2 W2 = np.array([[0.1,0.4],[0.2,0.5],[0.3,0.6]]) B2 = np.array([0.1,0.2])#查看W2,B2的形狀 print(X.shape) print(W1.shape) print(B1.shape)A2 = np.dot(Z1,W2) + B2 Z2 = sigmoid(A2) Z2#輸出: (3,2) (2,) array([0.62624937,0.7710107])

從第2層到第3層:(即第2層到輸出層的信號傳遞)

與之前類似,只不過激活函數有所不同

#定義恒等函數 def identity_function(x):return x#定義W3,B3 W3 = np.array([[0.1,0.3],[0.2,0.4]]) B3 = np.array([0.1,0.2])A3 = np.dot(Z2,W3) + B3 Y = identity_function(A3) Y#輸出: array([0.31682708,69627909])

代碼總結





輸出層的激活函數softmax




代碼實現:

import numpy as np#softmax函數的代碼實現 a = np.array([0.3,2.9,4.0]) exp_a = np.exp(a) #指數函數 print(exp_a) [1.34985881,18.17414537,54.59815003]sum_exp_a = np.sum(exp_a) print(sum_exp_a) [74.1221542101633]y = exp_a/sum_exp_a y array([0.01821127,0.24519181,0.73659691])

將softmaxt整合成一個函數:

def softmax(a):exp_a = np.exp(a)sum_exp_a = np.sum(exp_a)y = exp_a/sum_exp_areturn y





圖片來自另一個博客:https://blog.csdn.net/weixin_44478378/article/details/100569046

重新定義一下函數:

def softmax(a):c = np.max(a) #取出輸入信號的最大值exp_a = np.exp(a - c) #減去這個常數sum_exp_a = np.sum(exp_a)y = exp_a/sum_exp_areturn y






比較一下二分類與多分類:

def sigmoid(x):return 1/(1 + np.exp(-x))#二分類 import numpy as np import matplotlib.pylab as pltx = np.arange(10) e = softmax(x) f = x/np.sum(x) plt.plot(x,e,color='red',marker='o',linestyle='solid') plt.plot(x,f,color='blue',marker='o',linestyle='solid') plt.show()

def softmax(a):c = np.max(a) #取出輸入信號的最大值exp_a = np.exp(a - c) #減去這個常數sum_exp_a = np.sum(exp_a)y = exp_a/sum_exp_areturn y#多分類 import numpy as np import matplotlib.pylab as pltx = np.array([1,2]) y = sigmoid(x) plt.plot(x,y,color='red',marker='o',linestyle='solid') plt.plot(x,x,color='blue',marker='o',linestyle='solid') plt.show()


ok,到這里先結束一下吧,這里補充的比較基礎,是看的b站一學習大佬的深度學習入門視頻做的學習筆記,視頻鏈接如下,感謝大佬的講解:
https://www.bilibili.com/video/BV12t411N748

總結

以上是生活随笔為你收集整理的神经网络(补充)(第五章)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。