【问题标题】:Keras - Why is the accuracy of my CNN model not being affected by the hyper-parameters?Keras - 为什么我的 CNN 模型的准确性不受超参数的影响?
【发布时间】:2020-01-07 20:19:07
【问题描述】:

正如标题清楚地描述的那样,我的简单 CNN 模型的准确性不受超参数甚至DropoutMaxPooling 等层的存在的影响。我使用Keras 实现了模型。这种奇怪情况背后的原因可能是什么?我在下面添加了代码的相关部分:

input_dim = X_train.shape[1]
nb_classes = Y_train.shape[1]

model = Sequential()
model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(input_dim, 1)))
model.add(Dropout(0.5))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(40, activation='relu'))
model.add(Dense(nb_classes, activation='softmax'))

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

附言输入数据(X_trainX_test)包含由Word2Vec 复制的向量。输出是二进制的。

编辑:您可以在下面找到示例培训日志:

训练日志示例:

Train on 3114 samples, validate on 347 samples
Epoch 1/10
 - 1s - loss: 0.6917 - accuracy: 0.5363 - val_loss: 0.6901 - val_accuracy: 0.5476
Epoch 2/10
 - 1s - loss: 0.6906 - accuracy: 0.5369 - val_loss: 0.6896 - val_accuracy: 0.5476
Epoch 3/10
 - 1s - loss: 0.6908 - accuracy: 0.5369 - val_loss: 0.6895 - val_accuracy: 0.5476
Epoch 4/10
 - 1s - loss: 0.6908 - accuracy: 0.5369 - val_loss: 0.6903 - val_accuracy: 0.5476
Epoch 5/10
 - 1s - loss: 0.6908 - accuracy: 0.5369 - val_loss: 0.6899 - val_accuracy: 0.5476
Epoch 6/10
 - 1s - loss: 0.6909 - accuracy: 0.5369 - val_loss: 0.6901 - val_accuracy: 0.5476
Epoch 7/10
 - 1s - loss: 0.6905 - accuracy: 0.5369 - val_loss: 0.6896 - val_accuracy: 0.5476
Epoch 8/10
 - 1s - loss: 0.6909 - accuracy: 0.5369 - val_loss: 0.6897 - val_accuracy: 0.5476
Epoch 9/10
 - 1s - loss: 0.6905 - accuracy: 0.5369 - val_loss: 0.6892 - val_accuracy: 0.5476
Epoch 10/10
 - 1s - loss: 0.6909 - accuracy: 0.5369 - val_loss: 0.6900 - val_accuracy: 0.5476

【问题讨论】:

    标签: keras conv-neural-network keras-layer grid-search


    【解决方案1】:

    首先你需要把最后一层改为

    model.add(Dense(1, activation='sigmoid'))
    

    你还需要把损失函数改成

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

    【讨论】:

    • 准确率还是一样。
    • 那么你的数据集是什么样子的,我认为你在数据预处理中做错了什么,或者你的 X 与 y 无关。我发现您的输入形状为 (input_dim, 1) 也是不正常的,就像您尝试将单个单词分类为两个类别之一一样。这真的是你在做什么吗?
    • 实际上我正在做的是提取恶意和良性 Android 应用程序的特征,以便将它们分为两类。所以,特征基本上是字符串,我正在构建特征向量。 input_dim 是每个向量的大小。输入数据的形状为(3451, 100)
    • 您可以尝试的第一个解决方案是训练自己的嵌入,但在此之前需要先对文本数据进行一些预处理(标记化、词形还原、转换为索引......)。然后,您可以在 keras 中使用嵌入层,然后在其上添加 LSTM 或任何其他递归网络。现在我假设你的数据是一个脚本,真的是这样吗?您能否详细说明您所分类的内容?也许是您要分类的对象之一的示例
    • @TimbusCalin 是的,但是使用的损失函数是“mse”。然而,准确率没有下降的事实与所使用的数据更相关。
    【解决方案2】:

    我假设你有多类分类,对吧?

    那么你的损失是不合适的:你应该使用'categorical_crossentropy'而不是'mean_squared_error'。

    另外,请尝试添加多个 Conv+Drop+MaxPool(3 组),以便清楚地验证您网络的稳健性。

    【讨论】:

    • 使用mse 作为多类分类问题的损失没有任何问题。它仍然是一个有效的损失函数。只是categorical_crossentropy 在大多数情况下表现更好。
    • 准确率还是一样的。
    • 在此之间,我正在处理一个二元分类问题,因为我的目标类是 01
    • 你是对的,mse 不是错误的,这就是我编辑文本答案的原因。
    猜你喜欢
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 2019-11-27
    • 2019-08-29
    相关资源
    最近更新 更多