如何将model.predict包含到我的输入管道中?

时间:2019-08-18 13:04:34

标签: python tensorflow keras tensorflow-datasets

问题:

我正在构建视频字幕seq2seq模型,并且输入管道存在问题:

我正在使用预先训练的 InceptionV3 模型来预处理我的所有数据

但是,我有很多数据:10.000个视频,每个包含大约几百帧。

当我使用Inceptionv3预处理数据时,它返回给我一个非常大的numpy数组

那么我就不可能从这个numpy数组中创建一个tf.data.Dataset,因为它的大小6GiB比 2GiB张量流的大小限制大得多。


我的管道步骤:

第1步:

提取视频并将帧存储在磁盘上。从此文件创建tf.data.Dataset

record_files, lowest_n_frames = build_tfrecord_dataset(videos_name, video_path_zip, record_file_path)
records_dataset = tf.data.TFRecordDataset(record_files)

第2步:

从步骤1中创建的TFRecord文件中获取帧,然后将其重新格式化为Inceptionv3。

video_dataset = records_dataset.map(lambda tfrecord: decode_tfrecord(tfrecord, n_frames))
video_dataset = video_dataset.map(format_video)

第3步:

使用Inceptionv3预处理视频帧。这将返回一个巨大的numpy数组。

bottlenecks = image_features_extract_model.predict(video_dataset, verbose=1, steps=n_samples)

步骤4(错误步骤):

我正在根据tf.data.Dataset创建一个bottlenecks。当然,它只能处理少量数据。

features_dataset = tf.data.Dataset.from_tensor_slices(bottlenecks)

错误非常简单明了:

ValueError: Cannot create a tensor proto whose content is larger than 2GB.

我想要的东西:

我想知道如何将model.predict操作作为输入管道的一部分!

我不想一次在RAM中有一个6GiB numpy数组,我想对数据进行“逐步”预处理

1 个答案:

答案 0 :(得分:1)

当数据变大时,使用tf.data.Dataset.from_generator会更聪明

我不知道您的确切代码和输出是什么样子,但是如果您尝试这样的操作,它应该可以工作

features_dataset = tf.data.Dataset.from_generator(iter(bottlenecks),
                                                  output_types=...,
                                                  output_shapes=...,)