【问题标题】:How to solve constant model accuracy after each epoch如何在每个 epoch 后解决恒定的模型精度
【发布时间】:2021-10-15 11:19:07
【问题描述】:

我正在学习深度学习,作为一项作业,我正在做一个分类项目,该项目有 17k 条记录,包含 14 个特征和一个包含 11 个类的目标变量。

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

# define the keras model
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'))

# compile the keras model
model1.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

# fit the keras model on the dataset
performance1 = model1.fit(x_train, y_train, epochs=100, validation_split=0.2)

但这里的问题是我在每个时期都获得了相同的准确性,似乎模型甚至没有学习。

我试图研究这个问题,并在 StackOverflow 上发现了一些类似的问题,例如 question 并尝试了以下操作

  • 应用标准缩放器
  • 增加/减少隐藏层和神经元
  • 添加了 dropout 层
  • 更改了优化器、损失和激活函数
  • 我也尝试了 batch_size

但都没有奏效,当然,不同试验的准确率不同(但问题相同)。

几个试验如下:

# define the keras model
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)
# compile the keras model
model1.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])

# define the keras model
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'))

# compile the keras model
model1.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

我不知道这里有什么问题。如果您需要更多详细信息来处理此问题,请告诉我。请不要关闭这个问题我知道这个问题有机会被标记为重复的问题,但相信我,我尝试了很多我作为初学者可以理解的事情。

【问题讨论】:

  • 你的 x_train 和 y_train 是什么样的?
  • @TCArlen 上述数据集被分离为特征(包含除Class col之外的所有列)和标签(包含Class col),然后通过sklearn train_test_split进一步拆分

标签: python tensorflow keras deep-learning


【解决方案1】:

问题在于softmax 应该应用于输出数组以获取概率,并且模型的输出数组应该代表每个目标类的 logits。因此你必须改变这一行

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

编辑:

# Let's say you have 11 unique values in your class then you last layer will become
model1.add(keras.layers.Dense(11, activation='softmax'))

# Now your loss will be
model1.compile(loss=tf.keras.loss.SparseCategoricalCrossentropy(), optimizer='adam', metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])

【讨论】:

  • 我的数据集共有 11 个唯一值,我试图在最后一层添加它,但它给了我 `ValueError: Shapes (None, 1) and (None, 10) are incompatible`。但是当我将它切换回 1 时,它不会给我那个错误吗?
  • 现在模型精度在循环,没有增加,有什么解决办法吗?
  • 循环播放?我不太明白。
  • 我的意思是它一直在 32 到 38 等范围内旋转。即使是不同的配置
  • 它说没有文字频道,你能再链​​接一次吗?或者我可以在你的linkedin上给你发短信
猜你喜欢
  • 2018-04-23
  • 2018-07-27
  • 2020-07-06
  • 2018-12-10
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
  • 2021-03-06
  • 1970-01-01
相关资源
最近更新 更多