在每个 epoch 之后如何解决常量模型精度问题。

时间:2021-08-12 04:02:22

标签: python tensorflow keras deep-learning

我正在学习深度学习,作为一个任务,我正在进行分类项目,该项目有 17k 条记录、14 个特征和 11 个类别的目标变量。 enter image description here

我试图训练一个简单的神经网络

# 定义 keras 模型
model1 = keras.Sequential()
model1.add(keras.layers.Dense(64, input_dim=14, activation='relu'))
model1.add(keras.layers.Dense(128, activation='relu'))
model1.add(keras.layers.Dense(64, activation='relu'))
model1.add(keras.layers.Dense(1, activation='softmax'))

# 编译 keras 模型
model1.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

# 在数据集上拟合 keras 模型
performance1 = model1.fit(x_train, y_train, epochs=100, validation_split=0.2)

但是问题在于,我每个迭代周期都得到相同的准确率,似乎模型甚至没有学习。 enter image description here

我尝试研究这个问题,并在 StackOverflow 上找到了一些类似的问题,如此问题,并尝试以下事项:

  • 应用 StandardScaler
  • 增加 / 减少隐藏层和神经元
  • 添加 dropout 层
  • 更改优化器、损失和激活函数
  • 我还尝试了批量大小

但是没有一个解决方案奏效,当然在不同的试验中准确率不同(但存在相同问题)。

几个试验如下:

# 定义 keras 模型
model1 = keras.Sequential()
model1.add(keras.layers.Dense(64, input_dim=14, activation='sigmoid'))
model1.add(keras.layers.Dense(128, activation='sigmoid'))
model1.add(keras.layers.Dense(64, activation='sigmoid'))
model1.add(keras.layers.Dense(1, activation='softmax'))

sgd = keras.optimizers.SGD(lr=0.01)
# 编译 keras 模型
model1.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])

# 定义 keras 模型
model1 = keras.Sequential()
model1.add(keras.layers.Dense(64, input_dim=14, activation='relu'))
model1.add(keras.layers.Dense(128, activation='relu'))
model1.add(keras.layers.Dropout(0.2))
model1.add(keras.layers.Dense(64, activation='relu'))
model1.add(keras.layers.Dropout(0.2))
model1.add(keras.layers.Dense(1, activation='softmax'))

# 编译 keras 模型
model1.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])


我不知道这里出了什么问题。如果您需要更多详细信息来处理此问题,请告诉我。并且请不要关闭此问题,我知道这个问题可能被标记为重复问题,但是作为一个初学者,我尝试了很多事情。

1 个答案:

答案 0 :(得分:1)

问题在于 softmax 应该应用于输出数组以获取概率,并且模型的输出数组应表示每个目标类别的 logits。因此,您需要更改这一行代码:

model1.add(keras.layers.Dense(1, activation='softmax'))
# TO
model1.add(keras.layers.Dense(df['Class'].nunique(), activation='softmax'))

编辑后:

# 假设您的类别有 11 个唯一值,则最后一层将变为
model1.add(keras.layers.Dense(11, activation='softmax'))

# 现在您的损失将是
model1.compile(loss=tf.keras.loss.SparseCategoricalCrossentropy(), optimizer='adam', metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])