1 激活函數(shù):
a.階躍函數(shù) 當(dāng)輸入超過 0 時(shí),輸出 1, 否則輸出 0
b.sigmoid 函數(shù)
這個(gè)函數(shù)在后面的代碼中使用很頻繁,用代碼輸出圖形:
c.ReLU(Rectified Linear Unit)函數(shù) max(0,input)
這些函數(shù)的實(shí)現(xiàn)都非常簡(jiǎn)單悟泵,直接ruturn公式;
2 多維數(shù)組的運(yùn)算
矩陣乘法:.dot(a,b) 對(duì)應(yīng)維度的元素個(gè)數(shù)要保持一致,同數(shù)學(xué)里矩陣乘法
神經(jīng)網(wǎng)絡(luò)內(nèi)積:Y=WX+B
3 3層神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)
輸出層函數(shù):
恒等函數(shù):將輸入按原樣輸出报破,對(duì)于輸入的信息悠就,不加以任何改動(dòng)地直接輸出,加是為了和前面保持結(jié)構(gòu)一致性充易;
softmax 函數(shù):分子是輸入信號(hào)的指數(shù)函數(shù)梗脾,分母為所有輸入信號(hào)的指數(shù)函數(shù)的和;
softmax 函數(shù)的輸出是 0.0 到 1.0 之間的實(shí)數(shù)盹靴。并且炸茧,softmax 函數(shù)的輸出值的總和是 1。輸出總和為 1 是 softmax 函數(shù)的一個(gè)重要性質(zhì)稿静。正因?yàn)橛辛诉@個(gè)性質(zhì)梭冠,我們才可以把 softmax 函數(shù)的輸出解釋為“概率”。即該函數(shù)具有概率的性質(zhì)改备,可以表示概率控漠,一般而言,神經(jīng)網(wǎng)絡(luò)只把輸出值最大的神經(jīng)元所對(duì)應(yīng)的類別作為識(shí)別結(jié)果悬钳。
代碼實(shí)現(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
遇到了幾個(gè)問題:1.conda裝過Numpy后pycharm一直顯示無法導(dǎo)入盐捷,搜索了一下突然想到或許是每次新建工程時(shí)pycharm都需要重新配置解釋器導(dǎo)致的,果然如此默勾,配置方法:file-settings-project:network-python interpreter -修改為conda內(nèi)置的python 就可以了碉渡,idea也是這樣,每次都需要重新配置母剥;
2.報(bào)錯(cuò):Field elements must be 2- or 3-tuples, got '0.2' 是因?yàn)槎嗑S數(shù)組的寫法不正確滞诺,需要在外層在加一個(gè)中括號(hào):network['W2'] = np.array([[0.1,0.4],[0.2,0.5],[0.3,0.6]])
手寫數(shù)字識(shí)別
從書籍官網(wǎng)下載的代碼在run的時(shí)候,發(fā)現(xiàn)導(dǎo)入dataset不成功环疼,解決方法見ModuleNotFoundError: No module named ‘dataset‘--《深度學(xué)習(xí)入門》3.6.1節(jié)錯(cuò)誤的解決方案_modulenotfounderror: no module named 'datasets_alltimehigh的博客-CSDN博客
運(yùn)行截圖:
keywords:
load_mnist函數(shù)return的是"(訓(xùn)練圖像铭段,訓(xùn)練標(biāo)簽),(測(cè)試圖像,測(cè)試標(biāo)簽)"
有三個(gè)參數(shù)(均為布爾型):
normalize:是否正規(guī)化秦爆,即是否輸出為0-1(浮點(diǎn)型)的值序愚;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的時(shí)候from common.functions import sigmoid, softmax報(bào)錯(cuò):解決方法同上锰霜,因?yàn)槲业沫h(huán)境其實(shí)是用的conda的,所以需要把依賴的數(shù)據(jù)和function都放入conda包下桐早;
代碼及結(jié)果:
感覺for循環(huán)里的代碼有點(diǎn)難以理解癣缅,逐一輸出就比較清晰了:
預(yù)處理:方法有正規(guī)化,使用均值或者方差再處理數(shù)據(jù)哄酝,和將數(shù)據(jù)整體分布均勻化的白化方法友存;
3.6.3 批處理
通過range()的第三個(gè)參數(shù)實(shí)現(xiàn),會(huì)自動(dòng)實(shí)現(xiàn)分批處理陶衅,sql中這種通常要自己實(shí)現(xiàn)屡立;
書中解釋說批處理可以減輕數(shù)據(jù)總線的負(fù)荷,或許是因?yàn)橐淮巫x入減少了IO次數(shù)搀军?
從結(jié)果可以看出膨俐,這是多個(gè)一維數(shù)組:
python語法:使用print()的時(shí)候發(fā)現(xiàn)只能打印同一類型的數(shù)據(jù),所以輸出拼接類型的時(shí)候罩句,要把數(shù)字強(qiáng)制轉(zhuǎn)換成字符串類型:str(2)
第三章 end