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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【TensorFlow】笔记3:MNIST数字识别问题

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

文章目錄

  • 一、MNIST數據處理
    • 1、數據集概述
    • 2、數據獲取
  • 二、神經網絡模型訓練及不同模型結果對比
    • 1、TF訓練神經網絡
    • 2、使用驗證數據判斷模型效果
    • 3、不同模型效果比較
  • 三、變量管理
    • 1、tf.get_variable()
    • 2、tf.variable_scope()管理
    • 3、前向傳播的改進
  • 四、TF模型持久化
    • 1、持久化代碼實現
      • (1)ckpt文件的保存
      • (2)加載已經保存的TF模型
      • (3)保存或加載部分變量
      • (4)在保存或者加載時給變量重命名
      • (5)示例
      • (6)統一保存
    • 2、持久化原理及數據格式
  • 五、TF最佳實踐樣例
  • 1、mnist_inference.py
  • 2、mnist_train.py
  • 3、mnist_eval.py

一、MNIST數據處理

1、數據集概述

MNIST 數據集是 NIST 數據集的一個子集,它包含了 60000 張圖片作為訓練數據, 10000 張圖片作為測試數據。在 MNIST 數據集中的每一張圖片都代表了 0~9 中的一個數字。圖片的大小都為 28×2828\times2828×28 , 且數字都會出現在圖片的正中間。

2、數據獲取

from tensorflow.examples.tutorials.mnist import input_datapath = './datasets/MNIST_DATA' mnist = input_data.read_data_sets(path, one_hot=True)print("Training data size: ", mnist.train.num_examples) print("Validating data size: ", mnist.validation.num_examples) print("Testing data size: ", mnist.test.num_examples)# minist.train.next_batch函數, # 它可以從所有的訓練數據中讀取一小部分作為一個訓練batch。 batch_size = 100 xs, ys = mnist.train.next_batch(batch_size) print("X shape: ", xs.shape) print("Y shape: ", ys.shape)

輸出結果

Training data size: 55000 Validating data size: 5000 Testing data size: 10000 X shape: (100, 784) Y shape: (100, 10)

像素矩陣中的元素的取值范圍為[0, 1],0代表白色背景,1代表黑色前景。

通過 input_data.read_data_sets 函數生成的類提供 minist.train.next_batch函數,它可以從所有的訓練數據中讀取一小部分作為一個訓練batch。

二、神經網絡模型訓練及不同模型結果對比

1、TF訓練神經網絡

在神經網絡的結構上,深度學習一方面需要使用激活函數實現神經網絡模型的去線性化,另一方面需要使用一個或多個隱藏層使得神經網絡的結構更深,以解決復雜問題。

在訓練神經網絡時,通常使用帶指數衰減的學習率設置、使用正則化來避免過度擬合,以及使用滑動平均模型來使得最終模型更加健壯。

import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_datapath = './datasets/MNIST_DATA'# MNIST 數據集相關的常數 INPUT_NODE = 784 # 28*28 OUT_NODE = 10 # 0~9# 配置神經網絡的參數 LAYER1_NODE = 500 # 一個隱藏層,節點數:500 BATCH_SIZE = 100 LEARNING_RATE_BASE = 0.8 # 基礎的學習率 LEARNING_RATE_DECAY = 0.99 # 學習率的衰減率 REGULARIZATION_RATE = 0.0001 # 描述模型復雜度的正則化項在損失函數中的系數 TRAINING_STEPS = 30000 # 訓練輪數 MOVING_AVERAGE_DECAY = 0.99 # 滑動平均衰減率# 一個輔助函數,給定神經網絡的輸入和所有參數,計算神經網絡的前向傳播結果。 # 在這里定義了一個使用 ReLU 激活函數的三層全連接神經網絡。 # 通過加入隱藏層實現了多層網絡結構,通過 ReLU 激活函數實現了去線性化。 # 在這個函數中也支持傳入用于計算參數平均值的類,這樣方便在測試時使用滑動平均模型。 def inference(input_tensor, avg_class, weights1, biases1, weights2, biases2):# 當沒有提供滑動平均類時,直接使用參數當前的取值if avg_class == None:# 計算隱藏層的前向傳播結果,這里使用了 ReLU i版活函數layer1 = tf.nn.relu(tf.matmul(input_tensor, weights1) + biases1)# 計算輸出層的前向傳播結果。# 因為在計算損失函數時會一并計算 softmax 函數,所以這里不需要加入激活函數。# 而且不加入 softmax 不會影響預測結果。# 因為預測時使用的是不同類別對應節點輸出值的相對大小,有沒有 softmax 層對最后分類結果的# 計算沒有影響。于是在計算整個神經網絡的前向傳播時可以不加入最后的 softmax 層 。return tf.matmul(layer1, weights2) + biases2else:# 首先使用 avg_class.average 函數來計算得出變量的滑動平均值,# 然后再計算相應的神經網絡前向傳播結果。layer1 = tf.nn.relu(tf.matmul(input_tensor, avg_class.average(weights1)) + avg_class.average(biases1))return tf.matmul(layer1, avg_class.average(weights2)) + avg_class.average(biases2)# 訓練模型的過程 def train(mnist):x = tf.placeholder(tf.float32, [None, INPUT_NODE], name='x-input')y_ = tf.placeholder(tf.float32, [None, OUT_NODE], name='y-input')# 生成隱藏層的參數。weights1 = 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, OUT_NODE], stddev=0.1))biases2 = tf.Variable(tf.constant(0.1, shape=[OUT_NODE]))# 計算在當前參數下神經網絡前向傳播的結果。這里給出的用于計算滑動平均的類為 None,# 所以的數不會使用參數的滑動平均值。y = inference(x, None, weights1, biases1, weights2, biases2)# 定義在儲訓練輪數的變量。這個變量不需要計算滑動平均值,所以這里指定這個變量為# 不可訓練的變量(trainable=Fasle)。在使用 TensorFlow 訓練神經網絡時,# -般會將代表訓練輪數的變量指定為不可訓練的參數。global_step = tf.Variable(0, trainable=False)# 給定消動平均哀減率和訓練輪數的變量,初始化滑動平均類。# 給定訓練輪數的變量可以加快訓練早期變量的更新速度。variable_averages = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY, global_step)# 在所有代表神經網絡參數的變量上使用滑動平均。# tf.trainable_variables 返回的就是圖上集合GraphKeys.TRAINABLE_VARIABLES 中的元索。# 也就是這個集合的元索就是所有沒有指定 trainable=False 的參數。variable_avergaes_op = variable_averages.apply(tf.trainable_variables())# 計算使用了滑動平均之后的前向傳播結果.# 滑動平均不會改變變量本身的取值,而是會維護一個影子變量來記錄其滑動平均值。# 所以當面要使用這個滑動平均值時,需要明確調用 average 函數。average_y = inference(x, variable_averages, weights1, biases1, weights2, biases2)# 計算交叉熵損失函數:spare_softmax_cross_entropy_with_logits()# 第一個參數是神經網絡不包括 softmax 層的前向傳播結果,第二個是訓練數據的正確答案。# tf.argmax() 得到正確答案對應的類別編號cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y, labels=tf.argmax(y_, 1))# 計算在當前 batch 中所有樣例的交叉熵平均值。cross_entropy_mean = tf.reduce_mean(cross_entropy)# L2 正則化損失的損失函數regularizer = tf.contrib.layers.l2_regularizer(REGULARIZATION_RATE)# 計算模型的正則化損失。一般只計算神經網絡邊上權重的正則化損失,而不使用bias。regularization = regularizer(weights1) + regularizer(weights2)# loss funtionsloss = cross_entropy_mean + regularization# 設置指數衰減的學習率 。learning_rate = tf.train.exponential_decay(LEARNING_RATE_BASE, # 基礎的學習率,隨著迭代的進行,更新變量時使用的學習率在這個基礎上遞減 。global_step, # 當前迭代的輪數 mnist.train.num_examples / BATCH_SIZE, # 過完所有的訓練數據的迭代輪數LEARNING_RATE_DECAY) # 學習率衰減速度 。# 使用 tf.train.GradientDescentOptimizer 優化算法來優化損失函數train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss, global_step = global_step)# 在訓練、神經網絡模型時,每過一遍數據既需要通過反向傳播來更新神經網絡中的參數,# 又要更新每一個參數的滑動平均值。# 為了一次完成多個操作,TF提供了tf.control_dependencies和tf.group兩種機制。# train_op = tf.group(train_step, variable_avergaes_op) # 等價with tf.control_dependencies([train_step, variable_avergaes_op]):train_op = tf.no_op(name='train') # 檢驗使用了滑動平均模型的神經網絡前向傳播結果是否正確。# tf.argmax(average_y , 1)計算每一個樣例的預測答案。# 其中 average_y 是一個 batch_size*10 的二維數組,每一行表示一個樣例的前向傳播結果。# tf.argmax 的第二個參數"1”表示選取最大值的操作僅在第一個維度中進行,# 也就是說,只在每一行選取最大值對應的下標。# 得到長度為batch一維數組,數組中的值表示每個樣例對應的數字識別結果。# tf.equal判斷兩個張量的每一維是否相等,如果相等返回 True ,否則返回 False 。correct_prediction = tf.equal(tf.argmax(average_y, 1), tf.argmax(y_, 1))# 這個運算先將布爾型的數值轉換為實數型,然后計算平均值。表示模型在這一組數據上的正確率。accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))# 初始化會話并開始訓練過程。with tf.Session() as sess:tf.global_variables_initializer().run()# 準備驗證數據。 # 一般在神經網絡的訓練過程中會通過驗證數據來大致判斷停止的條件和評判訓練的效果。validate_feed = {x: mnist.validation.images,y_:mnist.validation.labels}# 準備測試數據, 只是作為模型優劣的最后評價標準。test_feed = {x:mnist.test.images, y_:mnist.test.labels}# 迭代地訓練神經網絡。for i in range(TRAINING_STEPS):# 每 1000 輪輸出一次在驗證數據集上的測試結果if i % 1000 == 0:# 計算滑動平均模型在驗證數據上的結果。因為 MNIST 數據集比較小,所以一次# 可以處理所有的驗證數據。為了計算方便,本樣例程序沒有將驗證數據劃分為更# 小的 batch. 當神經網絡棋型比較復雜或者驗證數據比較大時,太大的 batch# 會導致計算時間過長甚至發生內存溢出的錯誤。validate_acc = sess.run(accuracy, feed_dict=validate_feed)print("After %d training step(s), validation accuracy ""using average model is %g " % (i, validate_acc))# 產生這一輪使用的一個 batch 的訓練數據,并運行訓練過程。xs, ys = mnist.train.next_batch(BATCH_SIZE)sess.run(train_op, feed_dict={x: xs, y_: ys})# 在訓練結束之后,在測試數據上檢測神經網絡模型的最終正確率。test_acc = sess.run(accuracy, feed_dict=test_feed)print("After %d training step(s), test accuracy ""using average model is %g" % (TRAINING_STEPS, test_acc))def main(argv=None):mnist = input_data.read_data_sets(path, one_hot=True)train(mnist)if __name__ == "__main__":tf.app.run()

輸出結果

WARNING:tensorflow:From /home/jie/Jie/codes/tf/mnist.py:166: read_data_sets (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version. Instructions for updating: Please use alternatives such as official/mnist/dataset.py from tensorflow/models. WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:260: maybe_download (from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version. Instructions for updating: Please write your own downloading logic. WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:262: extract_images (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version. Instructions for updating: Please use tf.data to implement this functionality. Extracting ./datasets/MNIST_DATA/train-images-idx3-ubyte.gz WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:267: extract_labels (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version. Instructions for updating: Please use tf.data to implement this functionality. Extracting ./datasets/MNIST_DATA/train-labels-idx1-ubyte.gz WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:110: dense_to_one_hot (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version. Instructions for updating: Please use tf.one_hot on tensors. Extracting ./datasets/MNIST_DATA/t10k-images-idx3-ubyte.gz Extracting ./datasets/MNIST_DATA/t10k-labels-idx1-ubyte.gz WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:290: DataSet.__init__ (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version. Instructions for updating: Please use alternatives such as official/mnist/dataset.py from tensorflow/models. 2019-03-14 11:30:04.019232: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA 2019-03-14 11:30:04.104098: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:897] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero 2019-03-14 11:30:04.105001: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1405] Found device 0 with properties: name: GeForce GTX 1060 major: 6 minor: 1 memoryClockRate(GHz): 1.6705 pciBusID: 0000:01:00.0 totalMemory: 5.94GiB freeMemory: 5.50GiB 2019-03-14 11:30:04.105016: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1484] Adding visible gpu devices: 0 2019-03-14 11:30:04.324445: I tensorflow/core/common_runtime/gpu/gpu_device.cc:965] Device interconnect StreamExecutor with strength 1 edge matrix: 2019-03-14 11:30:04.324486: I tensorflow/core/common_runtime/gpu/gpu_device.cc:971] 0 2019-03-14 11:30:04.324493: I tensorflow/core/common_runtime/gpu/gpu_device.cc:984] 0: N 2019-03-14 11:30:04.324817: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1097] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 5264 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1060, pci bus id: 0000:01:00.0, compute capability: 6.1) After 0 training step(s), validation accuracy using average model is 0.1332 After 1000 training step(s), validation accuracy using average model is 0.9774 After 2000 training step(s), validation accuracy using average model is 0.9806 After 3000 training step(s), validation accuracy using average model is 0.982 After 4000 training step(s), validation accuracy using average model is 0.983 After 5000 training step(s), validation accuracy using average model is 0.9836 After 6000 training step(s), validation accuracy using average model is 0.9834 After 7000 training step(s), validation accuracy using average model is 0.9828 After 8000 training step(s), validation accuracy using average model is 0.9832 After 9000 training step(s), validation accuracy using average model is 0.9826 After 10000 training step(s), validation accuracy using average model is 0.9824 After 11000 training step(s), validation accuracy using average model is 0.9822 After 12000 training step(s), validation accuracy using average model is 0.9842 After 13000 training step(s), validation accuracy using average model is 0.9836 After 14000 training step(s), validation accuracy using average model is 0.9842 After 15000 training step(s), validation accuracy using average model is 0.9834 After 16000 training step(s), validation accuracy using average model is 0.9838 After 17000 training step(s), validation accuracy using average model is 0.9844 After 18000 training step(s), validation accuracy using average model is 0.984 After 19000 training step(s), validation accuracy using average model is 0.9834 After 20000 training step(s), validation accuracy using average model is 0.9838 After 21000 training step(s), validation accuracy using average model is 0.9844 After 22000 training step(s), validation accuracy using average model is 0.984 After 23000 training step(s), validation accuracy using average model is 0.984 After 24000 training step(s), validation accuracy using average model is 0.9844 After 25000 training step(s), validation accuracy using average model is 0.9848 After 26000 training step(s), validation accuracy using average model is 0.9838 After 27000 training step(s), validation accuracy using average model is 0.9844 After 28000 training step(s), validation accuracy using average model is 0.984 After 29000 training step(s), validation accuracy using average model is 0.9842 After 30000 training step(s), test accuracy using average model is 0.9842

在訓練初期,模型在驗證數據集上表現越來越好,后來出現波動,說明模型已經接近極小值,迭代結束。

2、使用驗證數據判斷模型效果

所需初始的超參數:上述程序的開始,設置了初始學習率、學習率衰減率、隱藏層節點數、迭代次數、batch_size、正則項系數、滑動平均衰減數等7個不同的參數。

如何設置初始的超參數:一般情況需要實驗來調整

難點:雖然模型的最終效果是在測試數據上進行判定的,但不能直接使用測試數據,否則會過擬合,從而丟失對未知數據的判斷能力,所以要保證測試數據在訓練過程中是不可見的。

解決方法

  • 從訓練數據中抽取一部分作為驗證數據,來評判不同參數取值下模型的表現。在海量數據的情況下,一般會更多地采用驗證數據集的形式來評測模型的效果。
  • 使用“交叉驗證(cross validation)”,但是神經網絡的訓練時間本身就比較長,所以采用該方法會花費大量的時間,故一般不會選用。

不同迭代輪次下,模型在驗證數據和測試數據上的正確率。
==》每1000輪的輸出滑動平均的模型在驗證數據和測試數據上的正確率。

validate_acc = sess.run(accuracy, feed_dict=validate_feed) test_acc = sess.run(accuracy, feed_dict=test_feed)print("After %d training step(s), validation accuracy using average ""model is %g, test accuracy using average model is %g" % (i, validate_acc, test_acc))

輸出結果

After 0 training step(s), validation accuracy using average model is 0.0592, test accuracy using average model is 0.058 After 1000 training step(s), validation accuracy using average model is 0.9754, test accuracy using average model is 0.9764 After 2000 training step(s), validation accuracy using average model is 0.981, test accuracy using average model is 0.981 After 3000 training step(s), validation accuracy using average model is 0.982, test accuracy using average model is 0.9824 After 4000 training step(s), validation accuracy using average model is 0.9842, test accuracy using average model is 0.9825 After 5000 training step(s), validation accuracy using average model is 0.984, test accuracy using average model is 0.9841 After 6000 training step(s), validation accuracy using average model is 0.9852, test accuracy using average model is 0.984 .... After 25000 training step(s), validation accuracy using average model is 0.9842, test accuracy using average model is 0.9839 After 26000 training step(s), validation accuracy using average model is 0.984, test accuracy using average model is 0.983 After 27000 training step(s), validation accuracy using average model is 0.9848, test accuracy using average model is 0.9841 After 28000 training step(s), validation accuracy using average model is 0.9846, test accuracy using average model is 0.9837 After 29000 training step(s), validation accuracy using average model is 0.9846, test accuracy using average model is 0.9845

分析:
驗證數據和測試數據上的準確率趨勢基本一致,且他們的相關系數(correlation coefficient)大于0.9999。意味著可以通過模型在驗證數據上的表現來判斷一個模型的優劣。
==》前提:驗證數據分布可以很好代表測試數據分布。

3、不同模型效果比較

不同的優化方法,需要使用多層和激活函數的網絡結構。此外,可以使用指數衰減學習率、加入正則化的損失函數以及滑動平均模型。

在神經網絡結構的設計上,需要使用激活函數和多層隱藏層。在神經網絡優化時,可以使用指數衰減的學習率,加入正則化的損失函數以及滑動平均模型。

不同優化方法的影響:

  • 本質影響:神經網絡的結構
  • 滑動平均模型、指數衰減的學習率、正則化對MNIST數據集影響看起來不是很大的原因:
    • 因為滑動平均模型、指數衰減的學習率都在限制神經網絡的參數的更新速度,而該數據庫模型收斂的速度很快,所以影響不大。
    • 但是當問題更復雜時,迭代不會很快收斂,所以滑動平均模型、指數衰減的學習率可以發揮更大的作用。
    • 正則化帶來的效果更為顯著

    總結:優化方法可以對模型帶來更好的效果(模型越復雜,效果越明顯)

    三、變量管理

    當神經網絡的結構復雜、參數很多時,需要更好的方式來傳遞和管理神經網絡的參數。
    TensorFlow提供了通過變量名稱來創建或獲取一個變量的機制,不同函數可以直接通過變量的名字來使用變量,不需要通過參數的形式到處傳遞。
    ==》實現:tf.get_variable()和tf.variable_scope()

    1、tf.get_variable()

    tf.get_variable() 用于創建或獲取變量。

    通過變量名稱來獲取變量。創建變量時,基本等價于tf.Variable()

    v = tf.get_variable("v", shape=[1], initializer=tf.constant_initializer(1.0)) v = tf.Variable(tf.constant(1.0, shape=[1]), name="v")

    TensorFlow提供了7種不同的初始化函數:

    初始化函數功能主要參數
    tf.constant_initializer將變量初始化為給定常量常量的取值
    tf.random_normal_initializer將變量初始化為滿足正太分布的隨機值正太分布的均值和標準差
    tf.truncated_normal_initializer將變量初始化為滿足正太分布的隨機值,但若隨機出來的值偏離平均值超過兩個標準差,那么這個數將會被重新隨機正太分布的均值和標準差
    tf.random_uniform_initializer將變量初始化為滿足平均分布的隨機值最大,最小值
    tf.uniform_unit_scaling_initializer將變量初始化為滿足平均分布但不影響輸出數量級的隨機值factor(產生隨機值時乘以的系數)
    tf.zeros_initializer將變量設置為全為0變量維度
    tf.ones_initializer將變量設置為全為1變量維度

    tf.get_variable:

    • tf.get_variable變量名是一個必填參數,其首先會試圖去創建一個名字為v的參數,如果創建失敗(比如已經有同名的參數),那么這個程序就會報錯。這是為了避免無意識的變量復用造成的錯誤。
    • 如果需要通過tf.get_variable獲取一個已經創建的變量,需要通過tf.variable_scope函數來生成一個上下文管理器,并明確指定在這個上下文管理器中,tf.get_variable將直接獲取已經生成的變量。

    2、tf.variable_scope()管理

    下面給出一段代碼說明如何通過tf.variable_scope函數來控制tf.get_variable函數獲取已經創建過的變量。

    #在名字為foo的命名空間內創建名字為v的變量 with tf.variable_scope("foo"):v = tf.get_variable("v",[1],initializer=tf.constant_initializer(1.0))#因為在命名空間foo已經存在名字為v的變量,所有下面的代碼將會報錯: with tf.variable_scope("foo"):v = tf.get_variable("v",[1])#在生成上下文管理器時,將參數reuse設置為True。這樣tf.get_variable函數將直接獲取已經生成的變量 with tf.variable_scope("foo",reuse=True):v1 = tf.get_variable("v",[1])print v == v1    #輸出為True,代表v,v1是相同的Tensorflow中的變量#將參數reuse設置為True時,tf.variable_scope將只能獲取已經創建的變量,因為在命名空間bar中還沒有創建變量v,所以下面的代碼將會報錯: with tf.variable_scope("bar",reuse=True):v = tf.get_variable("v",[1])

    通過 tf.variable_scope 控制 tf.get_variable 的語義:

    • 如果tf.variable_scope函數使用參數 reuse=None 或者reuse=False創建上下文管理器,tf.get_variable操作將創建新的變量,如果同名的變量已經存在,則tf.get_variable函數將報錯。另外,Tensorflow中tf.variable_scope函數是可以嵌套的。
    • 如果tf.variable_scope函數使用參數 reuse=True 生成上下文管理器時,該上下文管理器中的所有 tf.get_variable 函數會直接獲取已經創建的變量,如果變量不存在,將會報錯。
    • 使用變量管理后,就不再需要將所有變量都作為參數傳遞到不同的函數中了,當神經網絡結構更加復雜,參數更多時,使用這種變量管理的方式將大大提高程序的可讀性。

    嵌套示例代碼:

    with tf.variable_scope("root"):# 獲取當前上下文管理器中 reuse 的取值。print(tf.get_variable_scope().reuse)with tf.variable_scope("foo", reuse=True):print(tf.get_variable_scope().reuse)with tf.variable_scope("bar"):print(tf.get_variable_scope().reuse)with tf.variable_scope("bar1"):print(tf.get_variable_scope().reuse)print(tf.get_variable_scope().reuse)

    輸出結果

    False True True True False

    結論:在嵌套中,若指定reuse參數為True則輸出為True;當未指定reuse參數時,這時的reuse取值與外面一層保持一致,若為最后層,則為False。

    通過 tf.variable_scope 來管理變量命名空間:

    v1 = tf.get_variable("v", 1) print(v1.name) # output: v:0 # "v"表示變量名稱; # “0”表示該變量是生成變量這個運算的第一個結果with tf.variable_scope("foo"):v2 = tf.get_variable("v", [1])print(v2.name)# output: foo/v:0with tf.variable_scope("foo"):with tf.variable_scope("bar"):v3 = tf.get_variable("v", [1])print(v3.name)# output: foo/bar/v:0# 名稱會加入命名空間的名稱v4 = tf.get_variable("v1", [1])print(v4.name)# output: foo/v1:0with tf.variable_scope("", reuse=True):v5 = tf.get_variable("foo/bar/v", [1])print(v5 == v3)# output: Truev6 = tf.get_variable("foo/v1", [1])print(v6 == v4)# output: True

    3、前向傳播的改進

    def inference(input_tensor, reuse=False):# 定義第一層神經網絡的變量和前向傳播過程。with tf.variable_scope('layer1', reuse=reuse):# 根據傳進來的reuse來判斷是創建新變量還是使用已經創建好的,# 第一次構造網絡時需要創建新的變量,# 之后每次調用該函數都直接使用reuse=True就不需要每次將變量傳進來了weights = tf.get_variable("weights", [INPUT_NODE, LAYER1_NODE], initializer=tf.truncated_normal_initializer(stddev=0.1))biases = tf.get_variable("biases", [LAYER1_NODE],initializer=tf.constant_initializer(0.0))layer1 = tf.nn.relu(tf.matmul(input_tensor, weights) + biases)# 定義第 2 層神經網絡的變量和前向傳播過程。with tf.variable_scope('layer2', reuse=reuse):weights = tf.get_variable("weights", [LAYER1_NODE, OUT_NODE],initializer=tf.truncated_normal_initializer(stddev=0.1))biases = tf.get_variable("biases", [OUT_NODE],initializer=tf.constant_initializer(0.0))layer2 = tf.matmul(layer1, weights) + biasesreturn layer2x = tf.placeholder(tf.float32, [None, INPUT_NODE], name='x-input') y = inference(x)# 在程序中如果需要使用訓練好的神經網絡進行推導時,可以直接調用inference(new_x,True) new_x = ... new_y = inference(new_x, True)

    四、TF模型持久化

    為了將訓練得到的模型保存下來方便下次使用,即結果可以復用,需要將神經網絡模型持久化。

    1、持久化代碼實現

    實現:tf.train.Saver 類

    (1)ckpt文件的保存

    import tensorflow as tf# 聲明兩個變量并計算它們的和 v1 = tf.Variable(tf.constant(1.0, shape=[1]), name="v1") v2 = tf.Variable(tf.constant(2.0, shape=[1]), name="v2") result = v1 + v2init_op = tf.global_variables_initializer() # 聲明 tf.train.Saver 類用于保存模型。 saver = tf.train.Saver()with tf.Session() as sess:sess.run(init_op)# 將模型保存到model.ckpt 文件。saver.save(sess, "./model.ckpt")

    Tensorflow模型一般會存在后綴為 .ckpt 文件中,雖然上面的程序只指定了一個文件路徑,但是在這個文件目錄下會出現三個文件,這是因為Tensorflow會將計算圖的結構和圖上的參數取值分來保存。

    • 第一個文件為model.ckpt.meta,它保存了Tensorflow計算圖的結構,
    • 第二個文件為model.ckpt,這個文件保存了Tensorflow程序中每一個變量的取值,
    • 最后一個文件為checkpoint文件,這個文件保存了一個目錄下所有的模型文件列表。

    (2)加載已經保存的TF模型

    import tensorflow as tf# load the model v1 = tf.Variable(tf.constant(1.0, shape=[1]), name="v1") v2 = tf.Variable(tf.constant(2.0, shape=[1]), name="v2") result = v1 + v2saver = tf.train.Saver()with tf.Session() as sess:saver.restore(sess, "./model.ckpt")print(sess.run(result))# 輸出:[ 3.]

    加載模型的代碼中,沒有運行變量的初始化過程,而是將變量的值通過已經保存的模型加載進來.

    如果不希望重復定義圖上的運算,也可以直接加載已經持久化的圖。

    import tensorflow as tf# 加載計算圖 saver = tf.train.import_meta_graph("./model.ckpt.meta") with tf.Session() as sess:# 加載全部變量saver.restore(sess, "./model.ckpt")# 通過張量名稱來獲取張量print(sess.run(tf.get_default_graph().get_tensor_by_name("add:0")))# 輸出:[ 3.]

    (3)保存或加載部分變量

    情景:可能有一個之前訓練好的五層神經網絡模型,但現在想嘗試一個六層的神經網絡,那么可以將前面五層神經網絡中的參數直接加載到新的模型,而僅僅將最后一層神經網絡重新訓練。

    實現:在聲明 tf.train.Saver 類時可以提供一個列表來指定需要保存或者加載的變量。比如在加載模型的代碼中使用saver=tf.train.Saver([v1])命令來構建tf.train.Saver類,那么只有變量v1會被加載進來,如果運行修改后之家在v1的代碼會得到變量未初始化的錯誤:

    tensorflow.python.framework.errors_impl.FailedPreconditionError: Attempting to use uninitialized value v2

    (4)在保存或者加載時給變量重命名

    v11 = tf.Variable(tf.constant(1.0, shape=[1]), name="other-v1") v22 = tf.Variable(tf.constant(2.0, shape=[1]), name="other-v2")# 如果直接使用tf.train.Saver類來加載模型會報變量找不到的錯誤。# 使用字典來重命名變量即可加載原來的模型 # 字典指定了原來名稱為v1的變量現在加載到變量v11中(名稱為other-v1) saver = tf.train.Saver({"v1":v11, "v2":v22})

    主要目的:方便使用變量的滑動平均值,在Tensorflow中,每一個變量的滑動平均值是通過影子變量維護的,所以要獲取變量的滑動平均值實際上就是獲取這個影子變量的取值。如果在加載模型時直接將影子變量映射到變量自身,那么在使用訓練好的模型時就不需要再調用函數來獲取變量的滑動平均值了。

    (5)示例

    一個保存滑動平均模型的樣例。

    import tensorflow as tf# 1. 使用滑動平均 vv = tf.Variable(0, dtype=tf.float32, name="v") # 在沒有申明滑動平均模型時只有一個變量 v,所以以下語句只會輸出“v:0” for variables in tf.global_variables():print(variables.name)# v:0ema = tf.train.ExponentialMovingAverage(0.99) maintain_average_op = ema.apply(tf.global_variables()) # 在申明滑動平均模型之后, TensorFlow 會自動生成一個影子變量 for variables in tf.global_variables():print(variables.name)# v:0# v/ExponentialMovingAverage:0# 2. 保存滑動平均模型 saver = tf.train.Saver() with tf.Session() as sess:init_op = tf.global_variables_initializer()sess.run(init_op)sess.run(tf.assign(vv, 10))sess.run(maintain_average_op)# 保存的時候會將v:0 v/ExponentialMovingAverage:0這兩個變量都存下來。saver.save(sess, "./model/model1.ckpt")print(sess.run([vv, ema.average(vv)])) ''' [10.0, 0.099999905] '''# 3. 加載滑動平均模型 vv1 = tf.Variable(0, dtype=tf.float32, name="v") # 通過變量命名將原來變量v的滑動平均值直接賦值給vv saver = tf.train.Saver({"v/ExponentialMovingAverage":vv1}) with tf.Session() as sess:saver.restore(sess, "./model/model1.ckpt")print(sess.run(vv1))

    在加載時重命名滑動平均變量。使用tf.train.ExponentialMovingAverage類提供的variables_to_restore函數生成tf.train.Saver類所需的變量命名字典

    import tensorflow as tfv = tf.Variable(0, dtype=tf.float32, name="v") ema = tf.train.ExponentialMovingAverage(0.99)print(ema.variables_to_restore()) # {'v/ExponentialMovingAverage': <tf.Variable 'v:0' shape=() dtype=float32_ref>}saver = tf.train.Saver(ema.variables_to_restore()) with tf.Session() as sess:saver.restore(sess, "./model/model1.ckpt")print(sess.run(v))# 0.099999905

    (6)統一保存

    將變量取值和計算圖結構統一保存:在TF提供了 convert_variables_to_constants 函數,可以將計算圖中的變量及其取值通過變量的方式保存到一個文件中。

    import tensorflow as tf from tensorflow.python.framework import graph_utilv1 = tf.Variable(tf.constant(1.0, shape=[1]), name="v1") v2 = tf.Variable(tf.constant(2.0, shape=[1]), name="v2") result = v1 + v2init_op = tf.global_variables_initializer() with tf.Session() as sess:sess.run(init_op)# 導出當前計算圖的GraphDef部分,只需此部分就可完成從輸入層到輸出層的計算過程graph_def = tf.get_default_graph().as_graph_def()# 將圖中的變量及其取值轉化為常量,同時將圖中不必要的節點去掉output_graph_def = graph_util.convert_variables_to_constants(sess, graph_def, ["add"])# 將導出的模型出入文件with tf.gfile.GFile("./model/combined_model.pb", "wb") as f:f.write(output_graph_def.SerializeToString())# load the model import tensorflow as tf from tensorflow.python.platform import gfilewith tf.Session() as sess:model_filename = "./model/combined_model.pb"# 保存的模型文件,并將文件解析成對應的GrapDef Protocol Bufferwith gfile.FastGFile(model_filename, 'rb') as f:graph_def = tf.GraphDef()graph_def.ParseFromString(f.read())# 將graph_def中保存的圖加載到當前的圖中。# return_elements=["add:0"]給出返回的張量的名稱。# 在保存的時候給出的時計算節點的名稱,所以為"add",在加載的時候給出的是張量的名稱,所以時add:0result = tf.import_graph_def(graph_def, return_elements=["add:0"])print(sess.run(result))# [array([3.], dtype=float32)]

    2、持久化原理及數據格式

    • Tensorflow是一個通過圖的形式來表達計算的編程系統,Tensorflow程序中的所有計算都會表達為計算圖上的節點。
    • Tensorflow通過元圖(MetGraph)來記錄計算圖中節點的信息以及運行計算圖中節點所需要的元數據。
    • Tensorflow中元圖是由MetaGraphDef Protocol Buffer定義的,MetaGraphDef中的內容就構成了Tensorflow持久化時的第一個文件。==》.meta文件

    元圖(MetGraph)主要記錄5類信息

    保存MetGraph信息的文件默認以.meta為后綴名,是一個二進制文件,無法直接查看,TensorFlow提供export_meta_graph函數來以json格式導出MetaGraphDef Protocol Buffer。

    import tensorflow as tf from tensorflow.python.framework import graph_utilv1 = tf.Variable(tf.constant(1.0, shape=[1]), name="v1") v2 = tf.Variable(tf.constant(2.0, shape=[1]), name="v2") result = v1 + v2saver = tf.train.Saver() saver.export_meta_graph("./model/model1.ckpt.meda.json", as_text=True)

    下面分別介紹元圖存儲的信息 :

    • meta_info_def 屬性:記錄了計算圖中的元數據(計算圖版本號、標簽等)及程序中所有用到的運算方法信息。
    • graph_def 屬性:記錄了計算圖上的節點信息,因為在meta_info_def屬性已經包含了所有運算的信息,所以graph_def只關注運算的連接結構。
    • saver_def 屬性:記錄了持久化模型時需要使用的一些參數,如保存到文件的文件名、保存操作和加載操作的名稱,以及保存頻率等。
    • collection_def 屬性:計算圖中維護集合的底層實現,該屬性是一個從集合名稱到集合內容的映射。

    五、TF最佳實踐樣例

    • 將不同的功能模塊分開:將訓練和測試分成兩個獨立的程序,這可以使得每一個組件更加靈活。比如訓練神經網絡的程序可以持續輸出訓練好的模型,而測試程序可以每隔一段實踐檢驗最新模型的正確率,如果模型效果更好,則將這個模型提供給產品使用。除了將不同的功能模塊分開;
    • 本節還將前向傳播的過程抽象成一個單獨的庫函數。因為神經網絡的前向傳播過程在訓練和測試的過程中都會用到,所以通過庫函數的方式使用起來既方便又可以保證訓練和測試過程中使用的前向傳播方法是一致的。

    1、mnist_inference.py

    定義了前向傳播的過程以及神經網絡中的參數。

    # -*- coding:utf-8 -*- import tensorflow as tf# 1. 定義神經網絡結構相關參數 INPUT_NODE = 784 # 28*28 OUTPUT_NODE = 10 LAYER1_NODE = 500# 2. 通過tf.get_variable函數來獲取變量 def get_weight_variable(shape, regularizer):weights = tf.get_variable("weights", shape, initializer=tf.truncated_normal_initializer(stddev=0.1))# 當給出正則化生成函數,將正則化損失加入lossesif regularizer != None:tf.add_to_collection('losses', regularizer(weights))return weights# 3. 定義神經網絡的前向傳播過程 def inference(input_tensor, regularizer):with tf.variable_scope('layer1'):weights = get_weight_variable([INPUT_NODE, LAYER1_NODE], regularizer)biases = get_variable("biases", [LAYER1_NODE], initializer=tf.constant_initializer(0.0))layer1 = tf.nn.relu(tf.matmul(input_tensor, weights) + biases)with tf.variable_scope('layer2'):weights = get_weight_variable([LAYER1_NODE, OUTPUT_NODE], regularizer)biases = get_variable("biases", [OUTPUT_NODE], initializer=tf.constant_initializer(0.0))layer2 = tf.matmul(layer1, weights) + biasesreturn layer2

    2、mnist_train.py

    定義了神經網絡的訓練過程。

    # -*- coding:utf-8 -*- import os import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data# 加載 mnist inference.py 中定義的常量和前向傳播的函數 import mnist_inference# 1. 定義神經網絡結構相關參數 BATCH_SIZE = 100 LEARNING_RATE_BASE = 0.8 LEARNING_RATE_DECAY = 0.99 REGULARAZTION_RATE = 0.0001 TRANING_STEPS = 30000 MOVING_AVERAGE_DECAY = 0.99MODEL_SAVE_PATH = "./model/" MODEL_NAME = "model_mnist.ckpt"# 2. 定義訓練過程 def train(mnist):# 定義輸入輸出placeholderx = tf.placeholder(tf.float32, [None, mnist_inference.INPUT_NODE], name='x-input')y_ = tf.placeholder(tf.float32, [None, mnist_inference.OUTPUT_NODE], name='y-input')regularizer = tf.contrib.layers.l2_regularizer(REGULARAZTION_RATE)y = mnist_inference.inference(x, regularizer)global_step = tf.Variable(0, trainable=False)# 定義損失函數、學習率、滑動平均操作以及訓練過程。variable_averages = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY, global_step)variable_averages_op = variable_averages.apply(tf.trainable_variables())cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y, labels=tf.argmax(y_, 1))cross_entropy_mean = tf.reduce_mean(cross_entropy)loss = cross_entropy_mean + tf.add_n(tf.get_collection('losses'))learning_rate = tf.train.exponential_decay(LEARNING_RATE_BASE, global_step, mnist.train.num_examples / BATCH_SIZE,LEARNING_RATE_DECAY)train_step = tf.train.GradientDescentOptimizer(learning_rate)\.minimize(loss, global_step=global_step)with tf.control_dependencies([train_step, variable_averages_op]):train_op = tf.no_op(name='train')# 初始化TensorFlow持久化類。saver = tf.train.Saver()with tf.Session() as sess:tf.global_variables_initializer().run()# trainfor i in range(TRANING_STEPS):xs, ys = mnist.train.next_batch(BATCH_SIZE)_, loss_value, step = sess.run([train_op, loss, global_step], feed_dict={x:xs, y_:ys})if i % 1000 == 0:print("After %d training step(s), loss on training batch is %g." % (step, loss_value))saver.save(sess, os.path.join(MODEL_SAVE_PATH, MODEL_NAME), global_step=global_step)def main(argv=None):mnist = input_data.read_data_sets("./datasets/MNIST_DATA", one_hot=True)train(mnist)if __name__ == '__main__':tf.app.run()

    輸出結果

    5216 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1060, pci bus id: 0000:01:00.0, compute capability: 6.1) After 1 training step(s), loss on training batch is 2.84809. After 1001 training step(s), loss on training batch is 0.326219. After 2001 training step(s), loss on training batch is 0.179183. After 3001 training step(s), loss on training batch is 0.131504. After 4001 training step(s), loss on training batch is 0.113809. After 5001 training step(s), loss on training batch is 0.10388. ... After 22001 training step(s), loss on training batch is 0.0408138. After 23001 training step(s), loss on training batch is 0.0397483. After 24001 training step(s), loss on training batch is 0.0349427. After 25001 training step(s), loss on training batch is 0.0382821. After 26001 training step(s), loss on training batch is 0.0368644. After 27001 training step(s), loss on training batch is 0.0366197. After 28001 training step(s), loss on training batch is 0.0426658. After 29001 training step(s), loss on training batch is 0.0358222.

    3、mnist_eval.py

    定義了測試過程。

    # -*- coding:utf-8 -*- import time import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_dataimport mnist_inference import mnist_train# 每10秒加載一次最新的模型,并在測試數據上測試最新模型的正確率。 # 加載的時間間隔。 EVAL_INTERVAL_SECS = 10def evaluate(mnist):with tf.Graph().as_default() as g:x = tf.placeholder(tf.float32, [None, mnist_inference.INPUT_NODE], name='x-input')y_ = tf.placeholder(tf.float32, [None,mnist_inference.OUTPUT_NODE], name='y-input')validate_feed = {x: mnist.validation.images, y_:mnist.validation.labels}# 測試時不關注正則化損失的值,所以設置為Noney = mnist_inference.inference(x, None)# 計算正確率,tf.argmax(y, 1)可以得到輸入樣例的預測類別了correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))# 通過變量重命名的方式來加載模型variable_averages = tf.train.ExponentialMovingAverage(mnist_train.MOVING_AVERAGE_DECAY)variable_to_restore = variable_averages.variables_to_restore()saver = tf.train.Saver(variable_to_restore)# 每隔 EVAL_INTERVAL_SECS 秒調用一次計算正確率的過程以檢測訓練過程中正確率的變化。while True:with tf.Session() as sess:# tf.train.get_checkpoint_state 函數會通過 checkpoint 文件自動找到目錄中最新模型的名字ckpt = tf.train.get_checkpoint_state(mnist_train.MODEL_SAVE_PATH)if ckpt and ckpt.model_checkpoint_path:# load the modelsaver.restore(sess, ckpt.model_checkpoint_path)# 迦過文件名得到模型保存時迭代的輪數。global_step = ckpt.model_checkpoint_path.split('/')[-1].split('-')[-1]accuracy_score = sess.run(accuracy, feed_dict=validate_feed)print("After %s training step(s), validation accuracy = %g" % (global_step, accuracy_score))else:print("No checkpoint file found")returntime.sleep(EVAL_INTERVAL_SECS)def main(argv=None):mnist = input_data.read_data_sets("./datasets/MNIST_DATA", one_hot=True)evaluate(mnist)if __name__ == '__main__':tf.app.run()

    輸出結果

    After 29001 training step(s), validation accuracy = 0.985 與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的【TensorFlow】笔记3:MNIST数字识别问题的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    精品国产欧美一区二区 | 97激情影院 | 91在线视频观看 | 激情图片久久 | 国产电影一区二区三区四区 | 96视频在线| 欧美日韩国产页 | 国产va精品免费观看 | 五月婷婷在线观看 | 久久综合视频网 | 韩日av在线 | 黄色一级片视频 | 欧美一二三区在线观看 | 国产69久久久欧美一级 | 字幕网av| 久久精品导航 | 99精品视频免费观看视频 | 亚洲国产成人精品电影在线观看 | 最近2019中文免费高清视频观看www99 | 在线观看免费版高清版 | 中文字幕一区二区三区四区视频 | 男女激情麻豆 | 成人久久毛片 | 国产精品手机播放 | 黄色影院在线免费观看 | 黄视频色网站 | 国产精品电影一区 | 丁香六月av | 亚洲一区二区三区四区在线视频 | 黄色视屏免费在线观看 | 一级国产视频 | 99久久综合精品五月天 | 毛片美女网站 | 激情综合色综合久久 | 国产一区 在线播放 | 91麻豆精品国产自产在线游戏 | 狠狠色网 | 亚洲精品国产免费 | 99成人在线视频 | 亚洲黄色成人 | 99在线看| bbbbb女女女女女bbbbb国产 | 色五丁香| 免费黄色小网站 | 久久黄色免费 | 看黄色91 | 欧美少妇18p| 欧美一区二区三区在线 | 天天草天天色 | 绯色av一区| 日韩在线中文字幕 | 五月开心激情 | h视频日本 | 国产成人av网址 | 欧美日韩免费观看一区二区三区 | 五月丁香| 国产精品日韩欧美一区二区 | 国产v在线播放 | 91| 99精品视频在线播放免费 | 精品不卡视频 | 五月婷丁香 | 久久天天躁夜夜躁狠狠躁2022 | 婷婷深爱网 | 91麻豆精品国产91久久久无限制版 | 午夜精品久久久久久久久久 | 久久只精品99品免费久23小说 | 久久精品一区 | 天天操天天是 | 日韩a级黄色 | 最近中文字幕在线中文高清版 | 婷婷爱五月天 | 日日草天天干 | 亚洲 av网站| www亚洲一区 | 久草在线一免费新视频 | 日韩成人免费在线观看 | 成年人在线| 久久久黄色免费网站 | 国产片免费在线观看视频 | 久草在线视频首页 | 97精品国产97久久久久久久久久久久 | 午夜久久 | 久久久精品久久 | 成人av免费在线观看 | 天天操天天干天天插 | 午夜精品一区二区三区在线 | 精品久久影院 | 日韩簧片在线观看 | 99久久久成人国产精品 | 一区二区视频电影在线观看 | 免费看91的网站 | 色婷婷婷 | 国产亚洲精品女人久久久久久 | 99免在线观看免费视频高清 | 在线观看av的网站 | 91视频在线观看免费 | 伊甸园av在线 | 国产91精品一区二区绿帽 | 国产精品观看在线亚洲人成网 | 亚洲精品国产精品国自 | 久久精品com | 日韩一区二区三 | 欧美视频xxx | 麻豆视频免费入口 | 开心色停停 | 国产黄色在线网站 | 人人射人人射 | 青青草国产精品 | 国产高清在线a视频大全 | 亚洲婷婷综合色高清在线 | 日本性生活一级片 | 成人黄色大片在线观看 | 99久久久成人国产精品 | 亚洲精品视频网 | 久久激情视频免费观看 | 国产成人精品电影久久久 | 午夜视频在线观看网站 | 婷婷伊人综合亚洲综合网 | 男女拍拍免费视频 | 午夜久久久久久久久久久 | 又爽又黄又无遮挡网站动态图 | 久久精品久久久久电影 | 日韩91在线 | 久久少妇免费视频 | 黄色一级性片 | 欧美国产日韩久久 | 怡红院av久久久久久久 | 成人黄色片免费看 | 综合五月 | 日韩一区二区在线免费观看 | 久久久受www免费人成 | 久久人人爽视频 | 久久五月婷婷丁香社区 | 麻豆果冻剧传媒在线播放 | 亚洲无吗天堂 | 99久久久免费视频 | 久久人人爽人人人人片 | 国产伦精品一区二区三区四区视频 | 激情丁香月 | 免费观看十分钟 | 91桃色免费视频 | 久久综合狠狠综合 | 99精品在线看 | 久草在线视频看看 | 久久免费精品国产 | 国产精品久久久久婷婷二区次 | 国产精品理论片在线播放 | 国产一区二区在线免费 | 亚洲欧美国产精品18p | 精精国产xxxx视频在线播放 | 天天做日日爱夜夜爽 | 欧美怡红院 | 亚洲国产欧美一区二区三区丁香婷 | 国产在线精品一区二区三区 | 亚洲欧美偷拍另类 | 久久免费精品一区二区三区 | 欧美在线视频一区二区三区 | 国产永久免费高清在线观看视频 | 欧美无极色 | 中文字幕在线视频网站 | 天天色欧美 | 亚洲网站在线 | 中文字幕在线观看免费 | 国产精久久久久久妇女av | www.激情五月.com | 一区二区三区免费播放 | 日韩欧美综合视频 | 婷婷午夜| 日韩免费在线观看 | 国产精品美女久久久久久免费 | 黄色av网站在线免费观看 | 欧美aⅴ在线观看 | 日韩精品中文字幕在线 | 国产成人精品久久亚洲高清不卡 | 天天综合五月天 | 又黄又爽又色无遮挡免费 | 8x成人免费视频 | 亚洲国产精品女人久久久 | 黄色美女免费网站 | 久久这里只有精品视频99 | 免费看色视频 | 中文字幕亚洲欧美日韩 | 精品国内自产拍在线观看视频 | 欧美色图p | 欧美日韩精品影院 | av一级在线| 天天综合网在线观看 | 黄色免费av | 在线观看香蕉视频 | 成人免费看片网址 | 日日夜日日干 | 在线视频成人 | 在线视频免费观看 | 亚洲精品视频国产 | 在线观看中文字幕视频 | 欧美久久成人 | 在线免费观看不卡av | 国产精品久久久久久久av大片 | 外国av网 | 在线观看播放av | 国产v视频 | 久久精品一区二区三区四区 | 成人av一二三区 | 少妇超碰在线 | 国产一区欧美日韩 | 91亚色在线观看 | 亚洲精品五月 | 国产黄色在线网站 | 最新国产在线 | 91九色精品 | 亚洲女欲精品久久久久久久18 | 日韩大片在线看 | 国产美女网站视频 | 一区精品久久 | 日本精品一区二区三区在线播放视频 | 免费在线观看日韩视频 | 蜜臀av性久久久久av蜜臀妖精 | 在线观看a视频 | 毛片一二区| 免费色av| 69中文字幕| 久久精品视频在线 | 国产精品成人免费一区久久羞羞 | 久99久在线 | 日韩av在线免费看 | 久草在线中文888 | 一区在线观看视频 | 午夜精品久久久久久久久久久久 | 国产亚洲精品日韩在线tv黄 | 男女免费视频观看 | 亚洲理论片在线观看 | 国产精品久久人 | 91高清免费在线观看 | 丁香激情综合久久伊人久久 | 久久免费试看 | 国产日韩欧美在线一区 | 超级碰碰碰碰 | 成年人免费观看在线视频 | 欧美国产高清 | 精品视频资源站 | 久久精品美女 | 国产不卡在线视频 | 中文字幕精品久久 | 九九热精品视频在线观看 | 在线观看网站av | 日韩经典一区二区三区 | 国产人成一区二区三区影院 | 国产日韩高清在线 | 狠狠狠干狠狠 | 久久久片 | 国产精品丝袜 | 九九热免费在线视频 | 国产视频二区三区 | 国产精品一区免费观看 | 国产一级一级国产 | 91精品久久久久久久99蜜桃 | 日韩中出在线 | 女人18片| 久久久久免费精品国产小说色大师 | 欧美日韩国产一区二区三区 | 99色视频在线 | 久久久久成人精品亚洲国产 | 少妇视频一区 | 日韩免费视频播放 | 国产999视频在线观看 | 四虎在线永久免费观看 | 婷婷在线五月 | 国产亚洲精品中文字幕 | 在线观看成人毛片 | 日韩视频免费观看高清 | 国产精品国产自产拍高清av | 欧美成人精品欧美一级乱黄 | 成人免费一级 | 欧美成人手机版 | 国产美女被啪进深处喷白浆视频 | 美女国产在线 | 99久热在线精品视频成人一区 | 综合色站| 日韩电影中文字幕在线 | 日韩高清成人 | 日韩一区二区三区高清在线观看 | 成人9ⅰ免费影视网站 | 在线免费观看视频 | 国产成人一级电影 | 麻豆传媒在线视频 | 91污在线 | 免费观看完整版无人区 | 中文字幕a∨在线乱码免费看 | 99精品在线视频观看 | 人人爽人人爽人人 | 九色视频网址 | 97成人在线观看视频 | 日韩在线观看中文 | 国内视频在线观看 | 91麻豆精品国产91 | 欧美电影黄色 | 国产精品美女久久久久久免费 | 亚洲色图 校园春色 | 日日夜夜网站 | av资源在线看 | 久久午夜电影院 | 99精品视频免费观看视频 | 久久综合成人 | 日韩精品免费在线视频 | 日韩av免费大片 | 久久久久久免费网 | 岛国一区在线 | 蜜桃视频在线观看一区 | 99精品视频精品精品视频 | 久久国精品 | 中文字幕高清在线播放 | 亚洲精品国产第一综合99久久 | 亚洲婷婷在线视频 | 97精产国品一二三产区在线 | 欧美一级免费片 | 亚洲视频 在线观看 | 免费看三级黄色片 | 美女av免费 | 国产一区在线视频 | 97在线观看免费 | 日韩毛片在线免费观看 | 久草久草视频 | 国产精品原创视频 | 中文字幕国内精品 | 国产色在线 | 国产一二区在线观看 | 亚洲欧美少妇 | 国产91精品一区二区麻豆网站 | 国产精品国产三级国产aⅴ无密码 | 欧美另类美少妇69xxxx | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 欧美最新另类人妖 | 亚洲精品一区二区三区在线观看 | 国产视频一区在线播放 | 永久黄网站色视频免费观看w | 中文字幕在线日亚洲9 | 中文在线字幕观看电影 | 精品国产色 | 91看片在线免费观看 | 久久免费视频网 | 手机在线永久免费观看av片 | 美女在线国产 | 国产一卡二卡四卡国 | 91看片在线看片 | 成人高清在线 | 中文在线免费视频 | 69av视频在线| 久久久久久久久久伊人 | 在线观看aaa | 2019中文字幕网站 | 免费在线观看的av网站 | 国产专区视频在线观看 | 久久久久久久久网站 | av在线专区 | 99免费观看视频 | 五月亚洲综合 | 狠狠色丁香婷婷综合最新地址 | 中日韩欧美精彩视频 | 成人一级电影在线观看 | 免费看的国产视频网站 | 色婷婷亚洲精品 | 精品国产精品久久一区免费式 | 婷婷综合五月天 | 五月天av在线 | 亚洲视频免费在线观看 | 亚洲一级黄色 | 国产xxxx | 国产精品麻豆一区二区三区 | 日韩精品免费在线观看 | 午夜黄网 | 国色综合 | 亚洲精品久久视频 | 精品久久久久久久久久岛国gif | 乱男乱女www7788 | 91精品国产99久久久久 | 成人性生交大片免费看中文网站 | 日韩系列在线观看 | 色偷偷88888欧美精品久久 | 日本精a在线观看 | 天天干夜夜操视频 | 日韩精品一区二区三区不卡 | 亚洲欧美激情精品一区二区 | 日日天天 | 亚洲国产成人高清精品 | 最近中文字幕免费观看 | 九热在线 | 国产成人亚洲精品自产在线 | 欧美激情视频一区二区三区免费 | 在线免费性生活片 | 久久精选视频 | 午夜性盈盈 | 蜜臀aⅴ国产精品久久久国产 | 亚洲精品国内 | 日韩一级黄色大片 | 不卡精品视频 | 黄色电影网站在线观看 | 亚洲精品久久激情国产片 | 最近高清中文字幕 | 日韩av看片 | 毛片视频网址 | 麻豆成人在线观看 | 久久国产精品免费看 | 超碰97公开 | 成人污视频在线观看 | 国产成人性色生活片 | 超碰国产在线观看 | 久亚洲| 亚洲精品国产拍在线 | 久久综合免费视频影院 | 免费三级av | 国产精品2018| 9999免费视频 | 久久免费国产电影 | 国产精品对白一区二区三区 | 亚洲精品久久久久久久不卡四虎 | 91丨九色丨国产在线观看 | 亚洲精品女 | 特黄色大片 | 亚洲精品小区久久久久久 | 999男人的天堂| 日韩免费专区 | 69国产盗摄一区二区三区五区 | 国产麻豆精品免费视频 | 国产精品久久精品 | 久久99国产精品视频 | 免费黄av| 色婷婷综合久久久久中文字幕1 | 欧美日韩在线播放 | free. 性欧美.com | 国产午夜在线观看视频 | 色婷婷国产在线 | 国产久视频 | 玖玖在线资源 | 黄色免费观看 | av在线网站大全 | 亚洲a色 | 人人澡人人添人人爽一区二区 | 午夜久久久久久久久久影院 | 97国产精品亚洲精品 | 麻豆91网站| 久久久国产精品成人免费 | 亚洲精品玖玖玖av在线看 | 久久不见久久见免费影院 | 五月婷婷播播 | 久久不卡免费视频 | 亚洲午夜久久久久久久久 | 黄色小说网站在线 | 久久精品成人热国产成 | 五月婷婷久 | 波多野结衣久久资源 | 丁香六月天婷婷 | 综合网色 | 久草青青在线观看 | 在线色亚洲 | 激情五月播播久久久精品 | 精品色综合 | 欧美一级裸体视频 | 精品欧美乱码久久久久久 | 国产成人久久精品亚洲 | 中文字幕资源网 国产 | 久久综合一本 | 欧美91精品久久久久国产性生爱 | 日韩黄色网络 | 久草99| 六月天综合网 | 五月激情综合婷婷 | 日韩一级片观看 | 国内精品视频一区二区三区八戒 | 尤物97国产精品久久精品国产 | 成人在线观看日韩 | 免费观看www小视频的软件 | 免费看的黄色片 | 丰满少妇在线观看网站 | 国产91精品久久久久久 | 在线亚州 | 欧美狠狠操 | 日韩天堂在线观看 | 久久天天操 | 69精品视频在线观看 | www.色的| 国产精品久久久久毛片大屁完整版 | 久久老司机精品视频 | 久久人人爽爽 | 9久久精品| 亚洲国产日韩精品 | av九九| 中文字幕免费观看视频 | 波多野结衣视频一区 | 国产成人精品一区二区三区免费 | 日韩欧美高清在线观看 | 一级精品视频在线观看宜春院 | 香蕉视频国产在线观看 | 免费网址在线播放 | 婷婷综合伊人 | 中文在线免费看视频 | 国产免费影院 | 精品视频999 | 视频在线观看入口黄最新永久免费国产 | 五月天丁香视频 | 亚洲视屏在线播放 | 天天干夜夜操视频 | 97超碰资源总站 | 日韩在线首页 | 欧美韩日精品 | 国产又黄又硬又爽 | 伊人干综合 | av亚洲产国偷v产偷v自拍小说 | 日韩av一区二区三区在线观看 | 日韩一三区 | 伊人永久 | 欧美日韩高清在线观看 | 国产精品99久久免费观看 | 男女啪啪免费网站 | 黄色av成人在线 | 五月激情天 | 婷婷六月激情 | 亚洲成av人片一区二区梦乃 | 国产盗摄精品一区二区 | 一级成人免费 | 99免费在线播放99久久免费 | 婷婷丁香自拍 | 国产98色在线 | 日韩 | 91香蕉亚洲精品 | 久久国产欧美日韩精品 | 福利视频区 | 亚洲 欧洲av | 婷婷伊人综合 | 一区二区三区在线免费观看视频 | 日韩在线精品一区 | 美女久久久久久久久久久 | 国产精品国产三级国产不产一地 | 中文亚洲欧美日韩 | 欧美天堂影院 | 国产麻豆传媒 | 日日夜夜狠狠干 | 98超碰在线观看 | 国产一区网 | 成人免费在线电影 | 久久免费的精品国产v∧ | 国产日韩亚洲 | av一级久久 | 精品免费久久久久久 | 国产精品一区二区三区久久 | 久久香蕉影视 | 免费在线观看午夜视频 | 精品免费视频. | 99tvdz@gmail.com | 2020天天干天天操 | 在线观看视频日韩 | 国产精品一区二区精品视频免费看 | 亚洲成人高清在线 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 日本久久高清视频 | 在线看小早川怜子av | 亚洲资源视频 | 玖玖视频免费在线 | 丁香五月亚洲综合在线 | 国产精品 国产精品 | 精品国产欧美一区二区 | 福利视频在线看 | 日韩电影一区二区在线 | 久草影视在线观看 | 中国成人一区 | 高清免费在线视频 | 人人澡超碰碰97碰碰碰软件 | 国产免费观看av | 中国一区二区视频 | 在线观看电影av | 亚洲乱码在线 | 91av欧美 | 99久久久成人国产精品 | 国产一级h | 二区精品视频 | 精品无人国产偷自产在线 | 欧美成人免费在线 | 色综合久久久网 | 人人玩人人添人人澡97 | 91视频一8mav| 西西www4444大胆视频 | 91av电影在线 | 91av视频在线免费观看 | 91免费日韩 | 中文字幕久久久精品 | 在线中文字幕视频 | 亚洲精品五月 | 中文字幕高清 | 狠狠色狠狠色终合网 | 三级黄色理论片 | 久久免费99精品久久久久久 | av在线网站免费观看 | aav在线 | 久久精品高清 | 久久久精品国产免费观看同学 | 国产二区视频在线观看 | 国产精品乱码一区二区视频 | 精品国产一二三 | 国产伦精品一区二区三区… | 日本黄色大片免费看 | 国产视频精品视频 | 中日韩在线视频 | 少妇高潮流白浆在线观看 | 手机av观看| 91免费的视频在线播放 | 中国一级特黄毛片大片久久 | 国产第一页在线播放 | 亚洲最大av网 | 日韩在线视频在线观看 | 91免费视频网站在线观看 | 黄色av免费看 | 爱爱一区 | 亚洲不卡123 | 亚洲日本欧美 | 国产免费资源 | 国产二区精品 | 国产精品6999成人免费视频 | 蜜臀av性久久久久av蜜臀妖精 | 国产又粗又长的视频 | 精品影院| 色人久久 | 国产区在线看 | 亚洲精品视频免费在线观看 | 国产一区二区在线观看视频 | 久久久午夜精品理论片中文字幕 | 色噜噜噜噜 | 丁香婷婷综合色啪 | 天天摸天天干天天操天天射 | 日本三级大片 | 在线a视频 | 国产一区二区三区在线免费观看 | 久久精品国产一区二区 | 麻豆精品在线 | 国产一区二区三精品久久久无广告 | 久久免费av | 久久久久久电影 | 五月综合婷| 欧美-第1页-屁屁影院 | 欧美另类重口 | 91精品福利在线 | 久久av福利 | 黄色成人小视频 | 久久电影国产免费久久电影 | 久久综合色一综合色88 | 久久精品视频在线 | 日韩免费成人av | 粉嫩av一区二区三区四区 | 一级黄色片在线 | 日韩有码在线播放 | 久久久国产精品亚洲一区 | 欧美日韩高清免费 | 在线色资源 | 国产成人a v电影 | 伊香蕉大综综综合久久啪 | 中文字幕在线视频国产 | 日韩在线中文字幕视频 | 亚洲热久久 | 日本一区二区三区视频在线播放 | 国产视频99| 中文国产在线观看 | 最新久久免费视频 | 午夜精品剧场 | 涩涩色亚洲一区 | 人人爱天天操 | 99久久99久久精品国产片果冰 | a级成人毛片 | 美女久久久久 | 精品91久久久久 | 91香蕉国产在线观看软件 | 国产夫妻av在线 | 超级碰碰碰视频 | 热久久在线视频 | 91在线蜜桃臀| 美女国产精品 | 精品自拍av| 999久久久久久久久 69av视频在线观看 | 久久综合五月婷婷 | 福利视频午夜 | 91丨九色丨国产女 | 久久欧美综合 | 成人黄色大片网站 | 黄色一级在线免费观看 | a级免费观看 | 日韩免费专区 | 午夜精品一区二区三区免费 | 日本性视频 | 成人a级免费视频 | 91成人在线免费观看 | 日本久久久久久久久久 | 免费看三级黄色片 | 日本精品久久久久 | 激情图片久久 | 国产在线看一区 | 69亚洲视频 | 五月婷婷色丁香 | 国产很黄很色的视频 | 亚洲专区一二三 | av中文字幕网 | 一级黄网 | 国产精品成人一区二区三区 | 69视频国产 | 91福利社区在线观看 | av中文字幕在线观看网站 | 正在播放国产一区二区 | 在线日韩视频 | 国产夫妻性生活自拍 | 人人草网站| 91高清免费看 | 国产精品女 | 国产福利电影网址 | www国产亚洲 | 在线草 | 国产在线观看高清视频 | 在线观看国产成人av片 | 欧美日韩国产免费视频 | 久久精品视频在线免费观看 | 久久精品9 | 97电影在线看视频 | 色综合久久久网 | 久久96国产精品久久99漫画 | 黄污污网站 | 久久综合久久久 | 精品在线观看国产 | 亚洲精品视频在线免费 | 99久久日韩精品视频免费在线观看 | 在线导航av | 又粗又长又大又爽又黄少妇毛片 | 玖玖精品在线 | 久久天天躁| 91福利视频网站 | 日韩欧美精品在线观看 | 精品国产视频在线 | 久久一视频 | av黄色免费网站 | 手机成人在线 | 99国产精品久久久久老师 | 91 中文字幕 | 精品一区在线看 | 欧美精品免费一区二区 | 亚洲精品免费看 | 亚洲情婷婷 | 中文字幕电影一区 | 亚州国产视频 | 久久99精品久久久久久清纯直播 | 日韩精品极品视频 | 高清av免费看 | 婷五月激情 | 成人黄色av免费在线观看 | 91香蕉视频污在线 | 久久综合久久综合久久综合 | 欧美一级日韩免费不卡 | 久久国产精品久久久久 | 国产高清视频在线 | 日韩大片在线观看 | 在线欧美中文字幕 | 久久综合婷婷 | 久久久久五月 | 欧美一区免费观看 | 国产中文字幕网 | 久久手机看片 | 久久久久久免费毛片精品 | 中文字幕乱偷在线 | 精品91久久久久 | 91自拍成人 | 精品视频在线视频 | 中文字幕中文字幕中文字幕 | 欧美午夜理伦三级在线观看 | 亚洲小视频在线观看 | 521色香蕉网站在线观看 | 天天爱天天操天天射 | 蜜桃视频精品 | 97超碰.com | 玖玖在线精品 | www.天天色 | 亚洲视频一 | 久久女同性恋中文字幕 | 亚洲黄色app | 最新av网址在线观看 | 天天艹天天 | 久久亚洲福利 | 成年免费在线视频 | 国产视频中文字幕在线观看 | 国产精品va | 亚洲精品视频免费观看 | 精品国产欧美一区二区三区不卡 | 国产精品不卡视频 | 三级小视频在线观看 | 久草在线资源观看 | 97精产国品一二三产区在线 | 玖玖爱免费视频 | 99精品免费久久久久久久久 | 91看国产| 97色se| 亚洲经典中文字幕 | 久久 在线 | 四虎国产精品成人免费影视 | 日韩毛片在线免费观看 | 欧美日韩视频精品 | 久久午夜精品影院一区 | 欧美色综合久久 | 国产精品久久久久久69 | 黄色一区二区在线观看 | 中文字幕在线不卡国产视频 | 欧美日韩视频在线播放 | 中文字幕中文 | 日韩久久精品 | 久久精品国产亚洲 | 日韩高清在线一区 | 国产亚洲精品综合一区91 | 又粗又长又大又爽又黄少妇毛片 | 天天超碰 | www.五月婷婷 | 欧美午夜久久 | 欧美一区二区三区免费观看 | 成人黄在线观看 | 国产精品96久久久久久吹潮 | 91色一区二区三区 | 亚洲三级精品 | 黄色一级大片在线免费看产 | 另类五月激情 | 热久久免费视频 | 天天干天天干天天 | 婷婷在线视频 | 香蕉影视app| 亚洲 综合 国产 精品 | av网址aaa| 国产日韩三级 | 欧美日韩精品在线播放 | 久草在线看片 | 手机看片99 | 久久精品观看 | 精品国产乱码久久久久久1区2匹 | 中文av在线天堂 | 一级一片免费视频 | 波多野结衣电影一区二区 | 97国产精品| 天天操夜夜做 | 91电影福利 | 99视频在线免费 | 精品视频免费播放 | 国产一区二区在线观看免费 | 操久在线 | 精品国产亚洲在线 | 亚洲精品一区二区精华 | 亚洲va欧美va人人爽 | 欧美巨乳网 | 欧美日韩国产精品一区二区亚洲 | www.啪啪.com| 91精品色 | 手机看片久久 | 91久久人澡人人添人人爽欧美 | 96久久 | 久久国产精品视频免费看 | 91精品在线观看视频 | 国产一区二区在线观看免费 | 一区二区三区在线观看免费 | 国内精品久久天天躁人人爽 | 久久a v视频 | 美女搞黄国产视频网站 | 久精品在线观看 | 亚洲欧美观看 | 超级碰碰免费视频 | 中文免费在线观看 | 中文字幕乱码日本亚洲一区二区 | 91欧美国产 | 亚洲永久字幕 | 成人av在线亚洲 | 国产午夜精品av一区二区 | www.99热精品 | 99精品久久99久久久久 | 午夜精品一区二区三区在线观看 | 97在线播放| 精品国产美女在线 | 免费网站看v片在线a | 成 人 黄 色 视频播放1 | 二区三区av| 日韩免费一级电影 | 1000部18岁以下禁看视频 | 色香蕉网| 亚洲黄网址 | 国产福利一区二区三区在线观看 | 91丨九色丨国产在线观看 | 久久不射影院 | 国产手机视频在线 | 狠狠操狠狠干天天操 | 在线欧美国产 | 99国产视频 | 天天干.com | 伊在线视频 | 国产综合在线视频 | 国产精品资源在线 | 久久一二三四 | 国产精品久99| 在线看国产一区 | 亚洲视频www | 91丨九色丨首页 | 曰韩在线| 精品亚洲va在线va天堂资源站 | 91久草视频 | 西西44人体做爰大胆视频 | 天天操天天操天天操天天操 | 久久久久久久久久福利 | 欧美性生活大片 | 免费又黄又爽 | 午夜视频福利 | 免费在线中文字幕 | 狠狠色丁香久久综合网 | 免费看精品久久片 | 香蕉在线视频播放网站 | 亚洲综合爱 | 欧美色图亚洲图片 | 久久久久久久久久网 | 国产中文字幕免费 | 国产精品久久久久久久7电影 | 四虎小视频 | 国产白浆视频 | 超碰成人免费电影 | 亚洲人成免费网站 | 日韩精品一区在线播放 | 日韩中文字幕在线 | 欧美日韩国产二区三区 | 国产精品成人一区二区 | 色偷偷97 | 国产精品一区二区久久久久 | 久久久高清 | 美女网站在线免费观看 | 国产精品剧情在线亚洲 | 欧美人zozo| 人人玩人人添人人 | 97超碰人人 | 日韩字幕在线观看 | 久久夜靖品 | 欧美日韩伦理在线 | 国产一区二区久久久久 | 午夜精品视频福利 | 日日夜夜综合 | 亚洲精品网址在线观看 | 人人插人人舔 | 黄色一级免费电影 | 久久免费国产精品1 | 国产精品系列在线 | 精产嫩模国品一二三区 | 91在线观看视频网站 | 超碰国产人人 | www.久久久久| 亚洲激情视频在线 | 国产一级一级国产 | 九九热在线观看 | 日日夜夜人人天天 | 麻豆久久久久 | 国产成人在线观看免费 | 伊人手机在线 | 亚洲少妇天堂 | www.com久久久| 波多野结衣视频网址 | 久久天天拍| 高清中文字幕 | av午夜电影 | 免费久久精品视频 | 亚洲在线免费视频 | 欧美精品久久久久久久久久白贞 | 国产精品久久久久久久久久不蜜月 | 久久免费福利视频 | 一级黄色电影网站 | 国产精品久久99综合免费观看尤物 | 国产专区精品 | 久久视频在线免费观看 | 亚洲一二三在线 | 最近中文字幕完整视频高清1 | 欧美成人在线网站 | 欧美在线观看视频一区二区三区 | 91精品国产乱码在线观看 | 久草在线| 久久精品电影院 | 爱情影院aqdy鲁丝片二区 | 日韩欧美视频在线免费观看 | 免费一级特黄录像 | 狠狠色伊人亚洲综合成人 | 999在线精品 | 高清av免费观看 | 四虎在线免费观看 | 久久99精品国产99久久6尤 | www.日本色 | av无限看 | 九九日韩 | 国产免费久久av | 精品国产成人在线影院 | 激情黄色av | 色综合天天色综合 | 91精品在线免费观看 | 激情五月婷婷综合网 | 91人人插| 伊人天堂久久 | 久久久久久久久久久网站 | 爱爱一区 | 嫩嫩影院理论片 | 成年美女黄网站色大片免费看 | 亚洲第一中文网 | 91精品久久久久久久99蜜桃 |