当前位置: 代码迷 >> python >> Tensorflow from_generator中的数据集之间的运行时切换?
  详细解决方案

Tensorflow from_generator中的数据集之间的运行时切换?

热度:47   发布时间:2023-07-14 09:49:40.0

我有一个巨大的数据集(大约50 GB),并且正在使用类似以下的Python生成器加载它:

def data_generator(self, images_path):
    with open(self.temp_csv, 'r') as f:
        for image in f.readlines():
            # Something going on... 
            yield (X, y)

重要的是,我正在使用单个生成器来训练和验证数据,并且试图在运行时更改self.temp_csv 但是,事情并没有按预期进行,而是通过更新变量self.temp_csv来实现 ,该变量应该在训练集和验证集之间进行切换, 不会调用open,并且最终我会一遍又一遍地遍历同一数据集。 我想知道是否有可能使用Dataset.from_generator,并且在运行时期间,我切换到另一个数据集进行验证阶段。 这是我指定发生器的方式。 谢谢!

def get_data(self):

    with tf.name_scope('data'):

        data_generator = lambda: self.data_generator(images_path=self.data_path)

        my_data = tf.data.Dataset.from_generator(
        generator=data_generator,
        output_types=(tf.float32, tf.float32),
        output_shapes=(tf.TensorShape([None]), tf.TensorShape([None]))
        ).batch(self.batch_size).prefetch(2)

        img, self.label = my_data.make_one_shot_iterator().get_next()
        self.img = tf.reshape(img, [-1, CNN_INPUT_HEIGHT, CNN_INPUT_WIDTH, CNN_INPUT_CHANNELS])

您可以使用重新初始化的迭代器或可迭代的迭代器在2个数据集之间切换,如所示。

但是,如果要使用生成器读取所有数据,然后创建一个训练和验证拆分,则它并不是那么简单。

如果您有单独的验证文件,则可以简单地创建一个新的验证数据集并使用上面显示的迭代器。 如果不是这种情况,则和take()之类的方法可以帮助您拆分数据,但是需要考虑如何进行良好的拆分。

  相关解决方案