我正在构建视频字幕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数组,我想对数据进行“逐步”预处理
答案 0 :(得分:1)
当数据变大时,使用tf.data.Dataset.from_generator会更聪明
我不知道您的确切代码和输出是什么样子,但是如果您尝试这样的操作,它应该可以工作
features_dataset = tf.data.Dataset.from_generator(iter(bottlenecks),
output_types=...,
output_shapes=...,)