我的数据集(网络流量数据集,用于二元分类) –
数据中的特征数量为25
这是Transformer模型 –
embed_dim = 25 # Embedding size for each tokennum_heads = 2 # Number of attention headsff_dim = 32 # Hidden layer size in feed forward network inside transformerinputs = layers.Input(shape=(25,1,))transformer_block = TransformerBlock(25, num_heads, ff_dim)x = transformer_block(inputs)x = layers.GlobalAveragePooling1D()(x)x = layers.Dropout(0.1)(x)x = layers.Dense(20, activation="relu")(x)outputs = layers.Dense(1, activation="softmax")(x)model = keras.Model(inputs=inputs, outputs=outputs)model.compile("adam", "binary_crossentropy", metrics=["accuracy"])history = model.fit( x_train, y_train, batch_size=32, epochs=50, validation_data=(x_test, y_test))
但是准确率没有变化,而且非常低,随着epoch的增加也没有变化 –
Epoch 1/501421/1421 [==============================] - 9s 6ms/step - loss: 0.5215 - accuracy: 0.1192 - val_loss: 0.4167 - val_accuracy: 0.1173
回答:
总的来说,只要数据没有矛盾,就应该能够达到100%(训练)准确率。在担心泛化(测试误差)之前,这是达到这一目标的最佳策略,具体情况如下:
- 最终激活函数应为sigmoid(否则我们有f(x) = exp(x) / exp(x) = 1)
- 没有必要使用dropout(这只会降低训练准确率)
- 全局池化可能会移除重要信息 – 暂时用Dense层替换它
- 标准化你的数据,你的特征范围相当宽,这可能会导致训练难以收敛
- 考虑降低学习率,因为这将更容易过拟合训练数据
如果以上所有方法都失败了,只需增加模型的大小,因为你的特征范围在“20-25”之间可能还不够大。神经网络需要相当多的冗余才能正确学习。
个人建议,我也会用一个简单的MLP模型替换整个模型,并验证一切是否正常工作,我不确定为什么Transformer会是这里的首选模型,这将允许你验证问题是否出在所选模型上,还是代码本身的问题。
最后 – 确保确实可以达到100%的准确率,拿出你的训练数据,检查是否有任何两个数据点具有完全相同的特征但不同的标签。如果没有 – 你应该能够达到100%的准确率,这只是调整超参数的问题。