我正在尝试从头开始使用TensorFlow、Keras和ImageDataGenerator
创建一个模型,但结果并不如预期。我仅使用生成器来加载图像,因此没有使用数据增强。训练和测试数据分别存放在两个文件夹中,每个文件夹包含36个子文件夹,每个子文件夹内有图像。我得到了以下输出:
Using TensorFlow backend.Found 13268 images belonging to 36 classes.Found 3345 images belonging to 36 classes.Epoch 1/21/3 [=========>....................] - ETA: 0s - loss: 15.2706 - acc: 0.0000e+003/3 [==============================] - 1s 180ms/step - loss: 14.7610 - acc: 0.0667 - val_loss: 15.6144 - val_acc: 0.0312Epoch 2/21/3 [=========>....................] - ETA: 0s - loss: 14.5063 - acc: 0.10003/3 [==============================] - 0s 32ms/step - loss: 15.5808 - acc: 0.0333 - val_loss: 15.6144 - val_acc: 0.0312
尽管看起来正常,但显然它根本没有进行训练。我尝试过使用不同的epochs数量、steps和更大的数据集——几乎没有什么变化。即使有超过60,000张图像,每个epoch的训练时间也仅需半秒左右!奇怪的是,当我尝试将图像保存到相应的文件夹时,它只保存了大约500到600张图像,然后很可能就停止了。
from tensorflow.python.keras.applications import ResNet50from tensorflow.python.keras.models import Sequentialfrom tensorflow.python.keras.layers import Dense, Flatten, GlobalAveragePooling2D, Conv2D, Dropoutfrom tensorflow.python.keras.applications.resnet50 import preprocess_inputfrom tensorflow.python.keras.preprocessing.image import ImageDataGeneratorimport kerasimport osif __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)
看起来似乎有什么东西悄悄地失败了,导致训练过程受损。
回答:
正如@今天所建议的,问题在于图像未被归一化。
将rescale=1/255
传递给ImageDataGenerator
解决了这个问题。