2017-01-24 105 views
5

我在Keras的訓練神經網絡的迴歸問題。 爲什麼輸出只有一個尺寸,每個Epoch的精度始終顯示acc:0.0000e + 00?在Keras的零準確性訓練神經網絡

這樣子:

1000/199873 [..............................] - ETA:5s - 損失:0.0057 - acc:0.0000e + 00

2000/199873 [..............................] - ETA:4s - 損失:0.0058 - acc:0.0000e + 00

3000/199873 [........................... ...] - ETA:3s - 損失:0.0057 - acc:0.0000e + 00

4000/199873 [....................... .......] - ETA:3s - 損失:0.0060 - acc: 0.0000e + 00 ...

198000/199873 [============================>。] - ETA:0s - 損失:0.0055 - acc:0.0000e + 00

199000/199873 [============================>。] - ETA :0s - 損失:0.0055 - acc:0.0000e + 00

199873/199873 [============================= =] - 4S - 損失:0.0055 - ACC:0.0000E + 00 - val_loss:0.0180 - val_acc:0.0000E + 00

曆元50/50

但是,如果輸出是兩個維度或以上,準確性沒有問題。

我的模型如下:`

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]] 

回答

5

的問題是,最終模型輸出具有線性激活,使得模型迴歸,而不是一個分類問題。當模型根據分類正確分類數據時,「準確性」被定義,但由於其連續屬性,對於迴歸問題沒有定義「準確性」。

要麼擺脫作爲度量標準的準確性並切換到完全迴歸,要麼使用loss='categorical_crossentropy'activation='softmax'將問題歸爲分類問題。

這是一個類似的問題對你:Link

欲瞭解更多信息,請參閱:StackExchange

0

我不知道你的問題是什麼,但你的模型看起來有點怪我。

這是您的模型:

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')) 

和模型的可視化如下所示:

enter image description here

有兩層可以是模型的輸出層,而你並沒有決定哪一個是你的實際輸出層。我想這就是你無法做出正確預測的原因。

如果你想實現你的模型是這樣,

enter image description here

你應該獨立添加您激活層,而不是使用同一個。

例如,

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

謝謝你的答案,但它仍然顯示ACC:0.0000E + 00。 – soartseng