深入淺出tf.data

一、tf.data介紹

TensorFlow官方文檔中對於tf.data的介紹是「一款高性能,易用性,可擴展性,可組合性很好的框架,用於構建輸入隊列和管道」,這種描述非常的簡潔。就個人理解來說,tf.data主要是為了解決TensorFlow在數據處理階段的瓶頸問題而被開發出來的,同時可以使數據處理變得簡單易用。在構建模型的時候不僅涉及到各種複雜的模型結構的搭建,還需要考慮數據的質量和有效性,因此在數據處理階段使用tf.data,可以使這個過程更加流暢、可靠和提高效率。

二、tf.dataset與迭代器

tf.data包含三種數據形式:tf.data.Dataset, tf.data.Iterator, tf.data.TFRecordDataset。其中Dataset是我們要處理的主要數據形式,而Iterator是用來對Dataset進行處理的工具。

tf.data.Dataset 表示一個元素序列,其中的每個元素包含一個或多個Tensor對象。tf.data.Iterator 是一個可重複初始化的對象,它為tf.data.Dataset 提供了一種迭代方式。

使用tf.data.Dataset.from_tensor_slices() 創建Dataset後,可以使用make_one_shot_iterator方法創建一個 Iterator對象,Iterator可以迭代這個 Dataset。


import tensorflow as tf
data = np.array([[1, 2], [3, 4], [5, 6]])
dataset = tf.data.Dataset.from_tensor_slices(data)
iterator = tf.compat.v1.data.make_one_shot_iterator(dataset)
next_item = iterator.get_next()
with tf.compat.v1.Session() as sess:
for i in range(3):
val = sess.run(next_item)
print(val)

上段代碼將一個NumPy數組轉換為tf.data.Dataset,為了迭代這個數據集,我們創建了一個位於數據集頂端的迭代器,這種迭代方式被稱作「One-shot Iteration」,因為它可以完整地遍曆數據集僅一次。

三、tf.data.dataset函數、tf.data.AUTOTUNE

tf.data.Dataset接受的數據源可以是numpy數組、Pandas DataFrame、Python生成器或者TFRecord文件等等。另外,tf.data.Dataset還有若干個非常有用的處理函數,如map()、shuffle()、batch()、zip()等,允許您根據需要對數據集進行一系列轉換。

map() 函數使用一個函數將一個元素轉換為另一個元素。shuffle() 函數從數據集樣本中隨機地提取和重組數據。batch() 函數收集多個元素並將它們組合在一起形成小 batch。

tf.data.AUTOTUNE 這個值會自動決定當前操作需要多少CPU資源來執行。在新版本的TensorFlow中,這個參數會自動計算最佳的CPU資源數量。這種動態調整資源的方法可以更好地利用計算機的資源。

四、TFRecordDataset

TFRecord是一種處理大量數據的格式,可以更好地存儲和處理大量的樣本。.tfrecords格式文件是tensorflow官方提供的一種序列化文件格式,該文件格式存儲的數據類型只有tf.train.Example,tf.train.Example是一組特徵與標籤。而使用TFRecordDataset的一大作用便是可以讀取這種文件格式。


import tensorflow as tf
filenames = ["file1.tfrecords", "file2.tfrecords", "file3.tfrecords"]
dataset = tf.data.TFRecordDataset(filenames)

上述代碼中,我們將TFRecord文件放在第一層的列表中作為參數傳遞給TFRecordDataset的構造函數。然後,我們就可以使用這個 Dataset 了。

五、tf.data.Dataset.from、tf.data.dataset.from_tensor

tf.data.Dataset.from_tensor() 函數將張量轉換為數據集。與from_tensor_slices()不同,from_tensor() 會將整個張量作為一個元素,這在許多情況下會更加方便。

tf.data.Dataset.from_generator() 函數使用 Python 生成器中的值作為Dataset的處理入口。


import tensorflow as tf
import numpy as np
x = np.array([[1, 2], [3, 4]])
y = np.array([[0], [1]])
dataset = tf.data.Dataset.from_tensor_slices((x, y))

這個代碼通過創建一個元組 (x, y),使用 from_tensor_slices() 去創建了一個 Dataset。微調,我們可以通過 dataset.take() 和 list(dataset) 函數來看一下這個轉換得如何:


for element in dataset:
print(element)

tf.data.Dataset.from_generator() 的工作方式和 from_tensor() 相似。它需要的參數是一個 Python 函數,並且可以接受額外參數。這個 Python 函數需要通過 yield 返回元素。


def count(stop):
i = 0
while i<stop:
yield i
i += 1
for n in ds:
print(n.numpy())
ds = tf.data.Dataset.from_generator(count, args=[25], output_types=tf.int32, output_shapes = (), )

六、tf.data函數與matlab

TensorFlow提供了 tf.data.experimental.CsvDataset,tf.data.experimental.SqlDataset 等多個數據集組件,以滿足不同用戶的數據處理需求。而matlab與TensorFlow之間的數據交互則是使用matlabengineforpython橋接實現的


import tensorflow as tf
csv_file_path = 'iris_training.csv'
BATCH_SIZE = 32
def parse_csv(line):
example_defaults = [[0.0], [0.0], [0.0], [0.0], [0]]
parsed_line = tf.io.decode_csv(line, example_defaults)
features = tf.reshape(parsed_line[:-1], shape=(4,))
label = tf.reshape(parsed_line[-1], shape=())
return features, label
ds = tf.data.TextLineDataset(csv_file_path).skip(1).map(parse_csv).shuffle(buffer_size=10000).batch(BATCH_SIZE).prefetch(buffer_size=tf.data.AUTOTUNE)

此外,TensorFlow支持在Python and Google Colaboratory環境下使用Matlab。使用TensorFlow開源庫中的『matlabengineforpython』,可以將Python和Matlab整合在一起。可通過使用Python腳本和Matlab代碼的混合來介紹TensorFlow工具,將底層和高層加以結合。這也使得Matlab的數據處理和可視化功能應用到了TensorFlow。這對於matlab用戶來說是非常便利的。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/182940.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-24 16:25
下一篇 2024-11-24 16:26

相關推薦

  • Duplicate Data Logging Variable Name ‘scopedata1’的解決方法

    我們在進行編程開發過程中,很可能會碰到「scopedata1」數據日誌變數名重複的問題,這會導致程序運行錯誤或者異常,那麼該如何解決這個問題呢?接下來我們將從多個方面對這個問題做詳…

    編程 2025-04-27
  • 深入淺出統計學

    統計學是一門關於收集、分析、解釋和呈現數據的學科。它在各行各業都有廣泛應用,包括社會科學、醫學、自然科學、商業、經濟學、政治學等等。深入淺出統計學是指想要學習統計學的人能夠理解統計…

    編程 2025-04-25
  • 深入淺出torch.autograd

    一、介紹autograd torch.autograd 模塊是 PyTorch 中的自動微分引擎。它支持任意數量的計算圖,可以自動執行前向傳遞、後向傳遞和計算梯度,同時提供很多有用…

    編程 2025-04-24
  • 深入淺出SQL佔位符

    一、什麼是SQL佔位符 SQL佔位符是一種佔用SQL語句中某些值的標記或佔位符。當執行SQL時,將使用該標記替換為實際的值,並將這些值傳遞給查詢。SQL佔位符使查詢更加安全,防止S…

    編程 2025-04-24
  • 深入淺出:理解nginx unknown directive

    一、概述 nginx是目前使用非常廣泛的Web伺服器之一,它可以運行在Linux、Windows等不同的操作系統平台上,支持高並發、高擴展性等特性。然而,在使用nginx時,有時候…

    編程 2025-04-24
  • 深入淺出ThinkPHP框架

    一、簡介 ThinkPHP是一款開源的PHP框架,它遵循Apache2開源協議發布。ThinkPHP具有快速的開發速度、簡便的使用方式、良好的擴展性和豐富的功能特性。它的核心思想是…

    編程 2025-04-24
  • 深入淺出arthas火焰圖

    arthas是一個非常方便的Java診斷工具,包括很多功能,例如JVM診斷、應用診斷、Spring應用診斷等。arthas使診斷問題變得更加容易和準確,因此被廣泛地使用。artha…

    編程 2025-04-24
  • 深入淺出AWK -v參數

    一、功能介紹 AWK是一種強大的文本處理工具,它可以用於數據分析、報告生成、日誌分析等多個領域。其中,-v參數是AWK中一個非常有用的參數,它用於定義一個變數並賦值。下面讓我們詳細…

    編程 2025-04-24
  • Instant Data Scraper使用指南

    一、什麼是Instant Data Scraper Instant Data Scraper是一個基於瀏覽器的網頁數據爬取工具,可以從網站上獲取數據並將其導出到CSV、JSON或G…

    編程 2025-04-24
  • 深入淺出Markdown文字顏色

    一、Markdown文字顏色的背景 Markdown是一種輕量級標記語言,由於其簡單易學、易讀易寫,被廣泛應用於博客、文檔、代碼注釋等場景。Markdown支持使用HTML標籤,因…

    編程 2025-04-23

發表回復

登錄後才能評論