TensorFlow 图像分类损失没有减少

时间:2021-06-22 14:51:03

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

import tensorflow as tf
import matplotlib.pyplot as plt
import cv2
import os
import numpy as np
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.preprocessing import image
from tensorflow.keras.optimizers import Nadam
from tensorflow.keras.models import load_model

train = ImageDataGenerator(rescale=1 / 255)
validation = ImageDataGenerator(rescale=1 / 255)

train_dataset = train.flow_from_directory('raw-img/training', target_size=(200, 200), batch_size=3,
                                          class_mode='categorical')

validation_dataset = train.flow_from_directory('raw-img/validation', target_size=(200, 200), batch_size=3,
                                               class_mode='categorical')

model = tf.keras.models.Sequential([tf.keras.layers.Conv2D(16, (3, 3), activation='relu', input_shape=(200, 200, 3),padding='same'),
                                    tf.keras.layers.MaxPool2D(2, 2,padding='same'),
                                    #
                                    tf.keras.layers.Conv2D(32, (3, 3), activation='relu',padding='same'),
                                    tf.keras.layers.MaxPool2D(2, 2),
tf.keras.layers.Dropout(rate=0.6),
                                    #
                                    tf.keras.layers.Conv2D(64, (3, 3), activation='relu',padding='same'),
                                    tf.keras.layers.MaxPool2D(2, 2),
tf.keras.layers.Dropout(rate=0.6),
                                    #
                                    tf.keras.layers.Conv2D(128, (3, 3), activation='relu',padding='same'),
                                    tf.keras.layers.MaxPool2D(2, 2),
                                    #
                                    tf.keras.layers.Conv2D(128, (3, 3), activation='relu',padding='same'),
                                    tf.keras.layers.MaxPool2D(2, 2),
                                    #

                                    tf.keras.layers.Conv2D(256, (3, 3), activation='relu',padding='same'),
                                    tf.keras.layers.MaxPool2D(2, 2,),
                                    #
                                    tf.keras.layers.Flatten(),
                                    #
                                    tf.keras.layers.Dense(512, activation='relu'),

                                    tf.keras.layers.Dense(256, activation='relu'),
                                    tf.keras.layers.Dense(10, activation='sigmoid'),
])
print(model.summary())
model.compile(loss='binary_crossentropy', optimizer=Nadam(learning_rate=0.003), metrics['accuracy'])
model_fit = model.fit(train_dataset, epochs=70, batch_size=3, validation_data=validation_dataset,steps_per_epoch=len(train_dataset),validation_steps=len(validation_dataset))
loss, accuracy = model.evaluate(train_dataset)
print("Loss: ", loss)
print("Accuracy: ", accuracy)

找到属于 10 个类别的 26179 个图像。 共找到 8196 张图片,属于 10 个类别。

Epoch 1/70
2909/2909 [==============================] - 1005s 345ms/step - loss: 0.3292 - accuracy: 0.1805 - val_loss: 0.3533 - val_accuracy: 0.0000e+00
Epoch 2/70
2909/2909 [==============================] - 645s 222ms/step - loss: 0.3167 - accuracy: 0.1758 - val_loss: 0.3654 - val_accuracy: 0.0000e+00

...

Epoch 8/70
2909/2909 [==============================] - 445s 153ms/step - loss: 0.3160 - accuracy: 0.1835 - val_loss: 0.3666 - val_accuracy: 0.0000e+00
Epoch 9/70
2909/2909 [==============================] - ETA: 0s - loss: 0.3146 - accuracy: 0.1867

这段代码有什么问题?准确度停留在 0.1800 和 0.1900,损失不减少。

1 个答案:

答案 0 :(得分:0)

几个问题

  1. 由于您的图像是 200 X 200,您可以使用更大的批量大小,例如 32
  2. 在 train = ImageDataGenerator(rescale=1 / 255) 中,您可能需要考虑
    添加一些图像增强,如水平翻转=真等。如果你添加
    扩充不要在您的代码中使用 train 来进行validation_data 集,请使用
    验证
  3. 在你的模型中你有代码 tf.keras.layers.Dense(10, activation='sigmoid')
    除非您正在进行多标签分类,否则将激活更改为“softmax”
  4. 您的模型可能会过度拟合。我会至少添加一个 dropout 层到
    你的模型像 tf.keras.layers.Dropout(.3)
  5. 先做上面的改动,看看性能。如果它开始过度拟合
    增加dropout率或减少隐藏层的节点数
  6. 如果您对准确性不满意,您可以通过
    改进 使用和可调学习率。您可以使用 Keras 回调来执行此操作
    减少LROnPlateau。文档是 here. 我的建议代码是
rlronp=tf.keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=.5,patience=1,verbose=1)
  1. 我还建议您使用 Keras 回调 EarlyStopping。它会监控
    如果在“耐心”次数后未能减少验证损失。
    文档是 here. set restore_best_weights=True 所以这是这个
    回调激活它将使用
    时代的权重加载您的模型 最低的验证损失。我建议的代码是
es=tf.keras.callbacks.EarlyStopping(monitor="val_loss",patience=4,verbose=1,
                                    restore_best_weights=True)
  1. 如果您使用回调,则在 model.fit set callbacks=[rlronp,es]
相关问题