如何从 numpy 数组的数组中获取 tensorflow 2 中的窗口数据集?
How to get a windowed dataset in tensorflow 2 from an array of numpy arrays?
假设我有一些数据:
some_data = np.array([[1,2,3,4], [5, 6, 7,8]])
看起来像这样:
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
每一行代表不同的观察结果,因此不应将它们合并。我想创建一个 windowed 数据集,每个 window 大小为 3,偏移 1。当我通过一次观察时,我得到了我想要的,如下所示:
dataset = tf.data.Dataset.from_tensor_slices(some_data[0])
dataset = dataset.window(size=3, shift=1, drop_remainder=True)
dataset = dataset.flat_map(lambda window: window.batch(3))
结果:
for x in dataset:
print(x.numpy())
[1 2 3]
[2 3 4]
但是当我传递整个 numpy 数组时,我什么也得不到。
dataset = tf.data.Dataset.from_tensor_slices(some_data)
dataset = dataset.window(size=3, shift=1, drop_remainder=True)
dataset = dataset.flat_map(lambda window: window.batch(3))
这是我所期望的:
for x in dataset:
print(x.numpy())
[1 2 3]
[2 3 4]
[5 6 7]
[6 7 8]
我想我可以遍历 some_data
并一次传递一个数组,然后连接数据集,但这似乎是一个糟糕的解决方案。正确的做法是什么?
我正在使用 Tensorflow 2.0。谢谢!
使用dataset = tf.data.Dataset.from_tensor_slices(some_data[0])
时,数据集的每一行只有一个元素。
dataset = tf.data.Dataset.from_tensor_slices(some_data[0])
for x in dataset:
print(x.numpy())
1
2
3
4
但是当你使用dataset = tf.data.Dataset.from_tensor_slices(some_data)
时,数据集的每一行都有四个元素。
dataset = tf.data.Dataset.from_tensor_slices(some_data)
for x in dataset:
print(x.numpy())
[1 2 3 4]
[5 6 7 8]
所以你需要做的是转换每一行并合并它。
import numpy as np
import tensorflow as tf
some_data = np.array([[1,2,3,4], [5, 6, 7,8]])
dataset = tf.data.Dataset.from_tensor_slices(some_data)
def parse_samples(x):
return tf.data.Dataset.from_tensor_slices(x)\
.window(size=3, shift=1, drop_remainder=True)\
.flat_map(lambda window: window.batch(3))
dataset = dataset.flat_map(parse_samples)
for x in dataset:
print(x.numpy())
[1 2 3]
[2 3 4]
[5 6 7]
[6 7 8]
假设我有一些数据:
some_data = np.array([[1,2,3,4], [5, 6, 7,8]])
看起来像这样:
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
每一行代表不同的观察结果,因此不应将它们合并。我想创建一个 windowed 数据集,每个 window 大小为 3,偏移 1。当我通过一次观察时,我得到了我想要的,如下所示:
dataset = tf.data.Dataset.from_tensor_slices(some_data[0])
dataset = dataset.window(size=3, shift=1, drop_remainder=True)
dataset = dataset.flat_map(lambda window: window.batch(3))
结果:
for x in dataset:
print(x.numpy())
[1 2 3]
[2 3 4]
但是当我传递整个 numpy 数组时,我什么也得不到。
dataset = tf.data.Dataset.from_tensor_slices(some_data)
dataset = dataset.window(size=3, shift=1, drop_remainder=True)
dataset = dataset.flat_map(lambda window: window.batch(3))
这是我所期望的:
for x in dataset:
print(x.numpy())
[1 2 3]
[2 3 4]
[5 6 7]
[6 7 8]
我想我可以遍历 some_data
并一次传递一个数组,然后连接数据集,但这似乎是一个糟糕的解决方案。正确的做法是什么?
我正在使用 Tensorflow 2.0。谢谢!
使用dataset = tf.data.Dataset.from_tensor_slices(some_data[0])
时,数据集的每一行只有一个元素。
dataset = tf.data.Dataset.from_tensor_slices(some_data[0])
for x in dataset:
print(x.numpy())
1
2
3
4
但是当你使用dataset = tf.data.Dataset.from_tensor_slices(some_data)
时,数据集的每一行都有四个元素。
dataset = tf.data.Dataset.from_tensor_slices(some_data)
for x in dataset:
print(x.numpy())
[1 2 3 4]
[5 6 7 8]
所以你需要做的是转换每一行并合并它。
import numpy as np
import tensorflow as tf
some_data = np.array([[1,2,3,4], [5, 6, 7,8]])
dataset = tf.data.Dataset.from_tensor_slices(some_data)
def parse_samples(x):
return tf.data.Dataset.from_tensor_slices(x)\
.window(size=3, shift=1, drop_remainder=True)\
.flat_map(lambda window: window.batch(3))
dataset = dataset.flat_map(parse_samples)
for x in dataset:
print(x.numpy())
[1 2 3]
[2 3 4]
[5 6 7]
[6 7 8]