Dataset封裝了很好的關于數據集的一些基本操作,在這里做一下總結。該對象的路徑是:tensorflow.data.Dataset
(這是1.4版本之后的)很大程度上參考了這篇博客
同時再推薦一個特別好的博客:https://towardsdatascience.com/how-to-use-dataset-in-tensorflow-c758ef9e4428
Tensoflow的核心數據就是tensor。可以這么理解,想要讓tensoflow的數據正確的“流動”起來,那么就需要正確的匹配張量的維數。再給計算圖模型填充數據的時候,使用字典的方式是最慢的,應該避免這種操作;正確的做法是把數據組合成張量,進行操作,這也是tf.data.Dataset
的核心功能之一。
tensorflow hashtable。該函數是核心函數之一,它的作用是把給定的元組、列表和張量等數據進行特征切片。切片的范圍是從最外層維度開始的。如果有多個特征進行組合,那么一次切片是把每個組合的最外層的數據切出。。直接看代碼理解。
假設我們現在有兩組數據,分別是特征和標簽,為了簡化說明問題,我們假設每兩個特征對應一個標簽。之后把特征和標簽組合成一個tuple
,那么我們的想法是讓每個標簽都恰好對應2個特征,而且像直接切片,比如:[f11, f12] [t1]
。f11
表示第一個數據的第一個特征,f12
表示第1個數據的第二個特征,t1
表示第一個數據標簽。那么tf.data.Dataset.from_tensor_slices
就是做了這件事情:
import tensorflow as tf
import numpy as npfeatures, labels = (np.random.sample((5, 2)), # 模擬5組數據,每組數據2個標簽np.random.sample((5, 1))) # 模擬5組特征,注意兩者的維數必須匹配print((features, labels)) # 輸出下組合的數據
data = tf.data.Dataset.from_tensor_slices((features, labels))
print(data) # 輸出張量的信息
結果輸出:
(array([[0.94509483, 0.19160528],[0.49125608, 0.93146317],[0.19331899, 0.59950161],[0.8338232 , 0.71606446],[0.23264883, 0.71179252]]), array([[0.48340206],[0.55842171],[0.30450086],[0.45078316],[0.40497981]]))
<DatasetV1Adapter shapes: ((2,), (1,)), types: (tf.float64, tf.float64)>
生成一個迭代器,用于便利所有的數據。一般用法如下:
tf.data.Dataset.make_one_shot_iterator.get_next()
tensorflow c。每次列舉出下一個數據集。
實例:
import tensorflow as tf
import numpy as npdata = tf.data.Dataset.from_tensor_slices(np.array([1, 2, 3, 4, 5]))element = data.make_one_shot_iterator().get_next() # 建立迭代器,并進行迭代操作with tf.Session() as sess:try:while True:print(sess.run(element))except tf.errors.OutOfRangeError:print("Out range !")
import tensorflow as tf
import numpy as npa = np.array(['a', 'b', 'c', 'd', 'e'])
b = np.array([1, 2, 3, 4, 5])# 分別切分數據,以字典的形式存儲
data = tf.data.Dataset.from_tensor_slices({"label1": a,"label2": b}
)it=data.make_one_shot_iterator().get_next()with tf.Session() as sess:try:while True:print(sess.run(it))except tf.errors.OutOfRangeError:print("out of range")
輸出結果
{'label2': 1, 'label1': b'a'}
{'label2': 2, 'label1': b'b'}
{'label2': 3, 'label1': b'c'}
{'label2': 4, 'label1': b'd'}
{'label2': 5, 'label1': b'e'}
與python中的map作用類似,對輸入的數據進行預處理操作。
import tensorflow as tf
import numpy as npa = np.array([1, 2, 3, 4, 5])data = tf.data.Dataset.from_tensor_slices(a)
# 注意在這里是返回的集合,原來的集合不變
data = data.map(lambda x: x ** 2)it = data.make_one_shot_iterator().get_next()with tf.Session() as sess:try:while True:print(sess.run(it))except tf.errors.OutOfRangeError:print("out of range")
batch就是將多個元素組合成batch,如下面的程序將dataset中的每個元素組成了大小為32的batch:
dataset = dataset.batch(32)
tensorflow java。shuffle的功能為打亂dataset中的元素,它有一個參數buffersize,表示打亂時使用的buffer的大小:
dataset = dataset.shuffle(buffer_size=10000)
repeat的功能就是將整個序列重復多次,主要用來處理機器學習中的epoch,假設原先的數據是一個epoch,使用repeat(5)就可以將之變成5個epoch:
dataset = dataset.repeat(5) # 重復5次數據
注意,必須指明重復的次數,否則會無限期的重復下去。
dataset.shuffle(1000).repeat(10).batch(32)
把數據進行1000個為單位的亂序,重復10次,生成批次為32的batch
python dataset?這個函數的輸入是一個文件的列表,輸出是一個dataset。dataset中的每一個元素就對應了文件中的一行。可以使用這個函數來讀入CSV文件。一般操作方式:
tf.data.TextLineDataset(file_path).skip(n)
讀取文件,同時跳過前n行。
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态