在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)
答案 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))