使用 TensorFlow 實現神經網絡

?

深度學習在這十年中一直在興起,其應用是如此廣泛和驚人,以至于幾乎很難相信它的進步僅僅短短幾年。深度學習的核心是一個基本的“單元”,它支配著它的架構,是的,就是神經網絡。

神經網絡架構由許多神經元或我們所說的激活單元組成,這個單元回路的作用是尋找數據中的潛在關系。數學證明,神經網絡可以找到任何類型的關系/函數,無論其復雜性如何,只要它足夠深入/優(yōu)化,這就是它的潛力。

現在,我們來學習如何使用 TensorFlow 實現神經網絡

安裝 Tensorflow

Tensorflow 是由 Google 創(chuàng)建并開源的庫/平臺。它是深度學習應用程序中最常用的庫。現在,創(chuàng)建神經網絡可能不是 TensorFlow 庫的主要功能,但它經常用于此目的。因此,在繼續(xù)之前,讓我們安裝并導入 TensorFlow 模塊。

使用 pip/conda 命令在系統(tǒng)中安裝 TensorFlow

# terminal/zsh/cmd command
# pip
pip install tensorflow --upgrade

# conda
conda install -c conda-forge tensorflow
%tensorflow_version 2.x

下載并讀取數據

您可以使用任何您想要的數據集,這里我使用了 Kaggle 的紅葡萄酒質量數據集。這是一個分類問題,當然,你可以學習將這個概念應用到其他問題中。首先,在您的工作目錄中下載數據集。現在數據已下載,讓我們將數據加載為數據幀。

  • Python3 語言

import numpy as np
import pandas as pd
 
# be sure to change the file path
# if you have the dataset in another
# directly than the working folder
df = pd.read_csv('winequality-red.csv')
 
df.head()

 
 

輸出:

 

?

使用 TensorFlow 實現神經網絡的圖2 編輯

數據預處理/拆分為 Train/Valid/Test Set

 

有多種方法可以拆分數據,您可以定義自定義函數或使用時間戳(如果存在),也可以使用預定義函數,例如 train_test_split in scikit-learn。

 

在這里,我們使用 sample 函數獲取 75% 的數據來創(chuàng)建訓練集,然后將其余數據用于驗證集。您也可以而且應該創(chuàng)建一個測試集,但這里我們有一個非常小的數據集,我們在這里的主要重點是熟悉該過程并訓練神經網絡,對嗎?

 

現在讓我們劃分數據集。

 

  • Python3 語言

import tensorflow as tf
 
# 75% of the data is selected
train_df = df.sample(frac=0.75, random_state=4)
 
# it drops the training data
# from the original dataframe
val_df = df.drop(train_df.index)

需要注意的是,神經網絡通常對相同范圍內的數據執(zhí)行得更好。就像你有不同的列,在 1 列中,你的值范圍是 1-10,但在另一列中,它的范圍是 100-1000,建議首先將所有列縮放到相同的范圍以獲得更好的性能。

現在,最簡單的方法是:

值 — (列的最小值)/(列的范圍)

  • Python3 語言

# calling to (0,1) range
max_val = train_df.max(axis= 0)
min_val = train_df.min(axis= 0)
 
range = max_val - min_val
train_df = (train_df - min_val)/(range)
 
val_df =  (val_df- min_val)/range

既然我們已經完成了擴展數據并創(chuàng)建訓練和驗證數據集,那么讓我們將其分為特征,即輸入和目標,因為這就是我們將其傳遞給模型的方式。

  • Python3 語言

# now let's separate the targets and labels
X_train = train_df.drop('quality',axis=1)
X_val = val_df.drop('quality',axis=1)
y_train = train_df['quality']
y_val = val_df['quality']
 
# We'll need to pass the shape
# of features/inputs as an argument
# in our model, so let's define a variable
# to save it.
input_shape = [X_train.shape[1]]
 
input_shape

 
 

輸出:

 

[11]

 

這意味著我們將 11 個特征作為輸入傳遞到神經網絡的第一層。

 

創(chuàng)建模型神經網絡

 

Keras 模塊構建在 TensorFlow 之上,為我們提供了創(chuàng)建各種神經網絡架構的所有功能。我們將使用 Keras 中的 Sequential 類來構建我們的模型。首先,您可以嘗試使用線性模型,因為神經網絡基本上遵循與回歸相同的“數學”,因此您可以使用神經網絡創(chuàng)建線性模型,如下所示:

 

創(chuàng)建線性模型

 

  • Python3 語言

model = tf.keras.Sequential([
tf.keras.layers.Dense(units=1,input_shape=input_shape)])
 
# after you create your model it's
# always a good habit to print out it's summary
model.summary()

 
 

輸出:

 

?

使用 TensorFlow 實現神經網絡的圖4 編輯

 

但這基本上是一個線性模型,如果你的數據集稍微復雜一些,特征之間的關系更加多樣化,你想要一個非線性模型怎么辦?您需要什么?答案是激活函數。這就是神經網絡真正開始大放異彩的地方。在本文中,我們無法深入討論激活函數,但基本上,這些函數為我們的模型添加/引入非線性,你使用它們的次數越多,我們的模型可以找到的模式就越復雜。

 

創(chuàng)建多層神經網絡

 

我們將創(chuàng)建一個 3 層網絡,其中包含 1 個輸入層、1 個隱藏層 1(具有 64 個單元)和 1 個輸出層。我們將在隱藏層中使用 'relu' 激活函數。我們將在 Keras 模塊中使用 Sequential 方法,該方法通常用于創(chuàng)建多層神經網絡。在 keras 中,我們有不同類型的神經網絡層和/或轉換層,你可以使用它們來構建各種類型的神經網絡,但這里我們只使用了 3 個具有 relu 激活函數的 Dense 層(在 keras.layers 中)。

 

  • Python3 語言

model = tf.keras.Sequential([
 
    tf.keras.layers.Dense(units=64, activation='relu',
                          input_shape=input_shape),
    tf.keras.layers.Dense(units=64, activation='relu'),
    tf.keras.layers.Dense(units=1)
])
model.summary()

輸出:

?

使用 TensorFlow 實現神經網絡的圖6 編輯

在 Keras 中創(chuàng)建模型后,您需要為其“編譯”其他參數,如下所示。這有點像我們?yōu)槟P驮O置所有參數。

  • Python3 語言

# adam optimizer works pretty well for
# all kinds of problems and is a good starting point
model.compile(optimizer='adam'
               
              # MAE error is good for
              # numerical predictions
              loss='mae'

因此,我們使用了 adam 優(yōu)化器,并告訴模型計算 mae(平均絕對誤差)損失。

訓練模型

既然我們已經完成了模型的創(chuàng)建和實例化,現在是時候訓練它了。我們將使用 fit 方法來訓練我們的模型。這種方法以特征和目標為目標,我們也可以隨之傳遞validation_data,它會自動在驗證時嘗試你的模型并記錄損失指標。我們還提供了 batch_size,e 它的作用是將我們的數據分成小批量,并將其提供給我們的模型在每個 epoch 進行訓練,當您擁有大型數據集時,這非常有用,因為它減少了機器上的 RAM 和 CPU 消耗。

現在,我們只訓練了 15 個 epoch 的模型,因為我們的目的是熟悉過程,而不是準確性本身,但您必須增加或減少機器上的 epoch 數。您可以使用一些優(yōu)化方法,例如提前停止,當模型開始過擬合時會自動停止訓練,因此您也可以嘗試使用這些方法,如果您想閱讀它,我在底部提供了一個鏈接。

  • Python3 語言

losses = model.fit(X_train, y_train,
 
                   validation_data=(X_val, y_val),
                    
                   # it will use 'batch_size' number
                   # of examples per example
                   batch_size=256,
                   epochs=15# total epoch
 
                   )

輸出:

?

使用 TensorFlow 實現神經網絡的圖8 編輯

在這里,我們只訓練了 15 個 epoch,但您絕對應該訓練更多并嘗試更改模型本身。

生成預測并分析準確性

既然我們已經完成了訓練過程,那么讓我們實際嘗試使用它來預測 “葡萄酒質量”。為了進行預測,我們將使用 model 對象的 predict 函數。我們只給出 3 個示例作為輸入,并嘗試預測 3 個示例的葡萄酒質量。

  • Python3 語言

# this will pass the first 3 rows of features
# of our data as input to make predictions
model.predict(X_val.iloc[0:3, :])

輸出:

array([[0.40581337],
      [0.5295989 ],
      [0.3883106 ]], dtype=float32)

現在,讓我們將預測與目標值進行比較。

  • Python3 語言

y_val.iloc[0:3]

 
 

輸出:

 

0     0.4
9     0.4
12    0.4
Name: quality, dtype: float64

 

正如我們所看到的,我們的預測非常接近實際值,即在所有三種情況下都是 0.4。你可以定義另一個函數,將預測轉換為整數,以 1 到 10 的等級預測質量,以便更好地理解,但這是一件微不足道的事情,主要是讓你理解這里描述的整個過程。

 

可視化訓練與驗證損失

 

您可以分析損失并弄清楚它是否過度擬合或不容易,然后相應地采取適當的措施。

 

  • Python3 語言

loss_df = pd.DataFrame(losses.history)
 
# history stores the loss/val
# loss in each epoch
 
# loss_df is a dataframe which
# contains the losses so we can
# plot it to visualize our model training
loss_df.loc[:,['loss','val_loss']].plot()

輸出:

?

編輯

在分析模型的準確性/誤差時,需要注意的關鍵點是:

顯然,您的損失函數會不斷減小,但驗證數據集可能并非如此,在某些時候,您的模型將過度擬合數據,驗證誤差將開始增加而不是減少。因此,您可以在 validation loss 似乎正在增加的 epoch 停止。您還可以嘗試一些其他優(yōu)化算法,例如提前停止(Keras 中的 callback)。您可以在此處閱讀相關信息。

?

登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP

1
2