色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

PyTorch教程-4.4. 從頭開始實現 Softmax 回歸

jf_pJlTbmA9 ? 來源:PyTorch ? 作者:PyTorch ? 2023-06-05 15:43 ? 次閱讀

因為 softmax 回歸是如此基礎,我們相信您應該知道如何自己實現它。在這里,我們限制自己定義模型的 softmax 特定方面,并重用線性回歸部分的其他組件,包括訓練循環。

import torch
from d2l import torch as d2l

from mxnet import autograd, gluon, np, npx
from d2l import mxnet as d2l

npx.set_np()

from functools import partial
import jax
from flax import linen as nn
from jax import numpy as jnp
from d2l import jax as d2l

No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)

import tensorflow as tf
from d2l import tensorflow as d2l

4.4.1. Softmax

讓我們從最重要的部分開始:從標量到概率的映射。作為復習,請回憶一下在張量中沿特定維度的求和運算符,如第 2.3.6 節和 第 2.3.7 節中所討論的。給定一個矩陣,X我們可以對所有元素(默認情況下)或僅對同一軸上的元素求和。該axis變量讓我們計算行和列的總和:

X = torch.tensor([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
X.sum(0, keepdims=True), X.sum(1, keepdims=True)

(tensor([[5., 7., 9.]]),
 tensor([[ 6.],
     [15.]]))

X = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
X.sum(0, keepdims=True), X.sum(1, keepdims=True)

(array([[5., 7., 9.]]),
 array([[ 6.],
    [15.]]))

X = jnp.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
X.sum(0, keepdims=True), X.sum(1, keepdims=True)

(Array([[5., 7., 9.]], dtype=float32),
 Array([[ 6.],
    [15.]], dtype=float32))

X = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
tf.reduce_sum(X, 0, keepdims=True), tf.reduce_sum(X, 1, keepdims=True)

(,
 )

計算 softmax 需要三個步驟:(i)每一項取冪;(ii) 對每一行求和以計算每個示例的歸一化常數;(iii) 將每一行除以其歸一化常數,確保結果之和為 1。

(4.4.1)softmax(X)ij=exp?(Xij)∑kexp?(Xik).

分母的(對數)稱為(對數)配分函數。它是在統計物理學中引入的 ,用于對熱力學系綜中的所有可能狀態求和。實現很簡單:

def softmax(X):
  X_exp = torch.exp(X)
  partition = X_exp.sum(1, keepdims=True)
  return X_exp / partition # The broadcasting mechanism is applied here

def softmax(X):
  X_exp = np.exp(X)
  partition = X_exp.sum(1, keepdims=True)
  return X_exp / partition # The broadcasting mechanism is applied here

def softmax(X):
  X_exp = jnp.exp(X)
  partition = X_exp.sum(1, keepdims=True)
  return X_exp / partition # The broadcasting mechanism is applied here

def softmax(X):
  X_exp = tf.exp(X)
  partition = tf.reduce_sum(X_exp, 1, keepdims=True)
  return X_exp / partition # The broadcasting mechanism is applied here

對于任何輸入X,我們將每個元素變成一個非負數。每行總和為 1,這是概率所要求的。注意:上面的代碼對于非常大或非常小的參數并不穩健。雖然這足以說明正在發生的事情,但您不應 將此代碼逐字用于任何嚴肅的目的。深度學習框架內置了這樣的保護,我們將在未來使用內置的 softmax。

X = torch.rand((2, 5))
X_prob = softmax(X)
X_prob, X_prob.sum(1)

(tensor([[0.1560, 0.2128, 0.2260, 0.2372, 0.1680],
     [0.1504, 0.2473, 0.1132, 0.2779, 0.2112]]),
 tensor([1.0000, 1.0000]))

X = np.random.rand(2, 5)
X_prob = softmax(X)
X_prob, X_prob.sum(1)

(array([[0.17777154, 0.1857739 , 0.20995119, 0.23887765, 0.18762572],
    [0.24042214, 0.1757977 , 0.23786479, 0.15572716, 0.19018826]]),
 array([1., 1.]))

X = jax.random.uniform(jax.random.PRNGKey(d2l.get_seed()), (2, 5))
X_prob = softmax(X)
X_prob, X_prob.sum(1)

(Array([[0.17380024, 0.13607854, 0.29826194, 0.18967763, 0.20218161],
    [0.24212085, 0.19360834, 0.21299706, 0.17635451, 0.17491929]],   dtype=float32),
 Array([1., 1.], dtype=float32))

X = tf.random.uniform((2, 5))
X_prob = softmax(X)
X_prob, tf.reduce_sum(X_prob, 1)

(,
 )

4.4.2. 該模型

我們現在擁有了實現 softmax 回歸模型所需的一切。與我們的線性回歸示例一樣,每個實例都將由一個固定長度的向量表示。由于這里的原始數據包括28×28像素圖像,我們將每個圖像展平,將它們視為長度為 784 的向量。在后面的章節中,我們將介紹卷積神經網絡,它以更令人滿意的方式利用空間結構。

在 softmax 回歸中,我們網絡的輸出數量應該等于類的數量。由于我們的數據集有 10 個類,我們的網絡的輸出維度為 10。因此,我們的權重構成784×10矩陣加一個1×10 偏差的維行向量。與線性回歸一樣,我們W使用高斯噪聲初始化權重。偏差被初始化為零。

class SoftmaxRegressionScratch(d2l.Classifier):
  def __init__(self, num_inputs, num_outputs, lr, sigma=0.01):
    super().__init__()
    self.save_hyperparameters()
    self.W = torch.normal(0, sigma, size=(num_inputs, num_outputs),
               requires_grad=True)
    self.b = torch.zeros(num_outputs, requires_grad=True)

  def parameters(self):
    return [self.W, self.b]

class SoftmaxRegressionScratch(d2l.Classifier):
  def __init__(self, num_inputs, num_outputs, lr, sigma=0.01):
    super().__init__()
    self.save_hyperparameters()
    self.W = np.random.normal(0, sigma, (num_inputs, num_outputs))
    self.b = np.zeros(num_outputs)
    self.W.attach_grad()
    self.b.attach_grad()

  def collect_params(self):
    return [self.W, self.b]

class SoftmaxRegressionScratch(d2l.Classifier):
  num_inputs: int
  num_outputs: int
  lr: float
  sigma: float = 0.01

  def setup(self):
    self.W = self.param('W', nn.initializers.normal(self.sigma),
              (self.num_inputs, self.num_outputs))
    self.b = self.param('b', nn.initializers.zeros, self.num_outputs)

class SoftmaxRegressionScratch(d2l.Classifier):
  def __init__(self, num_inputs, num_outputs, lr, sigma=0.01):
    super().__init__()
    self.save_hyperparameters()
    self.W = tf.random.normal((num_inputs, num_outputs), 0, sigma)
    self.b = tf.zeros(num_outputs)
    self.W = tf.Variable(self.W)
    self.b = tf.Variable(self.b)

下面的代碼定義了網絡如何將每個輸入映射到輸出。請注意,我們將每個28×28reshape在將數據傳遞給我們的模型之前,將批處理中的像素圖像轉換為向量。

@d2l.add_to_class(SoftmaxRegressionScratch)
def forward(self, X):
  X = X.reshape((-1, self.W.shape[0]))
  return softmax(torch.matmul(X, self.W) + self.b)

@d2l.add_to_class(SoftmaxRegressionScratch)
def forward(self, X):
  X = X.reshape((-1, self.W.shape[0]))
  return softmax(np.dot(X, self.W) + self.b)

@d2l.add_to_class(SoftmaxRegressionScratch)
def forward(self, X):
  X = X.reshape((-1, self.W.shape[0]))
  return softmax(jnp.matmul(X, self.W) + self.b)

@d2l.add_to_class(SoftmaxRegressionScratch)
def forward(self, X):
  X = tf.reshape(X, (-1, self.W.shape[0]))
  return softmax(tf.matmul(X, self.W) + self.b)

4.4.3. 交叉熵損失

接下來我們需要實現交叉熵損失函數( 4.1.2節介紹 )。這可能是所有深度學習中最常見的損失函數。目前,深度學習的應用很容易拋出分類問題,遠遠超過那些更好地視為回歸問題的問題。

回想一下,交叉熵采用分配給真實標簽的預測概率的負對數似然。為了提高效率,我們避免使用 Python for 循環并改用索引。特別是,one-hot 編碼y允許我們選擇匹配項y^.

為了在行動中看到這一點,我們創建了樣本數據,y_hat其中包含 3 個類及其對應標簽的 2 個預測概率示例 y。正確的標簽是0和2分別(即一等和三等)。使用y中概率的指標y_hat,我們可以有效地挑選出術語。

y = torch.tensor([0, 2])
y_hat = torch.tensor([[0.1, 0.3, 0.6], [0.3, 0.2, 0.5]])
y_hat[[0, 1], y]

tensor([0.1000, 0.5000])

現在我們可以通過對所選概率的對數進行平均來實現交叉熵損失函數。

def cross_entropy(y_hat, y):
  return -torch.log(y_hat[list(range(len(y_hat))), y]).mean()

cross_entropy(y_hat, y)

tensor(1.4979)

@d2l.add_to_class(SoftmaxRegressionScratch)
def loss(self, y_hat, y):
  return cross_entropy(y_hat, y)

y = np.array([0, 2])
y_hat = np.array([[0.1, 0.3, 0.6], [0.3, 0.2, 0.5]])
y_hat[[0, 1], y]

array([0.1, 0.5])

Now we can implement the cross-entropy loss function by averaging over the logarithms of the selected probabilities.

def cross_entropy(y_hat, y):
  return -np.log(y_hat[list(range(len(y_hat))), y]).mean()

cross_entropy(y_hat, y)

array(1.4978662)

@d2l.add_to_class(SoftmaxRegressionScratch)
def loss(self, y_hat, y):
  return cross_entropy(y_hat, y)

y = jnp.array([0, 2])
y_hat = jnp.array([[0.1, 0.3, 0.6], [0.3, 0.2, 0.5]])
y_hat[[0, 1], y]

Array([0.1, 0.5], dtype=float32)

Now we can implement the cross-entropy loss function by averaging over the logarithms of the selected probabilities.

Note that to make use of jax.jit to speed up JAX implementations, and to make sure loss is a pure function, the cross_entropy function is re-defined inside the loss to avoid usage of any global variables or functions which may render the loss function impure. We refer interested readers to the JAX documentation on jax.jit and pure functions.

def cross_entropy(y_hat, y):
  return -jnp.log(y_hat[list(range(len(y_hat))), y]).mean()

cross_entropy(y_hat, y)

Array(1.4978662, dtype=float32)

@d2l.add_to_class(SoftmaxRegressionScratch)
@partial(jax.jit, static_argnums=(0))
def loss(self, params, X, y, state):
  def cross_entropy(y_hat, y):
    return -jnp.log(y_hat[list(range(len(y_hat))), y]).mean()
  y_hat = state.apply_fn({'params': params}, *X)
  # The returned empty dictionary is a placeholder for auxiliary data,
  # which will be used later (e.g., for batch norm)
  return cross_entropy(y_hat, y), {}

y_hat = tf.constant([[0.1, 0.3, 0.6], [0.3, 0.2, 0.5]])
y = tf.constant([0, 2])
tf.boolean_mask(y_hat, tf.one_hot(y, depth=y_hat.shape[-1]))


Now we can implement the cross-entropy loss function by averaging over the logarithms of the selected probabilities.

def cross_entropy(y_hat, y):
  return -tf.reduce_mean(tf.math.log(tf.boolean_mask(
    y_hat, tf.one_hot(y, depth=y_hat.shape[-1]))))

cross_entropy(y_hat, y)


@d2l.add_to_class(SoftmaxRegressionScratch)
def loss(self, y_hat, y):
  return cross_entropy(y_hat, y)

4.4.4. 訓練

我們重用第 3.4 節fit中定義的方法來訓練具有 10 個 epoch 的模型。請注意,時期數 ( )、小批量大小 ( ) 和學習率 ( ) 都是可調整的超參數。這意味著雖然這些值不是在我們的主要訓練循環中學習到的,但它們仍然會影響我們模型的性能、bot vis-a-vis 訓練和泛化性能。在實踐中,您將希望根據數據的驗證拆分來選擇這些值,然后最終在測試拆分上評估您的最終模型。如第 3.6.3 節所述max_epochsbatch_sizelr,我們將 Fashion-MNIST 的測試數據視為驗證集,從而報告此拆分的驗證損失和驗證準確性。

data = d2l.FashionMNIST(batch_size=256)
model = SoftmaxRegressionScratch(num_inputs=784, num_outputs=10, lr=0.1)
trainer = d2l.Trainer(max_epochs=10)
trainer.fit(model, data)

pYYBAGR5VgqAExsFAAGKX8leS1k713.svg

data = d2l.FashionMNIST(batch_size=256)
model = SoftmaxRegressionScratch(num_inputs=784, num_outputs=10, lr=0.1)
trainer = d2l.Trainer(max_epochs=10)
trainer.fit(model, data)

poYBAGR5Vg2ABqK6AAGLB0Eidv0636.svg

data = d2l.FashionMNIST(batch_size=256)
model = SoftmaxRegressionScratch(num_inputs=784, num_outputs=10, lr=0.1)
trainer = d2l.Trainer(max_epochs=10)
trainer.fit(model, data)

pYYBAGR5Vg-AR9EdAAGLFkwOa9I235.svg

data = d2l.FashionMNIST(batch_size=256)
model = SoftmaxRegressionScratch(num_inputs=784, num_outputs=10, lr=0.1)
trainer = d2l.Trainer(max_epochs=10)
trainer.fit(model, data)

poYBAGR5VhKAbq3pAAGK_cjKgSM338.svg

4.4.5. 預言

現在訓練已經完成,我們的模型已準備好對一些圖像進行分類。

X, y = next(iter(data.val_dataloader()))
preds = model(X).argmax(axis=1)
preds.shape

torch.Size([256])

X, y = next(iter(data.val_dataloader()))
preds = model(X).argmax(axis=1)
preds.shape

(256,)

X, y = next(iter(data.val_dataloader()))
preds = model.apply({'params': trainer.state.params}, X).argmax(axis=1)
preds.shape

(256,)

X, y = next(iter(data.val_dataloader()))
preds = tf.argmax(model(X), axis=1)
preds.shape

TensorShape([256])

我們更感興趣的是我們標記錯誤的圖像。我們通過將它們的實際標簽(文本輸出的第一行)與模型的預測(文本輸出的第二行)進行比較來可視化它們。

wrong = preds.type(y.dtype) != y
X, y, preds = X[wrong], y[wrong], preds[wrong]
labels = [a+'n'+b for a, b in zip(
  data.text_labels(y), data.text_labels(preds))]
data.visualize([X, y], labels=labels)

pYYBAGR5VhSAVqY4AAIFNGvzY-Q502.svg

wrong = preds.astype(y.dtype) != y
X, y, preds = X[wrong], y[wrong], preds[wrong]
labels = [a+'n'+b for a, b in zip(
  data.text_labels(y), data.text_labels(preds))]
data.visualize([X, y], labels=labels)

pYYBAGR5VheAX5-hAAHuRRk8q20818.svg

wrong = preds.astype(y.dtype) != y
X, y, preds = X[wrong], y[wrong], preds[wrong]
labels = [a+'n'+b for a, b in zip(
  data.text_labels(y), data.text_labels(preds))]
data.visualize([X, y], labels=labels)

poYBAGR5VhmABcT-AAIHlsNP9aI422.svg

wrong = tf.cast(preds, y.dtype) != y
X, y, preds = X[wrong], y[wrong], preds[wrong]
labels = [a+'n'+b for a, b in zip(
  data.text_labels(y), data.text_labels(preds))]
data.visualize([X, y], labels=labels)

pYYBAGR5VhuAKLrKAAIBilBL_jo766.svg

4.4.6. 概括

到目前為止,我們開始獲得解決線性回歸和分類問題的一些經驗。有了它,我們已經達到了可以說是 1960-1970 年代統計建模的最先進水平。在下一節中,我們將向您展示如何利用深度學習框架更有效地實施該模型。

4.4.7. 練習

在本節中,我們根據 softmax 運算的數學定義直接實現了 softmax 函數。如第 4.1 節所述,這會導致數值不穩定。

測試如果softmax輸入的值為100?

測試如果softmax所有輸入中最大的小于?100?

通過查看相對于參數中最大條目的值來實施修復。

實現一個cross_entropy遵循交叉熵損失函數定義的函數∑iyilog?y^i.

在上面的代碼示例中嘗試一下。

為什么你認為它運行得更慢?

你應該使用它嗎?在哪些情況下有意義?

你需要注意什么?提示:考慮對數的定義域。

返回最有可能的標簽總是一個好主意嗎?例如,你會為了醫學診斷而這樣做嗎?你會如何嘗試解決這個問題?

假設我們要使用 softmax 回歸來根據某些特征預測下一個單詞。大詞匯量可能會帶來哪些問題?

試驗上面代碼的超參數。尤其:

繪制驗證損失如何隨著學習率的變化而變化。

當您更改小批量大小時,驗證和訓練損失是否會發生變化?在看到效果之前,您需要多大或多小?

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • pytorch
    +關注

    關注

    2

    文章

    808

    瀏覽量

    13201
  • Softmax
    +關注

    關注

    0

    文章

    9

    瀏覽量

    2506
收藏 人收藏

    評論

    相關推薦

    如何使用和聲從頭開始設置HTTP服務?

    有沒有關于如何使用和聲從頭開始設置HTTP服務的最新教程/設置?(不是從演示項目開始
    發表于 04-08 09:39

    pytorch訓練出來的模型參數保存為嵌入式C語言能夠調用形式的方法

    個線性回歸的簡單深度學習例子,輸入節點為1個,隱藏層10個節點,輸出一個節點。relu用的是普通的,所以不需要參數。f = open('./w1.txt',mode = 'w+') #是創建一個txt文件。參數 'w+'的意思是如果存在該文件,則刪除內容,從頭開始書寫,如
    發表于 12-15 06:57

    能否連接JTAG調試器并從頭開始對MCU進行編程,因為MCU上沒有舊代碼?

    我正在設計一個帶有 mimxrt1062 芯片的 PCB。我要把 JTAG 引腳拿出來。我能否連接 JTAG 調試器并從頭開始對 MCU 進行編程,因為 MCU 上沒有舊代碼?有什么需要注意的嗎?
    發表于 05-12 06:20

    從頭開始構建無人機

    電子發燒友網站提供《從頭開始構建無人機.zip》資料免費下載
    發表于 11-22 10:35 ?1次下載
    <b class='flag-5'>從頭開始</b>構建無人機

    如何從頭開始制作六足機器人

    電子發燒友網站提供《如何從頭開始制作六足機器人.zip》資料免費下載
    發表于 11-23 09:53 ?2次下載
    如何<b class='flag-5'>從頭開始</b>制作六足機器人

    PyTorch教程3.1之線性回歸

    電子發燒友網站提供《PyTorch教程3.1之線性回歸.pdf》資料免費下載
    發表于 06-05 11:30 ?0次下載
    <b class='flag-5'>PyTorch</b>教程3.1之線性<b class='flag-5'>回歸</b>

    PyTorch教程3.4之從頭開始執行線性回歸

    電子發燒友網站提供《PyTorch教程3.4之從頭開始執行線性回歸.pdf》資料免費下載
    發表于 06-05 11:25 ?0次下載
    <b class='flag-5'>PyTorch</b>教程3.4之<b class='flag-5'>從頭開始</b>執行線性<b class='flag-5'>回歸</b>

    PyTorch教程3.5之線性回歸的簡潔實現

    電子發燒友網站提供《PyTorch教程3.5之線性回歸的簡潔實現.pdf》資料免費下載
    發表于 06-05 11:28 ?0次下載
    <b class='flag-5'>PyTorch</b>教程3.5之線性<b class='flag-5'>回歸</b>的簡潔<b class='flag-5'>實現</b>

    PyTorch教程4.1之Softmax回歸

    電子發燒友網站提供《PyTorch教程4.1之Softmax回歸.pdf》資料免費下載
    發表于 06-05 15:46 ?0次下載
    <b class='flag-5'>PyTorch</b>教程4.1之<b class='flag-5'>Softmax</b><b class='flag-5'>回歸</b>

    PyTorch教程4.4從頭開始實現Softmax回歸

    電子發燒友網站提供《PyTorch教程4.4從頭開始實現Softmax回歸.pdf》資料免費下
    發表于 06-05 15:37 ?0次下載
    <b class='flag-5'>PyTorch</b>教程<b class='flag-5'>4.4</b>之<b class='flag-5'>從頭開始</b><b class='flag-5'>實現</b><b class='flag-5'>Softmax</b><b class='flag-5'>回歸</b>

    PyTorch教程-3.4. 從頭開始執行線性回歸

    在 SageMaker Studio Lab 中打開筆記本 我們現在準備好通過線性回歸的全功能實現來工作。在本節中,我們將從頭開始實現整個方法,包括(i)模型;(ii) 損失函數;(
    的頭像 發表于 06-05 15:38 ?494次閱讀
    <b class='flag-5'>PyTorch</b>教程-3.4. <b class='flag-5'>從頭開始</b>執行線性<b class='flag-5'>回歸</b>

    PyTorch教程-4.1. Softmax 回歸

    在 SageMaker Studio Lab 中打開筆記本 在3.1 節中,我們介紹了線性回歸,在3.4 節中從頭開始實現 ,并在3.5 節中再次使用深度學習框架的高級 API來完成繁重的工作
    的頭像 發表于 06-05 15:38 ?624次閱讀
    <b class='flag-5'>PyTorch</b>教程-4.1. <b class='flag-5'>Softmax</b> <b class='flag-5'>回歸</b>

    為什么從頭開始為汽車應用設計IC很重要

    級和3級自動駕駛技術的好處,這些技術提供了部分到有條件的轉向,加速和制動自動化。反過來,這些技術又推動了對車內半導體內容的需求。本文將探討為什么從性能和安全角度出發,從頭開始設計汽車IC比重新利用最初設計用于其他用途的芯片更好。
    的頭像 發表于 06-12 14:25 ?644次閱讀

    在Spartan 6 FPGA上從頭開始實現全加器

    電子發燒友網站提供《在Spartan 6 FPGA上從頭開始實現全加器.zip》資料免費下載
    發表于 06-15 10:13 ?0次下載
    在Spartan 6 FPGA上<b class='flag-5'>從頭開始</b><b class='flag-5'>實現</b>全加器

    如何在PyTorch實現LeNet-5網絡

    等人提出,主要用于手寫數字識別任務(如MNIST數據集)。下面,我將詳細闡述如何在PyTorch從頭開始實現LeNet-5網絡,包括網絡架構設計、參數初始化、前向傳播、損失函數選擇、優化器配置以及訓練流程等方面。
    的頭像 發表于 07-11 10:58 ?774次閱讀
    主站蜘蛛池模板: 亚洲精品一区二区在线看片 | 成人在线视频播放| 被强J高H纯肉公交车啊| 吃春药后的女教师| 国产精品99久久久久久AV下载| 国产精品A久久久久久久久| 国产精品永久免费| 精品午夜视频| 蜜桃久久久亚洲精品成人| 人妻无码AV中文系列| 婷婷午夜影院| 亚洲色欲国产免费视频| 1000部做羞羞事禁片免费视频网站| 91桃色污无限免费看| 大香伊蕉在人线国产最新| 国产婷婷午夜无码A片| 久久青青草原精品国产软件| 欧美写真视频一区| 雪恋电影完整版免费观看| 在线观看日韩一区| qvod电影资源| 国产又黄又硬又粗| 男女床上黄色| 午夜伦理一yy4480影院| 在线免费观看成年人视频| 成品片a免人看免费| 狠狠色综合7777久夜色撩人| 免费果冻传媒2021视频| 偷尝禁果H1V1幸运的山熊| 在线观看免费亚洲| 公么我好爽再深一点| 久久99re热在线播放7| 青草在线观看视频| 亚洲无碼网站观看| xxxx69美国| 精品国产免费第一区二区| 欧洲兽交另类AVXXX| 亚洲欧美精品无码大片在线观看| 99精品视频一区在线视频免费观看| 国产精品高清m3u8在线播放| 妈妈的职业3完整版在线播放|