gpt4 book ai didi

python - Keras 的 predict_generator 没有返回正确数量的样本

转载 作者:太空宇宙 更新时间:2023-11-03 15:48:21 25 4
gpt4 key购买 nike

我正在尝试实现一个自定义数据生成器,它使用 pandas.read_csv 从 csv 文件中读取数据 block 。我使用 model.predict_generator 对其进行了测试,但返回的预测数量少于预期(在我的例子中,253457 中有 248192 个)。

自定义生成器

class TestDataGenerator:

def __init__(self, directory, batch_size=1024):
self.directory = directory
self.batch_size = batch_size
self.chunk_size=10000
self.samples = 0

def _to_movie_id(self, ids):
ids = ast.literal_eval(ids)
if ids == []:
return [EMB_MATRIX_SIZE-1]
else:
return [movie2idx[str(movie_id)] for movie_id in ids]

def generate(self):
csv_files = glob.glob(self.directory + '/*.csv')
while True:
for file in csv_files:
df = pd.read_csv(file, chunksize=self.chunk_size)
for df_chunk in df:
chunk_steps = math.ceil(len(df_chunk) / self.batch_size)
for i in range(chunk_steps):
batch = df_chunk[i * self.batch_size:(i + 1) * self.batch_size]
X_batch, y_batch = self.preprocess(batch)
self.samples += len(batch)
yield X_batch, y_batch


def preprocess(self, df):
X_user = df['user'].apply(lambda x: user2idx[str(x)]).values
X_watched = df['watched'].apply(self._to_movie_id).values
X_watched_padded = pad_sequences(X_watched, maxlen=SEQ_LENGTH, value=0)

ohe = df['movie'].apply(lambda x: to_categorical(movie2idx[x], num_classes=len(movie2idx)))
X = [X_user, X_watched_padded]
y = np.array([o.tolist() for o in ohe])

return X, y

运行model.predict_generator

batch_size=1024
n_samples_test = 253457
test_dir = 'folder/'
test_gen = TestDataGenerator(test_dir, batch_size=batch_size)
next_test_gen = test_gen.generate()
preds = model.predict_generator(next_test_gen, steps=math.ceil(n_samples_test/batch_size))

运行model.predict_generator后,preds的行数为248192,小于实际的253457。看起来它缺少一些纪元。我还在不与 Keras 交互的情况下单独测试了 generate,它的行为符合预期,在 csv 文件中返回了正确数量的样本。此外,在 generate 生成值之前,我会跟踪使用 samples 处理的样本数。令人惊讶的是,samples 的值为 250000。因此,我很确定我可能对 Keras 做了一些事情。

请注意,我还尝试设置 max_queue_size=1,并使 generate 线程安全,但没有成功。为简单起见,我只在 test_dir 下放置了 1 个 csv 文件。我正在使用嵌入在 Tensorflow 1.5.0 中的 Keras 2.1.2-tf。

我对如何做到这一点进行了一些研究,但还没有找到有用的示例。这个实现有什么问题?

谢谢

Peeranat F.

最佳答案

嗯,这很棘手。那么让我们深入探讨这个问题:

  1. fit_generator 如何在提供的批处理小于 batch_size 时工作:如您所见 - 您提供给 fit_generator 的大小小于 batch_size。每次从每个文件中取出最后一批时都会发生这种情况。通常 - 许多文本不能被批量大小整除,因此没有足够的文本来填充批量。这最终会导致向模型提供更少的示例。

    这是一个棘手的部分 - keras 忽略较小的大小,将其视为有效的生成器步骤并返回不完整批处理的值。

  2. 那么为什么缺少文本:让我通过示例向您展示。假设您有 2 个文件,每个文件有 5 个文本,并且您的 batch_size 是 4。这就是您的批处理的样子:

    [1t1, 1t2, 1t3, 1t4], [1t5,], [2t1, 2t2, 2t3, 2t4], [2t5].

    如您所见 - 实际所需的步数等于 4,它不等于 3,后者是通过获取:math.ceil (10/4)。这种方式适用于这些批处理:

    [1t1, 1t2, 1t3, 1t4], [1t5, 2t1, 2t2, 2t3], [2t4, 2t5]

    但是从你的生成器返回的批处理不是这样的。

  3. 如何解决问题? - 你需要让你的生成器计算实际需要的步数:

    def steps_needed(self):
    steps = 0
    csv_files = glob.glob(self.directory + '/*.csv')
    for file in csv_files:
    df = pd.read_csv(file, chunksize=self.chunk_size)
    for df_chunk in df:
    chunk_steps = math.ceil(len(df_chunk) / self.batch_size)
    steps += chunk_steps
    return steps

    此函数准确计算您的生成器将返回多少批处理。

干杯:)

关于python - Keras 的 predict_generator 没有返回正确数量的样本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48551158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com