tensorflow.keras模型在30个训练周期中的准确率、损失和验证指标保持静态

我编写了一个卷积神经网络(CNN),用于接收MFCC频谱图,并将其分类为五个不同的类别。我训练了这个模型30个周期,但在第一个周期之后,所有的指标都没有变化。这是否可能是由于分类不平衡的问题引起的?如果是的话,我应该如何调整模型来适应数据集?下面是数据生成器代码、模型定义和输出。原始模型有两个额外的层,但在尝试解决这个问题时,我开始调整这些设置。

数据生成器定义:

path = 'path_to_dataset'CLASS_NAMES = ['belly_pain', 'burping', 'discomfort', 'hungry', 'tired']CLASS_NAMES = np.array(CLASS_NAMES)BATCH_SIZE = 32IMG_HEIGHT = 150IMG_WIDTH = 150# 457 是总图像数量STEPS_PER_EPOCH = np.ceil(457/BATCH_SIZE)img_generator = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255, validation_split=0.2, horizontal_flip=True, rotation_range=45, width_shift_range=.15, height_shift_range=.15)train_data_gen = img_generator.flow_from_directory( directory=path, batch_size=BATCH_SIZE, shuffle=True, target_size=(IMG_HEIGHT, IMG_WIDTH), classes = list(CLASS_NAMES), subset='training', class_mode='categorical')validation_data_gen = img_generator.flow_from_directory( directory=path, batch_size=BATCH_SIZE, shuffle=True, target_size=(IMG_HEIGHT, IMG_WIDTH), classes = list(CLASS_NAMES), subset='validation', class_mode='categorical')

模型定义:

EPOCHS = 30model = Sequential([    Conv2D(128, 3, activation='relu',            input_shape=(IMG_HEIGHT, IMG_WIDTH ,3)),    MaxPooling2D(),    Flatten(),    Dense(512, activation='sigmoid'),    Dense(1)])opt = tf.keras.optimizers.Adamax(lr=0.001)model.compile(optimizer=opt,              loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),              metrics=['accuracy'])

前五个周期:

Epoch 1/30368/368 [==============================] - 371s 1s/step - loss: 0.6713 - accuracy: 0.8000 - val_loss: 0.5004 - val_accuracy: 0.8000Epoch 2/30368/368 [==============================] - 235s 640ms/step - loss: 0.5004 - accuracy: 0.8000 - val_loss: 0.5004 - val_accuracy: 0.8000Epoch 3/30368/368 [==============================] - 233s 633ms/step - loss: 0.5004 - accuracy: 0.8000 - val_loss: 0.5004 - val_accuracy: 0.8000Epoch 4/30368/368 [==============================] - 236s 641ms/step - loss: 0.5004 - accuracy: 0.8000 - val_loss: 0.5004 - val_accuracy: 0.8000Epoch 5/30368/368 [==============================] - 234s 636ms/step - loss: 0.5004 - accuracy: 0.8000 - val_loss: 0.5004 - val_accuracy: 0.8000

最后五个周期:

Epoch 25/30368/368 [==============================] - 231s 628ms/step - loss: 0.5004 - accuracy: 0.8000 - val_loss: 0.5004 - val_accuracy: 0.8000Epoch 26/30368/368 [==============================] - 227s 617ms/step - loss: 0.5004 - accuracy: 0.8000 - val_loss: 0.5004 - val_accuracy: 0.8000Epoch 27/30368/368 [==============================] - 228s 620ms/step - loss: 0.5004 - accuracy: 0.8000 - val_loss: 0.5004 - val_accuracy: 0.8000Epoch 28/30368/368 [==============================] - 234s 636ms/step - loss: 0.5004 - accuracy: 0.8000 - val_loss: 0.5004 - val_accuracy: 0.8000Epoch 29/30368/368 [==============================] - 235s 638ms/step - loss: 0.5004 - accuracy: 0.8000 - val_loss: 0.5004 - val_accuracy: 0.8000Epoch 30/30368/368 [==============================] - 234s 636ms/step - loss: 0.5004 - accuracy: 0.8000 - val_loss: 0.5004 - val_accuracy: 0.8000

回答:

您尝试执行一个包含4个类的分类任务,但您的最后一层只有一个神经元。

它应该是具有4个神经元和softmax激活函数的密集层:

Dense(4, activation="softmax")

您还需要相应地更改损失函数为分类损失函数,例如categorical_crossentropy

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中创建了一个多类分类项目。该项目可以对…

发表回复

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