1 激活函數(shù):
a.階躍函數(shù) 當(dāng)輸入超過 0 時,輸出 1, 否則輸出 0
b.sigmoid 函數(shù)

這個函數(shù)在后面的代碼中使用很頻繁,用代碼輸出圖形:

c.ReLU(Rectified Linear Unit)函數(shù) max(0,input)
這些函數(shù)的實現(xiàn)都非常簡單,直接ruturn公式;
2 多維數(shù)組的運算
矩陣乘法:.dot(a,b) 對應(yīng)維度的元素個數(shù)要保持一致,同數(shù)學(xué)里矩陣乘法
神經(jīng)網(wǎng)絡(luò)內(nèi)積:Y=WX+B
3 3層神經(jīng)網(wǎng)絡(luò)實現(xiàn)

輸出層函數(shù):
恒等函數(shù):將輸入按原樣輸出,對于輸入的信息,不加以任何改動地直接輸出,加是為了和前面保持結(jié)構(gòu)一致性;
softmax 函數(shù):分子是輸入信號的指數(shù)函數(shù),分母為所有輸入信號的指數(shù)函數(shù)的和;

softmax 函數(shù)的輸出是 0.0 到 1.0 之間的實數(shù)。并且,softmax 函數(shù)的輸出值的總和是 1。輸出總和為 1 是 softmax 函數(shù)的一個重要性質(zhì)。正因為有了這個性質(zhì),我們才可以把 softmax 函數(shù)的輸出解釋為“概率”。即該函數(shù)具有概率的性質(zhì),可以表示概率,一般而言,神經(jīng)網(wǎng)絡(luò)只把輸出值最大的神經(jīng)元所對應(yīng)的類別作為識別結(jié)果。
代碼實現(xiàn)
import numpy as np
def sigmoid(x):#激活函數(shù)
return 1/(1+np.exp(-x))
def identity_function(x):#輸出函數(shù)
return x
def init_network():
network = {}
network['W1'] = np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]])#0-1層權(quán)重
network['b1'] = np.array([0.1,0.2,0.3])#偏置
network['W2'] = np.array([[0.1,0.4],[0.2,0.5],[0.3,0.6]])#1-2層權(quán)重
network['b2'] = np.array([0.1,0.2])
network['W3'] = np.array([[0.1,0.3], [0.2,0.4]])#2-3層權(quán)重
network['b3'] = np.array([0.1,0.2])
return network
def forward(network,x):
W1,W2,W3 = network['W1'],network['W2'],network['W3']
b1,b2,b3 = network['b1'],network['b2'],network['b3']
#a=wx+b 矩陣乘法
a1 = np.dot(x,W1) + b1
z1 = sigmoid(a1)
a2 = np.dot(z1,W2) + b2
z2 = sigmoid(a2)
a3 = np.dot(z2,W3) + b3
y = identity_function(a3)
return y
network = init_network()
x=np.array([1.0,0.5])
y=forward(network,x)
print(y)
D:\software\Anaconda\python.exe D:\workspace_p\study\ch03\test.py
[0.31682708 0.69627909]
Process finished with exit code 0
遇到了幾個問題:1.conda裝過Numpy后pycharm一直顯示無法導(dǎo)入,搜索了一下突然想到或許是每次新建工程時pycharm都需要重新配置解釋器導(dǎo)致的,果然如此,配置方法:file-settings-project:network-python interpreter -修改為conda內(nèi)置的python 就可以了,idea也是這樣,每次都需要重新配置;
2.報錯:Field elements must be 2- or 3-tuples, got '0.2' 是因為多維數(shù)組的寫法不正確,需要在外層在加一個中括號:network['W2'] = np.array([[0.1,0.4],[0.2,0.5],[0.3,0.6]])
手寫數(shù)字識別
從書籍官網(wǎng)下載的代碼在run的時候,發(fā)現(xiàn)導(dǎo)入dataset不成功,解決方法見ModuleNotFoundError: No module named ‘dataset‘--《深度學(xué)習(xí)入門》3.6.1節(jié)錯誤的解決方案_modulenotfounderror: no module named 'datasets_alltimehigh的博客-CSDN博客
運行截圖:

keywords:
load_mnist函數(shù)return的是"(訓(xùn)練圖像,訓(xùn)練標(biāo)簽),(測試圖像,測試標(biāo)簽)"
有三個參數(shù)(均為布爾型):
normalize:是否正規(guī)化,即是否輸出為0-1(浮點型)的值;False 不正規(guī);
flatten:是否展開為一維數(shù)組;False 不做改變;
one_hot_label:是否將標(biāo)簽表示成正確解為1 ,其余為0 的形式; False不改變;
reshape() 可以改變圖像形狀(以像素的形式)
3.6.2 神經(jīng)網(wǎng)絡(luò)的推理處理
run示例代碼neuraint_mnist的時候from common.functions import sigmoid, softmax報錯:解決方法同上,因為我的環(huán)境其實是用的conda的,所以需要把依賴的數(shù)據(jù)和function都放入conda包下;
代碼及結(jié)果:

感覺for循環(huán)里的代碼有點難以理解,逐一輸出就比較清晰了:

預(yù)處理:方法有正規(guī)化,使用均值或者方差再處理數(shù)據(jù),和將數(shù)據(jù)整體分布均勻化的白化方法;
3.6.3 批處理
通過range()的第三個參數(shù)實現(xiàn),會自動實現(xiàn)分批處理,sql中這種通常要自己實現(xiàn);
書中解釋說批處理可以減輕數(shù)據(jù)總線的負(fù)荷,或許是因為一次讀入減少了IO次數(shù)?
從結(jié)果可以看出,這是多個一維數(shù)組:

python語法:使用print()的時候發(fā)現(xiàn)只能打印同一類型的數(shù)據(jù),所以輸出拼接類型的時候,要把數(shù)字強(qiáng)制轉(zhuǎn)換成字符串類型:str(2)
第三章 end