6

当我使用我的数据集在 Keras 中基于 Resnet-50(后端是 tensorflow)打开基础时,我发现很奇怪,在每个 epoch 之后,val 都比 train 慢。我不知道为什么,是因为我的GPU没有足够的内存吗?我的 GPU 是 K2200,它有 4 GB 内存。我误解了paras的意思吗?

我有 35946 火车图片,所以我使用:

samples_per_epoch=35946,

我有 8986 val pic 所以我用:</p>

 nb_val_samples=8986,

以下是我的代码的一部分:

train_datagen = ImageDataGenerator(
    rescale=1./255,
    featurewise_center=False,  # set input mean to 0 over the dataset
    samplewise_center=False,  # set each sample mean to 0
    featurewise_std_normalization=False,  # divide inputs by std of the dataset
    samplewise_std_normalization=False,  # divide each input by its std
    zca_whitening=False,  # apply ZCA whitening
    rotation_range=20,  # randomly rotate images in the range (degrees, 0 to 180)
    width_shift_range=0.1,  # randomly shift images horizontally (fraction of total width)
    height_shift_range=0.1,  # randomly shift images vertically (fraction of total height)
    horizontal_flip=True,  # randomly flip images
    vertical_flip=False,
    zoom_range=0.1,
    channel_shift_range=0.,
    fill_mode='nearest',
    cval=0.,

)
test_datagen = ImageDataGenerator(rescale=1. / 255)

train_generator = train_datagen.flow_from_directory(
    'data/train',
    batch_size=batch_size,
    class_mode='categorical')

validation_generator = test_datagen.flow_from_directory(
    'data/val',
    batch_size=batch_size,
    class_mode='categorical')
model.fit_generator(train_generator,
                    # steps_per_epoch=X_train.shape[0] // batch_size,
                    samples_per_epoch=35946,
                    epochs=epochs,
                    validation_data=validation_generator,
                    verbose=1,
                    nb_val_samples=8986,
                    callbacks=[earlyStopping,saveBestModel,tensorboard])
4

2 回答 2

1

@Yanning 正如您在评论中提到的那样,第一个时代很慢,因为 ImageDataGenerator 正在将数据从磁盘读取到 RAM。这部分很慢。将数据读入 RAM 后,只需将数据从 RAM 读取和传输到 GPU 即可。

因此,如果您的数据集不是很大并且可以放入您的 RAM,您可以尝试从所有数据集中创建一个 numpy 文件并在开始时读取此数据。这将节省大量磁盘寻道时间。

请查看此帖子以比较不同操作所花费的时间:

每个程序员都应该知道的延迟数字

延迟比较数字

主存储器参考 100 ns
从内存中顺序读取 1 MB 250,000 ns
从 SSD 顺序读取 1 MB 1,000,000 ns
从磁盘顺序读取 1 MB 20,000,000 ns
于 2017-12-03T01:44:10.430 回答
0

我认为答案在于“fit_generator”函数的各种参数选择。我遇到了同样的问题,并通过在“fit_generator”函数中使用以下参数来解决这个问题。

steps_per_epoch=training_samples_count // batch_size,
validation_steps=validation_samples_count // batch_size,

请注意,我已经为验证和训练指定了步骤,这使得验证速度非常快。

于 2020-07-12T14:19:22.680 回答