[英]Scaling data for neural network
我在 keras 中使用順序模型進行分類。
給定數據:
x_train = np.random.random((5000, 20))
y_train = keras.utils.to_categorical(np.random.randint(10, size=(5000, 1)), num_classes=10)
x_test = np.random.random((500, 20))
y_test = keras.utils.to_categorical(np.random.randint(10, size=(500, 1)), num_classes=10)
特征縮放很重要:
scaler = StandardScaler()
scaler.fit(x_train)
x_train = scaler.transform(x_train)
x_test = scaler.transform(x_test)
模型
model = Sequential()
model.add(Dense(64, activation='relu', input_dim=20))
model.add(Dropout(0.5))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
model.fit(x_train, y_train,
epochs=100,
batch_size=32)
要預測的數據
z = np.random.random((9999000, 20))
我應該縮放這些數據嗎? 如何縮放這些數據?
predictions = model.predict_classes(z)
如您所見,與要預測的數據 ( z
) 相比,訓練和測試樣本只是少數。 使用配備x_train
的縮放器重新縮放x_test
,似乎沒問題。 但是,使用僅配備 5000 個樣本的相同縮放器來重新縮放z
(9999000 個樣本),似乎不太好。 深度學習領域有沒有解決這個問題的最佳實踐?
對於對特征縮放鏈接不敏感的分類器,隨機森林沒有這個問題。 然而,對於深度學習,這個問題是存在的。
此處顯示的訓練數據僅用於示例目的。 在實際問題中,訓練數據並非來自相同(均勻)的概率分布。 很難標記數據,並且訓練數據對易於標記的人有偏見。 僅標記更容易標記的樣品。
但是,使用僅配備 5000 個樣本的相同縮放器來重新縮放
z
(9999000 個樣本),似乎不太好。
不清楚你為什么這么認為。 這正是標准做法,即使用適合您的訓練數據的縮放器,正如您對測試數據所做的那樣:
z_scaled = scaler.transform(z)
predictions = model.predict_classes(z_scaled)
樣本數量(500 或 10^6)在這里沒有任何區別; 重要的是所有這些數據( x
和z
)都來自相同的概率分布。 在實踐中(對於未來可能仍然存在的數據),這只是假設(並且模型部署后要注意的事情之一就是這個假設是否不成立,或者在一段時間后不再正確)。 但尤其是在這里,由於您的模擬數據來自完全相同(均勻)的概率分布,這完全是正確的做法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.