国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

使用TensorFlow構(gòu)建,繪制和解釋人工神經(jīng)網(wǎng)絡(luò)

這篇具有很好參考價值的文章主要介紹了使用TensorFlow構(gòu)建,繪制和解釋人工神經(jīng)網(wǎng)絡(luò)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

使用 Python 進行深度學(xué)習(xí):神經(jīng)網(wǎng)絡(luò)(完整教程) 使用TensorFlow構(gòu)建,繪制和解釋人工神經(jīng)網(wǎng)絡(luò)

總結(jié)

在本文中,我將展示如何使用Python構(gòu)建神經(jīng)網(wǎng)絡(luò),以及如何使用可視化和創(chuàng)建模型預(yù)測解釋器向業(yè)務(wù)解釋深度學(xué)習(xí)。

圖片來源:作者 深度學(xué)習(xí)是一種機器學(xué)習(xí),它模仿人類獲得某些類型知識的方式,與標準模型相比,它多年來越來越受歡迎。

雖然傳統(tǒng)算法是線性的,但深度學(xué)習(xí)模型(通常是神經(jīng)網(wǎng)絡(luò))堆疊在一個越來越復(fù)雜和抽象的層次結(jié)構(gòu)中(因此深度學(xué)習(xí)中的“深度”)。

神經(jīng)網(wǎng)絡(luò)基于一組連接的單元(神經(jīng)元),就像大腦中的突觸一樣,可以將信號傳遞給其他神經(jīng)元,因此,就像相互連接的腦細胞一樣,它們可以以更像人類的方式學(xué)習(xí)和做出決定。

今天,深度學(xué)習(xí)是如此流行,以至于許多公司想要使用它,即使他們并不完全理解它。通常,數(shù)據(jù)科學(xué)家首先必須為業(yè)務(wù)簡化這些復(fù)雜的算法,然后解釋和證明模型的結(jié)果,這對于神經(jīng)網(wǎng)絡(luò)來說并不總是那么簡單。我認為最好的方法是通過可視化。

我將介紹一些有用的 Python 代碼,這些代碼可以輕松應(yīng)用于其他類似情況(只需復(fù)制、粘貼、運行),并通過注釋遍歷每一行代碼,以便您可以復(fù)制示例。

特別是,我將經(jīng)歷:

環(huán)境設(shè)置,張量流與 pytorch

人工神經(jīng)網(wǎng)絡(luò)細分、輸入、輸出、隱藏層、激活函數(shù)

使用深度神經(jīng)網(wǎng)絡(luò)進行深度學(xué)習(xí)

使用張量流/keras進行模型設(shè)計

使用python可視化神經(jīng)網(wǎng)絡(luò)

模型訓(xùn)練和測試

用形狀解釋

設(shè)置

構(gòu)建神經(jīng)網(wǎng)絡(luò)有兩個主要庫:TensorFlow(由Google開發(fā))和PyTorch(由Facebook開發(fā))。它們可以執(zhí)行類似的任務(wù),但前者更適合生產(chǎn),而后者則適合構(gòu)建快速原型,因為它更容易學(xué)習(xí)。

這兩個庫受到社區(qū)和企業(yè)的青睞,因為它們可以利用 NVIDIA GPU 的強大功能。這對于處理文本語料庫或圖像庫等大型數(shù)據(jù)集非常有用,有時甚至是必要的。

在本教程中,我將使用 TensorFlow 和 Keras,這是一個比純 TensorFlow 和 PyTorch 更用戶友好的更高級別的模塊,盡管速度有點慢。

第一步是通過終端安裝 TensorFlow:

pip install tensorflow 如果要啟用GPU支持,可以閱讀官方文檔或遵循本指南。設(shè)置完成后,您的 Python 指令將由您的機器轉(zhuǎn)換為 CUDA 并由 GPU 處理,因此您的模型將運行得非??臁?/p>

現(xiàn)在我們可以在筆記本上導(dǎo)入 TensorFlow Keras 的主要模塊并開始編碼:

from?tensorflow.keras?import?models,?layers,?utils,?backend?as?K
import?matplotlib.pyplot?as?plt
import?shap

人工神經(jīng)網(wǎng)絡(luò)

ANN由具有輸入和輸出維度的層組成。后者由神經(jīng)元(也稱為“節(jié)點”)的數(shù)量決定,神經(jīng)元是一個計算單元,通過激活函數(shù)連接加權(quán)輸入(幫助神經(jīng)元打開/關(guān)閉)。

與大多數(shù)機器學(xué)習(xí)算法一樣,權(quán)重在訓(xùn)練期間隨機初始化和優(yōu)化,以最小化損失函數(shù)。

圖層可以分組為:

輸入層具有將輸入向量傳遞給神經(jīng)網(wǎng)絡(luò)的工作。如果我們有一個包含 3 個特征的矩陣(形狀 N x 3),則該層將 3 個數(shù)字作為輸入,并將相同的 3 個數(shù)字傳遞給下一層。

隱藏層代表中間節(jié)點,它們對數(shù)字進行多次轉(zhuǎn)換以提高最終結(jié)果的準確性,輸出由神經(jīng)元的數(shù)量定義。

返回神經(jīng)網(wǎng)絡(luò)最終輸出的輸出層。如果我們在做一個簡單的二元分類或回歸,輸出層應(yīng)該只有 1 個神經(jīng)元(因此它只返回 1 個數(shù)字)。

在具有 5 個不同類的多類分類的情況下,輸出層應(yīng)具有 5 個神經(jīng)元。

ANN最簡單的形式是感知器,一個只有一層的模型,與線性回歸模型非常相似。詢問感知器內(nèi)部發(fā)生了什么,相當(dāng)于詢問多層神經(jīng)網(wǎng)絡(luò)的單個節(jié)點內(nèi)部發(fā)生了什么......讓我們分解一下。

假設(shè)我們有一個包含 N 行、3 個特征和 1 個目標變量(即二進制 1/0)的數(shù)據(jù)集:

使用TensorFlow構(gòu)建,繪制和解釋人工神經(jīng)網(wǎng)絡(luò)

我在 0 到 1 之間放置了一些隨機數(shù)數(shù)據(jù)在輸入神經(jīng)網(wǎng)絡(luò)之前應(yīng)始終縮放。

就像在所有其他機器學(xué)習(xí)用例中一樣,我們將訓(xùn)練一個模型來逐行使用特征預(yù)測目標。讓我們從第一行開始:

使用TensorFlow構(gòu)建,繪制和解釋人工神經(jīng)網(wǎng)絡(luò)

“訓(xùn)練模型”是什么意思?

在數(shù)學(xué)公式中搜索最佳參數(shù),以最大程度地減少預(yù)測誤差。在回歸模型,即線性回歸中,您必須找到最佳權(quán)重,在基于樹的模型(即隨機森林)中,這是關(guān)于找到最佳拆分點......

使用TensorFlow構(gòu)建,繪制和解釋人工神經(jīng)網(wǎng)絡(luò)

通常,權(quán)重是隨機初始化的,然后隨著學(xué)習(xí)的進行進行調(diào)整。在這里,我將它們?nèi)吭O(shè)置為 1:

使用TensorFlow構(gòu)建,繪制和解釋人工神經(jīng)網(wǎng)絡(luò)

圖片來源:作者

到目前為止,我們還沒有做任何與線性回歸不同的事情。對于業(yè)務(wù)來說,這很簡單。

現(xiàn)在,這里是從線性模型 Σ(xiwi)=Y 到非線性模型 f ( Σ(xiwi)=Y 的升級...輸入激活函數(shù)。

使用TensorFlow構(gòu)建,繪制和解釋人工神經(jīng)網(wǎng)絡(luò)

圖片來源:作者

激活函數(shù)定義該節(jié)點的輸出。有很多,甚至可以創(chuàng)建一些自定義函數(shù),您可以在官方文檔中找到詳細信息并查看此備忘單。如果我們在示例中設(shè)置一個簡單的線性函數(shù),那么我們與線性回歸模型沒有區(qū)別。

使用TensorFlow構(gòu)建,繪制和解釋人工神經(jīng)網(wǎng)絡(luò)

來源:維基百科

我將使用僅返回 1 或 0 的二進制步驟激活函數(shù):

使用TensorFlow構(gòu)建,繪制和解釋人工神經(jīng)網(wǎng)絡(luò)

來源:維基百科

使用TensorFlow構(gòu)建,繪制和解釋人工神經(jīng)網(wǎng)絡(luò)

圖片來源:作者

我們有感知器的輸出,這是一個單層神經(jīng)網(wǎng)絡(luò),它接受一些輸入并返回 1 個輸出?,F(xiàn)在,模型的訓(xùn)練將繼續(xù),將輸出與目標進行比較,計算誤差并優(yōu)化權(quán)重,一次又一次地重復(fù)整個過程。

圖片來源:作者 這是神經(jīng)元的常見表示形式:

使用TensorFlow構(gòu)建,繪制和解釋人工神經(jīng)網(wǎng)絡(luò)

圖片來源:作者

深度神經(jīng)網(wǎng)絡(luò)

可以說所有的深度學(xué)習(xí)模型都是神經(jīng)網(wǎng)絡(luò),但并非所有的神經(jīng)網(wǎng)絡(luò)都是深度學(xué)習(xí)模型。一般來說,“深度”學(xué)習(xí)適用于算法至少有 2 個隱藏層(因此總共 4 層,包括輸入和輸出)的情況。

想象一下同時復(fù)制神經(jīng)元進程3次:由于每個節(jié)點(加權(quán)和和激活函數(shù))返回一個值,我們將擁有具有3個輸出的第一個隱藏層。

使用TensorFlow構(gòu)建,繪制和解釋人工神經(jīng)網(wǎng)絡(luò)

圖片來源:作者 現(xiàn)在讓我們再次使用這 3 個輸出作為第二個隱藏層的輸入,該隱藏層返回 3 個新數(shù)字。最后,我們將添加一個輸出層(僅 1 個節(jié)點)以獲得模型的最終預(yù)測。

圖片來源:作者 請記住,這些層可以具有不同數(shù)量的神經(jīng)元和不同的激活函數(shù),并且在每個節(jié)點中,權(quán)重被訓(xùn)練以優(yōu)化最終結(jié)果。這就是為什么添加的層越多,可訓(xùn)練參數(shù)的數(shù)量就越多。

現(xiàn)在,您可以查看神經(jīng)網(wǎng)絡(luò)的全貌:

圖片來源:作者 請注意,為了盡可能簡單,我沒有提到業(yè)務(wù)部門可能不感興趣的某些細節(jié),但數(shù)據(jù)科學(xué)家絕對應(yīng)該意識到這一點。特別:

偏差:在每個神經(jīng)元內(nèi)部,輸入和權(quán)重的線性組合還包括一個偏差,類似于線性方程中的常數(shù),因此神經(jīng)元的完整公式為 f( Σ(Xi * Wi ) + 偏置 )

反向傳播:在訓(xùn)練期間,模型通過將誤差傳播回節(jié)點并更新參數(shù)(權(quán)重和偏差)來學(xué)習(xí),以最大程度地減少損失。

來源:3Blue1Brown (Youtube) 梯度下降:用于訓(xùn)練神經(jīng)網(wǎng)絡(luò)的優(yōu)化算法,通過在最陡下降的方向上重復(fù)步驟來找到損失函數(shù)的局部最小值。

source:?3Blue1Brown?(Youtube)
Model?Design
The?easiest?way?to?build?a?Neural?Network?with?TensorFlow?is?with?the?Sequential?class?of?Keras.?Let’s?use?it?to?make?the?Perceptron?from?our?previous?example,?so?a?model?with?only?one?Dense?layer.?It?is?the?most?basic?layer?as?it?feeds?all?its?inputs?to?all?the?neurons,?each?neuron?providing?one?output.

model?=?models.Sequential(name="Perceptron",?layers=[
????layers.Dense(?????????????#a?fully?connected?layer
??????????name="dense",
??????????input_dim=3,????????#with?3?features?as?the?input
??????????units=1,????????????#and?1?node?because?we?want?1?output
??????????activation='linear'?#f(x)=x
????)
])
model.summary()
使用TensorFlow構(gòu)建,繪制和解釋人工神經(jīng)網(wǎng)絡(luò)

圖片來源:作者

摘要函數(shù)提供結(jié)構(gòu)和大小的快照(就要訓(xùn)練的參數(shù)而言)。在這種情況下,我們只有 4 個(3 個權(quán)重和 1 個偏差),所以它非常輕巧。

如果你想使用Keras中尚未包含的激活函數(shù),就像我在可視化示例中展示的二進制步驟函數(shù)一樣,你必須弄臟原始TensorFlow:

#?define?the?function
import?tensorflow?as?tf
def?binary_step_activation(x):
????##return?1?if?x>0?else?0?
????return?K.switch(x>0,?tf.math.divide(x,x),?tf.math.multiply(x,0))

#?build?the?model
model?=?models.Sequential(name="Perceptron",?layers=[
??????layers.Dense(?????????????
??????????name="dense",
??????????input_dim=3,????????
??????????units=1,????????????
??????????activation=binary_step_activation
??????)
])

現(xiàn)在讓我們嘗試從感知器轉(zhuǎn)向深度神經(jīng)網(wǎng)絡(luò)??赡苣銜栕约阂恍﹩栴}:

多少層? 正確的答案是“嘗試不同的變體,看看什么有效”。

我通常使用 Dropout 處理 2 個密集隱藏層,這是一種通過將輸入隨機設(shè)置為 0 來減少過度擬合的技術(shù)。

隱藏層對于克服數(shù)據(jù)的非線性很有用,因此如果您不需要非線性,則可以避免隱藏層。過多的隱藏層會導(dǎo)致過度擬合。

使用TensorFlow構(gòu)建,繪制和解釋人工神經(jīng)網(wǎng)絡(luò)

圖片來源:作者

有多少神經(jīng)元? 隱藏神經(jīng)元的數(shù)量應(yīng)該介于輸入層的大小和輸出層的大小之間。我的經(jīng)驗法則是(輸入數(shù) + 1 輸出)/2。

什么是激活功能? 有很多,我們不能說一個絕對更好。無論如何,最常用的是 ReLU,這是一個分段線性函數(shù),只有在為正時才返回輸出,并且主要用于隱藏層。

此外,輸出層必須具有與預(yù)期輸出兼容的激活。例如,線性函數(shù)適用于回歸問題,而 Sigmoid 通常用于分類。

使用TensorFlow構(gòu)建,繪制和解釋人工神經(jīng)網(wǎng)絡(luò)

來源:維基百科

我將假設(shè)一個包含 N 個特征和 1 個二進制目標變量的輸入數(shù)據(jù)集(很可能是一個分類用例)。

n_features?=?10
model?=?models.Sequential(name="DeepNN",?layers=[
????###?hidden?layer?1
????layers.Dense(name="h1",?input_dim=n_features,
?????????????????units=int(round((n_features+1)/2)),?
?????????????????activation='relu'),
????layers.Dropout(name="drop1",?rate=0.2),
????
????###?hidden?layer?2
????layers.Dense(name="h2",?units=int(round((n_features+1)/4)),?
?????????????????activation='relu'),
????layers.Dropout(name="drop2",?rate=0.2),
????
????###?layer?output
????layers.Dense(name="output",?units=1,?activation='sigmoid')
])
model.summary()
使用TensorFlow構(gòu)建,繪制和解釋人工神經(jīng)網(wǎng)絡(luò)

圖片來源:作者

請注意,順序類并不是使用 Keras 構(gòu)建神經(jīng)網(wǎng)絡(luò)的唯一方法。Model 類提供了對層的更大靈活性和控制,可用于構(gòu)建具有多個輸入/輸出的更復(fù)雜的模型。有兩個主要區(qū)別:

在順序類中,需要指定輸入層,它隱含在第一個密集層的輸入維度中。 這些圖層像對象一樣保存,可以應(yīng)用于其他圖層的輸出,例如:輸出 = layer(...)(輸入) 這就是如何使用 Model 類來構(gòu)建我們的感知器和 DeepNN:

#?Perceptron
inputs?=?layers.Input(name="input",?shape=(3,))
outputs?=?layers.Dense(name="output",?units=1,?
???????????????????????activation='linear')(inputs)
model?=?models.Model(inputs=inputs,?outputs=outputs,?
?????????????????????name="Perceptron")

#?DeepNN
###?layer?input
inputs?=?layers.Input(name="input",?shape=(n_features,))
###?hidden?layer?1
h1?=?layers.Dense(name="h1",?units=int(round((n_features+1)/2)),?activation='relu')(inputs)
h1?=?layers.Dropout(name="drop1",?rate=0.2)(h1)
###?hidden?layer?2
h2?=?layers.Dense(name="h2",?units=int(round((n_features+1)/4)),?activation='relu')(h1)
h2?=?layers.Dropout(name="drop2",?rate=0.2)(h2)
###?layer?output
outputs?=?layers.Dense(name="output",?units=1,?activation='sigmoid')(h2)
model?=?models.Model(inputs=inputs,?outputs=outputs,?name="DeepNN")

始終可以檢查模型摘要中的參數(shù)數(shù)量是否與順序中的參數(shù)數(shù)量相同。

可視化

請記住,我們正在向企業(yè)講述一個故事,可視化是我們最好的盟友。

我準備了一個函數(shù)來繪制人工神經(jīng)網(wǎng)絡(luò)的 TensorFlow 模型的結(jié)構(gòu),這是完整的代碼:

'''
Extract?info?for?each?layer?in?a?keras?model.
'
''
def?utils_nn_config(model):
????lst_layers?=?[]
????if?"Sequential"?in?str(model):?#->?Sequential?doesn't?show?the?input?layer
????????layer?=?model.layers[0]
????????lst_layers.append({"name":"input",?"in":int(layer.input.shape[-1]),?"neurons":0,?
???????????????????????????"out":int(layer.input.shape[-1]),?"activation":None,
???????????????????????????"params":0,?"bias":0})
????for?layer?in?model.layers:
????????try:
????????????dic_layer?=?{"name":layer.name,?"in":int(layer.input.shape[-1]),?"neurons":layer.units,?
?????????????????????????"out":int(layer.output.shape[-1]),?"activation":layer.get_config()["activation"],
?????????????????????????"params":layer.get_weights()[0],?"bias":layer.get_weights()[1]}
????????except:
????????????dic_layer?=?{"name":layer.name,?"in":int(layer.input.shape[-1]),?"neurons":0,?
?????????????????????????"out":int(layer.output.shape[-1]),?"activation":None,
?????????????????????????"params":0,?"bias":0}
????????lst_layers.append(dic_layer)
????return?lst_layers



'''
Plot?the?structure?of?a?keras?neural?network.
'
''
def?visualize_nn(model,?description=False,?figsize=(10,8)):
????##?get?layers?info
????lst_layers?=?utils_nn_config(model)
????layer_sizes?=?[layer["out"]?for?layer?in?lst_layers]
????
????##?fig?setup
????fig?=?plt.figure(figsize=figsize)
????ax?=?fig.gca()
????ax.set(title=model.name)
????ax.axis('off')
????left,?right,?bottom,?top?=?0.1,?0.9,?0.1,?0.9
????x_space?=?(right-left)?/?float(len(layer_sizes)-1)
????y_space?=?(top-bottom)?/?float(max(layer_sizes))
????p?=?0.025
????
????##?nodes
????for?i,n?in?enumerate(layer_sizes):
????????top_on_layer?=?y_space*(n-1)/2.0?+?(top+bottom)/2.0
????????layer?=?lst_layers[i]
????????color?=?"green"?if?i?in?[0,?len(layer_sizes)-1]?else?"blue"
????????color?=?"red"?if?(layer['neurons']?==?0)?and?(i?>?0)?else?color
????????
????????###?add?description
????????if?(description?is?True):
????????????d?=?i?if?i?==?0?else?i-0.5
????????????if?layer['activation']?is?None:
????????????????plt.text(x=left+d*x_space,?y=top,?fontsize=10,?color=color,?s=layer["name"].upper())
????????????else:
????????????????plt.text(x=left+d*x_space,?y=top,?fontsize=10,?color=color,?s=layer["name"].upper())
????????????????plt.text(x=left+d*x_space,?y=top-p,?fontsize=10,?color=color,?s=layer['activation']+"?(")
????????????????plt.text(x=left+d*x_space,?y=top-2*p,?fontsize=10,?color=color,?s="Σ"+str(layer['in'])+"[X*w]+b")
????????????????out?=?"?Y"??if?i?==?len(layer_sizes)-1?else?"?out"
????????????????plt.text(x=left+d*x_space,?y=top-3*p,?fontsize=10,?color=color,?s=")?=?"+str(layer['neurons'])+out)
????????
????????###?circles
????????for?m?in?range(n):
????????????color?=?"limegreen"?if?color?==?"green"?else?color
????????????circle?=?plt.Circle(xy=(left+i*x_space,?top_on_layer-m*y_space-4*p),?radius=y_space/4.0,?color=color,?ec='k',?zorder=4)
????????????ax.add_artist(circle)
????????????
????????????###?add?text
????????????if?i?==?0:
????????????????plt.text(x=left-4*p,?y=top_on_layer-m*y_space-4*p,?fontsize=10,?s=r'$X_{'+str(m+1)+'}$')
????????????elif?i?==?len(layer_sizes)-1:
????????????????plt.text(x=right+4*p,?y=top_on_layer-m*y_space-4*p,?fontsize=10,?s=r'$y_{'+str(m+1)+'}$')
????????????else:
????????????????plt.text(x=left+i*x_space+p,?y=top_on_layer-m*y_space+(y_space/8.+0.01*y_space)-4*p,?fontsize=10,?s=r'$H_{'+str(m+1)+'}$')
????
????##?links
????for?i,?(n_a,?n_b)?in?enumerate(zip(layer_sizes[:-1],?layer_sizes[1:])):
????????layer?=?lst_layers[i+1]
????????color?=?"green"?if?i?==?len(layer_sizes)-2?else?"blue"
????????color?=?"red"?if?layer['neurons']?==?0?else?color
????????layer_top_a?=?y_space*(n_a-1)/2.?+?(top+bottom)/2.?-4*p
????????layer_top_b?=?y_space*(n_b-1)/2.?+?(top+bottom)/2.?-4*p
????????for?m?in?range(n_a):
????????????for?o?in?range(n_b):
????????????????line?=?plt.Line2D([i*x_space+left,?(i+1)*x_space+left],?
??????????????????????????????????[layer_top_a-m*y_space,?layer_top_b-o*y_space],?
??????????????????????????????????c=color,?alpha=0.5)
????????????????if?layer['activation']?is?None:
????????????????????if?o?==?m:
????????????????????????ax.add_artist(line)
????????????????else:
????????????????????ax.add_artist(line)
????plt.show()

讓我們在我們的 2 個模型上嘗試一下,首先是感知器:

visualize_nn(model,?description=True,?figsize=(10,8))
使用TensorFlow構(gòu)建,繪制和解釋人工神經(jīng)網(wǎng)絡(luò)

圖片來源:作者

然后是深度神經(jīng)網(wǎng)絡(luò):

使用TensorFlow構(gòu)建,繪制和解釋人工神經(jīng)網(wǎng)絡(luò)

圖片來源:作者

TensorFlow也提供了一個繪制模型結(jié)構(gòu)的工具,你可能希望將其用于具有更復(fù)雜層(CNN,RNN等)的更復(fù)雜的神經(jīng)網(wǎng)絡(luò)。有時設(shè)置起來有點棘手,如果您有問題,這篇文章可能會有所幫助。

utils.plot_model(model,?to_file='model.png',?show_shapes=True,?show_layer_names=True)
使用TensorFlow構(gòu)建,繪制和解釋人工神經(jīng)網(wǎng)絡(luò)

圖片來源:作者

這會將此圖像保存在筆記本電腦上,因此,如果您只想將其繪制在筆記本上,只需運行以下命令即可刪除該文件:

import?os
os.remove('model.png')

訓(xùn)練與測試

最后,是時候訓(xùn)練我們的深度學(xué)習(xí)模型了。為了使它運行,我們必須“編譯”,或者換句話說,我們需要定義優(yōu)化器、損失函數(shù)和指標。

我通常使用 Adam 優(yōu)化器,這是一種梯度下降的替代優(yōu)化算法(自適應(yīng)優(yōu)化器中最好的)。其他參數(shù)取決于用例。

在(二元)分類問題中,您應(yīng)該使用(二元)交叉熵損失,它將每個預(yù)測概率與實際類輸出進行比較。

至于指標,我喜歡監(jiān)控準確性和 F1 分數(shù),這是一個結(jié)合了精度和召回率的指標(后者必須實現(xiàn),因為它尚未包含在 TensorFlow 中)。

#?define?metrics
def?Recall(y_true,?y_pred):
????true_positives?=?K.sum(K.round(K.clip(y_true?*?y_pred,?0,?1)))
????possible_positives?=?K.sum(K.round(K.clip(y_true,?0,?1)))
????recall?=?true_positives?/?(possible_positives?+?K.epsilon())
????return?recall

def?Precision(y_true,?y_pred):
????true_positives?=?K.sum(K.round(K.clip(y_true?*?y_pred,?0,?1)))
????predicted_positives?=?K.sum(K.round(K.clip(y_pred,?0,?1)))
????precision?=?true_positives?/?(predicted_positives?+?K.epsilon())
????return?precision

def?F1(y_true,?y_pred):
????precision?=?Precision(y_true,?y_pred)
????recall?=?Recall(y_true,?y_pred)
????return?2*((precision*recall)/(precision+recall+K.epsilon()))

#?compile?the?neural?network
model.compile(optimizer='adam',?loss='binary_crossentropy',?
??????????????metrics=['accuracy',F1])

另一方面,在回歸問題中,我通常將 MAE 設(shè)置為損失,將 R 平方設(shè)置為度量。

#?define?metrics
def?R2(y,?y_hat):
????ss_res?=??K.sum(K.square(y?-?y_hat))?
????ss_tot?=?K.sum(K.square(y?-?K.mean(y)))?
????return?(?1?-?ss_res/(ss_tot?+?K.epsilon())?)

#?compile?the?neural?network
model.compile(optimizer='adam',?loss='mean_absolute_error',?
??????????????metrics=[R2])

在開始訓(xùn)練之前,我們還需要確定 Epochs 和 Batches:由于數(shù)據(jù)集可能太大而無法一次全部處理,因此將其拆分為多個批次(批處理大小越大,需要的內(nèi)存空間就越多)。

反向傳播和隨后的參數(shù)更新每批發(fā)生一次,是整個訓(xùn)練集的一次傳遞。因此,如果您有 100 個觀測值,并且批大小為 20,則需要 5 個批次才能完成 1 個 epoch。批大小應(yīng)為 2 的倍數(shù)(常見:32、64、128、256),因為計算機通常以 2 的冪組織內(nèi)存。

我傾向于從 100 個 epoch 開始,批大小為 32。

在訓(xùn)練期間,我們希望看到指標得到改善,損失逐個時期減少。此外,最好保留一部分數(shù)據(jù) (20%-30%) 進行驗證。

換句話說,模型將分離這部分數(shù)據(jù),以評估訓(xùn)練之外的每個紀元結(jié)束時的損失和指標。

假設(shè)你已經(jīng)把你的數(shù)據(jù)準備好到一些 X 和 y 數(shù)組中(如果沒有,你可以簡單地生成隨機數(shù)據(jù),如

import?numpy?as?np
X?=?np.random.rand(1000,10)
y?=?np.random.choice([1,0],?size=1000)
),您可以按如下方式啟動和可視化訓(xùn)練:

#?train/validation
training?=?model.fit(x=X,?y=y,?batch_size=32,?epochs=100,?shuffle=True,?verbose=0,?validation_split=0.3)

#?plot
metrics?=?[k?for?k?in?training.history.keys()?if?("loss"?not?in?k)?and?("val"?not?in?k)]????
fig,?ax?=?plt.subplots(nrows=1,?ncols=2,?sharey=True,?figsize=(15,3))
???????
##?training????
ax[0].set(title="Training")????
ax11?=?ax[0].twinx()????
ax[0].plot(training.history['loss'],?color='black')????ax[0].set_xlabel('Epochs')????
ax[0].set_ylabel('Loss',?color='black')????
for?metric?in?metrics:????????
????ax11.plot(training.history[metric],?label=metric)????ax11.set_ylabel("Score",?color='steelblue')????
ax11.legend()
????????
##?validation????
ax[1].set(title="Validation")????
ax22?=?ax[1].twinx()????
ax[1].plot(training.history['val_loss'],?color='black')????ax[1].set_xlabel('Epochs')????
ax[1].set_ylabel('Loss',?color='black')????
for?metric?in?metrics:??????????
????ax22.plot(training.history['val_'+metric],?label=metric)????ax22.set_ylabel("Score",?color="steelblue")????
plt.show()
使用TensorFlow構(gòu)建,繪制和解釋人工神經(jīng)網(wǎng)絡(luò)

圖片由作者提供分類示例

圖片由作者提供?;貧w示例,此處為筆記本 這些圖取自兩個實際用例,這兩個用例將標準機器學(xué)習(xí)算法與神經(jīng)網(wǎng)絡(luò)進行比較(每個圖像下的鏈接)。

可解釋性

我們訓(xùn)練并測試了我們的模型,但我們?nèi)匀粵]有說服業(yè)務(wù)部門相信結(jié)果......我們能做什么?很簡單,我們構(gòu)建了一個解釋器來證明我們的深度學(xué)習(xí)模型不是一個黑匣子。

我發(fā)現(xiàn)Shap與神經(jīng)網(wǎng)絡(luò)配合得很好:對于每個預(yù)測,它能夠估計每個特征對模型預(yù)測值的貢獻?;旧?,它回答了“為什么模型說這是 1 而不是 0?”的問題。

您可以使用以下代碼:

請注意,您也可以在其他機器學(xué)習(xí)模型(即線性回歸、隨機森林)上使用此功能,而不僅僅是神經(jīng)網(wǎng)絡(luò)。

正如您可以從代碼中讀到的那樣,如果X_train參數(shù)保留為 None,我的函數(shù)假定它不是深度學(xué)習(xí)。

讓我們在分類和回歸示例中對其進行測試:

i?=?1
explainer_shap(model,?
???????????????X_names=list_feature_names,?
???????????????X_instance=X[i],?
???????????????X_train=X,?
???????????????task="classification",?#task="regression"
???????????????top=10)
使用TensorFlow構(gòu)建,繪制和解釋人工神經(jīng)網(wǎng)絡(luò)

圖片由作者提供。分類示例,泰坦尼克號數(shù)據(jù)集中,預(yù)測是“幸存”主要是因為虛擬變量_male=0,所以乘客是女性。

使用TensorFlow構(gòu)建,繪制和解釋人工神經(jīng)網(wǎng)絡(luò)

圖片由作者提供?;貧w示例房價數(shù)據(jù)集,這個房價的主要驅(qū)動力是一個大地下室。

結(jié)論

本文是一個教程,演示如何設(shè)計和構(gòu)建人工神經(jīng)網(wǎng)絡(luò),無論是深度的還是非深度的。 我一步一步地分解了單個神經(jīng)元內(nèi)部發(fā)生的事情,更普遍地說是層內(nèi)發(fā)生的事情。我讓這個故事變得簡單,就好像我們正在向業(yè)務(wù)部門解釋深度學(xué)習(xí)一樣,使用了大量的可視化。

在本教程的第二部分中,我們使用TensorFlow創(chuàng)建了一些神經(jīng)網(wǎng)絡(luò),從感知器到更復(fù)雜的神經(jīng)網(wǎng)絡(luò)。然后,我們訓(xùn)練了深度學(xué)習(xí)模型,并評估了它在分類和回歸用例中的可解釋性。

本文由 mdnice 多平臺發(fā)布文章來源地址http://www.zghlxwxcb.cn/news/detail-469955.html

到了這里,關(guān)于使用TensorFlow構(gòu)建,繪制和解釋人工神經(jīng)網(wǎng)絡(luò)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 深入了解神經(jīng)網(wǎng)絡(luò):構(gòu)建人工智能的基石

    深入了解神經(jīng)網(wǎng)絡(luò):構(gòu)建人工智能的基石

    目錄 引言: 第一部分:神經(jīng)元 - 生物的靈感 第二部分:人工神經(jīng)元 - 數(shù)學(xué)的力量 第三部分:神經(jīng)網(wǎng)絡(luò) - 層層堆疊 第四部分:訓(xùn)練神經(jīng)網(wǎng)絡(luò) - 損失函數(shù)和反向傳播算法 結(jié)論: 神經(jīng)網(wǎng)絡(luò)是一種受到生物神經(jīng)系統(tǒng)啟發(fā)的人工智能模型,它重現(xiàn)了大腦中神經(jīng)元之間相互連接的方式

    2024年04月15日
    瀏覽(29)
  • 【人工智能概論】 構(gòu)建神經(jīng)網(wǎng)絡(luò)——以用InceptionNet解決MNIST任務(wù)為例

    【人工智能概論】 構(gòu)建神經(jīng)網(wǎng)絡(luò)——以用InceptionNet解決MNIST任務(wù)為例

    兩條原則,四個步驟。 從宏觀到微觀 把握數(shù)據(jù)形狀 準備數(shù)據(jù) 構(gòu)建模型 確定優(yōu)化策略 完善訓(xùn)練與測試代碼 InceptionNet的設(shè)計思路是通過增加網(wǎng)絡(luò)寬度來獲得更好的模型性能。 其核心在于基本單元Inception結(jié)構(gòu)塊,如下圖: 通過縱向堆疊Inception塊構(gòu)建完整網(wǎng)絡(luò)。 MNIST是入門級的

    2023年04月20日
    瀏覽(30)
  • 從零使用TensorFlow搭建CNN(卷積)神經(jīng)網(wǎng)絡(luò)

    從零使用TensorFlow搭建CNN(卷積)神經(jīng)網(wǎng)絡(luò)

    ?? 寫在前面 ????? 博主介紹:大家好,這里是hyk寫算法了嗎,一枚致力于學(xué)習(xí)算法和人工智能領(lǐng)域的小菜鳥。 ??個人主頁:主頁鏈接(歡迎各位大佬光臨指導(dǎo)) ??近期專欄:機器學(xué)習(xí)與深度學(xué)習(xí) ???????????????????????LeetCode算法實例 本節(jié)內(nèi)容主要向大家

    2023年04月22日
    瀏覽(27)
  • 機器學(xué)習(xí)16:使用 TensorFlow 進行神經(jīng)網(wǎng)絡(luò)編程練習(xí)

    在【機器學(xué)習(xí)15】中,筆者介紹了神經(jīng)網(wǎng)絡(luò)的基本原理。在本篇中,我們使用 TensorFlow 來訓(xùn)練、驗證神經(jīng)網(wǎng)絡(luò)模型,并探索不同 “層數(shù)+節(jié)點數(shù)” 對模型預(yù)測效果的影響,以便讀者對神經(jīng)網(wǎng)絡(luò)模型有一個更加直觀的認識。 目錄 1.導(dǎo)入依賴模塊 2.加載數(shù)據(jù)集 3.表示數(shù)據(jù)

    2024年02月12日
    瀏覽(15)
  • 【優(yōu)化算法】使用遺傳算法優(yōu)化MLP神經(jīng)網(wǎng)絡(luò)參數(shù)(TensorFlow2)

    【優(yōu)化算法】使用遺傳算法優(yōu)化MLP神經(jīng)網(wǎng)絡(luò)參數(shù)(TensorFlow2)

    使用啟發(fā)式優(yōu)化算法 遺傳算法 對多層感知機中中間層神經(jīng)個數(shù)進行優(yōu)化,以提高模型的準確率。 待優(yōu)化的模型: 基于TensorFlow2實現(xiàn)的Mnist手寫數(shù)字識別多層感知機MLP 設(shè)置隨機樹種子,避免相同結(jié)構(gòu)的神經(jīng)網(wǎng)絡(luò)其結(jié)果不同的影響。 準確率為96.7% 使用scikit-opt提供的遺傳算法庫

    2023年04月13日
    瀏覽(111)
  • 卷積神經(jīng)網(wǎng)絡(luò)教程 (CNN) – 使用 TensorFlow 在 Python 中開發(fā)圖像分類器

    在這篇博客中,讓我們討論什么是卷積神經(jīng)網(wǎng)絡(luò) (CNN) 以及?卷積神經(jīng)網(wǎng)絡(luò)背后的 架構(gòu) ——旨在 解決 ? 圖像識別 系統(tǒng)和 分類 問題。?卷積神經(jīng)網(wǎng)絡(luò)在圖像和視頻識別、推薦系統(tǒng)和 自然語言處理方面有著 廣泛的應(yīng)用 。 目錄 計算機如何讀取圖像? 為什么不是全連接網(wǎng)絡(luò)?

    2024年02月12日
    瀏覽(19)
  • ubuntu深度學(xué)習(xí)使用TensorFlow卷積神經(jīng)網(wǎng)絡(luò)——圖片數(shù)據(jù)集的制作以及制作好的數(shù)據(jù)集的使用

    ubuntu深度學(xué)習(xí)使用TensorFlow卷積神經(jīng)網(wǎng)絡(luò)——圖片數(shù)據(jù)集的制作以及制作好的數(shù)據(jù)集的使用

    首先我事先準備好五分類的圖片放在對應(yīng)的文件夾,圖片資源在我的gitee文件夾中鏈接如下: 文件管理: 用于存各種數(shù)據(jù) https://gitee.com/xiaoxiaotai/file-management.git ?里面有imgs目錄和npy目錄,imgs就是存放5分類的圖片的目錄,里面有桂花、楓葉、五味子、銀杏、竹葉5種植物,npy目

    2024年02月05日
    瀏覽(92)
  • pytorch工具——使用pytorch構(gòu)建一個神經(jīng)網(wǎng)絡(luò)
  • 使用PyTorch構(gòu)建神經(jīng)網(wǎng)絡(luò),并計算參數(shù)Params

    使用PyTorch構(gòu)建神經(jīng)網(wǎng)絡(luò),并計算參數(shù)Params

    在深度學(xué)習(xí)中,模型的參數(shù)數(shù)量是一個非常重要的指標,通常會影響模型的大小、訓(xùn)練速度和準確度等多個方面。在本教程中,我們將介紹如何計算深度學(xué)習(xí)模型的參數(shù)數(shù)量。 本教程將以PyTorch為例,展示如何計算一個包含卷積、池化、歸一化和全連接等多種層的卷積神經(jīng)網(wǎng)

    2024年02月03日
    瀏覽(33)
  • PyTorch深度學(xué)習(xí)實戰(zhàn)(3)——使用PyTorch構(gòu)建神經(jīng)網(wǎng)絡(luò)

    PyTorch深度學(xué)習(xí)實戰(zhàn)(3)——使用PyTorch構(gòu)建神經(jīng)網(wǎng)絡(luò)

    我們已經(jīng)學(xué)習(xí)了如何從零開始構(gòu)建神經(jīng)網(wǎng)絡(luò),神經(jīng)網(wǎng)絡(luò)通常包括輸入層、隱藏層、輸出層、激活函數(shù)、損失函數(shù)和學(xué)習(xí)率等基本組件。在本節(jié)中,我們將學(xué)習(xí)如何在簡單數(shù)據(jù)集上使用 PyTorch 構(gòu)建神經(jīng)網(wǎng)絡(luò),利用張量對象操作和梯度值計算更新網(wǎng)絡(luò)權(quán)重。 1.1 使用 PyTorch 構(gòu)建神

    2024年02月08日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包