精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

終于把 Seq2Seq 算法搞懂了!!

人工智能
編碼器是一個循環神經網絡(RNN)或其變體,如LSTM或GRU,用于接收輸入序列并將其轉換為一個固定大小的上下文向量。

Seq2Seq(Sequence-to-Sequence)模型是一種用于處理序列數據的神經網絡架構,廣泛應用于自然語言處理(NLP)任務,如機器翻譯、文本生成、對話系統等。

它通過編碼器-解碼器架構將輸入序列(如一個句子)映射到輸出序列(另一個句子或序列)。

圖片圖片

模型結構

Seq2Seq 模型由兩個主要部分組成。

編碼器(Encoder)

編碼器是一個循環神經網絡(RNN)或其變體,如LSTM或GRU,用于接收輸入序列并將其轉換為一個固定大小的上下文向量。

編碼器逐步處理輸入序列的每個時間步,通過隱藏層狀態不斷更新輸入信息的表示,直到編碼到達輸入序列的結尾。

這一過程的最后一個隱藏狀態通常被認為是整個輸入序列的摘要,傳遞給解碼器。

圖片圖片

class Encoder(nn.Module):
    def __init__(self,input_dim,embedding_dim,hidden_size,num_layers,dropout):
        super(Encoder,self).__init__()
        #note hidden size and num layers 
        self.hidden_size = hidden_size
        self.num_layers = num_layers
        #create a dropout layer
        self.dropout = nn.Dropout(dropout)
        #embedding to convert input token into dense vectors
        self.embedding = nn.Embedding(input_dim,embedding_dim)
        #bilstm layer 
        self.lstm = nn.LSTM(embedding_dim,hidden_size,num_layers=num_layers,bidirectinotallow=True,dropout=dropout)
    def forward(self,src):
        embedded = self.dropout(self.embedding(src))
        out,(hidden,cell) = self.lstm(embedded)
        return hidden,cell

解碼器(Decoder)

解碼器也是一個RNN網絡,接受編碼器輸出的上下文向量,并生成目標序列。

解碼器在每一步會生成一個輸出,并將上一步的輸出作為下一步的輸入,直到產生特定的終止符。

解碼器的初始狀態來自編碼器的最后一個隱藏狀態,因此可以理解為解碼器是基于編碼器生成的全局信息來預測輸出序列。

圖片

class Decoder(nn.Module):
    def __init__(self,output_dim,embedding_dim,hidden_size,num_layers,dropout):
        super(Decoder,self).__init__()
        self.output_dim = output_dim
        #note hidden size and num layers for seq2seq class
        self.hidden_size = hidden_size
        self.num_layers = num_layers
        self.dropout = nn.Dropout(dropout)
        #note inputs of embedding layer
        self.embedding = nn.Embedding(output_dim,embedding_dim)
        self.lstm = nn.LSTM(embedding_dim,hidden_size,num_layers=num_layers,bidirectinotallow=True,dropout=dropout)
        #we apply softmax over target vocab size
        self.fc = nn.Linear(hidden_size*2,output_dim)
    def forward(self,input_token,hidden,cell):
        #adjust dimensions of input token
        input_token = input_token.unsqueeze(0)
        emb = self.embedding(input_token)
        emb = self.dropout(emb)
        #note hidden and cell along with output
        out,(hidden,cell) = self.lstm(emb,(hidden,cell))
        out = out.squeeze(0)
        pred = self.fc(out)
        return pred,hidden,cell

工作流程

Seq2Seq 模型的基本工作流程如下

  1. 輸入處理
    將輸入序列(如源語言句子)逐步傳入編碼器的 RNN 層,編碼器的最后一層的隱藏狀態會保留輸入序列的上下文信息。
  2. 生成上下文向量
    編碼器輸出的隱藏狀態向量(通常是最后一個隱藏狀態)稱為上下文向量,它包含了輸入序列的信息。
  3. 解碼過程
    解碼器接收上下文向量作為初始狀態,然后通過自身的RNN結構逐步生成目標序列。
    每一步解碼器生成一個輸出token,并將其作為下一步的輸入,直到生成結束token。
  4. 序列生成
    解碼器生成的序列作為模型的最終輸出。

優缺點

優點

  • 通用性強
    Seq2Seq 模型可以處理可變長度的輸入和輸出序列,適用于許多任務,例如機器翻譯、文本摘要、對話生成、語音識別等。
    它的編碼器-解碼器結構使得輸入和輸出不必同長,具有高度的靈活性。
  • 適應復雜序列任務
    Seq2Seq 模型通過編碼器-解碼器的分離,能夠更好地學習序列映射關系。
    編碼器負責捕獲輸入序列的信息,而解碼器則生成符合輸出序列特征的內容。

缺點

  • 信息壓縮損失
    傳統 Seq2Seq 模型通過編碼器最后一個隱藏狀態來表示整個輸入序列信息,當輸入序列較長時,這種單一的上下文向量難以全面表示輸入內容,導致信息丟失。這會導致模型在長序列任務上表現欠佳。
  • 對長序列敏感
    在沒有注意力機制的情況下,Seq2Seq模型難以有效處理長序列,因為解碼器需要依賴于編碼器的固定向量,而這個向量可能無法完全涵蓋長序列的細節。
  • 訓練難度大
    Seq2Seq 模型在訓練時面臨梯度消失和爆炸的問題,尤其是在長序列的情況下。

案例分享

下面是一個使用 Seq2Seq 進行機器翻譯的示例代碼。

首先,我們從 HuggingFace 導入了數據集,并將其分為訓練集和測試集

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.utils.data import DataLoader,Dataset
import tqdm,datasets
from torchtext.vocab import build_vocab_from_iterator
from torch.nn.utils.rnn import pad_sequence
import spacy

dataset = datasets.load_dataset('bentrevett/multi30k')
train_data,val_data,test_data = dataset['train'],dataset['validation'],dataset['test']

加載源語言和目標語言的 spaCy 模型。

spaCy 是一個功能強大、可用于生產的 Python 高級自然語言處理庫。

與許多其他 NLP 庫不同,spaCy 專為實際使用而設計,而非研究實驗。

它擅長使用預先訓練的模型進行高效的文本處理,可完成標記化、詞性標記、命名實體識別和依賴性解析等任務。

en_nlp = spacy.load('en_core_web_sm')
de_nlp = spacy.load('de_core_news_sm')

#tokenizer
def sample_tokenizer(sample,en_nlp,de_nlp,lower,max_length,sos_token,eos_token):
    en_tokens = [token.text for token in en_nlp.tokenizer(sample["en"])][:max_length]
    de_tokens = [token.text for token in de_nlp.tokenizer(sample["de"])][:max_length]
    if lower == True:
        en_tokens = [token.lower() for token in en_tokens]
        de_tokens = [token.lower() for token in de_tokens]
    en_tokens = [sos_token] + en_tokens + [eos_token]
    de_tokens = [sos_token] + de_tokens + [eos_token]
    return {"en_tokens":en_tokens,"de_tokens":de_tokens}

fn_kwargs = {
    "en_nlp":en_nlp,
    "de_nlp":de_nlp,
    "lower":True,
    "max_length":1000,
    "sos_token":'<sos>',
    "eos_token":'<eos>'
}
train_data = train_data.map(sample_tokenizer,fn_kwargs=fn_kwargs)
val_data = val_data.map(sample_tokenizer,fn_kwargs=fn_kwargs)
test_data = test_data.map(sample_tokenizer,fn_kwargs=fn_kwargs)

min_freq = 2
specials = ['<unk>','<pad>','<sos>','<eos>']
en_vocab = build_vocab_from_iterator(train_data['en_tokens'],specials=specials,min_freq=min_freq)
de_vocab = build_vocab_from_iterator(train_data['de_tokens'],specials=specials,min_freq=min_freq)

assert en_vocab['<unk>'] == de_vocab['<unk>']
assert en_vocab['<pad>'] == de_vocab['<pad>']

unk_index = en_vocab['<unk>']
pad_index = en_vocab['<pad>']
en_vocab.set_default_index(unk_index)
de_vocab.set_default_index(unk_index)

def sample_num(sample,en_vocab,de_vocab):
    en_ids = en_vocab.lookup_indices(sample["en_tokens"])
    de_ids = de_vocab.lookup_indices(sample["de_tokens"])
    return {"en_ids":en_ids,"de_ids":de_ids}
    
fn_kwargs = {"en_vocab":en_vocab,"de_vocab":de_vocab}
train_data = train_data.map(sample_num,fn_kwargs=fn_kwargs)
val_data = val_data.map(sample_num,fn_kwargs=fn_kwargs)
test_data = test_data.map(sample_num,fn_kwargs=fn_kwargs)

train_data = train_data.with_format(type="torch",columns=['en_ids','de_ids'],output_all_columns=True)
val_data = val_data.with_format(type="torch",columns=['en_ids','de_ids'],output_all_columns=True)
test_data = test_data.with_format(type="torch",columns=['en_ids','de_ids'],output_all_columns=True)

def get_collate_fn(pad_index):
    def collate_fn(batch):
        batch_en_ids = [sample["en_ids"] for sample in batch]
        batch_de_ids = [sample["de_ids"] for sample in batch]
        batch_en_ids = pad_sequence(batch_en_ids,padding_value=pad_index)
        batch_de_ids = pad_sequence(batch_de_ids,padding_value=pad_index)
        batch = {"en_ids":batch_en_ids,"de_ids":batch_de_ids}
        return batch
    return collate_fn
def get_dataloader(dataset,batch_size,shuffle,pad_index):
    collate_fn = get_collate_fn(pad_index)
    dataloader = DataLoader(dataset=dataset,
                            batch_size=batch_size,
                            shuffle=shuffle,
                           collate_fn=collate_fn)
    return dataloader

train_loader = get_dataloader(train_data,batch_size=512,shuffle=True,pad_index=pad_index)
val_loader = get_dataloader(val_data,batch_size=512,shuffle=True,pad_index=pad_index)
test_loader = get_dataloader(test_data,batch_size=512,shuffle=True,pad_index=pad_index)

接下來構建 seq2seq 模型。

class Seq2Seq(nn.Module):
    def __init__(self,encoder,decoder,device):
        super(Seq2Seq,self).__init__()
        self.encoder = encoder
        self.decoder = decoder
        assert encoder.num_layers == decoder.num_layers
        assert encoder.hidden_size == decoder.hidden_size
    def forward(self,src,trg,teacher_forcing_ratio):
        #exctract dim for out vector
        trg_len = trg.shape[0]
        batch_size = trg.shape[1]
        vocab_size = self.decoder.output_dim
        outputs = torch.zeros(trg_len,batch_size,vocab_size).to(device)
        #get input and hidden
        input_token = trg[0,:]
        hidden,cell = self.encoder(src)
        for t in range(1,trg_len):
            out,hidden,cell = self.decoder(input_token,hidden,cell)
            outputs[t] = out
            #decide what passes as input
            top1 = out.argmax(1)
            teacher_force = np.random.randn()<teacher_forcing_ratio
            input_token = trg[t] if teacher_force else top1
        return outputs

input_dim = len(de_vocab)
output_dim = len(en_vocab)
encoder_embedding_dim = 256
decoder_embedding_dim = 256
hidden_size = 512
num_layers = 3
encoder_dropout = 0.5
decoder_dropout = 0.5
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

encoder = Encoder(
    input_dim,
    encoder_embedding_dim,
    hidden_size=hidden_size,
    num_layers=num_layers,
    dropout=encoder_dropout,
)

decoder = Decoder(
    output_dim,
    decoder_embedding_dim,
    hidden_size=hidden_size,
    num_layers=num_layers,
    dropout=decoder_dropout,
)

model = Seq2Seq(encoder, decoder, device).to(device)

模型訓練

optimizer = torch.optim.Adam(model.parameters())
criterion = nn.CrossEntropyLoss(ignore_index=pad_index)

def train_fn(
    model, data_loader, optimizer, criterion, clip, teacher_forcing_ratio, device):
    model.train()
    epoch_loss = 0
    for i, batch in enumerate(data_loader):
        src = batch["de_ids"].to(device)
        trg = batch["en_ids"].to(device)
        # src = [src length, batch size]
        # trg = [trg length, batch size]
        optimizer.zero_grad()
        output = model(src, trg, teacher_forcing_ratio)
        # output = [trg length, batch size, trg vocab size]
        output_dim = output.shape[-1]
        output = output[1:].view(-1, output_dim)
        # output = [(trg length - 1) * batch size, trg vocab size]
        trg = trg[1:].view(-1)
        # trg = [(trg length - 1) * batch size]
        loss = criterion(output, trg)
        loss.backward()
        torch.nn.utils.clip_grad_norm_(model.parameters(), clip)
        optimizer.step()
        epoch_loss += loss.item()
    return epoch_loss / len(data_loader)
    
def evaluate_fn(model, data_loader, criterion, device):
    model.eval()
    epoch_loss = 0
    with torch.no_grad():
        for i, batch in enumerate(data_loader):
            src = batch["de_ids"].to(device)
            trg = batch["en_ids"].to(device)
            # src = [src length, batch size]
            # trg = [trg length, batch size]
            output = model(src, trg, 0)  # turn off teacher forcing
            # output = [trg length, batch size, trg vocab size]
            output_dim = output.shape[-1]
            output = output[1:].view(-1, output_dim)
            # output = [(trg length - 1) * batch size, trg vocab size]
            trg = trg[1:].view(-1)
            # trg = [(trg length - 1) * batch size]
            loss = criterion(output, trg)
            epoch_loss += loss.item()
    return epoch_loss / len(data_loader)

n_epochs = 10
clip = 1.0
teacher_forcing_ratio = 1

best_valid_loss = float("inf")

for epoch in tqdm.tqdm(range(n_epochs)):
    train_loss = train_fn(
        model,
        train_loader,
        optimizer,
        criterion,
        clip,
        teacher_forcing_ratio,
        device,
    )
    valid_loss = evaluate_fn(
        model,
        val_loader,
        criterion,
        device,
    )
    if valid_loss < best_valid_loss:
        best_valid_loss = valid_loss
        torch.save(model.state_dict(), "tut1-model.pt")
    print(f"\tTrain Loss: {train_loss:7.3f} | Train PPL: {np.exp(train_loss):7.3f}")
    print(f"\tValid Loss: {valid_loss:7.3f} | Valid PPL: {np.exp(valid_loss):7.3f}")

model.load_state_dict(torch.load("tut1-model.pt"))

test_loss = evaluate_fn(model, test_loader, criterion, device)

print(f"| Test Loss: {test_loss:.3f} | Test PPL: {np.exp(test_loss):7.3f} |")

接下來,我們看一下最終的效果

def translate_sentence(
    sentence,
    model,
    en_nlp,
    de_nlp,
    en_vocab,
    de_vocab,
    lower,
    sos_token,
    eos_token,
    device,
    max_output_length=25,
):
    model.eval()
    with torch.no_grad():
        if isinstance(sentence, str):
            tokens = [token.text for token in de_nlp.tokenizer(sentence)]
        else:
            tokens = [token for token in sentence]
        if lower:
            tokens = [token.lower() for token in tokens]
        tokens = [sos_token] + tokens + [eos_token]
        ids = de_vocab.lookup_indices(tokens)
        tensor = torch.LongTensor(ids).unsqueeze(-1).to(device)
        hidden, cell = model.encoder(tensor)
        inputs = en_vocab.lookup_indices([sos_token])
        for _ in range(max_output_length):
            inputs_tensor = torch.LongTensor([inputs[-1]]).to(device)
            output, hidden, cell = model.decoder(inputs_tensor, hidden, cell)
            predicted_token = output.argmax(-1).item()
            inputs.append(predicted_token)
            if predicted_token == en_vocab[eos_token]:
                break
        tokens = en_vocab.lookup_tokens(inputs)
    return tokens

sentence ='Der Mann ist am Weisheitsspross'
sos_token='<sos>'
eos_token='<eos>'
lower=True
translation = translate_sentence(
    sentence,
    model,
    en_nlp,
    de_nlp,
    en_vocab,
    de_vocab,
    lower,
    sos_token,
    eos_token,
    device,
)
print(translation)
#['<sos>', 'the', 'woman', 'is', 'looking', 'at', 'the', 'camera', '.', '<eos>']

圖片

責任編輯:武曉燕 來源: 程序員學長
相關推薦

2024-12-03 08:16:57

2024-10-16 07:58:48

2025-07-15 10:41:44

2024-09-23 09:12:20

2024-10-17 13:05:35

神經網絡算法機器學習深度學習

2024-09-12 08:28:32

2024-10-05 23:00:35

2024-11-15 13:20:02

2024-10-28 00:38:10

2024-09-20 07:36:12

2025-02-21 08:29:07

2024-12-12 00:29:03

2024-07-17 09:32:19

2023-12-19 17:41:38

AI模型

2021-05-06 16:06:20

Google AI技術

2024-11-28 12:37:07

2023-12-18 14:05:39

Facebook評議

2024-08-01 08:41:08

2024-10-14 14:02:17

機器學習評估指標人工智能

2024-08-23 09:06:35

機器學習混淆矩陣預測
點贊
收藏

51CTO技術棧公眾號

国语精品一区| 黄色激情小视频| 毛片在线网站| 99久久精品99国产精品| 中文字幕最新精品| 美国av一区二区| 色香蕉久久蜜桃| 国产美女久久久| 青娱乐国产在线视频| 日韩电影网站| av成人免费在线观看| 国产99在线|中文| 在线免费观看麻豆| а天堂中文最新一区二区三区| 国产亚洲va综合人人澡精品| 成人黄色在线免费| 国产精品99精品| 九色成人国产蝌蚪91| 91精品在线一区二区| 国产欧美久久久久| 国产视频第一区| 视频一区视频二区在线观看| 精品国产一区二区三区在线观看| 亚洲视频 中文字幕| 三级福利片在线观看| 不卡av电影在线播放| 国产高清视频一区三区| 欧美日韩三级在线观看| 欧美激情在线免费| 欧美日韩aaaaaa| 妞干网视频在线观看| 99re在线视频| 成人动漫一区二区三区| 国产xxx69麻豆国语对白| 2014亚洲天堂| 色爱综合av| 精品视频1区2区3区| 97在线国产视频| 欧美尤物美女在线| 精品在线亚洲视频| 久久久免费在线观看| 日本美女久久久| 英国三级经典在线观看| 亚洲精品视频免费看| 欧美在线一二三区| 夜夜嗨aⅴ一区二区三区| 黄色国产精品| 久热爱精品视频线路一| a级一a一级在线观看| 亚洲精品一区av| 91久久精品国产91性色tv| 久久av综合网| а√天堂官网中文在线| 91蜜桃在线免费视频| 99久久伊人精品影院| 在线观看中文字幕2021| 久久精品国产亚洲一区二区三区| 国产精品第七十二页| 制服丝袜在线一区| 蜜桃久久久久久久| 91精品中国老女人| 性生交大片免费看女人按摩| 久久精品国产精品青草| 国产中文字幕日韩| 亚洲婷婷综合网| 亚洲精品资源| 国语自产精品视频在线看抢先版图片 | 亚洲综合大片69999| 国产男男gay体育生白袜| 国产精品久久久久久久久久妞妞| 欧美一区二区三区免费视| 欧美日韩乱国产| 老色鬼久久亚洲一区二区| 国产精品高潮在线| 国产片高清在线观看| 国产剧情一区二区三区| 国产伦精品一区| 免费在线性爱视频| 国产三级精品三级| 天天干天天色天天爽| 国精产品一区一区三区mba下载| 亚洲成av人片在www色猫咪| 日韩成人三级视频| 欧美男体视频| 欧美人xxxx| 亚洲色图欧美另类| 欧美女王vk| xvideos国产精品| 久久9999久久免费精品国产| 午夜激情一区| 日本亚洲欧洲色α| 97人妻精品一区二区三区| 成人一区二区三区在线观看| 精品综合久久| 亚洲天天影视| 婷婷成人综合网| 欧美日韩亚洲第一| 奇米一区二区| 亚洲精品xxx| 亚洲aaa视频| 激情综合自拍| 欧美在线视频a| 在线观看黄色网| 99国产精品久| 偷拍视频一区二区| 菠萝蜜视频在线观看www入口| jvid一区二区三区| 日本一区二区三级电影在线观看 | 欧美人妖巨大在线| 黄色av网址在线观看| 日韩成人一级| 欧美成年人在线观看| 波多野结衣黄色| 成人免费视频一区| 亚洲AV无码成人精品一区| 欧洲一区二区三区| 91国产丝袜在线播放| 手机看片国产精品| 欧美日韩一二三四| 欧美中文字幕在线播放| 亚洲风情第一页| 国产精品网站导航| 人妻有码中文字幕| 红杏视频成人| 久久99精品国产99久久6尤物| youjizz在线视频| 国内精品伊人久久久久影院对白| 欧美极品一区| 麻豆理论在线观看| 欧美视频在线一区| 亚洲精品国产91| 亚洲一级在线| 国产精品久久国产三级国电话系列| 午夜在线观看视频| 欧美综合天天夜夜久久| 魔女鞋交玉足榨精调教| 国产人成精品一区二区三| 91精品视频观看| 在线播放毛片| 色就色 综合激情| 久久久久亚洲av成人网人人软件| 欧美一区在线看| 亚洲综合国产精品| 日本a级在线| 欧美日韩日日摸| 战狼4完整免费观看在线播放版| 日韩精品一二三四| 免费在线观看91| 日韩成人av电影| 亚洲丝袜一区在线| 国产成人麻豆免费观看| 91麻豆成人久久精品二区三区| 欧美午夜性视频| 在线观看欧美| 久久久99久久精品女同性| 国产欧美熟妇另类久久久 | 99精品国产99久久久久久97| 久久成人国产精品入口| 精品国产精品久久一区免费式| 97国产精品人人爽人人做| 熟妇人妻av无码一区二区三区| 亚洲综合男人的天堂| 黄色手机在线视频| 久久精品久久久| 91啪国产在线| 久久视频www| 欧美丝袜第三区| 老湿机69福利| 成人黄色777网| 777奇米四色成人影色区| 久久久久久久久久码影片| 综合久久2023| 亚洲欧美日本精品| 黄色av一区二区| 18成人在线视频| 熟妇高潮一区二区| 久久一区二区三区超碰国产精品| 日本在线成人一区二区| 福利一区二区| 欧美精品久久久久久久免费观看| 四虎影视2018在线播放alocalhost| 欧美日韩午夜视频在线观看| 亚洲毛片亚洲毛片亚洲毛片| 日本不卡视频在线观看| mm131午夜| 嫩草国产精品入口| 国产精品高潮呻吟视频| 欧美aaa免费| 337p日本欧洲亚洲大胆色噜噜| 美女又爽又黄免费视频| 欧美国产精品专区| 日韩女优在线视频| 麻豆国产精品视频| 精品久久久久久无码中文野结衣| 另类春色校园亚洲| 国产女精品视频网站免费| 变态调教一区二区三区| 在线播放日韩av| 亚洲黄色小说网址| 日本道免费精品一区二区三区| 精品人妻伦九区久久aaa片| 99久久精品国产毛片| 奇米视频7777| 国产精品五区| 老司机激情视频| 日韩精品不卡一区二区| 国产精品福利视频| 一级欧美视频| 国产成人精品电影| 中文字幕中文字幕在线十八区 | 色男人天堂av| 日本欧美久久久久免费播放网| 亚洲精品偷拍视频| av中字幕久久| 欧美精品在线一区| 风间由美一区二区av101| 国产精品欧美激情| free性m.freesex欧美| 久久在线免费观看视频| 国产在线一二| 亚洲女人被黑人巨大进入| а√天堂资源在线| 欧美乱熟臀69xxxxxx| 波多野结衣小视频| 色综合网色综合| 日本一区二区欧美| 国产精品久久看| 国产美女永久免费无遮挡| 99精品视频在线播放观看| 亚洲一区和二区| 国产一区二区福利视频| 日韩欧美国产片| 99xxxx成人网| 日韩视频免费播放| 98精品久久久久久久| 涩涩日韩在线| 日韩精品免费一区二区在线观看| 免费成人看片网址| 日韩欧美天堂| 久久影院理伦片| 岳的好大精品一区二区三区| 久久国产精品亚洲va麻豆| 精品视频在线观看免费观看| 91久久久久久久久| 国产精品成人3p一区二区三区 | 久久久久久久久久福利| 黄色亚洲在线| cao在线观看| 国产日韩欧美一区在线| 成人综合视频在线| 亚洲综合激情| 成人亚洲视频在线观看| 日本不卡的三区四区五区| 久久久精品麻豆| 久久激情五月婷婷| 亚洲天堂网站在线| 国产成人精品免费网站| 大桥未久恸哭の女教师| 91在线视频观看| 无码精品一区二区三区在线播放| av午夜精品一区二区三区| 中文字幕在线免费看线人| 91蜜桃网址入口| 潮喷失禁大喷水aⅴ无码| 最新久久zyz资源站| 麻豆一区产品精品蜜桃的特点 | 波多野结衣与黑人| 亚洲精品偷拍| 簧片在线免费看| 极品少妇xxxx精品少妇| 麻豆免费在线观看视频| 9l国产精品久久久久麻豆| 久久成人激情视频| 国产精品第一页第二页第三页| 欧美日韩国产高清视频| 国产喷水吹潮视频www| 日韩精品中文字幕一区二区三区| 色婷婷av一区二区三| 亚洲天堂成人在线| 黄色在线播放网站| 国模私拍一区二区三区| 天天综合av| 国产精品久久久久久久久久久久久 | 亚洲国产aⅴ天堂久久| 国产精品视频123| 91精品国产一区二区| 天堂av中文字幕| 日韩中文字幕在线看| 国产亚av手机在线观看| 国产精品久久久亚洲| 日韩综合一区二区三区| 欧美连裤袜在线视频| 亚洲电影在线一区二区三区| 日本丰满少妇xxxx| 麻豆视频观看网址久久| 男男受被啪到高潮自述| 国产精品亚洲综合一区在线观看| 亚洲国产精品成人综合久久久| 亚洲国产精品二十页| 日本天堂网在线观看| 欧美三级欧美一级| 性xxxxbbbb| 久久av在线看| 中文另类视频| 久久精品日产第一区二区三区 | 国产成人aa在线观看网站站| 日韩精品久久久| 一区二区三区四区久久| 久久一区视频| 91精品啪在线观看国产| 欧美高清一级片在线观看| 午夜影院在线看| 欧美日韩你懂得| 成人性生交大片免费看午夜| 97免费中文视频在线观看| 国产美女亚洲精品7777| 欧美日韩一区二区三区在线视频| 93在线视频精品免费观看| 国产真实乱子伦| 丁香婷婷综合激情五月色| 我不卡一区二区| 精品福利一区二区| 亚洲精品97久久中文字幕无码| www.日韩免费| 中文字幕在线视频久| 国产精品日韩一区二区| 国一区二区在线观看| 免费国偷自产拍精品视频| 中文字幕一区免费在线观看 | 米奇777在线欧美播放| 中国免费黄色片| 中文字幕一区三区| 亚洲天堂手机在线| 日韩中文综合网| 日韩精品影院| 国产精品对白一区二区三区| 欧美国内亚洲| 精品国产aⅴ一区二区三区东京热| 中文字幕亚洲精品在线观看| 免费黄色一级大片| 国产一区二区日韩精品欧美精品| xxx欧美xxx| 欧美高清视频一区| 肉色丝袜一区二区| 91精品久久久久久久久久久久| 色婷婷av一区二区三区之一色屋| 日本一卡二卡四卡精品| 欧美一级淫片aaaaaaa视频| 国产精品qvod| 成熟丰满熟妇高潮xxxxx视频| av亚洲产国偷v产偷v自拍| 性无码专区无码| 亚洲免费影视第一页| 日本欧美日韩| 午夜精品一区二区在线观看的| 99成人在线| 国产人妻一区二区| 欧洲人成人精品| 夜级特黄日本大片_在线| 亚洲自拍中文字幕| 亚洲精品网址| 伊人久久一区二区三区| 欧美午夜美女看片| yourporn在线观看视频| 国产精品美女在线| 婷婷综合久久| 色诱av手机版| 午夜天堂影视香蕉久久| 黄色大片在线免费观看| 国产精品主播视频| 欧美在线免费| 性欧美丰满熟妇xxxx性久久久| 日本精品一区二区三区高清| 日本中文字幕电影在线免费观看| 91嫩草在线视频| 妖精视频成人观看www| 成熟人妻av无码专区| 欧美大片在线观看| f2c人成在线观看免费视频| 日韩精品无码一区二区三区| 国产一区二区三区香蕉| 中文字幕一区二区三区精品| 在线视频欧美性高潮| 最新国产一区二区| 国产96在线 | 亚洲| 亚洲国产精品av| 成人av一区二区三区在线观看| 91成人天堂久久成人| 精品一区电影| 人妻av一区二区三区| 色综合天天综合在线视频| 黄网站在线免费| 精品福利影视| 韩国三级中文字幕hd久久精品| 国产精品a成v人在线播放| 成人午夜伦理影院| 在线视频不卡国产| 奇米精品一区二区三区在线观看 | 国产夜色精品一区二区av| 国产精品无码一区二区桃花视频|