我正在训练CNN。我想在短期内跟踪指标,但是我有太多实例要等待一个完整的纪元。本质上,我希望ImageDataGenerator仅选择一部分数据来完成一个纪元。由于我正在使用Tensorflow,因此历元是手动运行的,因此没有steps_per_epoch参数。

这是我的数据加载代码:

import tensorflow as tf
import numpy as np
import os
from tensorflow.keras.preprocessing.image import ImageDataGenerator

path = 'my_path/'
os.chdir(path)

image_generator = ImageDataGenerator(rescale=1./255, validation_split=.2)

train_generator = image_generator.flow_from_directory(
    path,
    color_mode='grayscale',
    target_size=(30, 30),
    batch_size=16,
    classes=os.listdir(),
    subset='training')


我正在像这样运行时代:

for epoch in range(5):
    for data, labels in train_generator:
        train_step(data, labels)

    for test_data, test_labels in validation_generator:
        test_step(test_data, test_labels)

    train_los.reset_states()
    train_acc.reset_states()

    test_los.reset_states()
    test_acc.reset_states()


test_step()基本上只是通过模型运行数据并更新渐变。

可能的解决方案:将validation_split设置为0.9,所以我只有10%的数据,但这似乎很愚蠢。此外,如果它继续重复使用相同的10%,我将会丢失很多信息。

最佳答案

我怀疑会不会比简单更漂亮:

EVALUATE_EVERY = 1000

def evaluate(step, generator, test_los, test_acc):
    for test_data, test_labels in generator:
        step(test_data, test_labels)
    test_los.reset_states()
    test_acc.reset_states()


for epoch in range(5):
    for i, (data, labels) in enumerate(train_generator):
        train_step(data, labels)
        if i % EVALUATE_EVERY == 0:
            evaluate(test_step, test_generator, test_los, test_acc)

    train_los.reset_states()
    train_acc.reset_states()


但是我不是keras epxert。

关于python - 有没有办法用Keras ImageDataGenerator和Tensorflow制作更小的纪元?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59438758/

10-12 21:55