欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python創(chuàng)建簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)實(shí)例講解

 更新時(shí)間:2021年01月04日 11:26:58   作者:Warmer_Sweeter  
在本篇文章里小編給大家整理的是一篇關(guān)于如何在Python中創(chuàng)建一個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)的相關(guān)知識(shí)點(diǎn),有興趣的朋友們可以參考下。

在過去的幾十年里,機(jī)器學(xué)習(xí)對(duì)世界產(chǎn)生了巨大的影響,而且它的普及程度似乎在不斷增長(zhǎng)。最近,越來越多的人已經(jīng)熟悉了機(jī)器學(xué)習(xí)的子領(lǐng)域,如神經(jīng)網(wǎng)絡(luò),這是由人類大腦啟發(fā)的網(wǎng)絡(luò)。在本文中,將介紹用于一個(gè)簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)的 Python 代碼,該神經(jīng)網(wǎng)絡(luò)對(duì)于一個(gè) 1x3 向量,分類第一個(gè)元素是否為 10。

步驟1: 導(dǎo)入 NumPy、 Scikit-learn 和 Matplotlib

import numpy as np
from sklearn.preprocessing import MinMaxScaler
import matplotlib.pyplot as plt

我們將在這個(gè)項(xiàng)目中使用上述三個(gè)庫。NumPy 將用于創(chuàng)建向量和矩陣以及數(shù)學(xué)操作。Scikit-learn 將用于縮放數(shù)據(jù),Matplotlib 將用于在神經(jīng)網(wǎng)絡(luò)訓(xùn)練期間繪圖。

步驟2: 創(chuàng)建一個(gè)訓(xùn)練和測(cè)試數(shù)據(jù)集

神經(jīng)網(wǎng)絡(luò)在大型和小型數(shù)據(jù)集的學(xué)習(xí)趨勢(shì)方面都很擅長(zhǎng)。然而,數(shù)據(jù)科學(xué)家必須意識(shí)到過擬合的危險(xiǎn),這在使用小數(shù)據(jù)集的項(xiàng)目中更為明顯。過擬合是當(dāng)一個(gè)算法訓(xùn)練和建模過于接近一組數(shù)據(jù)點(diǎn),以至于它不能很好地推廣到新的數(shù)據(jù)點(diǎn)。

通常情況下,過擬合的機(jī)器學(xué)習(xí)模型在訓(xùn)練的數(shù)據(jù)集上有很高的準(zhǔn)確性,但是作為一個(gè)數(shù)據(jù)科學(xué)家,目標(biāo)通常是盡可能精確地預(yù)測(cè)新的數(shù)據(jù)點(diǎn)。為了確保根據(jù)預(yù)測(cè)新數(shù)據(jù)點(diǎn)的好壞來評(píng)估模型,而不是根據(jù)對(duì)當(dāng)前數(shù)據(jù)點(diǎn)的建模好壞來評(píng)估模型,通常將數(shù)據(jù)集拆分為一個(gè)訓(xùn)練集和一個(gè)測(cè)試集(有時(shí)是一個(gè)驗(yàn)證集)。

input_train = np.array([[0, 1, 0], [0, 1, 1], [0, 0, 0], 
   [10, 0, 0], [10, 1, 1], [10, 0, 1]])
output_train = np.array([[0], [0], [0], [1], [1], [1]])
input_pred = np.array([1, 1, 0])
 
 
input_test = np.array([[1, 1, 1], [10, 0, 1], [0, 1, 10], 
   [10, 1, 10], [0, 0, 0], [0, 1, 1]])
output_test = np.array([[0], [1], [0], [1], [0], [0]])

在這個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)中,我們將1x3向量分類,10作為第一個(gè)元素。使用 NumPy 的 array 函數(shù)創(chuàng)建輸入和輸出訓(xùn)練集和測(cè)試集,并創(chuàng)建 input_pred 以測(cè)試稍后將定義的 prediction 函數(shù)。訓(xùn)練和測(cè)試數(shù)據(jù)由6個(gè)樣本組成,每個(gè)樣本具有3個(gè)特征,由于輸出已經(jīng)給出,我們理解這是監(jiān)督式學(xué)習(xí)的一個(gè)例子。

第三步: 擴(kuò)展數(shù)據(jù)集

許多機(jī)器學(xué)習(xí)模型不能理解例如單位之間的區(qū)別,自然而然地對(duì)高度的特征應(yīng)用更多的權(quán)重。這會(huì)破壞算法預(yù)測(cè)新數(shù)據(jù)點(diǎn)的能力。此外,訓(xùn)練具有高強(qiáng)度特征的機(jī)器學(xué)習(xí)模型將會(huì)比需要的慢,至少如果使用梯度下降法。這是因?yàn)楫?dāng)輸入值在大致相同的范圍內(nèi)時(shí),梯度下降法收斂得更快。

scaler = MinMaxScaler()
input_train_scaled = scaler.fit_transform(input_train)
output_train_scaled = scaler.fit_transform(output_train)
input_test_scaled = scaler.fit_transform(input_test)
output_test_scaled = scaler.fit_transform(output_test)

在我們的訓(xùn)練和測(cè)試數(shù)據(jù)集中,這些值的范圍相對(duì)較小,因此可能沒有必要進(jìn)行特征擴(kuò)展。然而,這樣可以使得小伙伴們使用自己喜歡的數(shù)字,而不需要更改太多的代碼。由于 Scikit-learn 包及其 MinMaxScaler 類,在 Python 中實(shí)現(xiàn)特征伸縮非常容易。只需創(chuàng)建一個(gè) MinMaxScaler 對(duì)象,并使用 fit_transform 函數(shù)將非縮放數(shù)據(jù)作為輸入,該函數(shù)將返回相同的縮放數(shù)據(jù)。Scikit-learn 包中還有其他縮放功能,我鼓勵(lì)您嘗試這些功能。

第四步: 創(chuàng)建一個(gè)神經(jīng)網(wǎng)絡(luò)類

要熟悉神經(jīng)網(wǎng)絡(luò)的所有元素,最簡(jiǎn)單的方法之一就是創(chuàng)建一個(gè)神經(jīng)網(wǎng)絡(luò)類。這樣一個(gè)類應(yīng)該包括所有的變量和函數(shù),將是必要的神經(jīng)網(wǎng)絡(luò)工作正常。

class NeuralNetwork():
 def __init__(self, ):
 self.inputSize = 3
 self.outputSize = 1
 self.hiddenSize = 3
 
 
 self.W1 = np.random.rand(self.inputSize, self.hiddenSize)
 self.W2 = np.random.rand(self.hiddenSize, self.outputSize)
 
 
 self.error_list = []
 self.limit = 0.5
 self.true_positives = 0
 self.false_positives = 0
 self.true_negatives = 0
 self.false_negatives = 0
 
 
 def forward(self, X):
 self.z = np.matmul(X, self.W1)
 self.z2 = self.sigmoid(self.z)
 self.z3 = np.matmul(self.z2, self.W2)
 o = self.sigmoid(self.z3)
 return o
 
 
 def sigmoid(self, s):
 return 1 / (1 + np.exp(-s))
 
 
 def sigmoidPrime(self, s):
 return s * (1 - s)
 
 
 def backward(self, X, y, o):
 self.o_error = y - o
 self.o_delta = self.o_error * self.sigmoidPrime(o)
 self.z2_error = np.matmul(self.o_delta,
     np.matrix.transpose(self.W2))
 self.z2_delta = self.z2_error * self.sigmoidPrime(self.z2)
 self.W1 += np.matmul(np.matrix.transpose(X), self.z2_delta)
 self.W2 += np.matmul(np.matrix.transpose(self.z2),
    self.o_delta)
 
 
 def train(self, X, y, epochs):
 for epoch in range(epochs):
  o = self.forward(X)
  self.backward(X, y, o)
  self.error_list.append(np.abs(self.o_error).mean())
 
 
 def predict(self, x_predicted):
 return self.forward(x_predicted).item()
 
 
 def view_error_development(self):
 plt.plot(range(len(self.error_list)), self.error_list)
 plt.title('Mean Sum Squared Loss')
 plt.xlabel('Epoch')
 plt.ylabel('Loss')
 
 
 def test_evaluation(self, input_test, output_test):
 for i, test_element in enumerate(input_test):
  if self.predict(test_element) > self.limit and \
   output_test[i] == 1:
  self.true_positives += 1
  if self.predict(test_element) < self.limit and \
   output_test[i] == 1:
  self.false_negatives += 1
  if self.predict(test_element) > self.limit and \
   output_test[i] == 0:
  self.false_positives += 1
  if self.predict(test_element) < self.limit and \
   output_test[i] == 0:
  self.true_negatives += 1
 print('True positives: ', self.true_positives,
  '\nTrue negatives: ', self.true_negatives,
  '\nFalse positives: ', self.false_positives,
  '\nFalse negatives: ', self.false_negatives,
  '\nAccuracy: ',
  (self.true_positives + self.true_negatives) /
  (self.true_positives + self.true_negatives +
  self.false_positives + self.false_negatives))

步驟4.1: 創(chuàng)建一個(gè) Initialize 函數(shù)

當(dāng)我們?cè)?Python 中創(chuàng)建一個(gè)類以便正確地初始化變量時(shí),會(huì)調(diào)用 __init__ 函數(shù)。

def __init__(self, ):
 self.inputSize = 3
 self.outputSize = 1
 self.hiddenSize = 3
 
 
 self.W1 = torch.randn(self.inputSize, self.hiddenSize)
 self.W2 = torch.randn(self.hiddenSize, self.outputSize)
 
 
 self.error_list = []
 self.limit = 0.5
 self.true_positives = 0
 self.false_positives = 0
 self.true_negatives = 0
 self.false_negatives = 0

在這個(gè)例子中,我選擇了一個(gè)有三個(gè)輸入節(jié)點(diǎn)、三個(gè)隱藏層節(jié)點(diǎn)和一個(gè)輸出節(jié)點(diǎn)的神經(jīng)網(wǎng)絡(luò)。以上的 __init__ 函數(shù)初始化描述神經(jīng)網(wǎng)絡(luò)大小的變量。inputSize 是輸入節(jié)點(diǎn)的數(shù)目,它應(yīng)該等于輸入數(shù)據(jù)中特征的數(shù)目。outputSize 等于輸出節(jié)點(diǎn)數(shù),hiddenSize 描述隱藏層中的節(jié)點(diǎn)數(shù)。此外,我們的網(wǎng)絡(luò)中不同節(jié)點(diǎn)之間的權(quán)重將在訓(xùn)練過程中進(jìn)行調(diào)整。

除了描述神經(jīng)網(wǎng)絡(luò)的大小和權(quán)重的變量之外,我還創(chuàng)建了幾個(gè)在創(chuàng)建神經(jīng)網(wǎng)絡(luò)對(duì)象時(shí)初始化的變量,這些對(duì)象將用于評(píng)估目的。誤差列表將包含每個(gè)時(shí)期的平均絕對(duì)誤差(MAE) ,這個(gè)極限將描述一個(gè)向量應(yīng)該被分類為一個(gè)向量,元素10作為第一個(gè)元素而不是。然后,還有一些變量可以用來存儲(chǔ)真實(shí)陽性、假陽性、真實(shí)陰性和假陰性的數(shù)量。

步驟4.2: 創(chuàng)建一個(gè)前向傳播函數(shù)

前向傳播函數(shù)的作用是通過神經(jīng)網(wǎng)絡(luò)的不同層次進(jìn)行迭代,以預(yù)測(cè)特定 epoch 的輸出。然后,根據(jù)預(yù)測(cè)輸出和實(shí)際輸出之間的差異,在反向傳播的過程中更新權(quán)重。

def forward(self, X):
 self.z = np.matmul(X, self.W1)
 self.z2 = self.sigmoid(self.z)
 self.z3 = np.matmul(self.z2, self.W2)
 o = self.sigmoid(self.z3)
 return o

為了計(jì)算每一層中每個(gè)節(jié)點(diǎn)的值,前一層中節(jié)點(diǎn)的值將被乘以適當(dāng)?shù)臋?quán)重,然后應(yīng)用非線性激活函數(shù)來擴(kuò)大最終輸出函數(shù)的可能性。在這個(gè)例子中,我們選擇了 Sigmoid 作為激活函數(shù),但也有許多其他的選擇。

步驟4.3: 創(chuàng)建一個(gè)反向傳播函數(shù)

反向傳播是對(duì)神經(jīng)網(wǎng)絡(luò)中不同節(jié)點(diǎn)的權(quán)值進(jìn)行更新,從而決定其重要性的過程。

def backward(self, X, y, o):
 self.o_error = y - o
 self.o_delta = self.o_error * self.sigmoidPrime(o)
 self.z2_error = np.matmul(self.o_delta,
     np.matrix.transpose(self.W2))
 self.z2_delta = self.z2_error * self.sigmoidPrime(self.z2)
 self.W1 += np.matmul(np.matrix.transpose(X), self.z2_delta)
 self.W2 += np.matmul(np.matrix.transpose(self.z2),
    self.o_delta)

在上面的代碼片段中,輸出層的輸出錯(cuò)誤被計(jì)算為預(yù)測(cè)輸出與實(shí)際輸出之間的差值。然后,在重復(fù)整個(gè)過程直到到達(dá)輸入層之前,將這個(gè)錯(cuò)誤與 Sigmoid 相乘以運(yùn)行梯度下降法。最后,更新不同層之間的權(quán)重。

步驟4.4: 創(chuàng)建一個(gè)訓(xùn)練函數(shù)

在訓(xùn)練過程中,該算法將運(yùn)行向前和向后傳遞,從而更新每個(gè) epoch 的權(quán)重。為了得到最精確的權(quán)重值,這是必要的。

def train(self, X, y, epochs):
 for epoch in range(epochs):
  o = self.forward(X)
  self.backward(X, y, o)
  self.error_list.append(np.abs(self.o_error).mean())

除了向前和向后傳播之外,我們還將平均絕對(duì)誤差(MAE)保存到一個(gè)錯(cuò)誤列表中,以便日后觀察平均絕對(duì)誤差在訓(xùn)練過程中是如何演變的。

步驟4.5: 創(chuàng)建一個(gè)預(yù)測(cè)函數(shù)

在訓(xùn)練過程中對(duì)權(quán)重進(jìn)行了微調(diào)之后,該算法就可以預(yù)測(cè)新數(shù)據(jù)點(diǎn)的輸出。預(yù)測(cè)的輸出數(shù)字有望與實(shí)際輸出數(shù)字非常接近。

def predict(self, x_predicted):
 return self.forward(x_predicted).item()

步驟4.6: 繪制平均絕對(duì)誤差發(fā)展圖

評(píng)價(jià)機(jī)器學(xué)習(xí)算法質(zhì)量的方法有很多。經(jīng)常使用的測(cè)量方法之一是平均絕對(duì)誤差,這個(gè)誤差應(yīng)該隨著時(shí)間的推移而減小。

def view_error_development(self):
 plt.plot(range(len(self.error_list)), self.error_list)
 plt.title('Mean Sum Squared Loss')
 plt.xlabel('Epoch')
 plt.ylabel('Loss')

步驟4.7: 計(jì)算精度及其組成部分

真正、假正、真負(fù)和假負(fù)的數(shù)量描述了機(jī)器學(xué)習(xí)分類算法的質(zhì)量。訓(xùn)練后的神經(jīng)網(wǎng)絡(luò)權(quán)值更新,使算法能夠準(zhǔn)確地預(yù)測(cè)新的數(shù)據(jù)點(diǎn)。在二進(jìn)制分類任務(wù)中,這些新數(shù)據(jù)點(diǎn)只能是1或0。根據(jù)預(yù)測(cè)值是否高于或低于定義的限制,算法將新條目分為1或0。

def test_evaluation(self, input_test, output_test):
 for i, test_element in enumerate(input_test):
  if self.predict(test_element) > self.limit and \
   output_test[i] == 1:
  self.true_positives += 1
  if self.predict(test_element) < self.limit and \
   output_test[i] == 1:
  self.false_negatives += 1
  if self.predict(test_element) > self.limit and \
   output_test[i] == 0:
  self.false_positives += 1
  if self.predict(test_element) < self.limit and \
   output_test[i] == 0:
  self.true_negatives += 1
 print('True positives: ', self.true_positives,
  '\nTrue negatives: ', self.true_negatives,
  '\nFalse positives: ', self.false_positives,
  '\nFalse negatives: ', self.false_negatives,
  '\nAccuracy: ',
  (self.true_positives + self.true_negatives) /
  (self.true_positives + self.true_negatives +
  self.false_positives + self.false_negatives))

當(dāng)運(yùn)行 test _ evaluation 函數(shù)時(shí),我們得到以下結(jié)果:

真正: 2

真負(fù): 4

假正: 0

假負(fù): 0

準(zhǔn)確性由以下公式給出:

由此我們可以推斷,在我們的案例中,精確度是1。

第五步: 運(yùn)行一個(gè)腳本來訓(xùn)練和評(píng)估神經(jīng)網(wǎng)絡(luò)模型

NN = NeuralNetwork()
NN.train(input_train_scaled, output_train_scaled, 200)
NN.predict(input_pred)
NN.view_error_development()
NN.test_evaluation(input_test_scaled, output_test_scaled)

為了嘗試我們剛剛構(gòu)建的神經(jīng)網(wǎng)絡(luò)類,我們將首先初始化一個(gè)神經(jīng)網(wǎng)絡(luò)類型的對(duì)象。然后對(duì)訓(xùn)練數(shù)據(jù)進(jìn)行神經(jīng)網(wǎng)絡(luò)訓(xùn)練,在新訓(xùn)練的模型在測(cè)試向量上進(jìn)行測(cè)試之前,對(duì)算法的權(quán)值進(jìn)行200個(gè) epoch 以上的“修正”。然后,在利用測(cè)試數(shù)據(jù)集對(duì)模型進(jìn)行評(píng)估之前,繪制誤差圖。

第六步: 改進(jìn)腳本并使用它

提供的代碼可以很容易地修改,以處理其他類似的情況。我們鼓勵(lì)讀者嘗試改變變量并使用自己的數(shù)據(jù)等等。改進(jìn)或變更的潛在想法包括但不限于:

  1. 泛化代碼以適用于任何輸入和輸出大小的數(shù)據(jù)
  2. 使用平均絕對(duì)誤差以外的另一個(gè)度量來衡量誤差
  3. 使用其他的縮放函數(shù)

到此這篇關(guān)于Python創(chuàng)建簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)實(shí)例講解的文章就介紹到這了,更多相關(guān)如何在Python中創(chuàng)建一個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python輕量級(jí)搜索工具Whoosh的使用教程

    Python輕量級(jí)搜索工具Whoosh的使用教程

    本文將為大家簡(jiǎn)單介紹一下Python中的一個(gè)輕量級(jí)搜索工具Whoosh,并給出相應(yīng)的使用示例代碼,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-07-07
  • 在Linux下使用命令行安裝Python

    在Linux下使用命令行安裝Python

    這篇文章主要介紹了在Linux下使用命令行安裝Python,通過詳細(xì)的圖文介紹Linux安裝Python的全部過程,希望對(duì)你有所幫助
    2021-06-06
  • python Web開發(fā)你要理解的WSGI & uwsgi詳解

    python Web開發(fā)你要理解的WSGI & uwsgi詳解

    這篇文章主要給大家介紹了關(guān)于python Web開發(fā)你一定要理解的WSGI & uwsgi的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • Pandas替換及部分替換(replace)實(shí)現(xiàn)流程詳解

    Pandas替換及部分替換(replace)實(shí)現(xiàn)流程詳解

    這篇文章主要介紹了Pandas替換及部分替換(replace)實(shí)現(xiàn)流程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • pyecharts如何旋轉(zhuǎn)折線圖的X軸標(biāo)簽

    pyecharts如何旋轉(zhuǎn)折線圖的X軸標(biāo)簽

    這篇文章主要介紹了pyecharts如何旋轉(zhuǎn)折線圖的X軸標(biāo)簽,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Jupyter notebook中5個(gè)有趣的魔法命令分享

    Jupyter notebook中5個(gè)有趣的魔法命令分享

    眾?所周知,Jupyter notebook是一個(gè)交互式的Python shell,也就是IPython的封裝版,非常適合用來進(jìn)行數(shù)據(jù)分析和機(jī)器學(xué)習(xí)。本文為大家整理了Jupyter notebook中5個(gè)有趣的魔法命令,感興趣的可以了解一下
    2022-07-07
  • Numpy之random函數(shù)使用學(xué)習(xí)

    Numpy之random函數(shù)使用學(xué)習(xí)

    這篇文章主要介紹了Numpy之random使用學(xué)習(xí),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • python實(shí)現(xiàn)指定字符串補(bǔ)全空格的方法

    python實(shí)現(xiàn)指定字符串補(bǔ)全空格的方法

    這篇文章主要介紹了python實(shí)現(xiàn)指定字符串補(bǔ)全空格的方法,涉及Python中rjust,ljust和center方法的使用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • 基于Python實(shí)現(xiàn)將列表數(shù)據(jù)生成折線圖

    基于Python實(shí)現(xiàn)將列表數(shù)據(jù)生成折線圖

    這篇文章主要介紹了如何利用Python中的pandas庫和matplotlib庫,實(shí)現(xiàn)將列表數(shù)據(jù)生成折線圖,文中的示例代碼簡(jiǎn)潔易懂,需要的可以參考一下
    2022-03-03
  • python數(shù)字圖像處理之邊緣輪廓檢測(cè)

    python數(shù)字圖像處理之邊緣輪廓檢測(cè)

    這篇文章主要介紹了python數(shù)字圖像處理之邊緣輪廓檢測(cè)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06

最新評(píng)論