我正在训练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/