如何使用tf.data.Dataset.apply()重塑数据集

Nil*_*kor 8 python tensorflow tensorflow-datasets

我正在使用tensorflow中的时间序列模型.我的数据集包含物理信号.我需要将这些信号分成窗口,因为这个切片的窗口是我模型的输入.

这是我如何读取数据并切片:

import tensorflow as tf
import numpy as np
def _ds_slicer(data):
    win_len = 768
    return {"mix":(tf.stack(tf.split(data["mix"],win_len))),
            "pure":(tf.stack(tf.split(data["pure"],win_len)))}
dataset = tf.data.Dataset.from_tensor_slices({
    "mix" : np.random.uniform(0,1,[1000,24576]),
    "pure" : np.random.uniform(0,1,[1000,24576])
})
dataset = dataset.map(_ds_slicer)
print dataset.output_shapes
# {'mix': TensorShape([Dimension(768), Dimension(32)]), 'pure': TensorShape([Dimension(768), Dimension(32)])}
Run Code Online (Sandbox Code Playgroud)

我想重塑这个数据集 # {'mix': TensorShape([Dimension(32)]), 'pure': TensorShape([Dimension(32))}

numpy中的等效转换将如下所示:

signal  = np.random.uniform(0,1,[1000,24576])
sliced_sig = np.stack(np.split(signal,768,axis=1),axis=1)
print sliced_sig.shape #(1000, 768, 32)
sliced_sig=sliced_sig.reshape(-1, sliced_sig.shape[-1])
print sliced_sig.shape #(768000, 32)
Run Code Online (Sandbox Code Playgroud)

我想过使用tf.contrib.data.group_by_window作为dataset.apply()的输入但是无法弄清楚如何使用它.有没有办法可以使用任何自定义转换来重塑数据集?

Oli*_*rot 5

我认为您只是在寻找转变tf.contrib.data.unbatch。这正是您想要的:

x = np.zeros((1000, 768, 32))

dataset = tf.data.Dataset.from_tensor_slices(x)
print(dataset.output_shapes)  # (768, 32)
dataset = dataset.apply(tf.contrib.data.unbatch())
print(dataset.output_shapes)  # (32,)
Run Code Online (Sandbox Code Playgroud)

从文档中:

如果数据集的元素的形状为[B,a0,a1,...],其中B随元素的不同而变化,则对于数据集中的每个元素,未分批处理的数据集将包含形状为[a0,a1]的B个连续元素,...]。


编辑TF 2.0

(感谢@DavidParks)

从TF 2.0开始,您可以直接使用tf.data.Dataset.unbatch

x = np.zeros((1000, 768, 32))

dataset = tf.data.Dataset.from_tensor_slices(x)
print(dataset.output_shapes)  # (768, 32)
dataset = dataset.unbatch()
print(dataset.output_shapes)  # (32,)
Run Code Online (Sandbox Code Playgroud)