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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Tensorflow数据预处理之tf.data.TFRecordDataset---TFRecords详解\TFRecords图像预处理

發布時間:2023/12/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Tensorflow数据预处理之tf.data.TFRecordDataset---TFRecords详解\TFRecords图像预处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 1、概述
  • 2、預處理數據
    • 2.1、常量定義
    • 2.2、導入庫
    • 2.3、從train.txt文件中讀取圖片-標簽對
    • 2.4、預處理圖片并保存
    • 2.5、調用main函數
  • 3、讀取預處理后的數據
    • 3.1、導入庫
    • 3.2、定義TFRecordDataset
    • 3.3、驗證是否成功讀取了數據
    • 3.3、在tensorflow模型中使用
    • 3.5、在Keras中使用

1、概述

在Tensoflow中,預處理數據除了使用tf.data.Dataset以外,還可以使用TFRecords。和tf.data.Dataset相比,優缺點如下(個人總結):

  • 在訓練時節省數據預處理的計算資源。 使用TFRecords時,是將原始數據處理之后,以一種特定的格式保存為TFRecords文件,訓練是只是簡單的將數據取出來訓練,在訓練時可以節省相當多的計算資源。
  • 預處理數據的邏輯可以非常復雜。 使用TFRecords時,數據預處理可以使用任意python代碼完成,而不必拘泥于Tensorflow預定義的操作,為預處理數據提供了相當的靈活性,預處理數據的邏輯可以非常復雜。
  • 訓練時占用的內存更小。 這點可能時因為不需要復雜的數據預處理,所以占用的內存更小。
  • 處理之后的數據可能比原始數據大好幾倍。 這點是針對圖像數據的,圖像因為有壓縮,所以圖像原文件都比較小。預處理完成以后,像素值以浮點數或者整數的形式保存。所以和圖像原始圖像數據相比,處理之后的數據要比原始數據大好幾倍。

本文將從一個實際的例子出發,講解TFRecords如何使用,分為如下幾部分:第二節講如何預處理數據(以處理圖像為例)和將數據保存為TFRecords文件;第三部分講解如何讀取TFRecords文件,并如何在Tensoflow和Keras中使用這些數據。

參考鏈接(多看官方鏈接才是王道):

  • Using TFRecords and TF Examples。
  • 導入數據。
  • tf.data.TFRecordDataset。

2、預處理數據

在我的項目中,數據預處理的需求是:首先從一個文本文件中讀取圖像路徑和其標簽(屬于哪一類);然后根據圖片路徑讀出圖片,把像素值的范圍從 [0, 255] 縮放到 [-1.0, 1.0] ;然后把處理后的數據和對應的標簽保存到TFRecords文件里面。上述的文本文件的名字為train.txt,一行代表一個圖片樣本,由圖片路徑和其對應的標簽組成,部分幾行如下:

data/M-PIE/test/001/001_01_01_051_09.png 0 data/M-PIE/test/001/001_01_01_051_10.png 0 data/M-PIE/test/002/002_01_01_051_19.png 1 data/M-PIE/test/002/002_01_01_051_09.png 1 data/M-PIE/test/003/003_01_01_051_14.png 2 data/M-PIE/test/003/003_01_01_051_03.png 2 data/M-PIE/test/004/004_01_01_051_05.png 3 data/M-PIE/test/004/004_01_01_051_06.png 3 ...

2.1、常量定義

此部分主要把一些常量定義在一個globals.py文件當中,免得到處都是常量,也便于將來修改。

# coding=utf-8 # 兼容python3 from __future__ import absolute_import from __future__ import division from __future__ import print_functionimport os import random import numpy as np import tensorflow as tf# -----------------------常量區-------------------------- # 設置種子,隨便定義的 SEED = 1213# 分類網絡的類別數目,也是網絡最后一層的單元數目 NUM_CLASSES = 285 # 預處理后圖像的大小 IMAGE_SHAPE = (227, 227, 3) # 預處理后圖像像素值的個數 IMAGE_SIZE = IMAGE_SHAPE[0] * IMAGE_SHAPE[1] * IMAGE_SHAPE[2]# 未處理的圖像的像素值最大值 IMAGE_DEPTH = 255# 訓練多少輪 NUM_TRAIN_EPOCH = 400 # 訓練的batch size TRAIN_BATCH_SIZE = 128# 訓練集的圖片-標簽對文本文件路徑 TRAIN_LIST = 'data/train.txt' # 預處理后的訓練集的保存路徑 TRAIN_TFRECORDS = 'data/train.tfrecords'# 驗證集的圖片-標簽對文本文件路徑 VAL_LIST = 'data/test.txt' # 預處理后的驗證集的保存路徑 VAL_TFRECORDS = 'data/test.tfrecords'# ------------------------------------------------------def set_seed():"""固定隨機數的種子,避免每次隨機過程結果不一樣,得到可復現的結果。"""os.environ['PYTHONHASHSEED'] = str(SEED)np.random.seed(seed=SEED)tf.set_random_seed(seed=SEED)random.seed(SEED)

2.2、導入庫

從這里開始,代碼均在preprocess.py中實現,全部代碼不到100行。

# coding=utf-8 # 前三行是為了python2的代碼兼容python3 from __future__ import absolute_import from __future__ import division from __future__ import print_functionimport numpy as np import tensorflow as tf import cv2import globals as _g # 設置固定的種子 _g.set_seed()

2.3、從train.txt文件中讀取圖片-標簽對

這部分代碼非常簡單,使用numpy的一個函數就可以完成,還不會出錯。

def main(list_name, record_file_name):"""預處理圖片和把預處理的數據保存到tfrecords文件里面:param list_name: 含有圖片-標簽對的文本文件路徑:param record_file_name: tfrecords的文件路徑"""# 讀取圖片-標簽對,讀取出來的格式為((path1,label1),(path2, label2), ...)lists_and_labels = np.loadtxt(list_name, dtype=str).tolist()# 以圖片-標簽對為單位,打亂數據集np.random.shuffle(lists_and_labels)

2.4、預處理圖片并保存

本部分代碼是main函數的一部分。非常簡單,先上代碼:

# 定義一個TFRecordWriter,用來寫TFRecords文件writer = tf.python_io.TFRecordWriter(record_file_name)for file_name, label in lists_and_labels:# 使用read_image函數讀取并預處理圖片,得到一個numpy數組img = read_image(file_name)# 把img的shape從_g.IMAGE_SHAPE調整為[_g.IMAGE_SIZE, ]img_reshape = np.reshape(img, [_g.IMAGE_SIZE, ])print(file_name, img.shape, img_reshape.shape)# 創建特征的字典,這里我們只需要標簽和圖像原始數據,如果要# 保存圖片路徑,再創建一個特征就行。feature = {'label': tf.train.Feature(int64_list=tf.train.Int64List(value=[int(label)])),'image_raw': tf.train.Feature(float_list=tf.train.FloatList(value=img_reshape.tolist()))}# 定義一個Exampleexample = tf.train.Example(features=tf.train.Features(feature=feature))# 把example寫入到文件中writer.write(example.SerializeToString())writer.close()

關于read_image
上面代碼中用到的使用OpenCV庫來讀取圖片,然后使用numpy來完成數據類型轉換,把值的范圍從[0, 255]縮放到[-1.0, 1.0],代碼如下:

def read_image(file_name):"""讀取并預處理圖片。:param file_name: 圖片的路徑:return: numpy數組,shape為_g.IMAGE_SHAPE"""# 讀取圖片,img為numpy數組,dtype=np.uint8img = cv2.imread(file_name, cv2.IMREAD_UNCHANGED)# 調整img的大小,只需要指定行數和列數img = cv2.resize(img, _g.IMAGE_SHAPE[0:2])# 轉換img的數據類型img = img.astype(dtype=np.float32)# 把像素值的范圍從[0, 255]縮放到[-1.0, 1.0]img -= _g.IMAGE_DEPTH / 2img /= _g.IMAGE_DEPTH / 2return img

關于tf.train.Feature
一個tf.Example由許多tf.train.Feature組成(可以這樣理解)。tf.train.Feature可以接收以下三種類型的數據,其他類型的數據基本都可以轉換為這三種數據:

  • bytes_list(string,byte)
  • float_list (float32,float64)
  • int64_list(bool,enum,int32, uint32,int64, uint64)

為了將標準類型轉換為tf.train.Feature兼容,可以使用如下函數:

def _bytes_feature(value):"""Returns a bytes_list from a string / byte."""return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))def _float_feature(value):"""Returns a float_list from a float / double."""return tf.train.Feature(float_list=tf.train.FloatList(value=[value]))def _int64_feature(value):"""Returns an int64_list from a bool / enum / int / uint."""return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))

需要說明的是,tf.train.*****List的value參數是一個list。 使用上述函數的一些例子:

print(_bytes_feature('test_string')) print(_bytes_feature(bytes('test_bytes'))) print(_float_feature(np.exp(1))) print(_int64_feature(True)) print(_int64_feature(1))

在文中,我保存label是使用int64_list;保存圖像數據是使用float_list,之所以使用float_list,一個是為了能在讀取時的代碼更加簡單,另外一個就是節省讀取時的CPU資源,缺點是文件占用的空間比較大。

2.5、調用main函數

對訓練集和驗證集調用main函數,完成數據預處理:

if __name__ == '__main__':main(_g.TRAIN_LIST, _g.TRAIN_TFRECORDS)main(_g.VAL_LIST, _g.VAL_TFRECORDS)

至此,數據的預處理就完成了。

3、讀取預處理后的數據

此部分代碼主要演示如何使用tf.data.TFRecordDataset讀取tfrecords文件。使用TFRecordDataset即可以作為tensorflow代碼所寫的模型的輸入,也可以作為keras模型的輸入,簡直美滋滋。還有其他讀取tfrecords文件的代碼,就不多說了。此部分的代碼實現于inputs_tfrecords.py中。

3.1、導入庫

# coding=utf-8 # 兼容python3 from __future__ import absolute_import from __future__ import division from __future__ import print_functionimport numpy as np import multiprocessing as mt import tensorflow as tf import cv2 import globals as _g_g.set_seed()

3.2、定義TFRecordDataset

TFRecordDataset和tf.data.Dataset非常相似,在這里不做過多的闡述,函數的說明可參見我另外一篇博客tf.data.Dataset圖像預處理詳解的第2部分。

def prepare_dataset(record_name, list_name):"""從record_name指定的TFRecords文件,初始化一個dataset:param record_name: TFRecords文件路徑:param list_name: 與record_name相對應的圖片-標簽對文件路徑"""# 定義TFRecordDatasetdataset = tf.data.TFRecordDataset([record_name])# 對每個dataset的每個樣本調用_parse_function來讀取TFRecords數據dataset = dataset.map(_parse_function, mt.cpu_count())# 定義batch size大小,非常重要。dataset = dataset.batch(_g.TRAIN_BATCH_SIZE)# 無限重復數據集dataset = dataset.repeat()# 返回dataset和訓練一輪需要的步數return dataset, compute_steps(list_name)

關于_parse_function
_parse_function是解析TFRecords的函數,實現如下:

def _parse_function(record):# 定義一個特征詞典,和寫TFRecords時的特征詞典相對應features = {'label': tf.FixedLenFeature([], tf.int64, default_value=0),'image_raw': tf.FixedLenFeature([_g.IMAGE_SIZE, ], tf.float32,)}# 根據上面的特征解析單個數據(保存時的單個Example)example = tf.parse_single_example(record, features)# 把image的shape從[_g.IMAGE_SIZE, ]調整回_g.IMAGE_SHAPEimage = tf.reshape(example['image_raw'], _g.IMAGE_SHAPE)# 如果使用dataset作為keras中,model.fit函數等的參數,則需要使用one_hot編碼# 在tensorflow中,基本是不需要的,可以直接返回example['label']。one_hot_label = tf.one_hot(example['label'], _g.NUM_CLASSES)return image, one_hot_label

tf.FixedLenFeature的第一個參數為特征的長度(元素的個數),如果只有一個整數,直接傳[],后面的default_value可設置為0;如果是一個list,有很多數,那么需要指定第一個參數為該特征的長度(這個長度要和2.4節保存的數據的個數相同),default_value建議不設置。第二個參數為特征的類型。

關于compute_steps
compute_steps的作用就是訓練一輪(one epoch)需要多少步(steps)。計算steps很簡單,record_name對應的那個list_name包含多少個樣本(一行一個樣本,就是有多少行),然后除以batch size并向上取整就可以得到steps:

def compute_steps(list_name):# 讀取所有的圖片-標簽對lists_and_labels = np.loadtxt(list_name, dtype=str).tolist()# 除以batch size并向上取整return np.ceil(len(list(lists_and_labels)) / _g.TRAIN_BATCH_SIZE).astype(np.int32)

3.3、驗證是否成功讀取了數據

驗證預處理的是否正確的方式比較簡單,總體思路是從dataset獲取圖像和標簽,然后保存圖像,看看對不對。

def save_image(file_name, image):"""保存image到file_name指定的位置"""# 把圖像的值范圍從[-1.0, 1.0] 縮放回 [0, 255]image *= _g.IMAGE_DEPTH / 2image += _g.IMAGE_DEPTH / 2# 轉換類型image = image.astype(dtype=np.uint8)# 保存圖片cv2.imwrite(file_name, image)def inputs_test():dataset, steps = prepare_dataset(_g.TRAIN_TFRECORDS, _g.TRAIN_LIST)print('shapes:', dataset.output_shapes)print('types:', dataset.output_types)print('steps: ', steps)next_op = dataset.make_one_shot_iterator().get_next()with tf.Session() as sess:for i in range(10):image, label = sess.run(next_op)print(image.shape, label.shape)save_image('logs/%d.png' % i, image[0])

3.3、在tensorflow模型中使用

思路為從dataset中取出數據,然后作為sess.run的feed_dict的參數:

import inputs_tfrecords ...def train():# 訓練集dataset, steps = inputs_tfrecords.prepare_dataset(_g.TRAIN_TFRECORDS, _g.TRAIN_LIST)# 驗證集val_dataset, val_steps = inputs_tfrecords.prepare_dataset(_g.VAL_TFRECORDS, _g.VAL_LIST)print('shapes:', dataset.output_shapes)print('types:', dataset.output_types)print('steps: ', steps)# 計算shapeshape = _g.IMAGE_SHAPE[:]shape.insert(0, _g.TRAIN_BATCH_SIZE)# 定義placeholderimg = tf.placeholder(shape=shape, name='image')lab = tf.placeholder(shape=[_g.TRAIN_BATCH_SIZE, ], name='label')# 定義訓練操作train_op = ...# 訓練next_op = dataset.make_one_shot_iterator().get_next()with tf.Session() as sess:for i in range(steps):image, label = sess.run(next_op)print(image.shape, label.shape)sess.run([train_op], feed_dict={'image': image, 'label': label})...

3.5、在Keras中使用

那真的是非常簡單了:

import inputs_tfrecords ...def train():# 訓練集dataset, steps = inputs_tfrecords.prepare_dataset(_g.TRAIN_TFRECORDS, _g.TRAIN_LIST)# 驗證集val_dataset, val_steps = inputs_tfrecords.prepare_dataset(_g.VAL_TFRECORDS, _g.VAL_LIST)print('shapes:', dataset.output_shapes)print('types:', dataset.output_types)print('steps: ', steps)# 得到模型model = tf.keras.Sequential()...# 訓練model.fit(train_dataset, epochs=_g.NUM_TRAIN_EPOCH, steps_per_epoch=train_steps,validation_data=val_dataset, validation_steps=val_steps)

關于tensorflow中如何使用keras,可參考:

  • Tensorflow keras入門教程
  • 基于Keras mnist手寫數字識別—Keras卷積神經網絡入門教程

總結

以上是生活随笔為你收集整理的Tensorflow数据预处理之tf.data.TFRecordDataset---TFRecords详解\TFRecords图像预处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产福利影院 | 国产精品久久无码一三区 | 欧美极品一区二区三区 | 色呦呦视频在线 | 91精品国产一区二区三区蜜臀 | 激情六月综合 | 国产精品人人爽 | 国产一区二区三区免费播放 | 亚洲av无码成人精品国产 | 国产成人精品久久 | 国产毛片精品国产一区二区三区 | 国产午夜三级一区二区三 | 国产日韩欧美电影 | 久久久av一区二区三区 | 黄色日批 | 一本大道久久久久精品嫩草 | 亚洲精品国产精品国自产在线 | 人体一级片 | 青青草伊人 | 欧美亚洲国产一区二区三区 | 午夜三级在线 | 在线看中文字幕 | 久久精品国产亚洲AV成人雅虎 | 横恋母在线观看 | 成人久久一区二区 | 91麻豆产精品久久久久久夏晴子 | 91精品久久久久久久久 | 理论片午夜 | 日本不卡影院 | 精品久久久蜜桃 | 男人天堂成人 | 加勒比色综合 | 五级黄高潮片90分钟视频 | 一级大片网站 | 91麻豆国产福利精品 | 生活片av| 免费精品一区二区 | 992tv在线成人免费观看 | 国产青青| 波多野结衣办公室33分钟 | 欧美一区二区最爽乱淫视频免费看 | 国产精品乱码一区二三区小蝌蚪 | 性a视频| cao我| 亚洲天堂av在线免费观看 | 极品新婚夜少妇真紧 | 国产精品99久久久久久www | 超碰av男人的天堂 | 朝桐光av在线一区二区三区 | 欧美精品一区二区三区蜜臀 | 韩国电影一区 | 午夜视频91 | 国产欧美一区二区三区视频在线观看 | 日韩欧美国产一区二区三区 | 奇米影视四色7777 | 亚洲一区二区视频在线观看 | 轻轻草在线视频 | 日韩精品偷拍 | 成人h动漫精品一区二区下载 | 日韩久久久久久久久久久 | 亚洲激情一区二区 | av在线地址| 国产一级二级三级 | 午夜剧场免费在线观看 | 久久精品免费播放 | 国产真实乱 | 短篇山村男同肉耽h | 美女狂揉羞羞的视频 | 激情综合图 | 亚洲人成网站999久久久综合 | 噜噜色图 | 久久精品国产亚洲AV成人雅虎 | 国产在线观看h | 亚洲一区二区中文 | 国产自偷自拍 | 先锋影音av资源在线 | a级黄色一级片 | 麻豆精品在线 | 亚洲m码 欧洲s码sss222 | 制服丝袜在线视频 | 日韩欧美在线观看一区二区三区 | 亚洲精品丝袜 | 欧美精品韩国精品 | 狠狠影院 | 狠狠夜 | 久久靠逼视频 | 国产露脸91国语对白 | 粉嫩精品久久99综合一区 | 四虎色播 | 中文字幕在线免费视频 | 久久观看最新视频 | h片在线观看视频 | 少妇精品无码一区二区免费视频 | 吞精囗交69激情欧美 | 国产精品com | 2018自拍偷拍| 五月婷婷狠狠干 | 国产精品99精品无码视亚 | 九九九久久久精品 |