Tensorflow:NotImplementedError:reduce()转换当前不支持嵌套数据集作为输入

时间:2018-10-24 10:05:08

标签: python tensorflow tensorflow-datasets

在Tensorflow 1.12中,引入了tf.data.Dataset.reduce()tf.data.Dataset.window()方法。

摘自发行说明:

  • “新的tf.data.Dataset.reduce() API允许用户使用用户提供的reduce函数将有限数据集简化为单个元素。”

  • “新的tf.data.Dataset.window() API允许用户创建输入数据集的有限窗口;与tf.data.Dataset.reduce() API结合使用时,这允许用户实现自定义的批处理。”

但是如何使用这些功能?

def reduce_func(old_state, input_element):
    pdb.set_trace()
    return new_state

dataset = tf.data.Dataset.from_generator(frame_generator, (tf.string, tf.string))
dataset = dataset.window(2).reduce(np.int64(0), reduce_func)

这会产生NotImplementedError:

  

NotImplementedError:reduce()转换当前不存在
  支持嵌套数据集作为输入。

我使用tensorflow版本'1.12.0-rc1'

编辑: 来自https://www.tensorflow.org/versions/r1.12/api_docs/python/tf/contrib/data/sliding_window_batch

此功能已被弃用。它将在以后的版本中删除。更新说明:使用tf.data.Dataset.window(size=window_size, shift=window_shift, stride=window_stride).flat_map(lambda x: x.batch(window.size))

但是如果使用生成数据集,该如何使用

dataset = tf.data.Dataset.from_generator(frame_generator, (tf.string, tf.string))

因此,数据集中的每个项目都包含两个元素。然后有一个TypeError:

  

TypeError:()接受1个位置参数,但给出了2个

编辑: 通过使用zip

解决
dataset = tf.data.Dataset.from_generator(frame_generator, (tf.string, tf.string))
window_size = 2
dataset = dataset.window(window_size).flat_map(lambda x,y: tf.data.Dataset.zip((x,y)).batch(window_size))
dataset = dataset.map(self.parse_function)

1 个答案:

答案 0 :(得分:0)

这里的问题是,当您调用.reduce()函数时,该函数将应用于外部数据集。 调用.window之后的数据集现在是一个数据集,其中每个元素本身就是一个数据集。 您要做的是对window创建的各个数据集使用reduce方法。 您可以使用map进行此操作,然后将每个内部数据集映射到reduce。

def reduce_func(old_state, input_element):
    pdb.set_trace()
    return new_state

dataset = tf.data.Dataset.from_generator(frame_generator, (tf.string, tf.string))
dataset = dataset.window(2).map(lambda ds: ds.reduce(np.int64(0), reduce_func))