我正在尝试使用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_epoch
的fit_generator
参数。让我们看一下文档:
steps_per_epoch:整数。在声明一个纪元完成并开始下一个纪元之前,要从生成器产生的总步数(批次样本)。它通常应等于数据集的样本数除以批次大小。序列的可选:如果未指定,将使用len(generator)
作为许多步骤。
因此,基本上,它确定了每个时期将生成多少批次。由于按照定义,一个时期意味着要遍历整个训练数据,因此我们必须将此参数设置为样本总数除以批次大小。因此,在您的示例中为steps_per_epoch = 13268 // 10
。当然,如文档中所述,您可以不指定它,它将自动进行推断。
此外,同样的事情也适用于validation_steps
参数。
关于python - fit_generator火车,精度为0,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53654594/