python - 如何在每个 epoch 后解决恒定的模型精度
问题描述
我正在研究深度学习,作为一项作业,我正在做一个分类项目,它有 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 上发现了一些类似的问题,比如这个问题,并尝试了以下事情
- 应用标准缩放器
- 增加/减少隐藏层和神经元
- 添加了 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'])
我不知道这里有什么问题。如果您需要更多详细信息来处理此问题,请告诉我。请不要关闭这个问题,我知道这个问题有机会标记为重复问题,但相信我,我尝试了很多我作为初学者可以理解的事情。
解决方案
问题是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()])
推荐阅读
- java - Java和C#在声明和初始化变量方面的区别
- javascript - 如何在情节时间序列中显示未来数据
- python - 在 conda 的当前频道中找不到 pytorch 1.9.1
- c# - 使用 Nlog 在 .Net 5 上进行网络跟踪
- paypal - 我是否需要同时购买 Paypal 和 Braintree 帐户才能进行 Paypal 集成?
- linkedin - 为什么 LinkedIn 没有从我的 URL 中获取正确的 og 标签
- awk - 将行与上一行合并
- r - 为什么 R ggplot2 geom_text 使用此代码位于 geom_point 和 geom_line 下?
- uipath - 仅限 UiPath 机器人中的 Chrome 扩展程序问题
- c++ - 从服务访问 gRPC 服务器类的成员