python人工智能算法之人工神經(jīng)網(wǎng)絡(luò)
人工神經(jīng)網(wǎng)絡(luò)
(Artificial Neural Network,ANN)是一種模仿生物神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)和功能的數(shù)學(xué)模型,其目的是通過學(xué)習(xí)和訓(xùn)練,在處理未知的輸入數(shù)據(jù)時能夠進行復(fù)雜的非線性映射關(guān)系,實現(xiàn)自適應(yīng)的智能決策??梢哉f,ANN是人工智能算法中最基礎(chǔ)、最核心的一種算法。
ANN模型的基本結(jié)構(gòu)包含輸入層、隱藏層和輸出層。輸入層接收輸入數(shù)據(jù),隱藏層負(fù)責(zé)對數(shù)據(jù)進行多層次、高維度的變換和處理,輸出層對處理后的數(shù)據(jù)進行輸出。ANN的訓(xùn)練過程是通過多次迭代,不斷調(diào)整神經(jīng)網(wǎng)絡(luò)中各層的權(quán)重,從而使得神經(jīng)網(wǎng)絡(luò)能夠?qū)斎霐?shù)據(jù)進行正確的預(yù)測和分類。
人工神經(jīng)網(wǎng)絡(luò)算法示例
接下來看看一個簡單的人工神經(jīng)網(wǎng)絡(luò)算法示例:
import numpy as np class NeuralNetwork(): def __init__(self, layers): """ layers: 數(shù)組,包含每個層的神經(jīng)元數(shù)量,例如 [2, 3, 1] 表示 3 層神經(jīng)網(wǎng)絡(luò),第一層 2 個神經(jīng)元,第二層 3 個神經(jīng)元,第三層 1 個神經(jīng)元。 weights: 數(shù)組,包含每個連接的權(quán)重矩陣,默認(rèn)值隨機生成。 biases: 數(shù)組,包含每個層的偏差值,默認(rèn)值為 0。 """ self.layers = layers self.weights = [np.random.randn(a, b) for a, b in zip(layers[1:], layers[:-1])] self.biases = [np.zeros((a, 1)) for a in layers[1:]] def sigmoid(self, z): """Sigmoid 激活函數(shù).""" return 1 / (1 + np.exp(-z)) def forward_propagation(self, a): """前向傳播.""" for w, b in zip(self.weights, self.biases): z = np.dot(w, a) + b a = self.sigmoid(z) return a def backward_propagation(self, x, y): """反向傳播.""" nabla_w = [np.zeros(w.shape) for w in self.weights] nabla_b = [np.zeros(b.shape) for b in self.biases] a = x activations = [x] zs = [] for w, b in zip(self.weights, self.biases): z = np.dot(w, a) + b zs.append(z) a = self.sigmoid(z) activations.append(a) delta = self.cost_derivative(activations[-1], y) * self.sigmoid_prime(zs[-1]) nabla_b[-1] = delta nabla_w[-1] = np.dot(delta, activations[-2].transpose()) for l in range(2, len(self.layers)): z = zs[-l] sp = self.sigmoid_prime(z) delta = np.dot(self.weights[-l+1].transpose(), delta) * sp nabla_b[-l] = delta nabla_w[-l] = np.dot(delta, activations[-l-1].transpose()) return (nabla_w, nabla_b) def train(self, x_train, y_train, epochs, learning_rate): """訓(xùn)練網(wǎng)絡(luò).""" for epoch in range(epochs): nabla_w = [np.zeros(w.shape) for w in self.weights] nabla_b = [np.zeros(b.shape) for b in self.biases] for x, y in zip(x_train, y_train): delta_nabla_w, delta_nabla_b = self.backward_propagation(np.array([x]).transpose(), np.array([y]).transpose()) nabla_w = [nw+dnw for nw, dnw in zip(nabla_w, delta_nabla_w)] nabla_b = [nb+dnb for nb, dnb in zip(nabla_b, delta_nabla_b)] self.weights = [w-(learning_rate/len(x_train))*nw for w, nw in zip(self.weights, nabla_w)] self.biases = [b-(learning_rate/len(x_train))*nb for b, nb in zip(self.biases, nabla_b)] def predict(self, x_test): """預(yù)測.""" y_predictions = [] for x in x_test: y_predictions.append(self.forward_propagation(np.array([x]).transpose())[0][0]) return y_predictions def cost_derivative(self, output_activations, y): """損失函數(shù)的導(dǎo)數(shù).""" return output_activations - y def sigmoid_prime(self, z): """Sigmoid 函數(shù)的導(dǎo)數(shù).""" return self.sigmoid(z) * (1 - self.sigmoid(z))
使用以下代碼示例來實例化和使用這個簡單的神經(jīng)網(wǎng)絡(luò)類:
x_train = [[0, 0], [1, 0], [0, 1], [1, 1]] y_train = [0, 1, 1, 0] # 創(chuàng)建神經(jīng)網(wǎng)絡(luò) nn = NeuralNetwork([2, 3, 1]) # 訓(xùn)練神經(jīng)網(wǎng)絡(luò) nn.train(x_train, y_train, 10000, 0.1) # 測試神經(jīng)網(wǎng)絡(luò) x_test = [[0, 0], [1, 0], [0, 1], [1, 1]] y_test = [0, 1, 1, 0] y_predictions = nn.predict(x_test) print("Predictions:", y_predictions) print("Actual:", y_test)
輸出結(jié)果:
Predictions: [0.011602156431658403, 0.9852717774725432, 0.9839448924887225, 0.020026540429992387]
Actual: [0, 1, 1, 0]
總結(jié):
優(yōu)點:
- 非線性能力強:ANN能夠處理非線性關(guān)系,能夠識別和預(yù)測非線性關(guān)系的數(shù)據(jù),如圖像和語音等數(shù)據(jù)
- 自適應(yīng)性高:ANN能夠自動學(xué)習(xí)數(shù)據(jù)特征并進行調(diào)整,能夠適應(yīng)環(huán)境的變化
- 學(xué)習(xí)能力強:ANN能夠通過對大量數(shù)據(jù)的學(xué)習(xí),對未知數(shù)據(jù)進行預(yù)測和分類
- 可并行化處理:ANN的計算過程可以并行處理,能夠在短時間內(nèi)處理大量數(shù)據(jù)
- 誤差容忍度高:ANN在計算中允許存在一定的誤差,可容忍部分?jǐn)?shù)據(jù)的失真和丟失
缺點:
- 數(shù)據(jù)需求量大:為了提高預(yù)測和分類準(zhǔn)確性,ANN需要大量數(shù)據(jù)進行學(xué)習(xí)和訓(xùn)練,如果數(shù)據(jù)量不足,預(yù)測和分類準(zhǔn)確性將下降
- 計算量大:ANN的計算量很大,需要強大的計算設(shè)備進行處理
- 參數(shù)設(shè)置難度大:ANN的每個層級有多個參數(shù),根據(jù)不同的數(shù)據(jù)需求,需要設(shè)置不同的參數(shù),選擇最優(yōu)參數(shù)需要進行大量的試驗和測試
- 可解釋性差:由于其內(nèi)部結(jié)構(gòu)非常復(fù)雜,ANN的結(jié)果難以解釋,難以知道決策是如何得出的
- 過擬合現(xiàn)象:為了達(dá)到高精度,ANN有可能會依賴于過于細(xì)節(jié)的特征,導(dǎo)致對新數(shù)據(jù)的泛化性能降低
目前,人工神經(jīng)網(wǎng)絡(luò)在圖像識別、語音識別、自然語言處理、機器翻譯等領(lǐng)域取得了重要的應(yīng)用成果。作為一種高度靈活、強大的人工智能算法,ANN在未來的發(fā)展中具有廣闊的應(yīng)用前景。好了,關(guān)于人工神經(jīng)網(wǎng)絡(luò)就簡單介紹到這里,希望對大家有所幫助!
以上就是python人工智能算法之人工神經(jīng)網(wǎng)絡(luò)的詳細(xì)內(nèi)容,更多關(guān)于python人工智能算法神經(jīng)網(wǎng)絡(luò)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python 排序最長英文單詞鏈(列表中前一個單詞末字母是下一個單詞的首字母)
這篇文章主要介紹了Python 排序最長英文單詞鏈(列表中前一個單詞末字母是下一個單詞的首字母),列表中每個元素相當(dāng)于一個單詞,要實現(xiàn)列表中前一個單詞末字母是下一個單詞的首字母,并且這個鏈?zhǔn)亲铋L的。感興趣的可以了解一下2020-12-12Python深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)基本原理
人工神經(jīng)網(wǎng)絡(luò)(Artificial Neural Networks,簡寫為ANNs)也簡稱為神經(jīng)網(wǎng)絡(luò)(NNs)或稱作連接模型(Connection Model),它是一種模仿動物神經(jīng)網(wǎng)絡(luò)行為特征,進行分布式并行信息處理的算法數(shù)學(xué)模型2021-10-10使用keras實現(xiàn)孿生網(wǎng)絡(luò)中的權(quán)值共享教程
這篇文章主要介紹了使用keras實現(xiàn)孿生網(wǎng)絡(luò)中的權(quán)值共享教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06使用 Django Highcharts 實現(xiàn)數(shù)據(jù)可視化過程解析
這篇文章主要介紹了使用 Django Highcharts 實現(xiàn)數(shù)據(jù)可視化過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-07-07Python scrapy爬取起點中文網(wǎng)小說榜單
爬蟲的基礎(chǔ)內(nèi)容已經(jīng)全部學(xué)玩,博主決定想著更加標(biāo)準(zhǔn)化以及實用能力更強的scrapy進發(fā),今天記錄自己第一個scrapy爬蟲項目. scrapy爬取起點中文網(wǎng)24小時熱銷榜單,需要的朋友可以參考下2021-06-06Python?基于xml.etree.ElementTree實現(xiàn)XML對比示例詳解
這篇文章主要介紹了Python?基于xml.etree.ElementTree實現(xiàn)XML對比,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-12-12