从Keras生成器中获取x_test和y_test?

4
对于某些问题,验证数据不能是一个生成器,例如:TensorBoard 直方图

如果要打印直方图,则必须提供验证数据,不能使用生成器。

我的当前代码如下:
image_data_generator = ImageDataGenerator()

training_seq   = image_data_generator.flow_from_directory(training_dir)
validation_seq = image_data_generator.flow_from_directory(validation_dir)
testing_seq    = image_data_generator.flow_from_directory(testing_dir)

model = Sequential(..)
# ..
model.compile(..)
model.fit_generator(training_seq, validation_data=validation_seq, ..)

我该如何将其提供为validation_data=(x_test, y_test)
2个回答

5

Python 2.7和Python 3.*的解决方案:

from platform import python_version_tuple

if python_version_tuple()[0] == '3':
    xrange = range
    izip = zip
    imap = map
else:
    from itertools import izip, imap

import numpy as np

# ..
# other code as in question
# ..

x, y = izip(*(validation_seq[i] for i in xrange(len(validation_seq))))
x_val, y_val = np.vstack(x), np.vstack(y)

或者,支持 class_mode='binary',那么:
from keras.utils import to_categorical

x_val = np.vstack(x)
y_val = np.vstack(imap(to_categorical, y))[:,0] if class_mode == 'binary' else y

完整可运行的代码: https://gist.github.com/AlecTaylor/7f6cc03ed6c3dd84548a039e2e0fd006

我试了你的代码,得到了x_val和y_val,它们的形状分别为(83,224,224,3)和(83,3)。我想把y_val重塑成(83,),但是却出现了这个错误**ValueError: cannot reshape array of size 249 into shape (83,)**。 - root

4

更新(2018年6月22日):阅读作者提供的简洁高效的解决方案。阅读我的内容以了解正在发生的事情。


在Python中,您可以使用以下方式获取所有生成器数据:

data = [x for x in generator]

然而,ImageDataGenerators不会终止,因此上述方法不适用。但是我们可以对该方法进行一些修改以适应这种情况:

data = []     # store all the generated data batches
labels = []   # store all the generated label batches
max_iter = 100  # maximum number of iterations, in each iteration one batch is generated; the proper value depends on batch size and size of whole data
i = 0
for d, l in validation_generator:
    data.append(d)
    labels.append(l)
    i += 1
    if i == max_iter:
        break

现在我们有两个张量批次的列表。我们需要对它们进行重新塑形,以便得到两个张量:一个用于数据(即X),另一个用于标签(即y):
data = np.array(data)
data = np.reshape(data, (data.shape[0]*data.shape[1],) + data.shape[2:])

labels = np.array(labels)
labels = np.reshape(labels, (labels.shape[0]*labels.shape[1],) + labels.shape[2:])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接