我正在尝试使用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的图像,训练每个纪元也要花费大约半秒钟!奇怪的是,当我尝试将图像保存到相应的文件夹时,它仅保存了大约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)


似乎有些事情无声地失败并削弱了培训过程。

最佳答案

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


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


因此,基本上,它确定了每个时期将生成多少批次。由于按照定义,一个时期意味着要遍历整个训练数据,因此我们必须将此参数设置为样本总数除以批次大小。因此,在您的示例中为steps_per_epoch = 13268 // 10。当然,如文档中所述,您可以不指定它,它将自动进行推断。

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

关于python - fit_generator火车,精度为0,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53654594/

10-12 17:31