【问题标题】:Keras regression model with 3 outputs gives accurate results only for one具有 3 个输出的 Keras 回归模型仅对一个输出提供准确的结果
【发布时间】:2019-08-30 22:55:52
【问题描述】:

我正在尝试使用 python 中的 keras 运行一个神经网络,它有 2 个输入值和 3 个输出值。输入代表自然频率,而输出代表等效冰载荷。问题是在模型完成训练后,它似乎只为预测一个输入而不是所有三个输入而训练。该模型是回归而不是分类。我在这里展示我的代码

seed = 9
np.random.seed(seed)
# import dataset
dataset=np.loadtxt("Final_test_matrix_new_3_digits.csv", delimiter=",")
# Define dataset
Y=dataset[:, 0:3]
X=dataset[:, 3:5]
#Categorize data
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.3, 
random_state = seed)
# create model
model = Sequential()
model.add(Dense(12, input_dim=2,activation='relu'))
model.add(Dense(8, init='uniform', activation='relu'))
model.add(Dense(8, init='uniform', activation='relu'))
model.add(Dense(3, init='uniform', activation='relu'))
# compile the model
model.compile(loss='mean_squared_logarithmic_error', optimizer='adam', 
metrics=['accuracy'])
# checkpoint
filepath="weights.best_12_8_8_neurons.hdf5"
checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1, 
save_best_only=True, mode='max')
callbacks_list = [checkpoint]
# fit the model
history=model.fit(X_train, Y_train, validation_split=0.1, epochs=100000, 
batch_size=10,callbacks=callbacks_list)
# evaluate the model
scores = model.evaluate(X_test, Y_test)
print ("Accuracy: %.2f%%" %(scores[1]*100))

根据 python,模型的准确度是 65%,但这个事实并没有影响输出的准确度,因为第二个输出的准确度低于第一个输出的准确度,第三个输出的准确度是几乎为 0。代码的主要目标是创建一个回归模型,其中所有输出都将具有相同的精度。下面分别显示了模型精度、模型损失和每个输出的预测:

【问题讨论】:

  • 首先想到的是不平衡数据集?
  • 你能具体解释一下你的意思吗?
  • 如果你的分数不相等,要么是因为你的数据不均匀,这意味着你对某些特征的训练材料较少。或者您的损失函数未加权,因此并不真正关心其他值。尝试查看您的数据以了解正在发生的事情
  • 您可能还需要考虑您的损失函数是否适用于所有标签

标签: python keras deep-learning regression


【解决方案1】:

看起来随机森林更适合您的情况。你应该试一试,特别是如果你有不平衡的类。

作为一种解决方法,您可以增加 Dense(8) 层中的节点数,具体取决于数据的差异。

然后,您必须检查少数类并调整以下代码(Synthetic Minority Oversampling Technique):

from imblearn.over_sampling import SMOTE

sm = SMOTE()
x_train2, y_train2 = sm.fit_sample(X_train, Y_train)

请注意,此代码仅适用于二进制输出,因此您应该对 3 个类进行一次热编码,然后将其应用到 0 类和 1 类,然后是 0 类和 2 类,从零类中移除双倍过采样。然后运行你的神经网络模型,将validation_split 增加到 0.2。

【讨论】:

  • 抱歉,我无法完全理解如何进行一次热编码
  • pd.get_dummies(Y_train)
  • 我仍然得到相同的结果。不过非常感谢
猜你喜欢
  • 2019-10-08
  • 2019-07-25
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 2019-04-08
  • 2020-12-26
  • 2023-03-30
相关资源
最近更新 更多