2017-07-25 37 views
1

所以,我明白規範化對於訓練神經網絡很重要。規範Keras中的神經網絡的驗證集合

我也明白,我必須正常化validation-和測試設置與訓練組的參數(例如見這個討論:https://stats.stackexchange.com/questions/77350/perform-feature-normalization-before-or-within-model-validation

我的問題是:如何做到這一點的Keras?

什麼我目前做的是:

import numpy as np 
from keras.models import Sequential 
from keras.layers import Dense 
from keras.callbacks import EarlyStopping 

def Normalize(data): 
    mean_data = np.mean(data) 
    std_data = np.std(data) 
    norm_data = (data-mean_data)/std_data 
    return norm_data 

input_data, targets = np.loadtxt(fname='data', delimiter=';') 
norm_input = Normalize(input_data) 

model = Sequential() 
model.add(Dense(25, input_dim=20, activation='relu')) 
model.add(Dense(1, activation='sigmoid')) 

model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) 

early_stopping = EarlyStopping(monitor='val_acc', patience=50) 
model.fit(norm_input, targets, validation_split=0.2, batch_size=15, callbacks=[early_stopping], verbose=1) 

但在這裏,我首先正常化數據w.r.t.整個數據集和,然後拆分驗證集,這是錯誤的根據上述討論。

保存來自訓練集(training_mean和training_std)的平均值和標準偏差並不是什麼大問題,但我怎樣才能將training_mean和training_std分別應用於驗證集的歸一化?

回答

0

在使用sklearn.model_selection.train_test_split擬合模型之前,您可以手動將數據拆分爲訓練和測試數據集。之後,分別對訓練和測試數據進行標準化處理,並使用validation_data參數呼叫model.fit

代碼示例

import numpy as np 
from sklearn.model_selection import train_test_split 

data = np.random.randint(0,100,200).reshape(20,10) 
target = np.random.randint(0,1,20) 

X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.2) 

X_train = Normalize(X_train) 
X_test = Normalize(X_test) 

model.fit(X_train, y_train, validation_data=(X_test,y_test), batch_size=15, callbacks=[early_stopping], verbose=1) 
0

以下代碼使你想要什麼:

import numpy as np 
def normalize(x_train, x_test): 
    mu = np.mean(x_train, axis=0) 
    std = np.std(x_train, axis=0) 
    x_train_normalized = (x_train - mu)/std 
    x_test_normalized = (x_test - mu)/std 
    return x_train_normalized, x_test_normalized 

然後你可以用keras這樣使用它:

from keras.datasets import boston_housing 
(x_train, y_train), (x_test, y_test) = boston_housing.load_data() 
x_train, x_test = normalize(x_train, x_test) 

豐益的答案是不正確的。