一、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