<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Dataset類是TensorFlow非常流行的儲存資料的格式。常用來作為輸入輸出。data模組主要的用途就是通過這種方法建立Dataset。
Dataset使用過程中的一些心得:
經常將自變數X資料以及target資料以元組的形式包裹,如db_train=tf.data.Dataset.from_tensor_slices((x_train,y_train)),建立Dataset。模型的fit()方法可以自動的解包。
Dataset能夠包括比較靈活的型別,比如db_train=tf.data.Dataset.from_tensor_slices(({"features":features_train,"biomass_start":biomass_start_trarin},y_train))。因為資料最外部依然是最外部包裹,所以model的fit()依然可以自動的對x以及target解包。但由於dataset儲存component是以原始資料的形式儲存的。所以,fit()裡的inputs一般是這個樣子:
{'features': <tf.Tensor 'my_rnn/Cast_1:0' shape=(None, 5, 4) dtype=float32>, 'biomass_start': <tf.Tensor 'my_rnn/Cast:0' shape=(None, 1) dtype=float32>}
對於字典內部部分,需要手動的自己解包。這樣的好處是,給我們自定義模型的結構提供的很大的遍歷,輸入一部分匯入A網路,一部分匯入不同的B網路。
Dataset作為模型的輸入,需要設定batch()。而不在模型內設定batch。更加方便。然而Dataset作為迭代器,迭代完成後再次迭代資料,生成資料的前後資料是不一樣的。需要注意。
batch的drop_remainder=True引數比較重要,只有設定為True,input接下來的層還能正確的識別shape
Dataset.element_spec
這個屬性可以檢測每一個元素中的component的型別。返回的是一個tf.TypeSpec物件。這個物件的結構跟元素的結構是一致的。
dataset1 = tf.data.Dataset.from_tensor_slices(tf.random.uniform([4, 10])) dataset1.element_spec #TensorSpec(shape=(10,), dtype=tf.float32, name=None) dataset2 = tf.data.Dataset.from_tensor_slices( (tf.random.uniform([4]), tf.random.uniform([4, 100], maxval=100, dtype=tf.int32))) dataset2.element_spec # 標量和向量 # (TensorSpec(shape=(), dtype=tf.float32, name=None), #TensorSpec(shape=(100,), dtype=tf.int32, name=None)) dataset = tf.data.Dataset.from_tensor_slices(([1, 2], [3, 4], [5, 6])) dataset.element_spec #(TensorSpec(shape=(), dtype=tf.int32, name=None), # TensorSpec(shape=(), dtype=tf.int32, name=None), # TensorSpec(shape=(), dtype=tf.int32, name=None)) # 注意這裡是字典型別 dataset = tf.data.Dataset.from_tensor_slices({"a": [1, 2], "b": [3, 4]}) dataset.element_spec #{'a': TensorSpec(shape=(), dtype=tf.int32, name=None), # 'b': TensorSpec(shape=(), dtype=tf.int32, name=None)}
apply方法
對dataset進行轉換。
dataset = tf.data.Dataset.range(100) def dataset_fn(ds): return ds.filter(lambda x: x < 5) dataset = dataset.apply(dataset_fn) list(dataset.as_numpy_iterator())
as_numpy_iterator
dataset = tf.data.Dataset.from_tensor_slices([1, 2, 3]) for element in dataset.as_numpy_iterator(): print(element)
這個在dataset比較常用。就是將dataset變成迭代器,將所有元素都變成numy物件輸出
shuffle
shuffle( buffer_size, seed=None, reshuffle_each_iteration=None, name=None )
引數:
這個方法用來隨機打亂資料集的元素順序。資料集用buffer_size元素填充一個緩衝區,然後從這個緩衝區隨機取樣元素,用新元素替換選中的元素。例如,如果您的資料集包含10,000個元素,但是buffer_size被設定為1,000,那麼shuffle將首先從緩衝區中的前1,000個元素中選擇一個隨機元素。一旦一個元素被選中,它在緩衝區中的空間就會被下一個(比如第1001個)元素替換,從而保持這個1,000元素緩衝區。為了實現完美的洗牌,需要一個大於或等於資料集完整大小的緩衝區。
dataset = tf.data.Dataset.range(3) # 每個每個epoch重新洗牌 dataset = dataset.shuffle(3, reshuffle_each_iteration=True) list(dataset.as_numpy_iterator()) # [1, 0, 2] list(dataset.as_numpy_iterator()) # [1, 2, 0] dataset = tf.data.Dataset.range(3) # 每個每個epoch不重新洗牌 dataset = dataset.shuffle(3, reshuffle_each_iteration=False) list(dataset.as_numpy_iterator()) # [1, 0, 2] list(dataset.as_numpy_iterator()) # [1, 0, 2]
batch
batch( batch_size, drop_remainder=False, num_parallel_calls=None, deterministic=None, name=None )
引數:
這個方法經常使用,將dataset進行批次處理化。因為資料集比較大的時候,一下子完全進行訓練佔用大量的記憶體。所以用分批次處理。輸出的元素增加了一個額外的維度,就是batch維,shape是batch的size.
batch支援一個drop_remainder=True關鍵字,為真意味著,最後一個batch的size如果小於我們指定值,就會被捨棄。
之所以要刪掉最後一個短的batch,是因為如果我們的專案依賴這個batch的size,那最後一個batch不等長,可能會出錯。
import tensorflow as tf from tensorflow.python.data import Dataset dataset = tf.data.Dataset.range(8) dataset = dataset.batch(3) print(list(dataset.as_numpy_iterator())) # 通過這個看到這個elem也已經是分批了 for elem in dataset: print(elem) # tf.Tensor([0 1 2], shape=(3,), dtype=int64) # tf.Tensor([3 4 5], shape=(3,), dtype=int64) # tf.Tensor([6 7], shape=(2,), dtype=int64) for elem in dataset.as_numpy_iterator(): print(elem) # [0 1 2] # [3 4 5] # [6 7] dataset = tf.data.Dataset.range(8) # drop_remainder舍掉最後一個長度不夠的batch dataset = dataset.batch(3, drop_remainder=True) list(dataset.as_numpy_iterator())
一般情況下,shuffle跟batch是連續使用的,實現隨機讀取並批次處理資料:dataset.shuffle(buffer_size).batch(batchsize)
不能對已經batch的dataset進行連續的batch操作,其batchsize不會改變,而是生成了新的異常資料
unbatch
unbatch( name=None )
這裡是將Batchdataset這樣的dataset分割為一個個元素,元素的格式跟定義時的格式是一樣的。而且,這裡固定的是對第1個維度進行split操作,且生成shape[0]個元素。
reduce方法
reduce( initial_state, reduce_func, name=None )
將輸入資料集簡化為一個元素。 reduce_func作用於dataset中每一個元素,輸出其dataset的聚合資訊。
引數initial_state代表進行reduce之前的初始狀態。reduce_func要接收old_state, input_element兩個引數,然後生成新的狀態newstate。old_state和new_state的結構要一致。
dataset = tf.data.Dataset.from_tensor_slices([8, 3, 0, 8, 2, 1]) print(dataset.reduce(0, lambda state, value: state + value).numpy()) # 22
dataset不支援tf.split屬性,也不能直接把dataset給切分為訓練集和測試集。
到此這篇關於Tensorflow的DataSet的使用詳解的文章就介紹到這了,更多相關Tensorflow DataSet內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45