網站首頁 編程語言 正文
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
- 上一篇:STDC分割網絡:onnx推理
- 下一篇:Spring的純注解配置詳解
相關推薦
- 2022-12-06 .net程序開發IOC控制反轉和DI依賴注入詳解_ASP.NET
- 2022-04-11 獲取base64編碼格式的圖片大小
- 2023-06-04 pandas.DataFrame?Series排序的使用(sort_values,sort_inde
- 2022-12-13 bat文件與Vbs文件之間的常用操作(獲取用戶輸入,執行VBS文件)_DOS/BAT
- 2022-07-01 C++超細致講解隊列queue的使用_C 語言
- 2022-11-30 深入理解Golang?channel的應用_Golang
- 2022-04-12 網絡編程——Http請求方式Get與Post
- 2022-06-19 Go中Writer和Reader接口的使用入門_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支