低精度的一维数据Transformer模型

我的数据集(网络流量数据集,用于二元分类) –

enter image description here

数据中的特征数量为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%的准确率,这只是调整超参数的问题。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注