網頁

2019年6月26日 星期三

Data Pre-processing for Deep Learning models (Deep Learning with Keras – Part 2)



Dealing with Data

Motivation
訓練深度學習模型需要數據......很多數據! 不幸的是,在大多數情況下,數據變得混亂,我們的模型對此非常敏感。 因此,我們在準備數據時要小心,以達到最佳效果。在直接開始構建和訓練模型之前,我們認為最好能夠全面概述數據處理技術。 在這篇文章中,我們將向您展示如何處理數字,分類和圖像數據集。

Working with Numerical Data
數值將是最常見的數據類型。即使它們已經符合合適的計算格式,我們仍然需要做一些處裡。

數值數據的主要問題是每個特徵所具有的不同尺度。考慮房屋價格數據集,其中包含以下資訊:房屋面積,臥室數量,建築年份和價格。假設我們的目標是預測房屋大小,臥室數量和建築年份的價格。每個功能都以不同的比例呈現。房屋面積可以說是100到500平方米之間,建築年份是一個4位數,可以追溯到200年前,最後臥室的數量是1-4之間的數字。

這裡的問題是模型可能會根據其值給予更多關注。這樣,房屋大小可能會受到更多的關注,因為它的值更大,而其他重要的特徵,如臥室數量可能會被忽略,因為它們的值很小。

接下來有兩個簡單的解決方案來解決這個問題,它們被稱為正規化(Normalization)和標準化(Standardization)。何謂正規化跟標準化可以參考一下連結。
https://aifreeblog.herokuapp.com/posts/54/data_science_203/

Normalization
正規化只是縮放[0-1]範圍內的值。 要將其應用於數據集,您只需從每個元素中減去最小值並將其除以範圍(max-min)。



Standardization
標準化將數據轉換為平均值為0和單位標準偏差為1。



Implementation
在Keras實施上述技術比您想像的要容易。 我們將向您展示使用可輕鬆加載Keras的Boston Housing數據集的示例。
from keras.datasets import boston_housing
# data is returned as a tuple for the training and the testing datasets
(X_train, y_train), (X_test, y_test) = boston_housing.load_data()

讓我們看一下訓練數據集的第一個例子:
print(X_train[0])
# Output
[  1.23247   0.        8.14      0.        0.538     6.142    91.7
   3.9769    4.      307.       21.      396.9      18.72   ]

看到不同的尺度? 為了解決這個問題,我們將使用流行的Scikit-Learn函式庫。

使用MinMaxScaler進行數據正規化:
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_normalized = scaler.fit_transform(X_train)
print(X_normalized[0])
# Output
[0.01378163 0.         0.28152493 0.         0.31481481 0.49980635
 0.91452111 0.29719123 0.13043478 0.22753346 0.89361702 1.
 0.46881898]

或者,使用StandardScaler標準化:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_train)
print(X_scaled[0])
# Output
[-0.27224633 -0.48361547 -0.43576161 -0.25683275 -0.1652266  -0.1764426
  0.81306188  0.1166983  -0.62624905 -0.59517003  1.14850044  0.44807713
  0.8252202 ]

接下來讓我們看看我們現在如何處理類別資料......

Working with Categorical Data
類別資料(Categorical data)需要特殊處理,因為它們不能以自己的格式餵給神經網絡(因為神經網絡只接受數值數據類型)。

我們將介紹兩種處理分類數據的主要技術:索引(Indexing)和OneHotEncoding。

Indexing
用索引或數字取代類別名稱。
import numpy as np

data = np.array(['small', 'medium', 'small', 'large', 'xlarge', 'large'])

from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
data_encoded = encoder.fit_transform(data)
print(data_encoded)

# Output
array([2, 1, 2, 0, 3, 0])

值'small','medium','large'和'xlarge'由0到3之間的數字替換。要嚴格指定使用的數字,可以參考OrdinalEncoder

OneHotEncoding
One Hot Encoding用一個boolean值的list取代每個元素,在當前類別索引中為1,在其他索引中為0。
import numpy as np

data = np.array(['red', 'blue', 'orange', 'white', 'red', 'orange', 'white', 'red'])

from sklearn.preprocessing import LabelBinarizer
encoder = LabelBinarizer()
data_encoded = encoder.fit_transform(data)

print(data_encoded)

# Output
array([[0, 0, 1, 0],
       [1, 0, 0, 0],
       [0, 1, 0, 0],
       [0, 0, 0, 1],
       [0, 0, 1, 0],
       [0, 1, 0, 0],
       [0, 0, 0, 1],
       [0, 0, 1, 0]])

這裏不是用數字取代每種顏色,而是用list取代。 該list表示以下內容:is_blue,is_orange,is_red和is_white。 將值1添加到每個顏色存在的相對索引,否則添加0。 範例:紅色表示為:[0 0 1 0]。

Working with Images
我們將在這篇文章中僅討論兩個簡單的圖像處理。 稍後將介紹更先進的技術。

第一步我們將處理圖像作為平面連續像素的簡單陣列。 但是圖像通常是2維的,具有1或3個顏色通道(channels)。 因此,我們需要在使用之前將每個圖像可以透過Numpy reshape函式重整其陣列形狀。

假設我們有500個圖像的list,每個圖像具有28 * 28像素和3個顏色通道RGB。 該list需要reshape為(500,2352)以便餵給網絡。 2353這裡是調整大小後每個圖像的大小(28 * 28 * 3)。

注意:稍後我們將使用內核以原始格式處理圖像

使用Numpy reshape list非常容易:
data_reshaped = data.reshape(500, 28*28*3)

現在因為我們的像素是數值,我們也需要縮放它們。 圖像的一種簡單縮放技術是將每個像素除以255(每個像素的最大值)。
images = images / 255.

Conclusion
在這篇文章中,我們學習瞭如何處理深度學習模型的數據。 我們現在準備處理數字,分類和圖像數據集。 這些技術對於我們構建第一個神經網絡的下一個教學將非常關鍵!



參考
https://www.marktechpost.com/2019/06/14/data-pre-processing-for-deep-learning-models-deep-learning-with-keras-part-2/?fbclid=IwAR2PlhZI0w_rDdfRwxAv3gVrl2dzuJ1QycWwE1-PbQhxYV2JRsioPAzfDbk

沒有留言:

張貼留言