2017-01-24 5 views
5

Szkolę neuronową sieć problemu regresji w Keras. Dlaczego dane wyjściowe to tylko jeden wymiar, dokładność w każdej epoce zawsze pokazuje wartość: 0.0000e + 00?Szkolenie z zerowej dokładności w sieci neuronowej w Keras

tak:

1000/199873 [..............................] - ETA: 5S - strata: 0,0057 - wg: 0.0000e + 00

2000/199873 [..............................] - ETA: 4s - strata: 0,0058 - wg: 0.0000e + 00

3000/199873 [........................... ...] - ETA: 3s - strata: 0,0057 - acc: 0.0000e + 00

4000/199873 [....................... .......] - ETA: 3s - strata: 0,0060 - acc: 0,0000e + 00 ...

198000/199873 [=============================.]. - ETA: 0s - strata : 0,0055 - wg: 0.0000e + 00

199000/199873 [============================>.] - ETA : 0s - strata: 0,0055 - wg: 0.0000e + 00

199873/199873 [============================= =] - 4s - strata: 0,0055 - wg: 0.0000e + 00 - val_loss: 0,0180 - val_acc: 0.0000e + 00

Epoki 50/50

Jeśli jednak sygnał wyjściowy są dwa wymiary lub powyżej, nie ma problemu z dokładnością.

Mój model jak poniżej: `

input_dim = 14 
batch_size = 1000 
nb_epoch = 50 
lrelu = LeakyReLU(alpha = 0.1) 

model = Sequential() 
model.add(Dense(126, input_dim=input_dim)) #Dense(output_dim(also hidden wight), input_dim = input_dim) 
model.add(lrelu) #Activation 

model.add(Dense(252)) 
model.add(lrelu) 
model.add(Dense(1)) 
model.add(Activation('linear')) 

model.compile(loss= 'mean_squared_error', optimizer='Adam', metrics=['accuracy']) 
model.summary() 
history = model.fit(X_train_1, y_train_1[:,0:1], 
        batch_size=batch_size, 
        nb_epoch=nb_epoch, 
        verbose=1, 
        validation_split=0.2) 

loss = history.history.get('loss') 
acc = history.history.get('acc') 
val_loss = history.history.get('val_loss') 
val_acc = history.history.get('val_acc') 

'''saving model''' 
from keras.models import load_model 
model.save('XXXXX') 
del model 

'''loading model''' 
model = load_model('XXXXX') 

'''prediction''' 
pred = model.predict(X_train_1, batch_size, verbose=1) 
ans = [np.argmax(r) for r in y_train_1[:,0:1]] 

Odpowiedz

5

Problemem jest to, że wyjście końcowe wzór liniowo aktywacji, co czyni, że model regresji, a nie problemu klasyfikacji. "Dokładność" jest określana, gdy model klasyfikuje dane poprawnie według klasy, ale "dokładność" nie jest skutecznie zdefiniowana dla problemu regresji, ze względu na jego ciągłą właściwość.

Albo pozbądź się dokładności jako metryki i przełącz się na pełną regresję, albo zmień swój problem w problem klasyfikacji, używając loss='categorical_crossentropy' i activation='softmax'.

To jest podobny problem do Ciebie: Link

Aby uzyskać więcej informacji, patrz: StackExchange

0

Nie jestem pewien, jaki jest twój problem, ale model wygląda trochę dziwne dla mnie.

to model:

lrelu = LeakyReLU(alpha = 0.1) 
model = Sequential() 
model.add(Dense(126, input_dim=15)) #Dense(output_dim(also hidden wight), input_dim = input_dim) 
model.add(lrelu) #Activation 

model.add(Dense(252)) 
model.add(lrelu) 
model.add(Dense(1)) 
model.add(Activation('linear')) 

i wizualizacja modelu przedstawiono poniżej:

enter image description here

Istnieją dwie warstwy, które mogą być warstwa wyjściowa modelu, i nie zdecydowałeś, który z nich jest twoją rzeczywistą warstwą wyjściową. Sądzę, że to jest powód, dla którego nie możesz dokonać prawidłowej prognozy.

Jeśli chcesz wdrożyć swój model tak,

enter image description here

należy dodać warstwę aktywacyjny niezależnie, zamiast wykorzystywać ten sam jeden.

Przykładowo

model = Sequential() 
model.add(Dense(126, input_dim=15)) #Dense(output_dim(also hidden wight), input_dim = input_dim) 
model.add(LeakyReLU(alpha = 0.1)) #Activation 

model.add(Dense(252)) 
model.add(LeakyReLU(alpha = 0.1)) 
model.add(Dense(1)) 
model.add(Activation('linear')) 
+0

Dziękuję za odpowiedź, ale wciąż pokazują ACC: 0.0000e + 00. – soartseng