【问题标题】:fit_generator trains with 0 accuracyfit_generator 训练精度为 0
【发布时间】:2023-03-22 20:37:01
【问题描述】:

我正在尝试使用 TensorFlow、Keras 和 ImageDataGenerator 从头开始​​制作模型,但它并没有按预期进行。我只使用生成器来加载图像,所以没有使用数据增强。有两个文件夹包含训练数据和测试数据,每个文件夹有 36 个子文件夹,里面装满了图像。我得到以下输出:

Using TensorFlow backend.
Found 13268 images belonging to 36 classes.
Found 3345 images belonging to 36 classes.
Epoch 1/2
1/3 [=========>....................] - ETA: 0s - loss: 15.2706 - acc: 0.0000e+00
3/3 [==============================] - 1s 180ms/step - loss: 14.7610 - acc: 0.0667 - val_loss: 15.6144 - val_acc: 0.0312
Epoch 2/2
1/3 [=========>....................] - ETA: 0s - loss: 14.5063 - acc: 0.1000
3/3 [==============================] - 0s 32ms/step - loss: 15.5808 - acc: 0.0333 - val_loss: 15.6144 - val_acc: 0.0312

尽管看起来不错,但显然它根本没有训练。我尝试过使用不同数量的时期、步骤和更大的数据集——几乎没有任何变化。即使有超过 60k 的图像,训练每个 epoch 也需要大约半秒!奇怪的是,当我尝试将图像保存到各个文件夹时,它只保存了大约 500-600 个并且很可能会停止。

from tensorflow.python.keras.applications import ResNet50
from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Dense, Flatten, GlobalAveragePooling2D, Conv2D, Dropout
from tensorflow.python.keras.applications.resnet50 import preprocess_input
from tensorflow.python.keras.preprocessing.image import ImageDataGenerator
import keras
import os

if __name__ == '__main__':
    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

    image_size = 28
    img_rows = 28
    img_cols = 28
    num_classes = 36

    data_generator = ImageDataGenerator()

    train_generator = data_generator.flow_from_directory(
        directory="/final train 1 of 5/",
        save_to_dir="/image generator output/train/",
        target_size=(image_size, image_size),
        color_mode="grayscale",
        batch_size=10,
        class_mode='categorical')

    validation_generator = data_generator.flow_from_directory(
        directory="/final test 1 of 5/",
        save_to_dir="/image generator output/test/",
        target_size=(image_size, image_size),
        color_mode="grayscale",
        class_mode='categorical')

    model = Sequential()
    model.add(Conv2D(20, kernel_size=(3, 3),
                     activation='relu',
                     input_shape=(img_rows, img_cols, 1)))
    model.add(Conv2D(20, kernel_size=(3, 3), activation='relu'))
    model.add(Flatten())
    model.add(Dense(100, activation='relu'))
    model.add(Dense(num_classes, activation='softmax'))

    model.compile(loss=keras.losses.categorical_crossentropy,
                  optimizer='adam',  # adam/sgd
                  metrics=['accuracy'])

    model.fit_generator(train_generator,
                        steps_per_epoch=3,
                        epochs=2,
                        validation_data=validation_generator,
                        validation_steps=1)

似乎某些事情默默地失败并削弱了训练过程。

【问题讨论】:

    标签: python tensorflow machine-learning keras classification


    【解决方案1】:

    问题是您误解了fit_generatorsteps_per_epoch 参数。让我们看一下文档:

    steps_per_epoch:整数。在声明一个时期完成并开始下一个时期之前从生成器产生的步骤总数(样本批次)。它通常应该等于数据集的样本数除以批量大小。序列可选:如果未指定,将使用len(generator) 作为步骤数。

    所以基本上,它决定了每个时期会产生多少批次。因为根据定义,一个时期意味着遍历整个训练数据,因此我们必须将此参数设置为样本总数除以批量大小。所以在你的例子中它是steps_per_epoch = 13268 // 10。当然,如文档中所述,您可以不指定它,它会自动推断。

    此外,同样的事情也适用于validation_steps 参数。

    【讨论】:

    • 感谢您的回复,但显然问题出在不同的地方。我只是从 Kaggle 的教程中复制粘贴了这些值。我去掉它们之后,它计算了1327步,但是训练还是很快,没有结果,导致1327/1327 [==============================] - 26s 20ms/step - loss: 15.6347 - acc: 0.0300 - val_loss: 15.9109 - val_acc: 0.0129为什么准确率会那么低? Apple 的 CreateML 工具在完全相同的数据上大约 40%(afaik 他们使用迁移学习)
    • @ethamine 我不知道您正在处理的具体任务和数据集。一个原因可能是您没有对图像进行标准化。将rescale=1/255. 作为参数传递给ImageDataGenerator,看看是否有帮助。此外,根据图像的数量和任务的复杂性,您的网络可能太小,因此欠拟合。
    【解决方案2】:

    正如@today 所暗示的,问题出在未标准化的图像中。

    rescale=1/255 传递给ImageDataGenerator 解决了它。

    【讨论】:

      猜你喜欢
      • 2020-06-07
      • 2017-11-12
      • 2016-10-01
      • 1970-01-01
      • 2023-01-01
      • 1970-01-01
      • 2020-03-20
      • 2017-09-18
      • 2020-06-04
      相关资源
      最近更新 更多