tensorflow hashtable,Tensorflow關于Dataset的一般操作

 2023-10-21 阅读 23 评论 0

摘要:Dataset封裝了很好的關于數據集的一些基本操作,在這里做一下總結。該對象的路徑是:tensorflow.data.Dataset(這是1.4版本之后的)很大程度上參考了這篇博客 同時再推薦一個特別好的博客:https://towardsdatascience.com/how-to-use-dataset

Dataset封裝了很好的關于數據集的一些基本操作,在這里做一下總結。該對象的路徑是:tensorflow.data.Dataset(這是1.4版本之后的)很大程度上參考了這篇博客

同時再推薦一個特別好的博客:https://towardsdatascience.com/how-to-use-dataset-in-tensorflow-c758ef9e4428

Tensoflow的核心數據就是tensor。可以這么理解,想要讓tensoflow的數據正確的“流動”起來,那么就需要正確的匹配張量的維數。再給計算圖模型填充數據的時候,使用字典的方式是最慢的,應該避免這種操作;正確的做法是把數據組合成張量,進行操作,這也是tf.data.Dataset的核心功能之一。

tf.data.Dataset.from_tensor_slices

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

生成一個迭代器,用于便利所有的數據。一般用法如下:

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'}

常用的數據集操作

map函數

與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就是將多個元素組合成batch,如下面的程序將dataset中的每個元素組成了大小為32的batch:

dataset = dataset.batch(32)
shuffle函數

tensorflow java。shuffle的功能為打亂dataset中的元素,它有一個參數buffersize,表示打亂時使用的buffer的大小:

dataset = dataset.shuffle(buffer_size=10000)
repeat函數

repeat的功能就是將整個序列重復多次,主要用來處理機器學習中的epoch,假設原先的數據是一個epoch,使用repeat(5)就可以將之變成5個epoch:

dataset = dataset.repeat(5)  # 重復5次數據

注意,必須指明重復的次數,否則會無限期的重復下去。

一種常規的用法:
dataset.shuffle(1000).repeat(10).batch(32)

把數據進行1000個為單位的亂序,重復10次,生成批次為32的batch

tf.data.TextLineDataset

python dataset?這個函數的輸入是一個文件的列表,輸出是一個dataset。dataset中的每一個元素就對應了文件中的一行。可以使用這個函數來讀入CSV文件。一般操作方式:

tf.data.TextLineDataset(file_path).skip(n)

讀取文件,同時跳過前n行。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/157016.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息