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
沒有留言:
張貼留言