日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【TensorFlow】笔记5:图像数据处理

發布時間:2025/3/19 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【TensorFlow】笔记5:图像数据处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、TFRecords輸入數據格式
    • 1、TFRecord格式介紹
    • 2、TFRecord樣例程序
      • (1)生成TFRecords文件
      • (2)讀取TFRecord文件
  • 二、圖像數據處理
    • 1、TF圖像處理函數
      • (1)圖像編碼處理
      • (2)圖像大小處理
        • a、通過算法使得新的圖像盡量保存原始圖像上所有的信息。
        • b、對圖像裁剪或填充——`tf.image.resize_image_with_crop_or_pad`函數
        • c、比例調整圖像大小——`tf.image.entral_crop`函數
        • d、剪裁或填充給定區域的圖像——`tf.image.crop_to_bounding_box`函數和`tf.image.pad_to_bounding_box`函數
      • (3)圖像翻轉
      • (4)圖像色彩調整
        • a、調整亮度
        • b、調整對比度
        • c、調整色相
        • d、調整飽和度
        • e、圖像標準化
        • f、處理標注框(bounding box)
        • g、隨機截取圖像
    • 2、圖像預處理實例
  • 三、多線程輸入數據處理框架
    • 1、隊列與多線程
      • (1)兩種隊列
      • (2)多線程協同方法1:`tf.Coordinator` 類
      • (3)多線程協同方法2:`tf.QueueRunner` 類
    • 2、輸入文件隊列
      • 3、組合訓練數據(batching)
        • (1)`tf.train.batch`
        • (2)`tf.train.shuffle_batch`
    • 4、輸入數據處理框架
    • 5、總結
  • 四、數據集(DataSet)
    • 1、數據集的基本使用方法
      • (1)tensor -> 數據集
      • (2)文本文件 -> 數據集
      • (3)TFRecord -> 數據集
    • 2、數據集的高層操作
      • (1)map操作
      • (2)shuffle 和 batch 操作
      • (3)repeat 操作
      • (4)其他操作
      • (5)示例

目標:如何對圖像數據進行預處理使得訓練得到的神經網絡模型盡可能小地被無關因素所影響。同時,為減小預處理對訓練速度的影響,使用多線程處理。

一、TFRecords輸入數據格式

TF統一存儲數據的格式:TFRecords,二進制文件,可更好利用內存、便于復制和移動,且不需要單獨的標簽文件。

1、TFRecord格式介紹

TFRecord 文件中的數據都是通過 tf.train.Example協議內存塊(Protocol Buffer)(協議內存塊包含了字段Features)的格式存儲的。

tf.train.Example定義:

message Example {Features features = 1; };message Features {map<string, Feature> feature = 1; };message Feature {oneof kind{BytesList bytes_list = 1;FloatList float_list = 2;Int64List int64_list = 3;} };

tf.train.Example 中包含了一個從屬性名稱到取值的字典。
其中屬性名稱為一個字符串,屬性的取值可以為字符串(BytesList)、實數列表 (FloatList)或者整數列表( Int64List)。
比如將一張解碼前的圖像存為一個字符串,圖像所對應的類別編號存為整數列表。在2中將給出 一個使用 TFRecord 的具體樣例 。

數據存儲:將數據填入到 Example 協議內存塊(protocol buffer),將協議內存塊序列化為一個字符串, 并且通過tf.python_io.TFRecordWriter 寫入到 TFRecords 文件。

從TFRecords文件中讀取數據, 可以使用tf.TFRecordReader的tf.parse_single_example解析器。這個操作可以將Example協議內存塊(protocol buffer)解析為張量。

2、TFRecord樣例程序

(1)生成TFRecords文件

將MNIST輸入數據轉換為TFRecord的格式

import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data import numpy as np# 生成整數型的屬性。 def _int64_feature(value):return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))# 生成字符串型的屬性。 def _bytes_feature(value):return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))DATASET_PATH = '/home/jie/Jie/codes/tf/datasets/MNIST_DATA' mnist = input_data.read_data_sets(DATASET_PATH, dtype=tf.uint8, one_hot=True) images = mnist.train.images # 訓練數據所對應的正確答案,可以作為一個屬性保存在 TFRecord 中 labels = mnist.train.labels # 訓練數據的圖像分辨率,這可以作為 Example 中的一個屬性。 pixels = images.shape[1] num_example = mnist.train.num_example# 輸出 TFRecord 文件的地址。 filename = '/home/jie/Jie/codes/tf/datasets/MNIST_DATA/output.tfrecords' # 創建一個 writer 來寫 TFRecord 文件。 writer = tf.python_io.TFRecordWriter(filename) for index in range(num_example):# 將圖像矩陣轉化成一個字符串。image_raw = images[index].tostring()# 將一個樣例轉化為 Example Protocol Buffer ,并將所有的信息寫入這個數據結構。example = tf.train.Example(features=tf.train.Features(features={'pixels':_int64_feature(pixels),'label':_int64_feature(np.argmax(labels[index])),'image_raw':_bytes_features(images_raw)}))# 將一個 Example 寫入 TFRecord 文件。writer.write(example.SerializeToString()) writer.close()

當數據量較大時,也可以將數據寫入多個 TFRecord 文件。

(2)讀取TFRecord文件

import tensorflow as tf# 輸出 TFRecord 文件的地址。 filename = '/home/jie/Jie/codes/tf/datasets/MNIST_DATA/output.tfrecords' # 創建一個 reader 來讀取 TFRecord 文件中的樣例。 reader = tf.TFRecordReader() # tf.train.string_input_producer 創建一個隊列來維護輸入文件列表 filename_queue = tf.train.string_input_producer([filename])# 從文件中讀取一個樣例。也可以使用 read_up_to 函數-次性讀取多個樣例。 _, serialized_example = reader.read(filename_queue) # 解析讀入的一個樣例。若需要解析多個樣例,可用parse_example函數 features = tf.parse_single_example(serialized_example,features={# TensorFlow 提供兩種不同的屬性解析方法。 # 1. tf.FixedLenFeature,所解析的結果為一個 Tensor。# 2. tf.VarLenFeature,所得到的解析結果為SparseTensor,用于處理稀疏數據。# 這里解析數據的格式需要和上面程序可入數據的格式一致。'image_raw':tf.FixedLenFeature([], tf.string),'pixels':tf.FixedLenFeature([], tf.int64),'label':tf.FixedLenFeature([], tf.int64),})# tf.decode_raw 可以將字符串解析成圖像對應的像索數組。 image = tf.decode_raw(features['image_raw'], tf.uint8) label = tf.cast(features['label'], tf.int32) pixels = tf.cast(features['pixels'], tf.int32)sess = tf.Session() # 啟動多線程處理輸入數據 coord = tf.train.Coordinator() threads = tf.train.start_queue_runners(sess=sess, coord=coord)# 每次運行可以讀取 TFRecord 文件中的一個樣例。 # 當所有樣例都讀取完之后,在此樣例中程序會再重頭讀取 for i in range(10):print(sess.run([image, label, pixels]))

二、圖像數據處理

目標:可以盡量避免模型受到無關因素的影響。在大部分圖像識別中,通過預處理過程可以提高模型的準確率。

1、TF圖像處理函數

(1)圖像編碼處理

RGB三維矩陣( jpeg 和 png 格式) 《==》 編碼/解碼

# -*-coding:utf-8-*- import tensorflow as tf import matplotlib.pyplot as pltIMAGES_PATH = '/home/jie/Desktop/6987985.jpeg' SAVE_PATH = '/home/jie/Desktop/output.jpeg' # 讀取圖像的原始數據。 image_raw_data = tf.gfile.FastGFile(IMAGES_PATH, 'rb').read()with tf.Session() as sess:# 對圖像進行 jpeg 的格式解碼從而得到圖像對應的三維矩陣。 # tf.image.decode_png 函數對 png 格式的圖像進行解碼。# 解碼之后的結果為一個張量,在使用它的取值之前需要明確調用運行的過程。img_data = tf.image.decode_jpeg(image_raw_data)print(img_data.eval())# 輸出解碼之后的三維矩陣,上面這一行代碼將輸出以下內容。# 使用 pyplot 工具可視化得到的圖像。plt.imshow(img_data.eval())plt.show()# 將表示一張圖像的三維矩陣重新按照jpeg格式編碼并存入文件中。# 打開該圖像,與原始圖像一樣encoded_image = tf.image.encode_jpeg(img_data)with tf.gfile.GFile(SAVE_PATH, "wb") as f:f.write(encoded_image.eval())

輸出結果

[[[ 11 7 0][ 29 25 22][ 32 33 38]...[ 29 31 28][ 19 21 20][ 5 7 2]][[ 38 31 15][191 184 174][213 213 213]...[209 214 217][183 187 188][ 32 37 33]][[ 19 44 51][200 228 242][153 189 215]...[188 201 209][210 218 221][ 24 33 32]]...[[ 56 34 23][245 217 196][125 87 42]...[ 77 74 65][214 215 209][ 36 37 32]][[ 20 30 40][177 184 190][211 216 212]...[217 216 214][185 185 183][ 27 27 25]][[ 6 6 4][ 29 29 27][ 29 33 32]...[ 29 30 32][ 32 32 32][ 1 1 1]]]

(2)圖像大小處理

由于很多網絡輸入節點的個數是固定的,所以需要先將圖像的大小統一。
圖像大小調整有兩種方法:

a、通過算法使得新的圖像盡量保存原始圖像上所有的信息。

TF的 tf.image.resize_images 函數提供四種不同的方法

# 略去加載原始圖像,定義會話等過程,假設:img_data是已經解碼的圖像。# 1. 首先將圖片數據轉換為實數類型,即將0-255轉化為0.0-1.0范圍內的實數。# 大多數圖像處理 API 支持整數和實數類型的輸入。# 如果輸入是整數類型,這些 API 會在內部將輸入轉化為實數后處理,再將輸出轉化為整數。# 如果有多個處理步驟,在格數和實數之間的反復轉化將導致精度損失,# 因此推薦在圖像處理前將其轉化為實數類型。img_data = tf.image.convert_image_dtype(img_data, dtype=tf.float32)# 通過 tf.image.resize_images 函數調整圖像的大小。# 第一個參數: 原始圖像# 第二個和第三個參數為調整后圖像的大小 # method 參數給出了調整圖像大小的算法resized = tf.image.resize_images(img_data, [300, 300], method=0)plt.imshow(resized.eval())plt.show()

method取值圖像大小調整算法
0雙線性插值法(Bilinear interpolation)
1最近鄰插值(Nearest neighbor interpolation)
2雙三次插值法(Bicubic interpolation)
3面積插值法(Area interpolation)

==》不同算法效果差別不大

b、對圖像裁剪或填充——tf.image.resize_image_with_crop_or_pad函數

# 通過 tf.image.resize_image_with_crop_or_pad 函數調整圖像的大小。# 第一個參數: 原始圖像# 第二個和第三個參數為調整后的目標圖像大小。# 如果原始圖像的尺寸大于大于目標圖像,則該函數會自動截取y你是圖像中居中的部分。# 若目標圖像大于原始圖像,則會自動在原始圖像的四周填充全0背景。croped = tf.image.resize_image_with_crop_or_pad(img_data, 400, 300)padded = tf.image.resize_image_with_crop_or_pad(img_data, 1500, 1500)plt.imshow(croped.eval())plt.show()plt.imshow(padded.eval())plt.show()


c、比例調整圖像大小——tf.image.entral_crop函數

# 第一個參數為原始圖像, 第二個參數為調整比例,這個比例需要是-個(0, 1]的實數central_cropped = tf.image.central_crop(img_data, 0.25)plt.imshow(central_cropped.eval())plt.show()

d、剪裁或填充給定區域的圖像——tf.image.crop_to_bounding_box函數和tf.image.pad_to_bounding_box函數

這兩個函數都要求給出的尺寸滿足一定的要求,否則程序會報錯。比如在使用 tf.image.crop_to_bounding_box 函數時, TensorFlow 要求提供的圖像尺寸要大于目標尺寸,也就是要求原始圖像能夠裁剪出目標圖像的大小。

(3)圖像翻轉

功能:上下翻轉、左右翻轉以及沿對角線翻轉

# 將圖像上下翻轉flipped1 = tf.image.flip_up_down(img_data)# 將圖像左右翻轉flipped2 = tf.image.flip_left_right(img_data)# 將圖像沿對角線翻轉flipped3 = tf.image.transpose_image(img_data)plt.subplot(221)plt.imshow(img_data.eval())plt.subplot(222)plt.imshow(flipped1.eval())plt.subplot(223)plt.imshow(flipped2.eval())plt.subplot(224)plt.imshow(flipped3.eval())plt.show()

輸出結果

在很多圖像識別問題中,圖像的翻轉不會影響識別的結果。
==》訓練得到的模型可以識別不同角度的實體
==》隨機翻轉訓練圖像是一種很常用的圖像預處理方式。

# 以 50% 概率上下翻轉圖像flipped1 = tf.image.random_flip_up_down(img_data)# 以 50% 概率左右翻轉圖像flipped2 = tf.image.random_flip_left_right(img_data)

(4)圖像色彩調整

調整圖像的亮度、對比度、飽和度和色相,在很多圖像識別應用中不會影響識別結果。
==》隨機調整這些屬性,使得訓練的模型盡可能小地受無關因素的影響。

a、調整亮度

tf.image.adjust_brightness()函數和tf.image.random_brightness()函數

注意:

  • 色彩調整的 API 可能導致像素的實數值超出 0.0-1.0 的范圍。在輸出最終圖像前需要將其值截斷在 0.0-1.0 范圍區間,否則不僅圖像無法正常可視化,以此為輸入的神經網絡的訓練質量可能受到影響。
  • 若對圖像進行多項處理操作,則截斷應在最后一步
# 將圖像的亮度 -0.5adjusted1 = tf.image.adjust_brightness(img_data, -0.5) # 截斷在 0.0-1.0 范圍區間adjusted1 = tf.clip_by_value(adjusted1, 0.0, 1.0)# 將圖像的亮度 +0.5adjusted2 = tf.image.adjust_brightness(img_data, 0.5)# 在[-max_delta, max_delta)的范圍隨機調整圖像的亮度。max_delta = 0.9adjusted3 = tf.image.random_brightness(img_data, max_delta)

b、調整對比度

tf.image.adjust_contrast()函數和tf.image.random_contrast()函數

# 將圖像的對比度減少到 0.5 倍adjusted1 = tf.image.adjust_contrast(img_data, 0.5) # 將圖像的對比度增加 5 倍adjusted2 = tf.image.adjust_contrast(img_data, 5)# 在[lower, upper] 的范圍隨機調整圖像的對比度。lower = 10upper = 100adjusted3 = tf.image.random_contrast(img_data, lower, upper)

c、調整色相

tf.image.adjust_hue函數和tf.image.random_hue函數

# 分別將色相加 0.1、0.3、0.6 和 0.9 adjusted1 = tf.image.adjust_hue(img_data, 0.1)adjusted2 = tf.image.adjust_hue(img_data, 0.3) adjusted3 = tf.image.adjust_hue(img_data, 0.6) adjusted4 = tf.image.adjust_hue(img_data, 0.9) # 在 [-max_delta, max_delta] 的范圍隨機調整圖像的色相。max_delta = 0.5adjusted5 = tf.image.random_hue(img_data, max_delta)

注意:max_delta最大為 0.5

d、調整飽和度

tf.image.adjust_saturation函數和tf.image.random_saturation函數

# 將圖像的飽和度-5adjusted1 = tf.image.adjust_saturation(img_data, -5) # 將圖像的飽和度+5adjusted2 = tf.image.adjust_saturation(img_data, 5)# 在[lower, upper] 的范圍隨機調整圖像的飽和度lower = 10upper = 100adjusted3 = tf.image.random_saturation(img_data, lower, upper)

e、圖像標準化

tf.image.per_image_standardization() :函數將圖像上的亮度均值變為0,方差變為1。

adjusted = tf.image.per_image_standardization(img_data)

f、處理標注框(bounding box)

tf.image.draw_bounding_boxes()函數在圖像中添加標注框。輸入圖像矩陣的數字為實數,且是一個 batch 的數據(四維張量)。所以,繪制圖時,需要tf.reduce_sum()函數進行降維。

# 將圖像縮小一些,這樣可視化能讓標注框更加清楚。img_data = tf.image.resize_images(img_data, [180, 267], method=1)# tf.image.draw_bounding_boxes 函數要求圖像矩陣中的數字為實數.# -> 先將圖像矩陣轉化為實數類型。# 輸入是一個 bacth 的數據(多張圖像組成的四維矩陣),要將解碼之后的圖像矩陣添加一維bacthed = tf.expand_dims(tf.image.convert_image_dtype(img_data, tf.float32), 0)# 給出每一張圖像的所有標注框。一個標注框有 4 個數字,分別代表[Y_min, X_min, Y_max, X_max]# 注意這里給出的數字都是圖像的相對位置。# 比如在 180 × 267 的圖像中,[0.35, 0.47, 0.5, 0.56]代表了從(63,125)到(90, 150)的圖像。boxes = tf.constant([[[0.05, 0.05, 0.9, 0.7], [0.35, 0.47, 0.5, 0.56]]])result = tf.image.draw_bounding_boxes(bacthed, boxes)result = tf.reduce_sum(result, 0) # 這里顯示的時候需要進行降維處理plt.imshow(result.eval())plt.show()


注:bounding box位置不準,僅用于學習。

g、隨機截取圖像

隨機截取圖像上有信息含量的部分也是一個提
高模型健壯性( robustness )的一種方式。
==》使得訓練模型不受被識別物體大小的影響。
==》tf.image.sample_distorted_bounding_box()函數

boxes = tf.constant([[[0.05, 0.05, 0.9, 0.7], [0.35, 0.47, 0.5, 0.56]]])# min_object_covered=0.4 表示截取部分至少包含某個標注框 40% 的內容。begin, size, bbox_for_draw = tf.image.sample_distorted_bounding_box(tf.shape(img_data), bounding_boxes = boxes,min_object_covered=0.4)# 通過標注框可視化隨機截取得到的圖像。bacthed = tf.expand_dims(tf.image.convert_image_dtype(img_data, tf.float32), 0)image_with_box = tf.image.draw_bounding_boxes(bacthed, bbox_for_draw)# 截取隨機出來的圖像。每次結果可能不盡相同.distored_image = tf.slice(img_data, begin, size)

2、圖像預處理實例

在解決真實的圖像識別問題時, 一般會同時使用多種處理方法。

本實例展示:將不同的圖像處理函數結合成一個完成的圖像預處理流程。從圖像片段截取,到圖像大小調整再到圖像翻轉及色彩調整的整個圖像預處理過程。

  • 調整亮度、對比度、飽和度和色相的順序會影響最后的結果,所以定義多種不同的順序。
  • 注意:數據預處理只針對訓練數據,而非測試數據

輸入:原始訓練圖像
輸出:神經網絡的輸入層

# -*-coding:utf-8 -*-import tensorflow as tf import numpy as np import matplotlib.pyplot as plt# 給定一張圖像,隨機調整圖像的色彩。 # 因為調整亮度、對比度、飽和度和色相的順序會影響最后的結果,所以定義多種不同的順序。 # 具體順序可在預處理時隨機選取一種。從而降低無關因素對模型的影響。 # 亮度(brightness) 對比度(contrast)、飽和度(saturation)和色相(hue) def distort_color(image, color_ordering=0):if color_ordering == 0:image = tf.image.random_brightness(image, max_delta=32./255.) # image = tf.image.random_saturation(image, lower=0.5, upper=1.5)image = tf.image.random_hue(image, max_delta=0.2)image = tf.image.random_contrast(image, lower=0.5, upper=1.5)elif color_ordering == 1:image = tf.image.random_saturation(image, lower=0.5, upper=1.5)image = tf.image.random_brightness(image, max_delta=32./255.)image = tf.image.random_contrast(image, lower=0.5, upper=1.5)image = tf.image.random_hue(image, max_delta=0.2)elif color_ordering == 2:image = tf.image.random_hue(image, max_delta=0.2)image = tf.image.random_contrast(image, lower=0.5, upper=1.5)image = tf.image.random_brightness(image, max_delta=32./255.)image = tf.image.random_saturation(image, lower=0.5, upper=1.5)# 截斷在 0.0-1.0 范圍區間return tf.clip_by_value(image, 0.0, 1.0)# 給定一張解碼后的圖像、目標圖像的尺寸以及圖像上的標注框, # 此函數可對給出的圖像進行預處理 # 輸入:原始訓練圖像 # 輸出:神經網絡的輸入層 def preprocess_for_train(image, height, width, bbox):# 如果沒有提供標注框,則認為整個圖像就是需要關注的部分。if bbox is None:bbox = tf.constant([0.0, 0.0, 1.0, 1.0], dtype=tf.float32, shape=[1, 1, 4])# 轉換圖像張量的類型 。if image.dtype != tf.float32:image = tf.image.convert_image_dtype(image, dtype=tf.float32)# 隨機截取圖像,減小需要關注的物體大小對圖像識別算法的影響。bbox_begin, bbox_size, _ = tf.image.sample_distorted_bounding_box(tf.shape(image), bounding_boxes=bbox)distorted_image = tf.slice(image, bbox_begin, bbox_size)# 將隨機截取的圖像調整為神經網絡輸入層的大小。大小調整的算法是隨機選摔的 。distorted_image = tf.image.resize_images(distorted_image, [height, width], method=np.random.randint(4))# 隨機左右翻轉圖像。distorted_image = tf.image.random_flip_left_right(distorted_image)# 使用一種隨機的順序調整圖像色彩。distorted_image = distort_color(distorted_image, np.random.randint(3))return distorted_imageIMAGE_PATH = '/home/jie/Desktop/6987985.jpeg' image_raw_data = tf.gfile.FastGFile(IMAGE_PATH, "rb").read() with tf.Session() as sess:img_data = tf.image.decode_jpeg(image_raw_data)boxes = tf.constant([[[0.05, 0.05, 0.9, 0.7], [0.35, 0.47, 0.5, 0.56]]])for i in range(6):result = preprocess_for_train(img_data, 299, 299, boxes)plt.imshow(result.eval())plt.show()

三、多線程輸入數據處理框架

復雜的預處理過程會減慢整個訓練的過程,所以為了避免預處理成為神經網絡模型訓練效率的瓶頸,TF提供多線程處理輸入數據的框架。

經典輸入流程:

1、隊列與多線程

在TF中,隊列也是計算圖上有狀態的節點,修改隊列狀態的操作主要有 Enqueue、EnqueueMany和Dequeue。

(1)兩種隊列

  • FIFOQueue:先進先出隊列。
  • RandomShuffleQueue:將隊列中的元素打亂,每次出隊列操作得到的是從當前隊列所有元素中隨機選擇的一個。(訓練網絡時希望每次使用的訓練數據盡可能隨機,推薦使用)
import tensorflow as tf# 創建一個先進先出隊列,指定隊列中最多可以保存兩個元素,并指定類型為整數。 q = tf.FIFOQueue(2, "int32") # enqueue_many 函數:初始化隊列中的元素,需要明確的調用這個初始化過程。 init = q.enqueue_many(([0, 10],)) # Dequeue 函數:隊列中的第一個元素出隊列,并存入x中 x = q.dequeue()y = x + 1 # 將y重新加入隊列。 q_inc = q.enqueue([y])with tf.Session() as sess:# 運行初始化隊列的操作。init.run()for _ in range(5):# 運行q_inc將執行數據出隊列、出隊的元素+1、重新歸入隊列的整個過程。v, _ = sess.run([x, q_inc])print(v)

輸出結果

0 10 1 11 2

TF中,隊列還是異步計算張量取值的一個重要機制。例:多個線程可同時向一個隊列中寫入或讀取元素。

(2)多線程協同方法1:tf.Coordinator 類

tf.Coordinator類:用于協同多個線程一起停止, 并提供了 should_stop、request_stop 和 join 三個函數。

工作過程:

  • 在啟動線程之前,需要先聲明一個 tf.Coordinator 類,并將這個類傳入每一個創建的線程中。
  • 啟動的線程需要一直查詢 tf.Coordinator 類中提供的 should_stop 函數, 為 True 時,則 當前線程也需要退出 。
  • 每一個啟動的線程都可以通過調用request_stop 函數來通知其他線程退出。當 某一個線程調用 request_stop 函數之后 ,should_stop 函數的返回值將被設置為 True,這樣其他的線程就可以同時終止了。
  • # 線程中運行的程序,這個程序每隔1秒判斷是否需要停止并打印向己的ID 。 def MyLoop(coord, worker_id):# 使用 tf.Coordinator 類提供的協同工具判斷當前線程是否要停止。while not coord.should_stop():# 隨機停止所有的線程。if np.random.rand() < 0.1:print("Stoping from id: %d\n" % worker_id)# 調用 coord.request_stop() 函數來通知其他線程停止。coord.request_stop()else:# 打印當前線程的Id。print("Working on id: %d\n" % worker_id)time.sleep(1)# 聲明一個 tf.train.Coordinator 類來協同多個線程。 coord = tf.train.Coordinator() # 聲明創建 5 個線程 threads = [threading.Thread(target=MyLoop, args=(coord, i)) for i in range(5)] # 啟動所有線程 for t in threads:t.start() # 等待所有線程退出 coord.join(threads)

    輸出

    Working on id: 0 Working on id: 1 Working on id: 2 Working on id: 3 Working on id: 4 Stoping from id: 0 Working on id: 2 Working on id: 3

    分析:主與所有線程啟動之后,每個線程會打印各自的 ID,于是前面 4 行打印出了它們的 ID 。然后在暫停 1 秒之后,所有線程又開始第二遍打印 ID。 在這個時候有一個線程退出的條件達到,于是調用了 coord.request_stop 函數來停止所有其他的線程。 然而在打印 Stoping from id: 0 之后,可以看到有線程仍然在輸出。這是因為這些線程已經執行完coord.should_stop的判斷,于是仍然會繼續輸出自己的 ID 。 但在下一輪判斷是否需要停止時將退出線程。 于是在打印一次 ID 之后就不會再有輸出了。

    (3)多線程協同方法2:tf.QueueRunner 類

    tf.QueueRunner類:用于啟動多個線程來操作同一個隊列,啟動的這些線程可以通過上面介紹的 tf.Coordinator 類來統一管理

    # 聲明一個先進先出的隊列,隊列中最多100個元素,類型是實數 queue = tf.FIFOQueue(100, "float") # 定義隊列的入隊操作 enqueue_op = queue.enqueue([tf.random_normal([1])])# 使用 tf.train.QueueRunner 創建多個線程運行隊列的入隊操作。 # 第1個參數:被操作的隊列, # [enqueue_op]*5 需要啟動5個線程,每個線程中運行的是 enqueue_op 操作。 qr = tf.train.QueueRunner(queue, [enqueue_op] * 5)# 將定義過的QueueRunner加入TensorFlow 計算圖上指定的集合。 # tf.train.add_queue_runner 函數沒有指定集合,則加入默認集合 tf.GraphKeys.QUEUE_RUNNERS。 # 下面的函數就是將剛剛定義的 qr 加入默認的 tf.GraphKeys.QUEUE_RUNNERS 集合。 tf.train.add_queue_runner(qr) # 定義出隊操作。 out_tensor = queue.dequeue()with tf.Session() as sess:# 使用 tf.train.Coordinator 來協同啟動的線程。coord = tf.train.Coordinator()# 使用tf.train.QueueRunner時,需要明確調用tf.train.start_queue_runners來啟動所有線程。# 否則因為沒有線程運行入隊操作,當調用出隊操作時,程序會一直等待入隊操作被運行。# tf.train.start_queue_runners 函數會默認啟動tf.GraphKeys.QUEUE_RUNNERS集合中所有的QueueRunner。# 這個函數只支持啟動指定集合中的 QueueRnner,# 所以一般來說 tf.train.add_queue_runner 函數和tf.train.start_queue_runners函數會指定同一個集合。threads = tf.train.start_queue_runners(sess = sess, coord=coord)# 獲取隊列中的取值。for _ in range(3):print(sess.run(out_tensor)[0])# 使用 tf.train.Coordinator 來停止所有的線程。coord.request_stop()coord.join(threads)

    輸出結果

    -1.475753 -0.27835137 2.2407255

    2、輸入文件隊列

    雖然一個TFRecord文件可以存儲多個訓練樣本,但當訓練數據量較大時,可以將數據分成多個TFRecord文件來提高處理效率。

  • 獲取一個正則表達式的所有文件: tf.train.match_filenames_once
  • 進行有效的管理:tf.train.string_input_producer
  • 該函數會使用初始化時提供的文件列表創建一個輸入隊列,輸入隊列中的原始元素為文件列表中的所有文件,創建好的輸入隊列可以作為文件讀取函數的參數,每層調用文件讀取函數時,該函數會先判斷當前是否已經有打開的文件可讀,如果沒有或者打開的文件已經讀完,則該函數會從輸入隊列中出隊一個文件并從該文件中讀取數據。

    • 當 shuffle=True 時,文件在加入隊列之前會被打亂順序,所以出隊順序也是隨機的;
    • 隨機打亂文件順序以及加入輸入隊列的過程是一個單獨的線程,不會影響獲取文件的速度。
    • 當輸入隊列中的所有文件都被處理完之后,會將初始化時提供的文件列表中的文件全部重新加入隊列。
    • num_epochs:限制加載初始文件列表的最大輪數
    • 當設置為1時,計算完一輪之后,程序將自動停止。
    • 神經網絡模型測試時,所有測試數據僅僅需要使用一次即可,所以將其設置為1。
    # 創建 TFRecord 文件的幫助函數。 def _int64_feature(value):return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))# 模擬海量數據情況下將數據寫入不同文件 # num_shards : 總共寫入多少個文件, # instances_per_shard : 每個文件中有多少個數據。 num_shards = 2 instances_per_shard = 2 for i in range(num_shards):# 將數據分為多個文件時,可以將不同文件以類似 OOOOn-of-OOOOm 的后綴區分。# m:表示數據總共被存在了多少個文件中# n:表示當前文件的編號# 式樣的方式既方便了通過正則表達式獲取文件列表,又在文件名中加入了更多的信息filename = ('./datasets/data.tfrecords-%.5d-of-%.5d' % (i, num_shards))writer = tf.python_io.TFRecordWriter(filename)# 將數據封裝成 Example 結構并寫入 TFRecord 文件 。for j in range(instances_per_shard):# Example 結構僅包含當前樣例屬于第幾個文件以及是當前文件的第幾個樣本。example = tf.train.Example(features=tf.train.Features(feature={'i':_int64_feature(i),'j':_int64_feature(j)}))writer.write(example.SerializeToString())writer.close()

    每一個文件中存儲了兩個樣例 。

    生成樣例之后,以下代碼展示了兩個函數的使用方法

    # 使用 tf.train.match_filenames_once 函數獲取文件列表。 files = tf.train.match_filenames_once('./datasets/data.tfrecords-*')# 通過 tf.train.string_input_producer 函數創建輸入隊列. # 輸入隊列巾的中的文件列表為tf.train.string_input_producer函數獲取的文件列表。 # 參數設置:shuffle為False,在一般解決真實問題時,shuffle設置為True filename_queue = tf.train.string_input_producer(files, shuffle=False)reader = tf.TFRecordReader() _, seraialized_example = reader.read(filename_queue) features = tf.parse_single_example(seraialized_example,features={'i':tf.FixedLenFeature([], tf.int64),'j':tf.FixedLenFeature([], tf.int64),})with tf.Session() as sess:# 雖然在本段程序中沒有聲明任何變量,# 但使用 tf.train.match_filenames_once 函數時前要初始化一些變量 。tf.local_variables_initializer().run()print(sess.run(files))# 聲明 tf.train.Coordinator 類來協同不同線程,并啟動線程。coord = tf.train.Coordinator()threads = tf.train.start_queue_runners(sess=sess, coord=coord)# 多次執行技取數據的操作。for i in range(6):print(sess.run([features['i'], features['j']]))coord.request_stop()coord.join(threads)

    輸出結果

    [b'./datasets/data.tfrecords-00000-of-00002'b'./datasets/data.tfrecords-00001-of-00002'] [0, 0] [0, 1] [1, 0] [1, 1] [0, 0] [0, 1]

    3、組合訓練數據(batching)

    將多個輸入樣例組織成一個batch可以提高模型訓練的效率,所以在得到單個樣例的預處理結果之后,還需要將其組織成batch,再提供給神經網絡的輸入層。

  • tf.train.batch 和 tf.train.shuffle_batch 函數來將單個的樣例組織成 batch 的形式輸出。這兩個函數都會生成一個隊列,隊列的入隊操作是生成單個樣例的方法,而每次出隊得到的是一個 batch 的樣例 。
  • 唯一區別:是否會將數據順序打亂 。tf.train.shuffle_batch 為亂序。
  • (1)tf.train.batch

    import tensorflow as tf# 使用 tf.train.match_filenames_once 函數獲取文件列表。 files = tf.train.match_filenames_once('./datasets/data.tfrecords-*')# 通過 tf.train.string_input_producer 函數創建輸入隊列. # 輸入隊列巾的中的文件列表為tf.train.string_input_producer函數獲取的文件列表。 # 參數設置:shuffle為False,在一般解決真實問題時,shuffle設置為True filename_queue = tf.train.string_input_producer(files, shuffle=False)reader = tf.TFRecordReader() _, seraialized_example = reader.read(filename_queue) features = tf.parse_single_example(seraialized_example,features={'i':tf.FixedLenFeature([], tf.int64),'j':tf.FixedLenFeature([], tf.int64),})# 使用上面樣例。這里假設 Example 結構中 i 表示一個樣例的特征向量, # 比如一張圖像的像索矩陣。而 j 表示該樣例對應的標簽 。 example, label = features['i'], features['j']# 一個 batch 中樣例的個數。 batch_size = 3 # 文件隊列中最多可以存儲的樣例個數 capacity = 1000 + 3 * batch_size# 使用 tf.train.batch 函數來組合樣例。[example, label]參數給出需組合的元素. # 當隊列長度等于容量時,TF將暫停入隊操作,而只是等待元索出隊。 # 當元素個數小于容量時, TF將自動重新啟動入隊操作。 example_batch, label_batch = tf.train.batch([example, label], batch_size=batch_size, capacity=capacity)with tf.Session() as sess:# tf.initialize_all_variables().run()tf.local_variables_initializer().run()coord = tf.train.Coordinator()threads = tf.train.start_queue_runners(sess=sess, coord=coord)# 獲取并打印組合之后的樣例。在真實問題中,這個輸出一般會作為神經網絡的輸入。for i in range(2):cur_example_batch, cur_label_batch = sess.run([example_batch, label_batch])print(cur_example_batch, cur_label_batch)coord.request_stop()coord.join(threads)

    報錯:因為使用match_filenames_once需要用local_variables_initializer初始化局部變量(local variables)沒有初始化

    • 局部變量初始化:tf.local_variables_initializer().run()
    OutOfRangeError (see above for traceback): FIFOQueue '_1_batch/fifo_queue' is closed and has insufficient elements (requested 3, current size 0)[[Node: batch = QueueDequeueManyV2[component_types=[DT_INT64, DT_INT64], timeout_ms=-1, _device="/job:localhost/replica:0/task:0/device:CPU:0"](batch/fifo_queue, batch/n)]]

    輸出結果

    [0 0 1] [0 1 0] [1 0 0] [1 0 1] # tf.train.batch 函數可以將單個的數據組織成3個一組的batch # 在example,lable中讀到的數據依次為: example:0, lable:0 example:0, lable:1 example:1, lable:0 example:1, lable:1 # 這是因為函數不會隨機打亂順序,所以組合之后得到的數據組合成了上面給出的輸出

    (2)tf.train.shuffle_batch

    tf.train.shuffle_batch 代碼示例如下:

    import tensorflow as tf# 獲取文件列表。 files = tf.train.match_filenames_once('./datasets/data.tfrecords-*')# 創建文件輸入隊列 filename_queue = tf.train.string_input_producer(files, shuffle=False)# 讀取并解析Example reader = tf.TFRecordReader() _, seraialized_example = reader.read(filename_queue) features = tf.parse_single_example(seraialized_example,features={'i':tf.FixedLenFeature([], tf.int64),'j':tf.FixedLenFeature([], tf.int64),})# i代表特征向量,j代表標簽 example, label = features['i'], features['j']# 一個 batch 中樣例的個數。 batch_size = 3 # 文件隊列中最多可以存儲的樣例個數 capacity = 1000 + 3 * batch_size# 組合樣例。 # `min_after_dequeue` 是該函數特有的參數,參數限制了出隊時隊列中元素的最少個數, # 但當隊列元素個數太少時,隨機的意義就不大了 example_batch, label_batch = tf.train.shuffle_batch([example, label], batch_size=batch_size, capacity=capacity, min_after_dequeue=30)with tf.Session() as sess:# 使用match_filenames_once需要用local_variables_initializer初始化一些變量tf.local_variables_initializer().run()# 用Coordinator協同線程,并啟動線程coord = tf.train.Coordinator()threads = tf.train.start_queue_runners(sess=sess, coord=coord)# 獲取并打印組合之后的樣例。在真實問題中,這個輸出一般會作為神經網絡的輸入。for i in range(2):cur_example_batch, cur_label_batch = sess.run([example_batch, label_batch])print(cur_example_batch, cur_label_batch)coord.request_stop()coord.join(threads)

    輸出結果

    [0 0 0] [1 1 0] [0 0 1] [1 1 0]

    4、輸入數據處理框架

    框架主要是三方面的內容:

    • TFRecord 輸入數據格式
    • 圖像數據處理
    • 多線程輸入數據處理
    import tensorflow as tf# 獲取文件列表。 files = tf.train.match_filenames_once('./datasets/data.tfrecords-*')# 創建文件輸入隊列 filename_queue = tf.train.string_input_producer(files, shuffle=False)# 讀取并解析Example reader = tf.TFRecordReader() _, seraialized_example = reader.read(filename_queue) features = tf.parse_single_example(seraialized_example,features={'image':tf.FixedLenFeature([], tf.string),'label':tf.FixedLenFeature([], tf.int64),'height':tf.FixedLenFeature([], tf.int64),'width':tf.FixedLenFeature([], tf.int64),'channels':tf.FixedLenFeature([], tf.int64),}) image, label = features['image'], features['label'] height, width = features['height'], features['width'] channels = features['channels']# 從原始圖像數據解析出像素矩陣,并根據圖像尺寸還原圖像。 decoded_image = tf.decoded_raw(image, tf.int8) decoded_image.set_shape([height, width, channels])# 定義神經網絡輸入層圖片的大小。 image_size = 299# 圖像預處理 distorted_image = preprocess_for_train(decoded_image, image_size, image_size, None)# 將處理后的圖像和標續數據通過 tf.train.shuffle_batch 整理成神經網絡訓練時需要的 batch, min_after_dequeue = 10000 batch_size = 100 capacity = min_after_dequeue + 3 * batch_size# 組合樣例。 # `min_after_dequeue` 是該函數特有的參數,參數限制了出隊時隊列中元素的最少個數, # 但當隊列元素個數太少時,隨機的意義就不大了 image_batch, label_batch = tf.train.shuffle_batch([distorted_image, label], batch_size=batch_size, capacity=capacity, min_after_dequeue=min_after_dequeue)# 定義神經網絡的結構以及優化過程 learing_rate = 0.01 logit = inferenece(image_batch) loss = calc_loss(logit, label_batch) train_step = tf.train.GradientDescentOptimizer(learing_rate).minimize(loss)with tf.Session() as sess:# 使用match_filenames_once需要用local_variables_initializer初始化一些變量sess.run((tf.global_variables_initializer(), tf.local_variables_initializer()))# 用Coordinator協同線程,并啟動線程coord = tf.train.Coordinator()threads = tf.train.start_queue_runners(sess=sess, coord=coord)# 神經網絡訓練過程TRAINING_ROUNDS = 5000for i in range(TRAINING_ROUNDS):sess.run(train_step)coord.request_stop()coord.join(threads)

    5、總結

    對于輸入數據的處理,大體上流程都差不多,可以歸結如下:

  • 將數據轉為 TFRecord 格式的多個文件
  • 用 tf.train.match_filenames_once() 創建文件列表(圖中為{A,B,C})
  • 用 tf.train.string_input_producer() 創建輸入文件隊列,可以將輸入文件順序隨機打亂,并加入輸入隊列(是否打亂為可選項,該函數也會生成并維護一個輸入文件隊列,不同進程中的文件讀取函數可以共享這個輸入文件隊列)
  • 用 tf.TFRecordReader() 讀取文件中的數據
  • 用 tf.parse_single_example() 解析數據
  • 對數據進行解碼及預處理
  • 用 tf.train.shuffle_batch() 將數據組合成 batch
  • 將 batch 用于訓練
  • 四、數據集(DataSet)

    TF核心組件:tf.data。數據集框架中,每一個數據來源被抽象為一個數據集,以數據集為基本對象,方便地進行 batching、隨機打亂( shuffle)等操作。

    1、數據集的基本使用方法

    由于訓練數據通常無法全部寫入內存中,從數據集中讀取數據時需要使用一個迭代器( iterator)按順序進行讀取,數據集也是計算圖上的一個節點。

    (1)tensor -> 數據集

    示例:從一個張量創建一個數據集,遍歷這個數據集,并對每個輸入輸出 y=x2y=x^2y=x2 的值。

    import tensorflow as tf# 1.定義數據集構造方法:從-個數組創建數據集 input_data = [1, 2, 3, 5, 8] dataset = tf.data.Dataset.from_tensor_slices(input_data)# 2.定義一個迭代器用于遍歷數據集 # 因為數據集定義時未用placeholder作為參數,則此處用one_shot_iterator() iterator = dataset.make_one_shot_iterator() # 3.返回一個輸入數據的張量 x = iterator.get_next() y = x * xwith tf.Session() as sess:for i in range(len(input_data)):print(sess.run(y))

    輸出結果

    1 4 9 25 64

    數據集讀取數據有三個基本步驟:

  • 定義數據集的構造方法:eg:tf.data.Dataset.from_tensor_slices
  • 定義遍歷器;
  • 使用 get_next() 方法從遍歷器中讀取數據張量,作為計算圖其他部分的輸入。
  • (2)文本文件 -> 數據集

    tf.data.TextLineDataset()函數

    TXT_FILE1 = './datasets/Text/1.txt' TXT_FILE2 = './datasets/Text/2.txt'input_files = [TXT_FILE1, TXT_FILE2] dataset = tf.data.TextLineDataset(input_files)# 定義一個迭代器用于遍歷數據集 iterator = dataset.make_one_shot_iterator() # 返回一個字符串類型的張量,代表文件中的一行。 x = iterator.get_next() with tf.Session() as sess:# 循環的次數為文檔中總共的行數,否則會報錯for i in range(3):print(sess.run(x))

    結果輸出

    b'HELLO' b'MY FRIENDS!' b'AHHAHA'

    (3)TFRecord -> 數據集

    TFRecordDataset()函數讀取 TFRecord 形式的數據(常為圖像數據),因為每個 TFRecord 都有自己不同的 feature 格式,因此在讀取時,需提供一個 parse 函數進行解析。

    # 解析一個 TFRecord 的方法。record是從文件中讀取的一個樣例。 def parser(record):# 解析讀入的一個樣例。features = tf.parse_single_example(record,features={'feat1': tf.FixedLenFeature([], tf.int64),'feat2': tf.FixedLenFeature([], tf.inp64)})return features['feat1'], features['feat2']# 從 TFRecord 文件創建數據集 FILE1_PATH = '' FILE2_PATH = '' input_files = [FILE1_PATH, FILE2_PATH] dataset = tf.dataset.TFRecordDataset(input_files) # 二進制的數據# map()函數表示對數據集中的每一條數據進行調用相應方法。 # 通過 map() 來調用 parser() 對二進制數據進行解析。 dataset = dataset.map(parser)# 定義一個迭代器用于遍歷數據集 iterator = Dataset.make_one_shot_iterator()# feat1, feat2 是 parser() 返回的一維int64型張量,可以作為輸入用于進一步的計算。feat1, feat2 = iterator.get_next()with tf.Session() as sess:for i in range(10):f1, f2 = sess.run([feat1, feat2])

    注意

    • 使用 one shot_iterator 時,數據集的所有參數必須已經確定,因此不需要特別的初始化過程。
    • 使用 placeholder 初始化數據集,則需用 initializable_iterator 動態初始化數據集。如下所示
    # 解析一個 TFRecord 的方法。record是從文件中讀取的一個樣例。 def parser(record):# 解析讀入的一個樣例。features = tf.parse_single_example(record,features={'feat1': tf.FixedLenFeature([], tf.int64),'feat2': tf.FixedLenFeature([], tf.inp64)})return features['feat1'], features['feat2']FILE1_PATH = '' FILE2_PATH = ''# 從 TFRecord 文件創建數據集,具體文件路徑是一個 placeholder,稍后再提供路徑。 input_files = tf.placeholder(tf.string) dataset = tf.data.TFRecordDataset(input_files) dataset = dataset.map(parser)# 定義遍歷 dataset 的 initializable_iterator. iterator = dataset.make_initializable_iterator() feat1, feat2 = iterator.get_next()with tf.Session() as sess:# 首先初始化 interator,并給出 input_files 的值。sess.run(iterator.initializer,feed_dict={input_files: [FILE1_PATH, FILE2_PATH]})# 遍歷所有數據一個epoch。當遍歷結束時,程序會拋出 OutOfRangeError。while True:try:sess.run([feat1, feat2])except tf.errors.OutOfRangeError as e:break

    上述示例通過使用placeholder和feed_dict的方式傳給數據集。

    注意:上面的循環體不是指定循環10次sess.run,而是使用while(True)try-except的形式來將所有數據遍歷一遍(即一個epoch),因為在動態指定輸入數據時,不同數據來源的數據量大小難以預知,而這個方法我們不必提前知道數據量的精確大小。

    2、數據集的高層操作

    (1)map操作

    dataset = dataset.map(parser)

    map(parser) 表示對數據集中每一條數據調用參數中指定的 parser 方法。對每一條數據進行處理后,map將處理后的數據包裝成一個新的數據集返回。

    map可用于對數據的任何預處理操作。

    dataset = dataset.map(lambda x: preprocess_for_train(x, image_size, image_size, None))

    lambda表達式的作用:將原來有4個參數的函數轉化為只有1個參數的函數。第一個參數decoded_image 變成了 lambda 表達式中的 x ,后3個參數都被換成了具體的數值。注意這里的 image_size 是一個變量,有具體取值,該值需要在程序的上文中給出。

    在返回的新的數據集上,可以直接繼續調用其他高層操作,比如預處理、shuffle、batch等操作。==》更加干凈簡潔

    (2)shuffle 和 batch 操作

    dataset = dataset.shuffle(buffer_size) # 隨機打亂順序 dataset = dataset.batch(batch_size) # 將數據組合成batch

    其中buffer_size相當于tf.train.shuffle_batch 的 min_after_dequeue 參數。shuffle 算法在內部使用一個緩沖區中保存 buffer_size 條數據,每讀入一條新數據時,從這個緩沖區中隨機選擇一條數據進行輸出。緩沖區的大小越大,隨機的性能越好,但占用的內存也越多 。

    batch方法中的 batch_size 參數表示要輸出的每個 batch 由多少條數據組成

    (3)repeat 操作

    作用:將數據集中的數據復制多份,其中每一份數據被稱為一個 epoch。

    dataset = dataset.repeat(N) # 將數據集重復 N 份

    注意:如果數據集在 repeat 前己經進行了 shuffle 操作,輸出的每個 epoch 中隨機 shuffle 的結果并不會相同 。repeat 和 map 、shuffle 、batch 等操作一樣,都只是計算圖中的一個計算節點 。repeat 只代表重復相同的處理過程,并不會記錄前一個epoch的處理結果。

    (4)其他操作

    • concatenate():將兩個數據集順序連接起來;
    • take(N):從數據集中讀取前 N 項數據;
    • skip(N):在數據集中跳過前 N 項數據;
    • flap_map():從多個數據集中輪流讀取數據。

    (5)示例

    從文件中讀取原始數據,進行預處理、shuffle、batching 等操作,并通過 repeat 方法訓練多個 epoch。此外,測試集和訓練集做了不同的預處理。在訓練時,調用上小節中的 preprocess_for_train 方法對圖像進行隨機反轉等預處理操作;而在測試時,測試數據以原本的樣子直接輸入測試。

    對數據依次進行預處理、shuffle、batching操作

    import tensorflow as tf import tempfile# 1. 列舉輸入文件 TRAIN_PATH = 'output.tfrecords' TEST_PATH = 'output_test.tfrecords' train_files = tf.train.match_filenames_once(TRAIN_PATH) test_files = tf.train.match_filenames_once(TEST_PATH)# 2. 定義parser方法TFRecord中解析數據 # 解析一個TFRecord的方法。 def parser(record):features = tf.parse_single_example(record,features={'image_raw':tf.FixedLenFeature([],tf.string),'pixels':tf.FixedLenFeature([],tf.int64),'label':tf.FixedLenFeature([],tf.int64)})decoded_images = tf.decode_raw(features['image_raw'],tf.uint8)retyped_images = tf.cast(decoded_images, tf.float32)images = tf.reshape(retyped_images, [784])labels = tf.cast(features['label'],tf.int32)#pixels = tf.cast(features['pixels'],tf.int32)return images, labelsimage = 299 # 定義神經網絡輸入層圖片的大小 batch_size = 100 # 定義組合數據 batch 的大小 shuffle_buffer = 10000 # 定義隨機打亂數據時buffer大小# 定義讀取訓練集和測試集 dataset = tf.data.TFRecordDataset(train_files) dataset = dataset.map(parser)# 對數據依次進行預處理、shuffle、batching操作 # dataset = dataset.map( # lambda image, label: ( # preprocess_for_train(image, image_size, image_size, None), label)) dataset = dataset.shuffle(shuffle_buffer).batch(batch_size)# 重復NUM_EPOCHS 個epoch NUM_EPOCHS = 10 dataset = dataset.repeat(NUM_EPOCHS)# 定義數據集迭代器。 iterator = dataset.make_initializable_iterator() image_batch, label_batch = iterator.get_next()# 4. 定義神經網絡結構和優化過程 def inference(input_tensor, weights1, biases1, weights2, biases2):layer1 = tf.nn.relu(tf.matmul(input_tensor, weights1) + biases1)return tf.matmul(layer1, weights2) + biases2INPUT_NODE = 784 OUTPUT_NODE = 10 LAYER1_NODE = 500 REGULARAZTION_RATE = 0.0001 TRAINING_STEP = 5000weights1 = tf.Variable(tf.truncated_normal([INPUT_NODE, LAYER1_NODE], stddev=0.1)) biases1 = tf.Variable(tf.constant(0.1, shape=[LAYER1_NODE])) weights2 = tf.Variable(tf.truncated_normal([LAYER1_NODE, OUTPUT_NODE], stddev=0.1)) biases2 = tf.Variable(tf.constant(0.1, shape=[OUTPUT_NODE]))y = inference(image_batch, weights1, biases1, weights2, biases2)# 計算交叉熵及其平均值 cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y, labels=label_batch) cross_entropy_mean = tf.reduce_mean(cross_entropy)# 損失函數的計算 regularizer = tf.contrib.layers.l2_regularizer(REGULARAZTION_RATE) regularaztion = regularizer(weights1) + regularizer(weights2) loss = cross_entropy_mean + regularaztion# 優化損失函數 train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss)# 5. 定義測試用數據集 # 定義測試用的Dataset。 test_dataset = tf.data.TFRecordDataset(test_files) test_dataset = test_dataset.map(parser) test_dataset = test_dataset.batch(batch_size)# 定義測試數據上的迭代器 test_iterator = test_dataset.make_initializable_iterator() test_image_batch, test_label_batch = test_iterator.get_next()# 定義測試數據上的預測結果 test_logit = inference(test_image_batch, weights1, biases1, weights2, biases2) predictions = tf.argmax(test_logit, axis=-1, output_type=tf.int32)# 聲明會話并運行神經網絡的優化過程。 with tf.Session() as sess:# 初始化變量。sess.run((tf.global_variables_initializer(),tf.local_variables_initializer()))# 初始化訓練數據的迭代器。sess.run(iterator.initializer)# 循環進行訓練,直到數據集完成輸入、拋出OutOfRangeError錯誤。while True:try:sess.run(train_step)except tf.errors.OutOfRangeError as e:break# 初始化測試數據的迭代器。test_results = []test_labels = []sess.run(test_iterator.initializer)while True:try:pred, label = sess.run([predictions, test_label_batch])test_results.extend(pred)test_labels.extend(label)except tf.errors.OutOfRangeError as e:break# 計算準確率 correct = [float(y==y_) for (y, y_) in zip(test_results, test_labels)] accuarcy = sum(correct)/len(correct) print("Test accuarcy is: ", accuarcy)

    輸出結果

    Test accuarcy is: 0.9005

    總結

    以上是生活随笔為你收集整理的【TensorFlow】笔记5:图像数据处理的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    91热爆在线观看 | 国产精品免费麻豆入口 | 六月久久婷婷 | 中文字幕乱码亚洲精品一区 | 97小视频 | 玖玖视频在线 | 这里只有精品视频在线观看 | 91视频观看免费 | 成年人视频免费在线 | avwww在线观看| 久久久99精品免费观看乱色 | 女人高潮特级毛片 | 久久综合五月天 | 久久精国产 | 国产在线观看中文字幕 | 黄色www免费| 国产不卡一二三区 | 精品免费视频 | 不卡视频一区二区三区 | av电影免费在线播放 | 欧美一级性 | 国产一区二区三区久久久 | 国产精品美 | 国产在线v | 亚洲成人av一区二区 | av电影在线免费 | 国产精品自产拍在线观看 | 久草在线一免费新视频 | 亚洲精品免费播放 | 九九色网 | 黄色a一级视频 | 在线观看国产福利片 | 欧美精品xxx | 激情五月六月婷婷 | 在线观看的a站 | 久久人91精品久久久久久不卡 | a在线免费| 丁香激情五月 | 又黄又刺激的视频 | 久久国产一二区 | 国产精品xxxx18a99 | 91成人天堂久久成人 | 欧美做受高潮 | 91干干干 | 久久区二区 | 久久久久综合网 | 一区二区三区中文字幕在线观看 | 97免费在线观看视频 | 狠狠色噜噜狠狠狠狠 | 免费日韩一区二区 | 欧美日韩国产精品久久 | 日韩免费av网址 | 国产美女免费观看 | 国产九九九九九 | 久久久91精品国产一区二区三区 | 一级久久精品 | 欧美在线日韩在线 | av在线看片 | 国产91免费在线观看 | 久久免费精品一区二区三区 | 欧美视频国产视频 | 天天草天天干 | 91大神视频网站 | 91精品亚洲影视在线观看 | www.久久久.cum| 91香蕉亚洲精品 | 黄色在线小网站 | 国产69精品久久久久99 | 狠狠色噜噜狠狠狠合久 | 黄色的网站免费看 | 精品久久久久久亚洲综合网站 | 九色精品 | 精品一区二区6 | 成年人黄色免费看 | 久久亚洲综合国产精品99麻豆的功能介绍 | 国产又粗又硬又长又爽的视频 | 久久理论影院 | 久久免费片 | 亚洲精品视频在线观看免费 | 国产原厂视频在线观看 | 人人看人人做人人澡 | 久久免费资源 | 亚洲最大激情中文字幕 | 日韩理论片在线观看 | 福利网址在线观看 | 天天色播 | 丝袜网站在线观看 | 色多视频在线观看 | 99精品欧美一区二区三区黑人哦 | 久久精品国产精品亚洲 | 久久久一本精品99久久精品 | 久草在线久草在线2 | 香蕉视频日本 | 亚洲日本精品 | 在线看v片成人 | 日韩精品久久久久久久电影99爱 | 国产精品乱码一区二三区 | 国产精品久久嫩一区二区免费 | 操操操av| 激情欧美xxxx | 99视频免费播放 | 国产激情电影综合在线看 | 日批在线看 | 欧美色图另类 | 四虎成人精品在永久免费 | 免费在线色视频 | 日韩三级视频在线观看 | 欧美精品二区 | 伊人天堂网| 激情五月在线视频 | 久久人人97超碰精品888 | 午夜av网站 | 国产精品免费久久久久 | 色综合久久88色综合天天免费 | 在线成人欧美 | 国产91精品久久久久久 | 日韩高清一区在线 | 亚洲国产成人高清精品 | 中文字幕制服丝袜av久久 | 日韩经典一区二区三区 | 亚洲国产色一区 | 视频二区在线视频 | 国产在线不卡精品 | 久久99久久99精品免费看小说 | 亚洲精品国精品久久99热 | 91人人澡人人爽 | 黄网站a | 93久久精品日日躁夜夜躁欧美 | 婷香五月 | 国产成人99久久亚洲综合精品 | 波多野结衣日韩 | 99热这里只有精品1 av中文字幕日韩 | 欧美午夜剧场 | 精品久久久久久久久中文字幕 | 婷婷综合久久 | 成片视频在线观看 | www178ccom视频在线 | 日韩 精品 一区 国产 麻豆 | 少妇av片 | 日韩高清一区在线 | 在线观看亚洲免费视频 | 亚洲欧洲成人 | www.五月天婷婷.com | 韩日成人av | 久久怡红院 | 久草在线免费资源 | 韩国av不卡 | 成人在线免费观看网站 | 日韩午夜在线播放 | 成人性生交大片免费看中文网站 | 天堂视频一区 | 国产精品亚州 | 天天狠狠 | 九九视频网 | 一区二区三区电影 | 欧美久久久久久久久 | 手机看片99| 欧美日韩视频在线观看免费 | 国产成人精品一区二区三区免费 | 五月在线视频 | 亚洲a成人v| 中文字幕黄色 | 亚洲天堂视频在线 | 色99在线| 久久精品五月 | 国产午夜精品一区二区三区嫩草 | 久久久久电影 | 日韩精品中文字幕av | 成人免费看片网址 | 91精品国自产在线观看欧美 | 免费精品视频在线观看 | 中文字幕第| 久久影视一区 | 少妇bbb | 免费网站黄 | 色噜噜日韩精品欧美一区二区 | 丁香五月缴情综合网 | 中文永久免费观看 | 超碰人人在线观看 | 久久综合综合久久综合 | 国产精品三级视频 | 麻豆视频一区二区 | 999免费视频 | 91女子私密保健养生少妇 | 久久视频6| 成人小视频在线观看免费 | 国产精品久久久久久久久久久久午 | 欧美激情视频免费看 | 天天爽天天爽夜夜爽 | av电影在线观看完整版一区二区 | 国产成人l区 | 免费又黄又爽视频 | 天天操天天谢 | 人人舔人人干 | www99精品 | 91久久在线观看 | 天天爱综合 | 亚洲精欧美一区二区精品 | 亚洲精品自拍视频在线观看 | 91亚洲精品久久久蜜桃 | 黄色av网站在线观看免费 | 国产永久免费观看 | 91香蕉视频720p | 国语久久 | 日日干精品 | 国产打女人屁股调教97 | 国产精品久久久久永久免费看 | 三级av黄色 | 日韩欧美在线一区 | 99久久er热在这里只有精品66 | 国产一级精品绿帽视频 | 日韩三级在线观看 | 精壮的侍卫呻吟h | 一级黄色片在线免费观看 | 日韩av高潮 | 色婷婷综合久久久久中文字幕1 | 久草免费在线视频 | 日韩精品久久一区二区三区 | 91免费观看国产 | 热99久久精品 | 国产视频2021| 亚洲五月六月 | 亚洲在线黄色 | 精品国产激情 | 国产精品久久嫩一区二区免费 | 国产精品网在线观看 | 成人黄色一级视频 | 欧美国产视频在线 | 亚洲最新在线视频 | www免费网站在线观看 | 精品国产一区二区三区四 | 成年人网站免费在线观看 | 黄色www在线观看 | 中文在线中文资源 | 这里只有精品视频在线 | 天天操天天操天天 | 九九视频免费观看视频精品 | 天天草天天操 | 日韩免费观看一区二区 | 最新成人在线 | 国产免费亚洲 | 成人一区二区三区在线观看 | 国产视频一二三 | 在线观看91久久久久久 | 亚洲一区 av| 首页中文字幕 | 国内精品免费 | 97视频免费 | 狠狠狠狠干| 免费看毛片网站 | 九色在线 | 人人爱人人舔 | 日韩r级电影在线观看 | 狠狠色丁香婷婷综合基地 | 久久国产高清视频 | 亚洲精品在线播放视频 | 黄色视屏在线免费观看 | 国产午夜影院 | 在线观看中文字幕第一页 | 三级黄色片子 | 国产男男gay做爰 | www.成人精品 | 黄色成人在线观看 | 久久国产热视频 | 奇米四色影狠狠爱7777 | 成人久久18免费网站麻豆 | 人人草在线视频 | 免费的国产精品 | 91重口视频 | av免费福利 | 成年人黄色大全 | 国产 欧美 日产久久 | 在线成人中文字幕 | 园产精品久久久久久久7电影 | 激情五月综合 | 欧美亚洲成人免费 | 国产第一福利网 | 日韩在线观看av | 中文免费观看 | 国产丝袜制服在线 | 午夜精品一区二区三区在线 | 久久这里只有精品1 | 国产一区二区免费看 | 亚洲高清激情 | 国产精品对白一区二区三区 | 高清不卡一区二区三区 | 成人免费观看大片 | 美女国产精品 | 在线国产视频一区 | 国产精品成人免费 | 日韩黄在线观看 | 天天亚洲综合 | 不卡av电影在线观看 | 日韩电影一区二区在线 | 色婷婷在线观看视频 | 99热精品久久 | 久久精品99久久久久久2456 | 天天爱天天操 | 久久99精品久久久久久 | 久久免费公开视频 | 成人国产精品一区 | 精品久久久久国产免费第一页 | 国产成人精品久久二区二区 | 精品国产一区二区三区四区在线观看 | 久久久久久国产精品亚洲78 | 国产亚洲精品久久网站 | 成人在线电影观看 | 青春草国产视频 | 人人干人人添 | 色婷婷www | 曰本免费av | 久久久久五月天 | 国产精品2020 | av成人在线观看 | 97视频在线观看网址 | 成人性生活大片 | 久久毛片网站 | 国产精品18久久久久vr手机版特色 | 国产又粗又猛又色又黄网站 | 日日夜夜精品 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 亚洲国产精品成人va在线观看 | 日韩在线观看你懂的 | 热热热热热色 | 天天综合网在线 | 亚洲欧美综合精品久久成人 | 亚洲精品美女在线观看 | 9i看片成人免费看片 | 99久久婷婷国产综合精品 | 美女视频永久黄网站免费观看国产 | 狠狠狠狠狠狠狠狠 | 国产老妇av| 精品国产aⅴ一区二区三区 在线直播av | 免费av免费观看 | 国产精品你懂的在线观看 | 国产精品一区二区三区在线看 | 五月天婷亚洲天综合网鲁鲁鲁 | 丁香花在线观看视频在线 | 一区二区中文字幕在线播放 | 香蕉视频在线观看免费 | 日韩精品在线播放 | 亚洲国产精品视频 | 亚洲国产精品日韩 | 国产精品一区二区麻豆 | 国产精品欧美 | 久久久久久草 | 九九精品视频在线看 | 激情视频久久 | 在线视频婷婷 | 久射网| 久久国产精品免费一区 | 亚洲国产精品一区二区尤物区 | 久久五月网 | 日本精品一区二区三区在线观看 | 黄色大片日本免费大片 | 综合久久网站 | 青青久草在线 | 人人超碰在线 | 国产高清一 | 国产精品永久在线观看 | 免费在线观看av不卡 | 92中文资源在线 | 日韩高清免费电影 | 亚洲精品国偷自产在线99热 | 国产精品久久久久久久免费观看 | 精品久久免费 | 伊人中文字幕在线 | 欧美精品一区二区在线观看 | 91在线免费视频 | 婷婷丁香在线 | 99r在线视频| 综合国产视频 | 久久国产欧美日韩 | 综合久久久久久久久 | 亚洲国产操 | 在线香蕉视频 | 亚洲 欧洲av | 国产伦理久久精品久久久久_ | 国产精品久久久久久久久久 | 国产在线a免费观看 | 国产一级二级在线 | 国产精品麻豆免费版 | 久久综合成人网 | 在线观看国产区 | 91丨porny丨九色 | 国产在线91在线电影 | 在线观看你懂的网站 | 精品国产欧美一区二区三区不卡 | 日本久久成人 | 一区二区亚洲精品 | 夜夜嗨av色一区二区不卡 | 五月天久久久久久 | 在线免费观看国产视频 | 最新中文字幕在线观看视频 | 一区二区 久久 | 视频在线观看入口黄最新永久免费国产 | 成人av在线直播 | 欧美一二区在线 | 久久只有精品 | 91av九色 | 免费看短 | 中文av字幕在线观看 | 国产一级免费播放 | 美女网站视频免费都是黄 | 成人av电影在线观看 | 99久久久久 | 免费黄色网址大全 | 国产精品日韩欧美一区二区 | 日韩免费播放 | 人人搞人人爽 | 国产又粗又猛又爽又黄的视频免费 | 最近更新中文字幕 | 欧美精品v国产精品v日韩精品 | 日韩欧美有码在线 | 国产手机免费视频 | 国产精品免费久久久久影院仙踪林 | 91成人免费电影 | 国产午夜精品一区二区三区四区 | 不卡的av在线 | 日韩午夜av| 亚洲一级片在线看 | 中文字幕亚洲欧美日韩2019 | 狠狠色丁香久久综合网 | 91av在线不卡 | 中文字幕日韩高清 | 国产高清一 | 人人澡人人爽 | 国产精品对白一区二区三区 | 久久中国精品 | 99热这里只有精品国产首页 | 丁香久久激情 | 成人手机在线视频 | 碰碰影院 | 欧美一区中文字幕 | 亚洲成av人片在线观看香蕉 | 天天操天天操天天操天天操天天操 | 久久综合五月天婷婷伊人 | 国产一区二区电影在线观看 | av综合站 | 在线观看免费视频 | 精品一二三四五区 | 亚洲午夜精品一区 | 日日干日日操 | 久久精品999 | 日日干,天天干 | 在线免费精品视频 | 国产永久网站 | 午夜视频在线观看欧美 | 成年人网站免费在线观看 | 中文字幕麻豆 | 亚洲精品国产综合久久 | 国产精品一区二区三区视频免费 | av在线播放中文字幕 | av日韩在线网站 | 中文久久精品 | 中文字幕永久 | 久久国产精品久久w女人spa | 91麻豆精品国产91久久久使用方法 | 久久激情五月激情 | 欧美成人猛片 | 国产在线观看一 | 国产一级电影免费观看 | 99久久精品国产亚洲 | 婷婷丁香在线观看 | 国产流白浆高潮在线观看 | 国产精品久久久久一区二区三区共 | 美女视频黄免费网站 | 欧美精品一区二区在线播放 | 久久久久久免费毛片精品 | 91伊人影院 | 国产日韩一区在线 | 久久福利电影 | 一区二区三区四区在线 | 国产精品麻豆果冻传媒在线播放 | 麻豆视频成人 | 日韩三级免费 | 最近的中文字幕大全免费版 | 五月婷婷综合在线观看 | 国产亚洲观看 | 美女免费视频观看网站 | 在线观看视频你懂得 | 四虎在线永久免费观看 | 免费在线观看成人 | 久久午夜影视 | 人人爽人人爽人人片av免 | 伊人婷婷在线 | 亚洲成人精品久久久 | 久久精品123 | 久久精品视频在线免费观看 | 91麻豆精品国产91久久久无需广告 | 天天弄天天操 | 在线观看中文av | 日韩高清不卡在线 | 欧美在线不卡一区 | 欧美视频www | 最近日本韩国中文字幕 | av在线影片| 精品在线视频一区二区三区 | 国产在线一卡 | 黄色网中文字幕 | 九九激情视频 | 99久久精品无码一区二区毛片 | 黄色毛片视频免费观看中文 | 国产欧美三级 | 国内久久久久久 | 特级片免费看 | 96精品高清视频在线观看软件特色 | 成人看片| 国产精品高潮久久av | 亚洲精品久久久久58 | 成人资源在线播放 | 丁香六月中文字幕 | 久久久久女教师免费一区 | 91人人爽人人爽人人精88v | 久久精品影视 | 国产精品成人一区二区三区 | 免费看国产黄色 | 免费久久99精品国产婷婷六月 | 精品久久亚洲 | 特黄特黄的视频 | 99色资源| 日韩综合第一页 | 成人黄色小说视频 | 四虎成人精品 | 97视频在线观看网址 | 右手影院亚洲欧美 | 欧美一二区视频 | 成人h电影在线观看 | 国精产品永久999 | 精品久久久精品 | 国产黄色免费看 | 日韩av中文字幕在线免费观看 | 超碰公开97 | 久久er99热精品一区二区 | 天天操夜夜干 | 国产综合激情 | 美女视频黄是免费的 | 四虎影视久久久 | 亚州国产精品视频 | aaa免费毛片 | 中文字幕高清av | 欧美激情综合五月 | 免费在线黄网 | a成人在线| 黄色一级免费网站 | 中文字幕乱码日本亚洲一区二区 | 日韩一级黄色片 | av久久在线 | 久久久91精品国产 | 久久se视频 | 波多野结衣精品 | 国产精品九九久久久久久久 | 免费三及片 | 免费成人av电影 | 五月婷综合 | 日韩av在线资源 | 亚洲精品视频在线免费 | 99欧美视频| 中文字幕 第二区 | 国产免费久久精品 | 亚洲国产精品电影 | 99麻豆久久久国产精品免费 | 日本久久久久久久久久 | 粉嫩av一区二区三区入口 | 日批视频国产 | 欧美精品在线视频 | 日韩网站在线观看 | 日韩免费中文 | 天天射天天射天天射 | 日本一区二区免费在线观看 | 成人av中文字幕在线观看 | 国产亚洲精品久久久久久 | 国产色视频网站2 | 国产中文字幕一区二区 | 97视频在线免费 | 亚洲美女在线一区 | 久久在线免费视频 | 精品福利视频在线观看 | 久久激情综合 | 婷婷久久综合网 | 色av网站| 国产精品久久久久久久久久99 | 五月天开心 | 欧美日韩亚洲第一页 | 天天综合网久久综合网 | 精品国产一区二区三区久久久蜜月 | 亚洲国产精品电影在线观看 | 久久免费一| 精品久久久久久亚洲综合网站 | 999久久久久久 | 超碰在线人人爱 | 五月开心婷婷 | 91在线www | 91黄色影视 | 97中文字幕 | 国产裸体视频bbbbb | 一区二区 精品 | 免费视频久久久久 | 久久国产精品99精国产 | 色婷婷久久一区二区 | 中文字幕av电影下载 | 国产亚洲婷婷免费 | 亚洲人成网站精品片在线观看 | 国产精品麻豆视频 | 久久精品伊人 | 91成人在线观看高潮 | 久久免费成人网 | 日韩精品一区二区三区三炮视频 | 精品久久久久久久久久 | 日韩在线一区二区免费 | 免费观看成年人视频 | 成人香蕉视频 | 精品美女久久久久 | 国产美女网站在线观看 | 成年人网站免费观看 | 激情av五月婷婷 | 久久久久久久久久久福利 | 麻豆国产精品va在线观看不卡 | 99热这里只有精品久久 | 中文字幕av一区二区三区四区 | 三级动图 | 国产精品久久久久久欧美 | 四虎影视国产精品免费久久 | 国产精品99久久久久的智能播放 | 在线观看中文字幕2021 | 久久精品永久免费 | 亚洲国产中文在线 | 一级黄色片在线免费看 | 国产小视频免费在线观看 | 最近日本字幕mv免费观看在线 | 成人午夜影院 | 欧美日韩二三区 | 热久久最新地址 | 天天综合网入口 | 美女精品 | 精品国产一区二区三区免费 | 成年人免费电影在线观看 | 黄色字幕网 | 亚洲黄色成人 | 婷色| 日韩一二区在线 | 天天综合精品 | 欧美了一区在线观看 | 久久久免费毛片 | 国产一级黄色电影 | 日日夜夜干 | 国产高清亚洲 | 久久精品欧美日韩精品 | 日日碰狠狠躁久久躁综合网 | 97超碰免费在线 | 国产日韩av在线 | 在线免费高清一区二区三区 | 国产亚洲日 | 亚洲九九爱| 日韩中文字幕免费视频 | 久久调教视频 | 就要干b| 国产很黄很色的视频 | 中文字幕av在线 | 日本一区二区三区视频在线播放 | 成人国产综合 | 国产一区二区三区免费在线观看 | 91综合在线| 久久久国产精品一区二区中文 | 午夜精品福利一区二区 | 成人毛片100免费观看 | 国产91精品高清一区二区三区 | 免费av网址大全 | 久久免费精品国产 | 欧美激情精品 | 久久夜色精品国产欧美乱 | 91免费视频黄 | 综合铜03| 欧美在线你懂的 | 国产成人一区二区在线观看 | 色婷婷骚婷婷 | 欧美性高跟鞋xxxxhd | 黄色影院在线观看 | 在线一二区 | 免费亚洲一区二区 | 探花视频在线观看 | 三级黄在线 | 亚洲欧美激情精品一区二区 | 色香蕉在线视频 | 国产亚洲精品久久久久久网站 | 久久激情视频 久久 | 亚洲成人免费观看 | 成人av一二三区 | 久久国产高清 | 黄色成人av网址 | 久久综合久久综合久久 | 国产中文字幕一区二区三区 | av片在线观看免费 | 99精品电影 | 久久精品波多野结衣 | 亚洲精品综合久久 | 日日干av | 国产精品永久在线 | 91日本在线播放 | 久久免费视频在线观看 | 午夜精品一区二区三区在线 | 久久免费精品视频 | 国产69精品久久久久久久久久 | 国产成人亚洲在线观看 | 少妇精品久久久一区二区免费 | 国产精品久久久av久久久 | 黄色aa久久| 999ZYZ玖玖资源站永久 | 国产99久久久久 | 手机av电影在线观看 | 婷婷5月色| avwww在线观看 | 国产精品一级在线 | 人人超在线公开视频 | 色狠狠操| 好看的国产精品视频 | 青草视频在线 | 免费精品在线观看 | 视频在线观看入口黄最新永久免费国产 | 狠狠色香婷婷久久亚洲精品 | 国产玖玖精品视频 | 91在线中字 | 日日操日日插 | 国产精品福利久久久 | 久热电影 | 中文国产在线观看 | 久草观看视频 | 九九欧美| 亚洲国产精品久久久久婷婷884 | 香蕉91视频 | 激情五月在线观看 | 久久天天躁狠狠躁夜夜不卡公司 | 久久只有精品 | 欧美乱码精品一区二区 | 人人澡澡人人 | 超碰人人在| 国产字幕在线看 | 2021久久 | 国产精品高潮在线观看 | 免费污片 | 亚洲永久精品国产 | 九九久久影视 | 91在线观| 三级黄色片子 | 69国产盗摄一区二区三区五区 | 色www精品视频在线观看 | 81精品国产乱码久久久久久 | 久久精品99国产精品酒店日本 | 三三级黄色片之日韩 | 在线免费av网站 | 天天草天天 | 亚洲精品66 | 国产一级在线视频 | 中文字幕第一页在线视频 | 国产亚洲精品久久久久久网站 | 欧美一级专区免费大片 | 成人av电影免费在线播放 | 草久在线播放 | 精品免费在线视频 | 91传媒激情理伦片 | 久久久久免费网 | 久久久久久蜜桃一区二区 | 国产午夜精品一区二区三区欧美 | 麻豆 free xxxx movies hd| 亚洲一区免费在线 | 精品日韩中文字幕 | 久久精品人人做人人综合老师 | 免费观看福利视频 | 亚洲va综合va国产va中文 | 免费69视频 | 色激情五月 | 国产精品99久久久久久大便 | 美女精品 | 久久激情视频 久久 | av不卡免费在线观看 | 亚洲狠狠婷婷综合久久久 | 亚洲国产小视频在线观看 | 日韩免费一区二区在线观看 | 国产成人免费网站 | 中文字幕a在线 | 一区二区三区四区精品 | 精品av网站 | 国产99在线 | 精品 一区 在线 | 成人午夜精品久久久久久久3d | 91免费高清| 国产91精品在线播放 | 国产在线色 | 亚洲精品看片 | 久久成年人视频 | 久久这里只有精品1 | 在线欧美最极品的av | 久久夜视频 | 国产在线黄色 | 久久精品一区二区 | 成人免费观看网址 | 精品黄色视 | 在线观看爱爱视频 | 色综合天天狠天天透天天伊人 | 91麻豆文化传媒在线观看 | 狠狠色狠狠色综合系列 | av不卡网站 | 天天爱天天射 | 国产香蕉久久 | 免费看一级片 | 中文字幕永久 | 亚洲免费高清视频 | 国产精品视频地址 | 国产一级在线观看 | www欧美色 | 日韩中文字| 国产一二区在线观看 | 国产精品午夜免费福利视频 | 在线看成人片 | 一区二区三区日韩视频在线观看 | 国产高h视频 | 国产精品美女视频网站 | 国产精品手机在线 | 在线观看亚洲免费视频 | 97av视频| 婷婷亚洲五月色综合 | 国产亚洲精品xxoo | 久久久久国产成人免费精品免费 | 99一级片| 中文字幕在线播出 | 成人精品电影 | 美女免费视频一区 | 国产精品久久久一区二区 | 久久99热精品这里久久精品 | 成人黄在线观看 | 日韩一二三在线 | 久久高清av | 免费热情视频 | 欧美一级特黄高清视频 | 激情视频网页 | 激情综合啪 | 99在线观看视频网站 | 99re亚洲国产精品 | 亚洲精品成人在线 | 夜夜操网站 | 日韩av视屏在线观看 | 日日夜夜综合网 | 97成人在线| 国产黄免费看 | 亚洲欧美日韩不卡 | 久久久久久久久久久久av | 高清国产午夜精品久久久久久 | 国色天香在线观看 | 91大神精品视频在线观看 | 久久99国产精品久久99 | 91精品综合在线观看 | 午夜精品一二三区 | 欧美激情综合网 | 五月天激情视频在线观看 | 免费观看一区 | 国产成人一区二区三区在线观看 | 激情av在线播放 | 99色亚洲| 麻花豆传媒一二三产区 | 亚洲极色 | 免费看片成年人 | 91超级碰| 99精品乱码国产在线观看 | 国产亚洲人成网站在线观看 | 91av中文 | 91在线91拍拍在线91 | av中文字幕网 | 免费看搞黄视频网站 | 69欧美视频 | 天天色欧美 | 在线视频一二三 | 日韩欧美国产视频 | 中文字幕精品www乱入免费视频 | 亚洲精品久久久久999中文字幕 | 国产在线a免费观看 | 国产亚洲精品久久久久久无几年桃 | 91在线麻豆 | 四虎在线观看 | 国产精品永久久久久久久久久 | 黄色网址中文字幕 | 粉嫩av一区二区三区免费 | 亚洲国产wwwccc36天堂 | 激情五月婷婷 | 日韩在线三级 | 欧美a影视 | 日本大尺码专区mv | 国产精品 中文字幕 亚洲 欧美 | 国产精品久久一区二区无卡 | 日韩国产精品一区 | 亚洲美女视频在线 | 国产午夜精品一区二区三区欧美 | 91成人免费在线 | 成人午夜影院 | 九九免费在线观看 | 中午字幕在线观看 | 一区二区视 | 国产精品一区二区白浆 | 久久99免费视频 | 天天操天天爽天天干 | 亚洲欧洲美洲av | 高清av免费看 | 国产91对白在线播 | 国产一二区精品 | 天天射天 | 成人午夜片av在线看 | 超碰97网站 | 中文字幕精品视频 | 天天操天天摸天天干 | www.久久成人 | 在线观看视频97 | 国产午夜影院 | 亚洲精品中文在线 | 免费看一及片 | 久久国色夜色精品国产 | 日本三级大片 | 久久高清免费观看 | 亚洲三级在线播放 | 外国av网 | 六月丁香激情综合色啪小说 | 2000xxx影视| 国产视频一二区 | 中文字幕在线看人 | 中文字幕在线观看视频一区二区三区 | 亚洲极色 | 韩日av在线 | 天天干天天射天天操 | 久久超碰网| 国产精品中文字幕在线 | 国产精品第三页 | 国产精品一区二区精品视频免费看 | 国产破处视频在线播放 | 三级黄免费看 | 免费一级黄色 | 婷婷电影在线观看 | 天天干天天射天天爽 | 人人爱夜夜操 | 五月丁婷婷| 日韩免费b | 手机在线欧美 | 欧美在线1 | 在线国产日本 | 亚洲精品在线国产 | 福利电影一区二区 | 天天操夜夜逼 | 888av| 欧美日韩另类在线观看 | 国产精品久久久久久久久久三级 | 中文字幕二区三区 | 国产一区二区精品久久91 | 欧美永久视频 | 欧美精品在线一区 | 激情久久一区二区三区 | 99国产精品视频免费观看一公开 | 天天操,夜夜操 | 天天操天天艹 | 亚洲男男gⅴgay双龙 | 国产福利免费看 | 九九导航 | 久久高清毛片 | av电影 一区二区 | 国产精品久久久影视 | 99久久精品国产免费看不卡 | 激情婷婷久久 | 久久久精品在线观看 | 91中文在线观看 | 国产日韩在线看 | 亚洲精品字幕在线 | 国产日韩中文字幕在线 | 日本午夜在线亚洲.国产 | 国产一区二区高清 | 丁香六月婷婷激情 | 一区二区三区免费播放 | 精品自拍av | 91麻豆国产福利在线观看 | 国产一区黄色 | 天天综合久久综合 | 国产视频观看 | 日日爽天天操 | 久久夜色精品国产欧美乱 | 国产精品成人aaaaa网站 | 91片在线观看 | 美女视频一区 | 精品夜夜嗨av一区二区三区 | 亚洲国内在线 | 日韩久久精品一区二区 | 9草在线| 美女在线黄 | 成人啪啪18免费游戏链接 | 极品嫩模被强到高潮呻吟91 | 91精品色| 成年人网站免费观看 | 亚洲免费精品一区二区 | 久久成人综合 | 天天摸天天干天天操天天射 | 最新av电影网站 | 91热视频 | 国产视频观看 | 九九九热精品免费视频观看 |