日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【TensorFlow2.0】数据读取与使用方式

發(fā)布時(shí)間:2025/3/20 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【TensorFlow2.0】数据读取与使用方式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

大家好,這是專欄《TensorFlow2.0》的第三篇文章,講述如何使用TensorFlow2.0讀取和使用自己的數(shù)據(jù)集。

如果您正在學(xué)習(xí)計(jì)算機(jī)視覺,無論你通過書籍還是視頻學(xué)習(xí),大部分的教程講解的都是MNIST等已經(jīng)為用戶打包封裝好的數(shù)據(jù)集,用戶只需要load_data即可實(shí)現(xiàn)數(shù)據(jù)導(dǎo)入。但是在我們平時(shí)使用時(shí),無論您是做分類還是檢測(cè)或者分割任務(wù),我們不可能每次都能找到打包好的數(shù)據(jù)集使用,大多數(shù)時(shí)候我們使用的都是自己的數(shù)據(jù)集,也就是我們需要從本地讀取文件。因此我們是很有必要學(xué)會(huì)數(shù)據(jù)預(yù)處理這個(gè)本領(lǐng)的。本篇文章,我們就聊聊如何使用TensorFlow2.0對(duì)自己的數(shù)據(jù)集進(jìn)行處理。

作者&編輯 | 湯興旺

在TensorFlow2.0中,對(duì)數(shù)據(jù)處理的方法有很多種,下面我主要介紹兩種我自認(rèn)為最好用的數(shù)據(jù)預(yù)處理的方法。


1 使用Keras API對(duì)數(shù)據(jù)進(jìn)行預(yù)處理

1.1 數(shù)據(jù)集

本文用到的數(shù)據(jù)集是表情分類數(shù)據(jù)集,數(shù)據(jù)集有1000張圖片,包括500張微笑圖片,500張非微笑圖片。圖片預(yù)覽如下:


微笑圖片:

非微笑圖片:

數(shù)據(jù)集結(jié)構(gòu)組織如下:

其中800張圖片用來訓(xùn)練,200張用來測(cè)試,每個(gè)類別的樣本也是相同的。

1.2 數(shù)據(jù)預(yù)處理

我們知道,在將數(shù)據(jù)輸入神經(jīng)網(wǎng)絡(luò)之前,需要將數(shù)據(jù)格式化為經(jīng)過預(yù)處理的浮點(diǎn)數(shù)張量。現(xiàn)在我們看看數(shù)據(jù)預(yù)處理的步驟,如下圖:

這個(gè)步驟雖然看起來比較復(fù)雜,但在TensorFlow2.0的高級(jí)API Keras中有個(gè)比較好用的圖像處理的類ImageDataGenerator,它可以將本地圖像文件自動(dòng)轉(zhuǎn)換為處理好的張量。

接下來我們通過代碼來解釋如何利用Keras來對(duì)數(shù)據(jù)預(yù)處理,完整代碼如下:

from tensorflow.keras.preprocessing.image import ImageDataGenerator

train_data_dir = r"D://Learning//tensorflow_2.0//smile//data//train"

img_width,img_height = 48,48

train_datagen = ImageDataGenerator(

在上面的代碼中,我們首先導(dǎo)入ImageDataGenerator,即下面代碼:

from tensorflow.keras.preprocessing.image import ImageDataGenerator

ImageDataGenerator是tensorflow.keras.preprocessing.image模塊中的圖片生成器,同時(shí)也可以使用它在batch中對(duì)數(shù)據(jù)進(jìn)行增強(qiáng),擴(kuò)充數(shù)據(jù)集大小,從而增強(qiáng)模型的泛化能力。

ImageDataGenerator中有眾多的參數(shù),如下:

tf.keras.preprocessing.image.ImageDataGenerator(

? ?featurewise_center=False,

? ?brightness_range, ? ?

? ?shear_range=0.,

具體含義如下:

featurewise_center:布爾值,使輸入數(shù)據(jù)集去中心化(均值為0)

samplewise_center:布爾值,使輸入數(shù)據(jù)的每個(gè)樣本均值為0。

featurewise_std_normalization:布爾值,將輸入除以數(shù)據(jù)集的標(biāo)準(zhǔn)差以完成標(biāo)準(zhǔn)化。

samplewise_std_normalization:布爾值,將輸入的每個(gè)樣本除以其自身的標(biāo)準(zhǔn)差。

zca_whitening:布爾值,對(duì)輸入數(shù)據(jù)施加ZCA白化。

rotation_range:整數(shù),數(shù)據(jù)增強(qiáng)時(shí)圖片隨機(jī)轉(zhuǎn)動(dòng)的角度。隨機(jī)選擇圖片的角度,是一個(gè)0~180的度數(shù),取值為0~180。

width_shift_range:浮點(diǎn)數(shù),圖片寬度的某個(gè)比例,數(shù)據(jù)增強(qiáng)時(shí)圖片隨機(jī)水平偏移的幅度。

height_shift_range:浮點(diǎn)數(shù),圖片高度的某個(gè)比例,數(shù)據(jù)增強(qiáng)時(shí)圖片隨機(jī)豎直偏移的幅度。?

shear_range:浮點(diǎn)數(shù),剪切強(qiáng)度(逆時(shí)針方向的剪切變換角度)。是用來進(jìn)行剪切變換的程度。

zoom_range:浮點(diǎn)數(shù)或形如[lower,upper]的列表,隨機(jī)縮放的幅度,若為浮點(diǎn)數(shù),則相當(dāng)于[lower,upper] = [1 - zoom_range, 1+zoom_range]。用來進(jìn)行隨機(jī)的放大。

channel_shift_range:浮點(diǎn)數(shù),隨機(jī)通道偏移的幅度。

fill_mode:‘constant’,‘nearest’,‘reflect’或‘wrap’之一,當(dāng)進(jìn)行變換時(shí)超出邊界的點(diǎn)將根據(jù)本參數(shù)給定的方法進(jìn)行處理。

cval:浮點(diǎn)數(shù)或整數(shù),當(dāng)fill_mode=constant時(shí),指定要向超出邊界的點(diǎn)填充的值。

horizontal_flip:布爾值,進(jìn)行隨機(jī)水平翻轉(zhuǎn)。隨機(jī)的對(duì)圖片進(jìn)行水平翻轉(zhuǎn),這個(gè)參數(shù)適用于水平翻轉(zhuǎn)不影響圖片語義的時(shí)候。

vertical_flip:布爾值,進(jìn)行隨機(jī)豎直翻轉(zhuǎn)。

rescale: 值將在執(zhí)行其他處理前乘到整個(gè)圖像上,我們的圖像在RGB通道都是0~255的整數(shù),這樣的操作可能使圖像的值過高或過低,所以我們將這個(gè)值定為0~1之間的數(shù)。

preprocessing_function: 將被應(yīng)用于每個(gè)輸入的函數(shù)。該函數(shù)將在任何其他修改之前運(yùn)行。該函數(shù)接受一個(gè)參數(shù),為一張圖片(秩為3的numpy array),并且輸出一個(gè)具有相同shape的numpy array。

下面看看我們對(duì)數(shù)據(jù)集增強(qiáng)后的一個(gè)效果,由于圖片數(shù)量太多,我們顯示其中9張圖片,增強(qiáng)后圖片如下:

大家可以多嘗試下每個(gè)增強(qiáng)后的效果,增加些感性認(rèn)識(shí),數(shù)據(jù)增強(qiáng)和圖片顯示代碼如下,只需要更改ImageDataGenerator中的參數(shù),就能看到結(jié)果。

import matplotlib.pyplot as plt

? ? ? ? r"D://Learning//tensorflow_2.0//smile//datas//mouth//test",?

? ? ? ?batch_size=1,

? shuffle=False,? ? ? ? ? ? ? ? ? ? ? ? ? ?save_to_dir=r"D://Learning//tensorflow_2.0//smile//datas//mouth//model",

說完了數(shù)據(jù)增強(qiáng),我們?cè)倏聪翴mageGenerator類下的函數(shù)flow_from_diectory。從這個(gè)函數(shù)名,我們也明白其就是從文件夾中讀取圖像。

train_generator = train_datagen.flow_from_directory(

flow_from_diectory中有如下參數(shù):

directory:目標(biāo)文件夾路徑,對(duì)于每一個(gè)類,該文件夾都要包含一個(gè)子文件夾。

target_size:整數(shù)tuple,默認(rèn)為(256, 256)。圖像將被resize成該尺寸

color_mode:顏色模式,為"grayscale"和"rgb"之一,默認(rèn)為"rgb",代表這些圖片是否會(huì)被轉(zhuǎn)換為單通道或三通道的圖片。

classes:可選參數(shù),為子文件夾的列表,如['smile','neutral'],默認(rèn)為None。若未提供,則該類別列表將從directory下的子文件夾名稱/結(jié)構(gòu)自動(dòng)推斷。每一個(gè)子文件夾都會(huì)被認(rèn)為是一個(gè)新的類。(類別的順序?qū)凑兆帜副眄樞蛴成涞綐?biāo)簽值)。

class_mode: "categorical", "binary", "sparse"或None之一。默認(rèn)為"categorical。該參數(shù)決定了返回的標(biāo)簽數(shù)組的形式, "categorical"會(huì)返回2D的one-hot編碼標(biāo)簽,"binary"返回1D的二值標(biāo)簽。"sparse"返回1D的整數(shù)標(biāo)簽,如果為None則不返回任何標(biāo)簽,生成器將僅僅生成batch數(shù)據(jù)。

batch_size:batch數(shù)據(jù)的大小,默認(rèn)32。

shuffle:是否打亂數(shù)據(jù),默認(rèn)為True。

seed:可選參數(shù),打亂數(shù)據(jù)和進(jìn)行變換時(shí)的隨機(jī)數(shù)種子。

save_to_dir:None或字符串,該參數(shù)能讓你將數(shù)據(jù)增強(qiáng)后的圖片保存起來,用以可視化。

save_prefix:字符串,保存數(shù)據(jù)增強(qiáng)后圖片時(shí)使用的前綴, 僅當(dāng)設(shè)置了save_to_dir時(shí)生效。

save_format:"png"或"jpeg"之一,指定保存圖片的數(shù)據(jù)格式,默認(rèn)"jpeg"。

這些參數(shù)中的directory一定要弄清楚,它是指類別文件夾的上一層文件夾,在該數(shù)據(jù)集中,類別文件夾為smile和neutral,它的上一級(jí)文件夾是train。所以director為?r"D://Learning//tensorflow_2.0//smile//data//train"

另外,class這個(gè)參數(shù)也要注意,通常我們就采用默認(rèn)None,directory的子文件夾就是標(biāo)簽。在該分類任務(wù)中標(biāo)簽就是smile和neutral。

以上就是在TensorFlow2.0中利用Keras這個(gè)高級(jí)API來對(duì)分類任務(wù)中的數(shù)據(jù)進(jìn)行預(yù)處理。另外如果您需要完成一個(gè)目標(biāo)檢測(cè)等任務(wù),則需要自定義一個(gè)類來繼承ImageDataGeneraton。具體怎么操作,請(qǐng)期待我們的下回關(guān)于如何利用TensorFlow2.0處理目標(biāo)檢測(cè)任務(wù)的分享。

2 使用Dataset類對(duì)數(shù)據(jù)預(yù)處理

由于該方法在TensorFlow1.x版本中也有,大家可以比較查看2.0相對(duì)于1.x版本的改動(dòng)地方。下面是TensorFlow2.0中使用的完整代碼:

import tensorflow as tf

#from tensorflow.contrib.data import Dataset

#from tensorflow.python.framework import dtypes

#from tensorflow.python.framework.ops import convert_to_tensor

? ? ? # 轉(zhuǎn)換成Tensor

? ? ? ?#self.img_paths=convert_to_tensor(self.img_paths, dtype=dtypes.string)

? ? ? ?#self.labels =convert_to_tensor(self.labels, dtype=dtypes.int32)

? ? ? ?#img = tf.read_file(filename)

? ? ? ?img = tf.io.read_file(filename)

? ? ? ?img = tf.image.convert_image_dtype(img, dtype=tf.float32)

? ? ? ?#img =tf.random_crop(img,[self.image_size[0],self.image_size[1],3]) ? ? ?

? ? ? ?img=tf.image.random_crop(img, [self.image_size[0], self.image_size[1], 3])

上圖中標(biāo)紅色的地方是tensorFlow2.0版本與1.x版本的區(qū)別,紅色部分屬于1.X版本。主要更改在contrib部分,在tensorFlow2.0中已經(jīng)刪除contrib了,其中有維護(hù)價(jià)值的模塊會(huì)被移動(dòng)到別的地方,剩余的都將被刪除,這點(diǎn)大家務(wù)必注意。

如果您對(duì)上面代碼有任何不明白的地方請(qǐng)移步之前的文章:【tensorflow速成】Tensorflow圖像分類從模型自定義到測(cè)試

重要活動(dòng),本周有三AI紀(jì)念撲克牌發(fā)售中,只有不到100套的名額噢,先到先得!

有三AI紀(jì)念撲克牌

總結(jié)

本文主要介紹了如何在TensorFlow2.0中對(duì)自己的數(shù)據(jù)進(jìn)行預(yù)處理。主要由兩種比較好用的方法,第一種是TensorFlow2.0中特有的,即利用Keras高級(jí)API對(duì)數(shù)據(jù)進(jìn)行預(yù)處理,第二種是利用Dataset類來處理數(shù)據(jù),它和TensorFlow1.X版本基本一致。


下期預(yù)告:使用TensorFlow構(gòu)建深度學(xué)習(xí)網(wǎng)絡(luò)。

近期chat

今日看圖猜技術(shù)

知識(shí)匯總

有三AI生態(tài)

轉(zhuǎn)載文章請(qǐng)后臺(tái)聯(lián)系

侵權(quán)必究

更多請(qǐng)關(guān)注知乎專欄《有三AI學(xué)院》

往期精選

  • 有三AI一周年了,說說我們的初衷,生態(tài)和愿景

與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的【TensorFlow2.0】数据读取与使用方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。