【问题标题】:tensorflow.keras model accuracy, loss, and validation metrics remain static during 30 epochs of trainingtensorflow.keras 模型的准确性、损失和验证指标在 30 个训练阶段保持不变
【发布时间】:2020-05-04 01:26:57
【问题描述】:

我编写了一个接收 MFCC 频谱图的 CNN,旨在将图像分为五个不同的类别。我对模型进行了 30 个 epoch 的训练,在第一个 epoch 之后,指标没有变化。这可能是分类不平衡的问题吗?如果是这样,如果可能的话,我将如何偏向数据集的模型?下面是数据生成器代码、模型定义和输出。原始模型有两个额外的层,但是当我尝试解决问题时我开始调整一些东西

数据生成器定义:

path = 'path_to_dataset'
CLASS_NAMES = ['belly_pain', 'burping', 'discomfort', 'hungry', 'tired']
CLASS_NAMES = np.array(CLASS_NAMES)
BATCH_SIZE = 32
IMG_HEIGHT = 150
IMG_WIDTH = 150
# 457 is the number of images total
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 = 30

model = 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'])

前 5 个时期:

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

最后五个时期:

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

【问题讨论】:

  • 请不要使用 cmets 空间在您自己的问题中提供此类更新 - 改为编辑和更新您的帖子。

标签: python tensorflow machine-learning keras deep-learning


【解决方案1】:

您正在尝试完成一个包含 4 个类别的分类任务,但您的最后一层仅包含一个神经元。

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

Dense(4, activation="softmax")

您还需要根据分类损失更改损失函数,例如categorical_crossentropy

【讨论】:

  • 这种情况下损失也要改;请相应地更新您的答案。
  • 我可以只使用不带参数的 CCE,还是将数据生成器对象传递给该函数?
  • 我不确定是否完全理解您的问题,但您不需要提供任何参数,在您的情况下,您只需更改 model.compile 方法中的损失参数即可。
猜你喜欢
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 2020-08-08
  • 1970-01-01
  • 2019-01-30
  • 1970-01-01
  • 2018-02-02
  • 1970-01-01
相关资源
最近更新 更多