Python基于numpy靈活定義神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)的方法
本文實(shí)例講述了Python基于numpy靈活定義神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)的方法。分享給大家供大家參考,具體如下:
用numpy可以靈活定義神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),還可以應(yīng)用numpy強(qiáng)大的矩陣運(yùn)算功能!
一、用法
1). 定義一個(gè)三層神經(jīng)網(wǎng)絡(luò):
'''示例一''' nn = NeuralNetworks([3,4,2]) # 定義神經(jīng)網(wǎng)絡(luò) nn.fit(X,y) # 擬合 print(nn.predict(X)) #預(yù)測(cè)
說明:
輸入層節(jié)點(diǎn)數(shù)目:3
隱藏層節(jié)點(diǎn)數(shù)目:4
輸出層節(jié)點(diǎn)數(shù)目:2
2).定義一個(gè)五層神經(jīng)網(wǎng)絡(luò):
'''示例二''' nn = NeuralNetworks([3,5,7,4,2]) # 定義神經(jīng)網(wǎng)絡(luò) nn.fit(X,y) # 擬合 print(nn.predict(X)) #預(yù)測(cè)
說明:
輸入層節(jié)點(diǎn)數(shù)目:3
隱藏層1節(jié)點(diǎn)數(shù)目:5
隱藏層2節(jié)點(diǎn)數(shù)目:7
隱藏層3節(jié)點(diǎn)數(shù)目:4
輸出層節(jié)點(diǎn)數(shù)目:2
二、實(shí)現(xiàn)
如下實(shí)現(xiàn)方式為本人(@hhh5460)原創(chuàng)。 要點(diǎn): dtype=object
import numpy as np
class NeuralNetworks(object):
''''''
def __init__(self, n_layers=None, active_type=None, n_iter=10000, error=0.05, alpha=0.5, lamda=0.4):
'''搭建神經(jīng)網(wǎng)絡(luò)框架'''
# 各層節(jié)點(diǎn)數(shù)目 (向量)
self.n = np.array(n_layers) # 'n_layers必須為list類型,如:[3,4,2] 或 n_layers=[3,4,2]'
self.size = self.n.size # 層的總數(shù)
# 層 (向量)
self.z = np.empty(self.size, dtype=object) # 先占位(置空),dtype=object !如下皆然
self.a = np.empty(self.size, dtype=object)
self.data_a = np.empty(self.size, dtype=object)
# 偏置 (向量)
self.b = np.empty(self.size, dtype=object)
self.delta_b = np.empty(self.size, dtype=object)
# 權(quán) (矩陣)
self.w = np.empty(self.size, dtype=object)
self.delta_w = np.empty(self.size, dtype=object)
# 填充
for i in range(self.size):
self.a[i] = np.zeros(self.n[i]) # 全零
self.z[i] = np.zeros(self.n[i]) # 全零
self.data_a[i] = np.zeros(self.n[i]) # 全零
if i < self.size - 1:
self.b[i] = np.ones(self.n[i+1]) # 全一
self.delta_b[i] = np.zeros(self.n[i+1]) # 全零
mu, sigma = 0, 0.1 # 均值、方差
self.w[i] = np.random.normal(mu, sigma, (self.n[i], self.n[i+1])) # # 正態(tài)分布隨機(jī)化
self.delta_w[i] = np.zeros((self.n[i], self.n[i+1])) # 全零
下面完整代碼是我學(xué)習(xí)斯坦福機(jī)器學(xué)習(xí)教程,完全自己敲出來的:
import numpy as np
'''
參考:http://ufldl.stanford.edu/wiki/index.php/%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C
'''
class NeuralNetworks(object):
''''''
def __init__(self, n_layers=None, active_type=None, n_iter=10000, error=0.05, alpha=0.5, lamda=0.4):
'''搭建神經(jīng)網(wǎng)絡(luò)框架'''
self.n_iter = n_iter # 迭代次數(shù)
self.error = error # 允許最大誤差
self.alpha = alpha # 學(xué)習(xí)速率
self.lamda = lamda # 衰減因子 # 此處故意拼寫錯(cuò)誤!
if n_layers is None:
raise '各層的節(jié)點(diǎn)數(shù)目必須設(shè)置!'
elif not isinstance(n_layers, list):
raise 'n_layers必須為list類型,如:[3,4,2] 或 n_layers=[3,4,2]'
# 節(jié)點(diǎn)數(shù)目 (向量)
self.n = np.array(n_layers)
self.size = self.n.size # 層的總數(shù)
# 層 (向量)
self.a = np.empty(self.size, dtype=object) # 先占位(置空),dtype=object !如下皆然
self.z = np.empty(self.size, dtype=object)
# 偏置 (向量)
self.b = np.empty(self.size, dtype=object)
self.delta_b = np.empty(self.size, dtype=object)
# 權(quán) (矩陣)
self.w = np.empty(self.size, dtype=object)
self.delta_w = np.empty(self.size, dtype=object)
# 殘差 (向量)
self.data_a = np.empty(self.size, dtype=object)
# 填充
for i in range(self.size):
self.a[i] = np.zeros(self.n[i]) # 全零
self.z[i] = np.zeros(self.n[i]) # 全零
self.data_a[i] = np.zeros(self.n[i]) # 全零
if i < self.size - 1:
self.b[i] = np.ones(self.n[i+1]) # 全一
self.delta_b[i] = np.zeros(self.n[i+1]) # 全零
mu, sigma = 0, 0.1 # 均值、方差
self.w[i] = np.random.normal(mu, sigma, (self.n[i], self.n[i+1])) # # 正態(tài)分布隨機(jī)化
self.delta_w[i] = np.zeros((self.n[i], self.n[i+1])) # 全零
# 激活函數(shù)
self.active_functions = {
'sigmoid': self.sigmoid,
'tanh': self.tanh,
'radb': self.radb,
'line': self.line,
}
# 激活函數(shù)的導(dǎo)函數(shù)
self.derivative_functions = {
'sigmoid': self.sigmoid_d,
'tanh': self.tanh_d,
'radb': self.radb_d,
'line': self.line_d,
}
if active_type is None:
self.active_type = ['sigmoid'] * (self.size - 1) # 默認(rèn)激活函數(shù)類型
else:
self.active_type = active_type
def sigmoid(self, z):
if np.max(z) > 600:
z[z.argmax()] = 600
return 1.0 / (1.0 + np.exp(-z))
def tanh(self, z):
return (np.exp(z) - np.exp(-z)) / (np.exp(z) + np.exp(-z))
def radb(self, z):
return np.exp(-z * z)
def line(self, z):
return z
def sigmoid_d(self, z):
return z * (1.0 - z)
def tanh_d(self, z):
return 1.0 - z * z
def radb_d(self, z):
return -2.0 * z * np.exp(-z * z)
def line_d(self, z):
return np.ones(z.size) # 全一
def forward(self, x):
'''正向傳播(在線)'''
# 用樣本 x 走一遍,刷新所有 z, a
self.a[0] = x
for i in range(self.size - 1):
self.z[i+1] = np.dot(self.a[i], self.w[i]) + self.b[i]
self.a[i+1] = self.active_functions[self.active_type[i]](self.z[i+1]) # 加了激活函數(shù)
def err(self, X, Y):
'''誤差'''
last = self.size-1
err = 0.0
for x, y in zip(X, Y):
self.forward(x)
err += 0.5 * np.sum((self.a[last] - y)**2)
err /= X.shape[0]
err += sum([np.sum(w) for w in self.w[:last]**2])
return err
def backward(self, y):
'''反向傳播(在線)'''
last = self.size - 1
# 用樣本 y 走一遍,刷新所有delta_w, delta_b
self.data_a[last] = -(y - self.a[last]) * self.derivative_functions[self.active_type[last-1]](self.z[last]) # 加了激活函數(shù)的導(dǎo)函數(shù)
for i in range(last-1, 1, -1):
self.data_a[i] = np.dot(self.w[i], self.data_a[i+1]) * self.derivative_functions[self.active_type[i-1]](self.z[i]) # 加了激活函數(shù)的導(dǎo)函數(shù)
# 計(jì)算偏導(dǎo)
p_w = np.outer(self.a[i], self.data_a[i+1]) # 外積!感謝 numpy 的強(qiáng)大!
p_b = self.data_a[i+1]
# 更新 delta_w, delta_w
self.delta_w[i] = self.delta_w[i] + p_w
self.delta_b[i] = self.delta_b[i] + p_b
def update(self, n_samples):
'''更新權(quán)重參數(shù)'''
last = self.size - 1
for i in range(last):
self.w[i] -= self.alpha * ((1/n_samples) * self.delta_w[i] + self.lamda * self.w[i])
self.b[i] -= self.alpha * ((1/n_samples) * self.delta_b[i])
def fit(self, X, Y):
'''擬合'''
for i in range(self.n_iter):
# 用所有樣本,依次
for x, y in zip(X, Y):
self.forward(x) # 前向,更新 a, z;
self.backward(y) # 后向,更新 delta_w, delta_b
# 然后,更新 w, b
self.update(len(X))
# 計(jì)算誤差
err = self.err(X, Y)
if err < self.error:
break
# 整千次顯示誤差(否則太無聊?。?
if i % 1000 == 0:
print('iter: {}, error: {}'.format(i, err))
def predict(self, X):
'''預(yù)測(cè)'''
last = self.size - 1
res = []
for x in X:
self.forward(x)
res.append(self.a[last])
return np.array(res)
if __name__ == '__main__':
nn = NeuralNetworks([2,3,4,3,1], n_iter=5000, alpha=0.4, lamda=0.3, error=0.06) # 定義神經(jīng)網(wǎng)絡(luò)
X = np.array([[0.,0.], # 準(zhǔn)備數(shù)據(jù)
[0.,1.],
[1.,0.],
[1.,1.]])
y = np.array([0,1,1,0])
nn.fit(X,y) # 擬合
print(nn.predict(X)) # 預(yù)測(cè)
更多關(guān)于Python相關(guān)內(nèi)容可查看本站專題:《Python數(shù)學(xué)運(yùn)算技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
- 對(duì)Pytorch神經(jīng)網(wǎng)絡(luò)初始化kaiming分布詳解
- Python使用numpy實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)
- pytorch下使用LSTM神經(jīng)網(wǎng)絡(luò)寫詩實(shí)例
- 基于MATLAB神經(jīng)網(wǎng)絡(luò)圖像識(shí)別的高識(shí)別率代碼
- 純用NumPy實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)的示例代碼
- Python中LSTM回歸神經(jīng)網(wǎng)絡(luò)時(shí)間序列預(yù)測(cè)詳情
- Python利用全連接神經(jīng)網(wǎng)絡(luò)求解MNIST問題詳解
- tensorflow學(xué)習(xí)筆記之mnist的卷積神經(jīng)網(wǎng)絡(luò)實(shí)例
- numpy實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)反向傳播算法的步驟
- Pytorch搭建簡單的卷積神經(jīng)網(wǎng)絡(luò)(CNN)實(shí)現(xiàn)MNIST數(shù)據(jù)集分類任務(wù)
- 如何在M芯片的Macbook上訓(xùn)練神經(jīng)網(wǎng)絡(luò)
相關(guān)文章
Python編程實(shí)現(xiàn)輸入某年某月某日計(jì)算出這一天是該年第幾天的方法
這篇文章主要介紹了Python編程實(shí)現(xiàn)輸入某年某月某日計(jì)算出這一天是該年第幾天的方法,涉及Python針對(duì)日期時(shí)間的轉(zhuǎn)換與運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-04-04
Pytorch DataLoader 變長數(shù)據(jù)處理方式
今天小編就為大家分享一篇Pytorch DataLoader 變長數(shù)據(jù)處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-01-01
python GUI庫圖形界面開發(fā)之pyinstaller打包python程序?yàn)閑xe安裝文件
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之pyinstaller打包python程序?yàn)閑xe安裝文件,需要的朋友可以參考下2020-02-02
PyInstaller如何打包依賴文件至目標(biāo)程序目錄
這篇文章主要介紹了PyInstaller如何打包依賴文件至目標(biāo)程序目錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
Django集成搜索引擎Elasticserach的方法示例
這篇文章主要介紹了Django集成搜索引擎Elasticserach的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06

