如何使用 tf.data.Dataset.apply() 重塑数据集
How to use tf.data.Dataset.apply() for reshaping the dataset
我正在使用 tensorflow 中的时间序列模型。我的数据集包含物理信号。我需要将此信号划分为 windows,因为将此切片 windows 作为我模型的输入。
这是我读取数据并对其进行切片的方式:
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)])}
我想将此数据集重塑为 # {'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)
我想过使用 tf.contrib.data.group_by_window 作为 dataset.apply() 的输入,但不知道如何使用它。有没有一种方法可以使用任何自定义转换来重塑数据集?
我认为您只是在寻找转换 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,)
来自文档:
If elements of the dataset are shaped [B, a0, a1, ...], where B may vary from element to element, then for each element in the dataset, the unbatched dataset will contain B consecutive elements of shape [a0, a1, ...].
为 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,)
我正在使用 tensorflow 中的时间序列模型。我的数据集包含物理信号。我需要将此信号划分为 windows,因为将此切片 windows 作为我模型的输入。
这是我读取数据并对其进行切片的方式:
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)])}
我想将此数据集重塑为 # {'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)
我想过使用 tf.contrib.data.group_by_window 作为 dataset.apply() 的输入,但不知道如何使用它。有没有一种方法可以使用任何自定义转换来重塑数据集?
我认为您只是在寻找转换 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,)
来自文档:
If elements of the dataset are shaped [B, a0, a1, ...], where B may vary from element to element, then for each element in the dataset, the unbatched dataset will contain B consecutive elements of shape [a0, a1, ...].
为 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,)