精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲中文字幕无码一区二区三区| 日韩码欧中文字| 91精品国产欧美一区二区18 | 亚洲午夜精品17c| 51国产成人精品午夜福中文下载 | 九九热精品视频在线观看| 色哟哟日韩精品| 亚洲国产一区二区精品视频| 国产精品久久久久久久免费看| 欧美激情 亚洲a∨综合| 日韩国产精品视频| 蜜臀视频一区二区三区| 精品孕妇一区二区三区| 丁香五精品蜜臀久久久久99网站| 2019中文字幕在线观看| 国产精品18在线| 91嫩草精品| 色婷婷综合激情| 日本女人高潮视频| 青青草视频免费在线观看| 免费av网站大全久久| 欧美精品激情在线观看| 色一情一交一乱一区二区三区| 国产一区二区三区黄网站| 岛国av一区二区| 中文字幕一区二区三区最新| 天天综合天天色| 激情另类小说区图片区视频区| 国内精品久久久久| 国产免费嫩草影院| 国产高清视频免费观看| 精品人妻aV中文字幕乱码色欲| 伊人久久大香线蕉综合热线| 中文字幕亚洲一区二区三区| 国产a级片视频| 黄页网站在线| 亚洲国产成人一区二区三区| 国严精品久久久久久亚洲影视| 中文在线字幕免费观| 亚洲精品婷婷| 日韩中文字幕网址| 人妻少妇精品视频一区二区三区| 精品网站999| 欧美最猛黑人xxxxx猛交| 成人在线观看你懂的| 在线观看美女网站大全免费| 91丨porny丨户外露出| 亚洲伊人成综合成人网| 奴色虐av一区二区三区| 国产一级一区二区| 久久久久久久久91| 国产麻豆视频在线观看| 精品视频免费| 亚洲社区在线观看| 亚洲精品乱码久久久久久不卡| 国产精一区二区| 综合久久一区| 亚洲国产高清在线观看视频| 国产精品乱码一区二区三区| 国产毛片毛片毛片毛片| 精品亚洲aⅴ乱码一区二区三区| 欧美在线性视频| 日韩精品一卡二卡| 在线不卡视频| 久久久噜噜噜久久| 久久久久成人精品无码| 欧美午夜久久| 麻豆成人在线观看| 亚洲国产成人在线播放| aaaaa黄色片| 91精品一久久香蕉国产线看观看| 在线一区二区三区四区| 妺妺窝人体色www在线小说| www视频在线观看| 亚洲午夜电影网| 青草青青在线视频| 成年女人在线看片| 午夜成人免费视频| 精品欧美一区免费观看α√| 日本黄色免费在线| 精品久久久久久久久久久| 国产一区二区三区乱码| 激情网站在线| 亚洲精品国产一区二区三区四区在线| 三年中国中文在线观看免费播放| 国产视频中文字幕在线观看| 一个色在线综合| 日韩欧美猛交xxxxx无码| 91色在线看| 亚洲高清视频在线| 国产黄页在线观看| 欧美91看片特黄aaaa| 黄色成人av网| 波多野结衣作品集| 永久免费看av| 国产在线自天天| 国产精品视频在线看| 毛片av一区二区三区| 日韩精品在线观看视频| 青青草视频播放| 国产一区二区精品福利地址| 色妞色视频一区二区三区四区| 三级在线观看免费大全| 在线观看一区| 国产精品久久97| 99在线精品视频免费观看软件| 成人app下载| 欧洲高清一区二区| 国产二区三区在线| 五月天视频一区| 色乱码一区二区三区在线| 日本精品在线播放| 亚洲精品狠狠操| 成人性视频免费看| 91久久夜色精品国产九色| 国产精品电影网站| 亚洲欧美另类日韩| 国产欧美日韩综合精品一区二区| 中国一级黄色录像| 色综合桃花网| 日韩午夜激情免费电影| 日韩一级av毛片| 国产一在线精品一区在线观看| 国产精品高清免费在线观看| 亚洲免费视频网| 中文一区在线播放| 给我免费播放片在线观看| av一区在线播放| 亚洲а∨天堂久久精品9966| 免费看日本黄色片| 一区二区动漫| 91亚洲va在线va天堂va国| 欧美日韩国产综合视频| 亚洲综合无码一区二区| 精品亚洲一区二区三区四区| 亚洲精品一区在线| 日韩中文字幕免费| 亚洲欧美偷拍视频| 丁香六月综合激情| 伊人久久大香线蕉精品| 日本精品网站| 亚洲理论在线a中文字幕| 国产午夜激情视频| 秋霞电影一区二区| 美国av一区二区三区| 国产黄色大片在线观看| 91精品婷婷国产综合久久性色| 亚洲精品午夜视频| 亚洲一区国产| 肥熟一91porny丨九色丨| 国产在线小视频| 疯狂欧美牲乱大交777| 国产精品亚洲一区二区无码| 自拍日韩欧美| 91精品久久久久久久久久| 久青草国产在线| 欧美日韩亚洲激情| 香港三日本8a三级少妇三级99| 欧美激情亚洲| 91久久爱成人| 在线中文字幕视频观看| 在线成人小视频| 日韩av毛片在线观看| 青青草国产成人av片免费| 欧美精品二区三区四区免费看视频 | 日韩欧美国产小视频| 91香蕉一区二区三区在线观看 | 黄大色黄女片18第一次| 青青草综合网| 国产成人精品视频| 久久天堂电影| 在线观看国产91| 日本欧美一区二区三区不卡视频| 日韩va亚洲va欧美va久久| 国产精品一区二区三区不卡| 2019中文字幕在线电影免费| 精品国产乱码久久久久久浪潮 | 香蕉久久一区| 久久中文字幕国产| av中文字幕观看| 亚洲自拍偷拍九九九| 无码人妻一区二区三区在线| 亚洲精品国产日韩| 国产一区二区久久久| 桃花岛成人影院| 久久精品国产精品| 五月激情六月婷婷| 欧美欧美欧美欧美首页| 国产在线视频二区| 亚洲国产成人午夜在线一区 | 中文字幕一二三四| 一区二区三区av电影| 国产精品无码永久免费不卡| 蜜桃精品视频在线| 蜜臀av色欲a片无码精品一区 | 99久久精品免费| 在线观看av网页| 亚洲精品日本| 天天在线免费视频| 欧美精选视频在线观看| 成人3d动漫一区二区三区91| 成人日韩在线观看| 久久久久中文字幕| 麻豆系列在线观看| 精品亚洲一区二区三区在线观看| 国产精品一区二区免费视频| 色成年激情久久综合| 久久久久黄色片| 国产精品乱码一区二区三区软件 | xxxx18国产| 欧美亚洲国产一区二区三区 | av片在线观看永久免费| 亚洲色图欧美制服丝袜另类第一页 | 奇米亚洲午夜久久精品| 日韩免费视频播放| 午夜激情一区| 992tv成人免费观看| 日本一区二区在线看| 日本不卡一二三区| 精品五月天堂| 99久久99| 91麻豆精品一二三区在线| 国产精品久久久久福利| 亚洲精品**中文毛片| 午夜精品一区二区三区在线视| 成人在线免费看片| 日韩在线视频观看| 国产原创av在线| 日韩美女av在线| 亚洲女同志亚洲女同女播放| 91精品婷婷国产综合久久| 亚洲无码久久久久| 欧美色区777第一页| 亚洲av无码不卡| 色狠狠综合天天综合综合| 亚洲精品视频在线观看免费视频| 亚洲丶国产丶欧美一区二区三区| 曰本女人与公拘交酡| 亚洲图片欧美激情| 国产盗摄一区二区三区在线| 中文字幕在线不卡视频| 少妇高潮在线观看| 国产精品福利在线播放| 992在线观看| 日韩理论片中文av| 欧美三级日本三级| 一区2区3区在线看| 国产真实的和子乱拍在线观看| 亚洲福中文字幕伊人影院| 久久免费黄色网址| 亚洲成人av福利| 国产精品第一页在线观看| 亚洲成在人线免费| 国产精品xxxx喷水欧美| 日韩欧美在线视频日韩欧美在线视频| xxxx.国产| 一本色道a无线码一区v| 亚洲精品国产精品乱码视色| 欧美三级韩国三级日本一级| 一本到在线视频| 欧美一级欧美三级在线观看| 亚洲男人天堂久久| 亚洲欧洲高清在线| 成年人视频在线看| 久久久国产成人精品| 日本在线视频中文有码| 78m国产成人精品视频| 电影在线观看一区二区| 91久久中文字幕| 精品成人自拍视频| 手机看片福利永久国产日韩| 91精品秘密在线观看| 日韩精品一区二区免费| 久久精品成人| 成年人三级黄色片| 成人丝袜18视频在线观看| 久久精品一区二区免费播放| 国产精品久久久久久久岛一牛影视| 亚洲综合网在线| 天天av天天翘天天综合网色鬼国产| 国内av在线播放| 日韩精品一区二区在线观看| 欧美女同网站| 久热国产精品视频| 在线观看特色大片免费视频| 成人精品一区二区三区| 六月丁香久久丫| 一本色道婷婷久久欧美| 1024日韩| 狠狠干狠狠操视频| 不卡av免费在线观看| 天美传媒免费在线观看| 精品国产乱码久久久久酒店| 伊人网免费视频| 日韩av一区二区在线| 久久77777| 欧洲中文字幕国产精品| 欧美中文高清| 日本日本精品二区免费| 激情久久久久久| 亚洲成人福利在线| 91欧美一区二区| 欧美日韩偷拍视频| 欧美日韩黄色一区二区| 性xxxxbbbb| 九九精品在线视频| 成人福利片在线| 久久伊人资源站| 在线日韩中文| 日本高清免费观看| 国产精品无码永久免费888| 成年人午夜视频| 日韩午夜av电影| av女优在线| 日韩av片永久免费网站| 久久精品国产亚洲5555| 最新视频 - x88av| 欧美a级一区二区| 国产精品无码一区二区三区免费 | 伊人成人在线观看| 亚洲欧美日韩在线一区| а√在线中文网新版地址在线| 亚洲free性xxxx护士hd| 91影院成人| 中文字幕 欧美日韩| 国产精品久久久久久久久动漫| 波多野结衣视频在线观看| 亚洲欧美精品伊人久久| 碰碰在线视频| 麻豆久久久9性大片| 亚洲一区日韩在线| 亚洲人人夜夜澡人人爽| 午夜电影网一区| 国产刺激高潮av| 久久久久久久一区二区三区| 成人精品毛片| 国产欧美久久久久| 国产99久久久国产精品潘金| 激情小说中文字幕| 精品久久久久久亚洲综合网 | 91精品国产91久久久久久密臀 | 国产日韩欧美综合在线| 少妇高潮av久久久久久| 亚洲美女激情视频| 日韩精品专区| 亚洲人成网站在线观看播放| 裸体一区二区三区| 色偷偷男人天堂| 777xxx欧美| 国产淫片在线观看| 亚洲伊人第一页| 国内精品久久久久国产盗摄免费观看完整版 | 亚洲欧美国产一本综合首页| 黄色成人免费网| 日韩久久久久久久久久久久久| 免费成人你懂的| 国产精品久久久久久久精| 精品久久久久99| 不卡福利视频| 亚洲高清乱码| 国产精品一区一区三区| 日本污视频在线观看| 亚洲免费视频在线观看| 国产91欧美| 久久男人资源站| 91免费精品国自产拍在线不卡| 日本熟女毛茸茸| 日韩性生活视频| 好吊妞国产欧美日韩免费观看网站| 国产成人无码精品久久久性色| 国产亚洲一区二区三区在线观看| 91精品国产色综合久久不8| 久操成人在线视频| 思热99re视热频这里只精品| 婷婷丁香激情网| 亚洲精品一二三| 亚洲 精品 综合 精品 自拍| 国产精品一区二区电影| 国产精品vip| 国产一二三四五区| 日韩一区二区不卡| 暖暖成人免费视频| 国产成人三级视频| 久久久久久**毛片大全| 国产免费无遮挡| 91大神在线播放精品| 国产精品久久久久无码av| 免费看毛片的网站| 欧美日韩和欧美的一区二区| 岛国在线视频网站| 中文字幕精品一区日韩| 99这里只有久久精品视频| 亚洲最新av网站| 1769国产精品| 欧美日韩hd| 日本黄色录像视频| 亚洲欧洲黄色网| youjizz欧美| 国内外成人免费在线视频| 欧美日韩国产黄|