【发布时间】:2021-08-13 16:40:01
【问题描述】:
我使用 Keras 为入侵检测系统制作了一个 CNN 模型。我的损失结果有问题。请问如何修复我的代码。 这些是数据集的形状:
x_train shape: (1131151, 79)
y_train shape: (1131151, 2)
x_test shape: (53386, 79)
y_test shape: (53386, 2)
train shape after reshape: (1131151, 79, 1)
test shape after reshape: (53386, 79, 1)
我的模特是:
model = Sequential()
#convolution 1st layer
model.add(Conv1D(32, kernel_size=(filter_size), padding="same",
activation='relu',
input_shape=(X_train.shape[1], 1)))
model.add(BatchNormalization())
model.add(Dropout(droprate))
#convolution 2nd layer
model.add(Conv1D(64, kernel_size=(filter_size), activation='relu', padding="same"))
model.add(BatchNormalization())
model.add(MaxPooling1D(strides=1))
model.add(Dropout(droprate))
#convolution 3rd layer
model.add(Conv1D(128, kernel_size=(filter_size), activation='relu', padding="same"))
model.add(BatchNormalization())
model.add(MaxPooling1D(strides=1))
model.add(Dropout(droprate))
#FCN 1st layer
model.add(Flatten())
model.add(Dense(128,use_bias=False))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(droprate))
#FCN 2nd layer
model.add(Dense(32,use_bias=False))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(droprate))
#FCN 3rd layer
model.add(Dense(16,use_bias=False))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(droprate))
#FCN final layer
model.add(Dense(2))
model.add(Activation('sigmoid'))
model.compile(loss="binary_crossentropy", optimizer="Adam", metrics=['accuracy'])
model.summary()
我的结果是:
score = model.evaluate(X_test, preprocess.y_test, verbose=0)
Test loss: 9.198558109346777e-05
Test accuracy: 0.9999812841415405
如您所见,损失函数为负数,准确率接近 100% 我的代码有什么问题?
【问题讨论】:
-
9.198558109346777e-05不是负数...... -
对不起,我没有注意到这个数字,我认为它是负数。问题还是存在的吧?
-
训练/测试 y-label 的分布是什么?如果存在较大的类不平衡(比如 99% 的训练示例是
false='no intrusion',那么分类器可以学会始终预测没有入侵并达到 99% 的准确率。 -
只有当您向我们证明问题存在时才会存在问题,包括您看到的确切数字。
-
@TC 80% 用于训练,20% 用于测试
标签: python tensorflow machine-learning keras deep-learning