1

Also, ich verstehe, dass die Normalisierung wichtig ist, ein neuronales Netzwerk zu trainieren.Normalisieren Sie das Validierungsset für ein Neuronales Netzwerk in Keras

Ich verstehe auch, dass ich Validierungs- und Test-Set zu normalisieren haben mit den Parametern aus dem Trainingssatz (siehe zum Beispiel die Diskussion: https://stats.stackexchange.com/questions/77350/perform-feature-normalization-before-or-within-model-validation)

Meine Frage ist: Wie kann ich tun dies in Keras?

Was ich zur Zeit tun, ist:

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) 

Aber hier, ich erste normalisieren die Daten w.r.t. der gesamte Datensatz und dann Split die Validierungsmenge, die nach der oben genannten Diskussion falsch ist.

Es wäre keine große Sache, die mittlere und Standardabweichung vom Trainingssatz (training_mean und training_std) zu speichern, aber wie kann ich die Normalisierung mit dem training_mean und training_std auf dem Validierungsset separat anwenden?

Antwort

0

Sie können Ihre Daten manuell in einen Trainings- und Testdatensatz aufteilen, bevor Sie das Modell mit sklearn.model_selection.train_test_split versehen. Danach normalisieren Sie die Trainings- und Testdaten separat und rufen Sie mit dem Argument validation_data.

Codebeispiel

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

Code Nach macht genau das, was Sie wollen: Antwort des

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) 

Die Wilmar:

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 

Dann ist es mit keras wie diese Sie verwenden können, das ist nicht richtig.

Verwandte Themen