自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

用 Python 繪制圖表理解神經(jīng)網(wǎng)絡

開發(fā) 后端 深度學習
在這篇文章中,我嘗試直觀地展示一個簡單的前饋神經(jīng)網(wǎng)絡如何在訓練過程中將一組輸入映射到不同的空間,以便更容易理解它們。

 Python中文社區(qū)(ID:python-china)

人工神經(jīng)網(wǎng)絡 (ANN) 已成功應用于許多需要人工監(jiān)督的日常任務,但由于其復雜性,很難理解它們的工作方式和訓練方式。

在這篇博客中,我們深入討論了神經(jīng)網(wǎng)絡是什么、它們是如何工作的,以及如何將它們應用于諸如尋找異常值或預測金融時間序列之類的問題。

在這篇文章中,我嘗試直觀地展示一個簡單的前饋神經(jīng)網(wǎng)絡如何在訓練過程中將一組輸入映射到不同的空間,以便更容易理解它們。

數(shù)據(jù)

為了展示它是如何工作的,首先我創(chuàng)建了一個“ toy”數(shù)據(jù)集。它包含 400 個均勻分布在兩個類(0 和 1)中的樣本,每個樣本具有兩個維度(X0 和 X1)。

注:所有數(shù)據(jù)均來自三個隨機正態(tài)分布,均值為 [-1, 0, 1],標準差為 [0.5, 0.5, 0.5]。

網(wǎng)絡架構(gòu)

下一步是定義ANN的結(jié)構(gòu),如下:

隱藏層的維度最?。? 個神經(jīng)元)以顯示網(wǎng)絡在 2D 散點圖中映射每個樣本的位置。

盡管前面的圖表沒有顯示,但每一層都有一個修改其輸出的激活函數(shù)。

•輸入層有一個linear激活函數(shù)來復制它的輸入值。

•隱藏層具有ReLU或tanh激活函數(shù)。

•輸出層有一個sigmoid激活函數(shù),可以將其輸入值“縮小”到 [0, 1] 范圍內(nèi)。

訓練

除了網(wǎng)絡的架構(gòu)之外,神經(jīng)網(wǎng)絡的另一個關(guān)鍵方面是訓練過程。訓練 ANN 的方法有很多種,但最常見的是反向傳播過程。

反向傳播過程首先將所有訓練案例(或一批)前饋到網(wǎng)絡,然后優(yōu)化器根據(jù)損失函數(shù)計算“如何”更新網(wǎng)絡的權(quán)重,并根據(jù)學習率更新它們。

當損失收斂、經(jīng)過一定數(shù)量的 epoch 或用戶停止訓練時,訓練過程停止。一個epoch 表示所有的數(shù)據(jù)送入網(wǎng)絡中, 完成了一次前向計算 + 反向傳播的過程。

在我們的研究案例中,該架構(gòu)使用隱藏層中的 2 個不同激活函數(shù)(ReLU 和 Tanh)和 3 個不同的學習率(0.1、0.01 和 0.001)進行訓練。

在輸入樣本周圍,有一個“網(wǎng)格”點,顯示模型為該位置的樣本提供的預測概率。這使得模型在訓練過程中生成的邊界更加清晰。 

  1. # figure holding the evolution  
  2. f, axes = plt.subplots(1, 3, figsize=(18, 6), gridspec_kw={'height_ratios':[.9]})  
  3. f.subplots_adjust(top=0.82)  
  4. # camera to record the evolution  
  5. camera = Camera(f)  
  6. # number of epochs  
  7. epochs = 20  
  8. # iterate epoch times  
  9. for i in range(epochs):  
  10.     # evaluate the model (acc, loss)  
  11.     evaluation = model.evaluate(x_train, y_train, verbose=0 
  12.     # generate intermediate models  
  13.     model_hid_1 = Model(model.input, model.get_layer("hidden_1").output)  
  14.     model_act_1 = Model(model.input, model.get_layer("activation_1").output) 
  15.      # generate data  
  16.     df_hid_1 = pd.DataFrame(model_hid_1.predict(x_train), columns=['X0', 'X1'])  
  17.     df_hid_1['y'] = y_train  
  18.     df_act_1 = pd.DataFrame(model_act_1.predict(x_train), columns=['X0', 'X1'])  
  19.     df_act_1['y'] = y_train  
  20.     # generate meshgrid (200 values)  
  21.     x = np.linspace(x_train[:,0].min(), x_train[:,0].max(), 200)  
  22.     y = np.linspace(x_train[:,1].min(), x_train[:,1].max(), 200)  
  23.     xv, yv = np.meshgrid(x, y)  
  24.     # generate meshgrid intenisty  
  25.     df_mg_train = pd.DataFrame(np.stack((xv.flatten(), yv.flatten()), axis=1), columns=['X0', 'X1'])  
  26.     df_mg_train['y'] = model.predict(df_mg_train.values)  
  27.     df_mg_hid_1 = pd.DataFrame(model_hid_1.predict(df_mg_train.values[:,:-1]), columns=['X0', 'X1'])  
  28.     df_mg_hid_1['y'] = model.predict(df_mg_train.values[:,:-1])  
  29.     df_mg_act_1 = pd.DataFrame(model_act_1.predict(df_mg_train.values[:,:-1]), columns=['X0', 'X1'])  
  30.     df_mg_act_1['y'] = model.predict(df_mg_train.values[:,:-1])  
  31.     # show dataset        
  32.     ax = sns.scatterplot(x='X0'y='X1'data=df_mg_trainhue='y'x_jitter=Truey_jitter=Truelegend=Noneax=axes[0], palette=sns.diverging_palette(220, 20, as_cmap=True), alpha=0.15) 
  33.     ax = sns.scatterplot(x='X0'y='X1'data=df_trainhue='y'legend=Noneax=axes[0], palette=sns.diverging_palette(220, 20, n=2)) 
  34.     ax.set_title('Input layer')  
  35.     ax = sns.scatterplot(x='X0'y='X1'data=df_mg_hid_1hue='y'x_jitter=Truey_jitter=Truelegend=Noneax=axes[1], palette=sns.diverging_palette(220, 20, as_cmap=True), alpha=0.15) 
  36.     ax = sns.scatterplot(x='X0'y='X1'data=df_hid_1hue='y'legend=Noneax=axes[1], palette=sns.diverging_palette(220, 20, n=2)) 
  37.     ax.set_title('Hidden layer')  
  38.     # show the current epoch and the metrics  
  39.     ax.text(x=0.5, y=1.15, s='Epoch {}'.format(i+1), fontsize=16weight='bold'ha='center'va='bottom'transform=ax.transAxes)  
  40.     ax.text(x=0.5, y=1.08, s='Accuracy {:.3f} - Loss {:.3f}'.format(evaluation[1], evaluation[0]), fontsize=13ha='center'va='bottom'transform=ax.transAxes)  
  41.     ax = sns.scatterplot(x='X0'y='X1'data=df_mg_act_1hue='y'x_jitter=Truey_jitter=Truelegend=Noneax=axes[2], palette=sns.diverging_palette(220, 20, as_cmap=True), alpha=0.15) 
  42.     ax = sns.scatterplot(x='X0'y='X1'data=df_act_1hue='y'legend=Noneax=axes[2], palette=sns.diverging_palette(220, 20, n=2)) 
  43.     ax.set_title('Activation')  
  44.     # show the plot  
  45.     plt.show()  
  46.     # call to generate the GIF  
  47.     camera.snap()  
  48.     # stop execution if loss <= 0.263 (avoid looping 200 times if not needed)  
  49.     if evaluation[0] <= 0.263:  
  50.         break  
  51.     # train the model 1 epoch  
  52.     model.fit(x_train, y_train, epochs=1verbose=0

ReLU 激活

Tanh 激活

注意:使用的損失函數(shù)是二元交叉熵,因為我們正在處理二元分類問題,而優(yōu)化器是對原始隨機梯度下降 (SGD) 稱為 Adam 的修改。當epoch達到 200 或損失低于 0.263 時,模型訓練停止。 

 

責任編輯:龐桂玉 來源: Python中文社區(qū)
相關(guān)推薦

2009-10-23 16:43:01

VB.NET繪制圖形

2011-06-30 15:09:37

QT 繪制 圖形

2023-05-16 07:44:03

紋理映射WebGL

2020-05-27 11:10:54

KerasLSTM神經(jīng)網(wǎng)絡

2023-09-07 08:24:35

圖形編輯器開發(fā)繪制圖形工具

2013-12-04 16:07:27

Android游戲引擎libgdx教程

2013-12-27 13:00:30

Android開發(fā)Android應用Context Men

2021-02-07 09:40:19

Python神經(jīng)網(wǎng)絡人工智能

2020-09-08 13:02:00

Python神經(jīng)網(wǎng)絡感知器

2019-05-07 19:12:28

機器學習神經(jīng)網(wǎng)絡Python

2018-07-03 16:10:04

神經(jīng)網(wǎng)絡生物神經(jīng)網(wǎng)絡人工神經(jīng)網(wǎng)絡

2021-05-10 15:14:23

Python棒棒糖圖表

2023-01-04 11:18:21

Canvas 封裝pixi.js

2022-08-23 12:32:37

Python可視化圖表

2024-11-20 16:42:03

Python科學計算

2022-07-27 09:53:06

神經(jīng)網(wǎng)絡結(jié)構(gòu)

2020-12-19 11:05:57

循環(huán)神經(jīng)網(wǎng)絡PyTorch神經(jīng)網(wǎng)絡

2023-11-10 18:07:42

Python折線圖折線

2022-05-16 09:34:17

Python可視化圖表

2020-09-17 12:40:54

神經(jīng)網(wǎng)絡CNN機器學習
點贊
收藏

51CTO技術(shù)棧公眾號