深度學習中數據加載(tensorflow2.0爲例)

背景知識

    在 深度學習中, 數據的預處理佔據了我們在訓練過程中的一大部分,如何利用不同的庫加載我們的數據顯得尤爲重要。因此本次blog將結合tensorflow2.0中數據加載部分官方文檔講述如何加載我們自己標註的數據和標籤。

測試環境

  • 操作系統:Windows10
  • 深度學習框架:Tensorflow==2.0 or plus
  • IDE: Pycharm

自定義數據格式介紹

    在 深度學習中, 對於模型的搭建固然重要,但是在數據的預處理部分也佔據了訓練過程中的很大一部分時間,如何利用不同的庫加載我們的數據顯得尤爲重要。由於本人感興趣的是圖像這一塊的領域,因此數據將以圖像分類爲例,進行演示和說明。

數據下載的鏈接爲  演示數據下載
   
簡單看一下數據的存儲的方式,數據存儲的方式的目錄結構爲:
在這裏插入圖片描述
可以看到每張圖片的父節點目錄就是他們分類的結果,而每個文件夾裏面的內容就是分類的圖片。在我們準備好數據之後就可以開始我們的數據加載部分的操作了。

自定義數據加載

在tensorflow==2.0中需要使用到的數據加載函數有:

# 數據記載模塊,主要功能是使用迭代器動態獲取對應切片
ds = tf.data.Dataset.from_tensor_slices()
# 利用ds輸出的套一層function函數,就是一個映射(這點和pytorch中的transform很類似)
ds = ds.map(function)
# 從函數名就可以看出這個函數的作用是,在緩衝區大小爲buffer_size的地方,先打亂整個數據,並填滿(需等待一點點時間),並由repeat進行重新啓動
obj = tf.data.experimental.shuffle_and_repeat(buffer_size = buffer_size)
# 設置BATCH_SIZE,對象固有屬性
ds = ds.batch(BATCH_SIZE)
# 從緩存中取得數據,對象固有屬性
ds = ds.prefetch(buffer_size=AUTOTUNE)

有了上面的函數介紹,現在開始操作步驟:

  • 得到圖像的路徑和標籤,作爲函數ds= tf.data.Dataset.from_tensor_slices的參數
  • 利用ds.map加入圖片的讀取,預處理(歸一化,resize等)操作
  • 打亂得到的數據並設置batch_size
  • 獲取數據

預設值參數

import tensorflow as tf
AUTOTUNE = tf.data.experimental.AUTOTUNE

圖像的路徑和標籤,獲取對象 ds

# data_root 這裏是你下載圖片保存的地址,我這裏data_root = "C:\\Users\wu\\.keras\\datasets\\flower_photos"pathlib生成一個路徑對象
import pathlib
data_root = pathlib.Path(data_root)
# 獲取所有圖片的路徑的對象
all_image_paths = list(data_root.glob("*/*"))
# 獲取所有圖片的路徑的字符串
all_image_paths = [str(path) for path in all_image_paths]
# 打亂所有路徑
import random
random.shuffle(all_image_paths)
# 圖片數量
image_count = len(all_image_paths)
# 圖像名稱
label_names = sorted(item.name for item in data_root.glob("*/") if item.is_dir())
# 爲圖像名稱設置映射,映射結果爲整數
label_to_index = dict((name, index) for index, name in enumerate(label_names))
# 獲取所有圖像所對應的標籤
all_image_labels = [label_to_index[pathlib.Path(path).parent.name] for path in all_image_paths]

# 獲取對象ds
ds = tf.data.Dataset.from_tensor_slices((all_image_paths,all_image_labels))

圖片的讀取,預處理


# 預處理圖片
def preprocess_image(image):
    image = tf.image.decode_jpeg(image,channels=3)
    image = tf.image.resize(image,[192,192])
    image /=255.0
    return image
# 讀取圖片+預處理
def load_and_preprocess_image(path):
    image = tf.io.read_file(path)
    return preprocess_image(image)
# 讀取圖片+預處理+獲取圖片對應的標籤
def load_and_preprocess_from_path_label(path,label):
    return load_and_preprocess_image(path),label
# 將圖片的預處理部分附在切片的對象上
image_label_ds = ds.map(load_and_preprocess_from_path_label)

打亂得到的數據並設置batch_size

ds = image_label_ds.apply(tf.data.experimental.shuffle_and_repeat(buffer_size=image_count))
ds = ds.batch(Batch_Size)
ds = ds.prefetch(buffer_size=AUTOTUNE)

獲取數據

def change_range(image,label):
    return 2*image-1,label
keras_ds = ds.map(change_range)
image_batch,label_batch = next(iter(keras_ds))

至此,圖片數據的讀取和輸入到神經網絡的輸入即可。

1. https://tensorflow.google.cn/tutorials/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章