當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python tf.compat.v1.data.TFRecordDataset.window用法及代碼示例


用法

window(
    size, shift=None, stride=1, drop_remainder=False, name=None
)

參數

  • size tf.int64 標量 tf.Tensor ,表示要組合到窗口中的輸入數據集元素的數量。必須是積極的。
  • shift (可選。)tf.int64 標量 tf.Tensor ,表示窗口在每次迭代中移動的輸入元素的數量。默認為 size 。必須是積極的。
  • stride (可選。)tf.int64 標量 tf.Tensor ,表示滑動窗口中輸入元素的步幅。必須是積極的。默認值 1 表示“保留每個輸入元素”。
  • drop_remainder (可選。)一個 tf.bool 標量 tf.Tensor ,表示如果最後一個窗口的大小小於 size ,則是否應刪除它們。
  • name (可選。) tf.data 操作的名稱。

返回

  • Dataset A Dataset 的(嵌套的)窗口。每個窗口都是平麵元素的有限數據集。

返回"windows" 的數據集。

每個"window" 都是一個數據集,其中包含輸入數據集元素的子集。這些是大小為 size 的有限數據集(如果沒有足夠的輸入元素來填充窗口並且 drop_remainder 評估為 False ,則可能更少)。

例如:

dataset = tf.data.Dataset.range(7).window(3)
for window in dataset:
  print(window)
<...Dataset element_spec=TensorSpec(shape=(), dtype=tf.int64, name=None)>
<...Dataset element_spec=TensorSpec(shape=(), dtype=tf.int64, name=None)>
<...Dataset element_spec=TensorSpec(shape=(), dtype=tf.int64, name=None)>

由於窗口是數據集,因此可以對其進行迭代:

for window in dataset:
  print([item.numpy() for item in window])
[0, 1, 2]
[3, 4, 5]
[6]

轉移

shift 參數確定要在每個窗口的開始之間移動的輸入元素的數量。如果窗口和元素都從 0 開始編號,則窗口 k 中的第一個元素將是輸入數據集的元素 k * shift。特別是,第一個窗口的第一個元素將始終是輸入數據集的第一個元素。

dataset = tf.data.Dataset.range(7).window(3, shift=1,
                                          drop_remainder=True)
for window in dataset:
  print(list(window.as_numpy_iterator()))
[0, 1, 2]
[1, 2, 3]
[2, 3, 4]
[3, 4, 5]
[4, 5, 6]

跨步

stride 參數確定窗口內輸入元素之間的步幅。

dataset = tf.data.Dataset.range(7).window(3, shift=1, stride=2,
                                          drop_remainder=True)
for window in dataset:
  print(list(window.as_numpy_iterator()))
[0, 2, 4]
[1, 3, 5]
[2, 4, 6]

嵌套元素

window 轉換應用於元素是嵌套結構的數據集時,它會生成一個數據集,其中元素具有相同的嵌套結構,但每個葉子都被一個窗口替換。換句話說,嵌套應用在窗口之外,而不是在窗口內部。

類型簽名是:

def window(
    self:Dataset[Nest[T]], ...
) -> Dataset[Nest[Dataset[T]]]

window 應用於 Dataset 的元組給出一個窗口元組:

dataset = tf.data.Dataset.from_tensor_slices(([1, 2, 3, 4, 5],
                                              [6, 7, 8, 9, 10]))
dataset = dataset.window(2)
windows = next(iter(dataset))
windows
(<...Dataset element_spec=TensorSpec(shape=(), dtype=tf.int32, name=None)>,
 <...Dataset element_spec=TensorSpec(shape=(), dtype=tf.int32, name=None)>)
def to_numpy(ds):
  return list(ds.as_numpy_iterator())

for windows in dataset:
  print(to_numpy(windows[0]), to_numpy(windows[1]))
[1, 2] [6, 7]
[3, 4] [8, 9]
[5] [10]

window 應用於字典的 Dataset 會給出 Datasets 的字典:

dataset = tf.data.Dataset.from_tensor_slices({'a':[1, 2, 3],
                                              'b':[4, 5, 6],
                                              'c':[7, 8, 9]})
dataset = dataset.window(2)
def to_numpy(ds):
  return list(ds.as_numpy_iterator())

for windows in dataset:
  print(tf.nest.map_structure(to_numpy, windows))
{'a':[1, 2], 'b':[4, 5], 'c':[7, 8]}
{'a':[3], 'b':[6], 'c':[9]}

展平窗口數據集

Dataset.flat_mapDataset.interleave 方法可用於將窗口數據集展平為單個數據集。

flat_map 的參數是一個從數據集中獲取元素並返回 Dataset 的函數。 flat_map 按順序將生成的數據集鏈接在一起。

例如,要將每個窗口變成密集張量:

size = 3
dataset = tf.data.Dataset.range(7).window(size, shift=1,
                                          drop_remainder=True)
batched = dataset.flat_map(lambda x:x.batch(3))
for batch in batched:
  print(batch.numpy())
[0 1 2]
[1 2 3]
[2 3 4]
[3 4 5]
[4 5 6]

相關用法


注:本文由純淨天空篩選整理自tensorflow.org大神的英文原創作品 tf.compat.v1.data.TFRecordDataset.window。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。