日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

tensorflow2數據讀取P2: tf.data.Dataset.from_generator通過自定義的python生成器構造Dataset

作者:象象家的小蜜桃 更新時間: 2022-10-29 編程語言

上一篇文章:tensorflow2數據讀取P1: numpy array中,提到model.fit支持輸入5類數據。分別是numpy array, tensor, 字典(值為numpy array或tensor), tf.data創建的Dataset, 生成器類型。

其中tensor, 字典與numpy array區別不是很大。在必須使用這2中數據類型時,做一些類型轉換即可。這篇文章想要說說tf.data創建的Dataset類型作為輸入。學會這種方法,可以處理數據量很大的任務。因為,一些方法創建的Dataset類型,類似一個生成器,可以一點一點地讀取數據。而不是一次性將所有的數據都讀取到內存中。在數據量很大的任務中,一次性將所有數據都讀入內存是不太可能的。

這里主要講解以下3中創建Dataset的方法

  • tf.data.Dataset.from_generator通過自定義的python生成器構造Dataset
  • tf.data.Dataset.from_generator通過preprocessing.image.ImageDataGenerator構造Dataset, 此方法比較適合圖像任務
  • tf.data.TFRecordDataset創建Dataset

tf.data.Dataset.from_generator通過自定義的python生成器構造Dataset

python生成器可以簡單理解成,一種用yield關鍵字返回值的一種函數。生成器有點像擠牙膏,你調用它一次,它的任務就往前推進一點。這就很適合處理大量數據時,每次只讀取需要的那部分數據的情景。
假設有一批圖片數據,我們可以自定義一個生成器,yield圖片路徑,然后再讀取圖片

import os
import tensorflow as tf
import glob
# 自定義一個讀取路徑的生成器
def filepath_generator(inroot,filetype):
    inroot = inroot.decode('utf-8') # 這里用decode是因為這個生成器的參數傳入tf.data.Dataset.from_generator之后,字符串會變成bytes類型
    filetype = filetype.decode('utf-8')
    inroot = os.path.join(inroot,'*.'+filetype)
    filelist = glob.glob(inroot)
    for filepath in range(len(filelist)):
        yield filelist[filepath]

然后使用tf.data.Dataset.from_generator構建dataset
···
inroot = r’imgs’
filetype = ‘jpeg’
dataset = tf.data.Dataset.from_generator(filepath_generator,(tf.string),args=[inroot,filetype])
···
在這里插入圖片描述
tf.data.Dataset.from_generator函數接收4個參數,分別是generator(生成器),output_types(生成器輸出的數據類型),output_shapes(生成器輸出的數據形狀,可選參數),args(調用生成器需要的參數)
注意
送入的generator(生成器)必須是可調用的,例如這個例子里面,傳入filepath_generator函數名,這個就是可調用的。但是,如果生成一個mygenerator = filepath_generator(inroot,filetype), 再將mygenerator傳入tf.data.Dataset.from_generator(mygenerator, (tf.string)), 就會報generator必須是可調用的錯誤。

原文鏈接:https://blog.csdn.net/qq_19069557/article/details/127561671

欄目分類
最近更新