簡體   English   中英

為什么二進制Keras CNN總是預測1?

[英]Why does a binary Keras CNN always predict 1?

我想使用Keras CNN構建二進制分類器。 我有大約6000行輸入數據,如下所示:

>> print(X_train[0]) 
[[[-1.06405307 -1.06685851 -1.05989663 -1.06273152]
  [-1.06295958 -1.06655996 -1.05969803 -1.06382503]
  [-1.06415248 -1.06735609 -1.05999593 -1.06302975]
  [-1.06295958 -1.06755513 -1.05949944 -1.06362621]
  [-1.06355603 -1.06636092 -1.05959873 -1.06173742]
  [-1.0619655  -1.06655996 -1.06039312 -1.06412326]
  [-1.06415248 -1.06725658 -1.05940014 -1.06322857]
  [-1.06345662 -1.06377347 -1.05890365 -1.06034568]
  [-1.06027557 -1.06019084 -1.05592469 -1.05537518]
  [-1.05550398 -1.06038988 -1.05225064 -1.05676692]]]
>>> print(y_train[0])
[1]

然后我通過這種方式構建CNN:

model = Sequential()
model.add(Convolution1D(input_shape = (10, 4),
                        nb_filter=16,
                        filter_length=4,
                        border_mode='same'))
model.add(BatchNormalization())
model.add(LeakyReLU())
model.add(Dropout(0.2))

model.add(Convolution1D(nb_filter=8,
                        filter_length=4,
                        border_mode='same'))
model.add(BatchNormalization())
model.add(LeakyReLU())
model.add(Dropout(0.2))

model.add(Flatten())

model.add(Dense(64))
model.add(BatchNormalization())
model.add(LeakyReLU())

model.add(Dense(1))
model.add(Activation('softmax'))

reduce_lr    = ReduceLROnPlateau(monitor='val_acc', factor=0.9, patience=30, min_lr=0.000001, verbose=0)

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

history = model.fit(X_train, y_train, 
          nb_epoch = 100, 
          batch_size = 128, 
          verbose=0, 
          validation_data=(X_test, y_test),
          callbacks=[reduce_lr],
          shuffle=True)

y_pred = model.predict(X_test)

但它返回以下內容:

>> print(confusion_matrix(y_test, y_pred))
[[  0 362]
 [  0 608]]

為什么所有的預測都是一個? 為什么CNN表現如此糟糕? 以下是損失和acc圖表: 在此輸入圖像描述

由於網絡中的輸出,它總是預測一個。 你有一個帶有一個神經元的密集層,並且有一個Softmax激活。 Softmax通過每個輸出的指數之和進行歸一化。 由於有一個輸出,唯一可能的輸出是1.0。

對於二元分類器,您可以使用帶有“binary_crossentropy”丟失的sigmoid激活,或者在最后一層放置兩個輸出單元,繼續使用softmax並將損失更改為categorical_crossentropy。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM