我编写了一个卷积神经网络(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
。