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

使用Transformer 模型進行時間序列預測的Pytorch代碼示例

人工智能
時間序列預測是一個經久不衰的主題,受自然語言處理領域的成功啟發,transformer模型也在時間序列預測有了很大的發展。本文可以作為學習使用Transformer 模型的時間序列預測的一個起點。

時間序列預測是一個經久不衰的主題,受自然語言處理領域的成功啟發,transformer模型也在時間序列預測有了很大的發展。本文可以作為學習使用Transformer 模型的時間序列預測的一個起點。

數據集 這里我們直接使用kaggle中的 Store Sales — Time Series Forecasting作為數據。這個比賽需要預測54家商店中各種產品系列未來16天的銷售情況,總共創建1782個時間序列。數據從2013年1月1日至2017年8月15日,目標是預測接下來16天的銷售情況。雖然為了簡潔起見,我們做了簡化處理,作為模型的輸入包含20列中的3,029,400條數據,。每行的關鍵列為' store_nbr '、' family '和' date '。數據分為三類變量:

1、截止到最后一次訓練數據日期(2017年8月15日)之前已知的與時間相關的變量。這些變量包括數字變量,如“銷售額”,表示某一產品系列在某家商店的銷售額;“transactions”,一家商店的交易總數;' store_sales ',該商店的總銷售額;' family_sales '表示該產品系列的總銷售額。

2、訓練截止日期(2017年8月31日)之前已知,包括“onpromotion”(產品系列中促銷產品的數量)和“dcoilwtico”等變量。這些數字列由' holiday '列補充,它表示假日或事件的存在,并被分類編碼為整數。此外,' time_idx '、' week_day '、' month_day '、' month '和' year '列提供時間上下文,也編碼為整數。雖然我們的模型是只有編碼器的,但已經添加了16天移動值“onpromotion”和“dcoilwtico”,以便在沒有解碼器的情況下包含未來的信息。

3、靜態協變量隨著時間的推移保持不變,包括諸如“store_nbr”、“family”等標識符,以及“city”、“state”、“type”和“cluster”等分類變量(詳細說明了商店的特征),所有這些變量都是整數編碼的。

我們最后生成的df名為' data_all ',結構如下:

categorical_covariates = ['time_idx','week_day','month_day','month','year','holiday']
 
 categorical_covariates_num_embeddings = []
 for col in categorical_covariates:
     data_all[col] = data_all[col].astype('category').cat.codes
     categorical_covariates_num_embeddings.append(data_all[col].nunique())
 
 categorical_static = ['store_nbr','city','state','type','cluster','family_int']
 
 categorical_static_num_embeddings = []
 for col in categorical_static:
     data_all[col] = data_all[col].astype('category').cat.codes
     categorical_static_num_embeddings.append(data_all[col].nunique())
 
 numeric_covariates = ['sales','dcoilwtico','dcoilwtico_future','onpromotion','onpromotion_future','store_sales','transactions','family_sales']
 
 target_idx = np.where(np.array(numeric_covariates)=='sales')[0][0]

在將數據轉換為適合我的PyTorch模型的張量之前,需要將其分為訓練集和驗證集。窗口大小是一個重要的超參數,表示每個訓練樣本的序列長度。此外,' num_val '表示使用的驗證折數,在此上下文中設置為2。將2013年1月1日至2017年6月28日的觀測數據指定為訓練數據集,以2017年6月29日至2017年7月14日和2017年7月15日至2017年7月30日作為驗證區間。

同時還進行了數據的縮放,完整代碼如下:

 def dataframe_to_tensor(series,numeric_covariates,categorical_covariates,categorical_static,target_idx):
 
     numeric_cov_arr = np.array(series[numeric_covariates].values.tolist())
     category_cov_arr = np.array(series[categorical_covariates].values.tolist())
     static_cov_arr = np.array(series[categorical_static].values.tolist())
 
     x_numeric = torch.tensor(numeric_cov_arr,dtype=torch.float32).transpose(2,1)
     x_numeric = torch.log(x_numeric+1e-5)
     x_category = torch.tensor(category_cov_arr,dtype=torch.long).transpose(2,1)
     x_static = torch.tensor(static_cov_arr,dtype=torch.long)
     y = torch.tensor(numeric_cov_arr[:,target_idx,:],dtype=torch.float32)
 
     return x_numeric, x_category, x_static, y
 
 
 window_size = 16
 forecast_length = 16
 num_val = 2
 
 val_max_date = '2017-08-15'
 train_max_date = str((pd.to_datetime(val_max_date) - pd.Timedelta(days=window_size*num_val+forecast_length)).date())
 
 train_final = data_all[data_all['date']<=train_max_date]
 val_final = data_all[(data_all['date']>train_max_date)&(data_all['date']<=val_max_date)]
 
 train_series = train_final.groupby(categorical_static+['family']).agg(list).reset_index()
 val_series = val_final.groupby(categorical_static+['family']).agg(list).reset_index()
 
 x_numeric_train_tensor, x_category_train_tensor, x_static_train_tensor, y_train_tensor = dataframe_to_tensor(train_series,numeric_covariates,categorical_covariates,categorical_static,target_idx)
 
 x_numeric_val_tensor, x_category_val_tensor, x_static_val_tensor, y_val_tensor = dataframe_to_tensor(val_series,numeric_covariates,categorical_covariates,categorical_static,target_idx)

數據加載器 在數據加載時,需要將每個時間序列從窗口范圍內的隨機索引開始劃分為時間塊,以確保模型暴露于不同的序列段。

為了減少偏差還引入了一個額外的超參數設置,它不是隨機打亂數據,而是根據塊的開始時間對數據集進行排序。然后數據被分成五部分——反映了我們五年的數據集——每一部分都是內部打亂的,這樣最后一批數據將包括去年的觀察結果,但還是隨機的。模型的最終梯度更新受到最近一年的影響,理論上可以改善最近時期的預測。

 def divide_shuffle(df,div_num):
     space = df.shape[0]//div_num
     division = np.arange(0,df.shape[0],space)
     return pd.concat([df.iloc[division[i]:division[i]+space,:].sample(frac=1) for i in range(len(division))])
 
 def create_time_blocks(time_length,window_size):
     start_idx = np.random.randint(0,window_size-1)
     end_idx = time_length-window_size-16-1
     time_indices = np.arange(start_idx,end_idx+1,window_size)[:-1]
     time_indices = np.append(time_indices,end_idx)
     return time_indices
 
 def data_loader(x_numeric_tensor, x_category_tensor, x_static_tensor, y_tensor, batch_size, time_shuffle):
 
     num_series = x_numeric_tensor.shape[0]
     time_length = x_numeric_tensor.shape[1]
     index_pd = pd.DataFrame({'serie_idx':range(num_series)})
     index_pd['time_idx'] = [create_time_blocks(time_length,window_size) for n in range(index_pd.shape[0])]
     if time_shuffle:
         index_pd = index_pd.explode('time_idx')
         index_pd = index_pd.sample(frac=1)
     else:
         index_pd = index_pd.explode('time_idx').sort_values('time_idx')
         index_pd = divide_shuffle(index_pd,5)
     indices = np.array(index_pd).astype(int)
 
     for batch_idx in np.arange(0,indices.shape[0],batch_size):
 
         cur_indices = indices[batch_idx:batch_idx+batch_size,:]
 
         x_numeric = torch.stack([x_numeric_tensor[n[0],n[1]:n[1]+window_size,:] for n in cur_indices])
         x_category = torch.stack([x_category_tensor[n[0],n[1]:n[1]+window_size,:] for n in cur_indices])
         x_static = torch.stack([x_static_tensor[n[0],:] for n in cur_indices])
         y = torch.stack([y_tensor[n[0],n[1]+window_size:n[1]+window_size+forecast_length] for n in cur_indices])
 
         yield x_numeric.to(device), x_category.to(device), x_static.to(device), y.to(device)
 
 def val_loader(x_numeric_tensor, x_category_tensor, x_static_tensor, y_tensor, batch_size, num_val):
 
     num_time_series = x_numeric_tensor.shape[0]
 
     for i in range(num_val):
 
       for batch_idx in np.arange(0,num_time_series,batch_size):
 
           x_numeric = x_numeric_tensor[batch_idx:batch_idx+batch_size,window_size*i:window_size*(i+1),:]
           x_category = x_category_tensor[batch_idx:batch_idx+batch_size,window_size*i:window_size*(i+1),:]
           x_static = x_static_tensor[batch_idx:batch_idx+batch_size]
           y_val = y_tensor[batch_idx:batch_idx+batch_size,window_size*(i+1):window_size*(i+1)+forecast_length]
 
           yield x_numeric.to(device), x_category.to(device), x_static.to(device), y_val.to(device)

模型

我們這里通過Pytorch來簡單的實現《Attention is All You Need》(2017)2中描述的Transformer架構。因為是時間序列預測,所以注意力機制中不需要因果關系,也就是沒有對注意塊應用進行遮蔽。

從輸入開始:分類特征通過嵌入層傳遞,以密集的形式表示它們,然后送到Transformer塊。多層感知器(MLP)接受最終編碼輸入來產生預測。嵌入維數、每個Transformer塊中的注意頭數和dropout概率是模型的主要超參數。堆疊多個Transformer塊由' num_blocks '超參數控制。

下面是單個Transformer塊的實現和整體預測模型:

 class transformer_block(nn.Module):
 
     def __init__(self,embed_size,num_heads):
         super(transformer_block, self).__init__()
 
         self.attention = nn.MultiheadAttention(embed_size, num_heads, batch_first=True)
         self.fc = nn.Sequential(nn.Linear(embed_size, 4 * embed_size),
                                  nn.LeakyReLU(),
                                  nn.Linear(4 * embed_size, embed_size))
         self.dropout = nn.Dropout(drop_prob)
         self.ln1 = nn.LayerNorm(embed_size, eps=1e-6)
         self.ln2 = nn.LayerNorm(embed_size, eps=1e-6)
 
     def forward(self, x):
 
         attn_out, _ = self.attention(x, x, x, need_weights=False)
         x = x + self.dropout(attn_out)
         x = self.ln1(x)
 
         fc_out = self.fc(x)
         x = x + self.dropout(fc_out)
         x = self.ln2(x)
 
         return x
 
 class transformer_forecaster(nn.Module):
 
     def __init__(self,embed_size,num_heads,num_blocks):
         super(transformer_forecaster, self).__init__()
 
         num_len = len(numeric_covariates)
         self.embedding_cov = nn.ModuleList([nn.Embedding(n,embed_size-num_len) for n in categorical_covariates_num_embeddings])
         self.embedding_static = nn.ModuleList([nn.Embedding(n,embed_size-num_len) for n in categorical_static_num_embeddings])
 
         self.blocks = nn.ModuleList([transformer_block(embed_size,num_heads) for n in range(num_blocks)])
 
         self.forecast_head = nn.Sequential(nn.Linear(embed_size, embed_size*2),
                                            nn.LeakyReLU(),
                                            nn.Dropout(drop_prob),
                                            nn.Linear(embed_size*2, embed_size*4),
                                            nn.LeakyReLU(),
                                            nn.Linear(embed_size*4, forecast_length),
                                            nn.ReLU())
 
     def forward(self, x_numeric, x_category, x_static):
 
         tmp_list = []
         for i,embed_layer in enumerate(self.embedding_static):
             tmp_list.append(embed_layer(x_static[:,i]))
         categroical_static_embeddings = torch.stack(tmp_list).mean(dim=0).unsqueeze(1)
 
         tmp_list = []
         for i,embed_layer in enumerate(self.embedding_cov):
             tmp_list.append(embed_layer(x_category[:,:,i]))
         categroical_covariates_embeddings = torch.stack(tmp_list).mean(dim=0)
         T = categroical_covariates_embeddings.shape[1]
 
         embed_out = (categroical_covariates_embeddings + categroical_static_embeddings.repeat(1,T,1))/2
         x = torch.concat((x_numeric,embed_out),dim=-1)
 
         for block in self.blocks:
             x = block(x)
 
         x = x.mean(dim=1)
         x = self.forecast_head(x)
 
         return x

我們修改后的transformer架構如下圖所示:

模型接受三個獨立的輸入張量:數值特征、分類特征和靜態特征。對分類和靜態特征嵌入進行平均,并與數字特征組合形成具有形狀(batch_size, window_size, embedding_size)的張量,為Transformer塊做好準備。這個復合張量還包含嵌入的時間變量,提供必要的位置信息。

Transformer塊提取順序信息,然后將結果張量沿著時間維度聚合,將其傳遞到MLP中以生成最終預測(batch_size, forecast_length)。這個比賽采用均方根對數誤差(RMSLE)作為評價指標,公式為:

鑒于預測經過對數轉換,預測低于-1的負銷售額(這會導致未定義的錯誤)需要進行處理,所以為了避免負的銷售預測和由此產生的NaN損失值,在MLP層以后增加了一層ReLU激活確保非負預測。

 class RMSLELoss(nn.Module):
 
    def __init__(self):
        super().__init__()
        self.mse = nn.MSELoss()
 
    def forward(self, pred, actual):
        return torch.sqrt(self.mse(torch.log(pred + 1), torch.log(actual + 1)))

訓練和驗證

訓練模型時需要設置幾個超參數:窗口大小、是否打亂時間、嵌入大小、頭部數量、塊數量、dropout、批大小和學習率。以下配置是有效的,但不保證是最好的:

num_epoch = 1000
 min_val_loss = 999
 
 num_blocks = 1
 embed_size = 500
 num_heads = 50
 batch_size = 128
 learning_rate = 3e-4
 time_shuffle = False
 drop_prob = 0.1
 
 model = transformer_forecaster(embed_size,num_heads,num_blocks).to(device)
 criterion = RMSLELoss()
 optimizer = torch.optim.Adam(model.parameters(),lr=learning_rate)
 scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=50, gamma=0.5)

這里使用adam優化器和學習率調度,以便在訓練期間逐步調整學習率。

for epoch in range(num_epoch):
 
    batch_loader = data_loader(x_numeric_train_tensor, x_category_train_tensor, x_static_train_tensor, y_train_tensor, batch_size, time_shuffle)
    train_loss = 0
    counter = 0
 
    model.train()
    for x_numeric, x_category, x_static, y in batch_loader:
 
        optimizer.zero_grad()
        preds = model(x_numeric, x_category, x_static)
        loss = criterion(preds, y)
        train_loss += loss.item()
        counter += 1
        loss.backward()
        optimizer.step()
 
    train_loss = train_loss/counter
    print(f'Epoch {epoch} training loss: {train_loss}')
 
    model.eval()
    val_batches = val_loader(x_numeric_val_tensor, x_category_val_tensor, x_static_val_tensor, y_val_tensor, batch_size, num_val)
    val_loss = 0
    counter = 0
    for x_numeric_val, x_category_val, x_static_val, y_val in val_batches:
        with torch.no_grad():
            preds = model(x_numeric_val,x_category_val,x_static_val)
            loss = criterion(preds,y_val).item()
        val_loss += loss
        counter += 1
    val_loss = val_loss/counter
    print(f'Epoch {epoch} validation loss: {val_loss}')
 
    if val_loss<min_val_loss:
      print('saved...')
      torch.save(model,data_folder+'best.model')
      min_val_loss = val_loss
 
    scheduler.step()

結果

訓練后,表現最好的模型的訓練損失為0.387,驗證損失為0.457。當應用于測試集時,該模型的RMSLE為0.416,比賽排名為第89位(前10%)。

更大的嵌入和更多的注意力頭似乎可以提高性能,但最好的結果是用一個單獨的Transformer 實現的,這表明在有限的數據下,簡單是優點。當放棄整體打亂而選擇局部打亂時,效果有所改善;引入輕微的時間偏差提高了預測的準確性。

責任編輯:華軒 來源: DeepHub IMBA
相關推薦

2024-07-18 13:13:58

2025-01-14 13:32:47

2023-10-20 16:14:43

2023-03-16 07:27:30

CnosDB數據庫

2021-04-07 10:02:00

XGBoostPython代碼

2023-03-27 07:34:28

XGBoostInluxDB時間序列

2024-06-17 16:02:58

2022-12-19 15:16:46

機器學習模型

2022-11-24 17:00:01

模型ARDL開發

2023-10-13 15:34:55

時間序列TimesNet

2024-11-04 15:34:01

2024-10-23 17:10:49

2023-01-30 17:10:23

DeepTime元學習

2023-03-16 18:09:00

機器學習數據集

2024-05-09 16:23:14

2024-04-26 12:29:36

2023-05-26 15:38:40

2023-01-03 10:06:08

模型計算

2022-07-15 16:14:39

深度學習時間序列理論

2023-03-30 15:12:47

點贊
收藏

51CTO技術棧公眾號

国产精品亲子乱子伦xxxx裸| 日韩精品每日更新| 亚洲国产精品久久久| 黄色www网站| 精品久久久久一区二区三区| 另类中文字幕网| 欧美精品aaa| 男人的天堂官网 | 国产精品成人v| 国产探花在线播放| 精品一二三区| 精品成人一区二区三区四区| 激情 小说 亚洲 图片: 伦| 丝袜国产在线| 中文字幕国产精品一区二区| 国产乱码精品一区二区三区卡| 久久久999久久久| 亚洲精选久久| 久久久www成人免费精品| 极品人妻一区二区三区| 精品一区二区三区中文字幕在线| 一本大道久久a久久综合| 妺妺窝人体色www看人体| www视频在线观看免费| 99视频精品免费视频| 91精品国产99久久久久久红楼| 人人草在线观看| 亚洲精品影视| 高清一区二区三区四区五区| 午夜剧场免费在线观看| 精品久久久久久久久久久下田| 亚洲国产精品电影在线观看| 黑人无套内谢中国美女| 91成人小视频| 欧美视频三区在线播放| 99色精品视频| 麻豆蜜桃在线观看| 亚洲成人免费看| 久久这里只有精品18| av大大超碰在线| 亚洲色图另类专区| 中文字幕欧美日韩一区二区三区 | 欧美老女人性视频| 少妇高潮一区二区三区喷水| 精品国产精品国产偷麻豆| 日韩av在线一区二区| 欧美熟妇精品一区二区蜜桃视频| 亚洲视频精选| 亚洲成色777777在线观看影院 | 国产视频一区在线观看| 欧美视频观看一区| 欧美xxx.com| 国产欧美日韩在线| 亚洲精品人成| 成人av福利| 亚洲一卡二卡三卡四卡五卡| 成人网站免费观看入口| 黄色影院在线看| 午夜免费久久看| 免费黄色福利视频| 欧美日韩五码| 欧美日韩成人综合在线一区二区| 亚洲综合激情视频| 精品国产亚洲一区二区三区在线| 日韩一区二区三区视频在线| 国产一级二级av| 国产成人高清精品免费5388| 亚洲精品国产综合久久| 美女被到爽高潮视频| 欧美亚洲国产精品久久| 久久精品视频在线播放| 欧美精品乱码视频一二专区| 欧美国产免费| 91精品国产高清久久久久久久久| 国产成人无码一区二区在线播放| 免费成人在线观看| 7777精品久久久大香线蕉小说| 丰满肉嫩西川结衣av| 成a人片国产精品| 欧美日韩在线一区二区三区| 91福利在线视频| 一区av在线播放| 青青视频在线播放| 国产a亚洲精品| 欧美va亚洲va在线观看蝴蝶网| xxxx黄色片| 国产精品探花在线观看| 九九精品视频在线观看| 五月婷婷视频在线| 国产一区在线不卡| 蜜桃成人免费视频| 国产三区在线观看| 黑人巨大精品欧美一区免费视频| 第四色婷婷基地| 成人av影音| 日韩一区二区三区在线播放| 久久精品视频日本| 老司机午夜精品99久久| 国产伦精品一区二区三区免费视频| 国产精品麻豆一区二区三区| 亚洲一区二区三区中文字幕在线| 激情综合网俺也去| 国产无遮挡裸体免费久久| 中文字幕精品一区久久久久| 日本少妇做爰全过程毛片| 捆绑调教美女网站视频一区| 精品伦精品一区二区三区视频 | 亚洲欧洲中文日韩久久av乱码| 国产午夜福利100集发布| 四虎成人精品一区二区免费网站| 亚洲精品成a人在线观看| 三级黄色录像视频| 免费在线欧美黄色| 国产精品二区二区三区| 欧美激情办公室videoshd| 欧美性极品xxxx做受| 亚洲成人福利视频| 亚洲精品极品少妇16p| 国产精品久久电影观看| 五月婷婷六月色| 一区二区三区在线免费视频| 亚洲欧美国产日韩综合| 亚洲成在人线免费观看| 欧美高清videos高潮hd| 国产精品久久影视| 欧美国产精品劲爆| 欧在线一二三四区| 竹菊久久久久久久| 26uuu亚洲伊人春色| 少妇高潮一区二区三区69| 亚洲欧美韩国综合色| 亚洲欧美日韩精品一区| 日本在线电影一区二区三区| 日本欧美一二三区| 免费一级在线观看| 91黄色免费观看| a毛片毛片av永久免费| 一本久道久久综合狠狠爱| 国产区欧美区日韩区| 男男gaygays亚洲| 日韩欧美在线综合网| 午夜免费激情视频| 国产精品99久久不卡二区| 欧美美女黄色网| 国产欧美日韩电影| 久久成人人人人精品欧| 国产精品一级视频| 一区二区日韩av| 男人的天堂免费| 欧美视频一区| 精品1区2区| 欧美电影免费观看网站| 亚洲网在线观看| 在线观看xxxx| 亚洲人亚洲人成电影网站色| 粉色视频免费看| 性欧美69xoxoxoxo| 2019国产精品视频| 波多野结衣在线高清| 亚洲精品美女视频| 国产性生活视频| 中文字幕精品一区二区精品绿巨人 | 精品小视频在线观看| 成人av资源网站| 日韩欧美国产免费| av伊人久久| 亚洲在线免费视频| 17videosex性欧美| 亚洲视频在线观看网站| 亚洲中文字幕在线一区| 一区二区免费视频| 大地资源二中文在线影视观看| 天堂一区二区在线| 中文字幕制服丝袜在线| 7m精品国产导航在线| 欧美中文在线观看| 日本免费视频在线观看| 精品国产凹凸成av人网站| 亚洲av无码精品一区二区| 中文字幕亚洲一区二区av在线| 91亚洲一线产区二线产区 | 亚洲精品国产一区二区精华液 | 国产精品久久久久9999吃药| 日本少妇xxxx软件| 日韩精品电影在线| 欧美做暖暖视频| 国产a久久精品一区二区三区| 成人在线小视频| 新版的欧美在线视频| 久久精品99无色码中文字幕| 亚洲色图欧美视频| 5858s免费视频成人| 成人午夜视频精品一区| 亚洲天天做日日做天天谢日日欢| 国产精品99精品无码视亚| 天堂va蜜桃一区二区三区漫画版 | 久久欧美肥婆一二区| 992tv成人免费观看| 中国av一区| 大波视频国产精品久久| 国产91欧美| 青草热久免费精品视频 | 色琪琪久久se色| 精品久久久久亚洲| 日韩精品久久久久久久软件91| 热草久综合在线| 欧美人与禽猛交乱配| 这里只有精品在线观看| 色哟哟国产精品色哟哟| 制服丝袜中文字幕亚洲| 懂色av中文字幕| 五月天久久比比资源色| 妺妺窝人体色www婷婷| 国产精品午夜久久| 麻豆精品免费视频| 99久久综合狠狠综合久久| 特级西西444www| 麻豆传媒一区二区三区| 免费av网址在线| 99亚洲一区二区| 国产一区二区三区小说| 亚洲影视一区| 中文字幕色一区二区| 欧美日韩在线观看视频小说| 快播亚洲色图| 天堂综合网久久| 精品久久久三级| 精品少妇3p| 国产精品对白一区二区三区| 亚洲午夜免费| 99在线观看视频| 麻豆一区在线| 亚洲尤物视频网| 日本一区二区三区播放| 97人人模人人爽人人喊38tv| 日本在线成人| av一区二区三区四区电影| 亚洲日本va午夜在线电影| 97超级碰碰| 国产欧美自拍一区| 精品国产aⅴ麻豆| 精品国产影院| 精品在线视频一区二区| 色综合www| 日韩电影免费观看高清完整| 国产精品手机在线播放| 先锋在线资源一区二区三区| av一区二区高清| 熟妇熟女乱妇乱女网站| 一区二区中文| 妺妺窝人体色777777| 在线亚洲精品| 日韩av一二三四| 日韩avvvv在线播放| xx欧美撒尿嘘撒尿xx| 久久成人免费网| 精人妻一区二区三区| av在线不卡电影| 在线免费观看日韩av| 国产日韩欧美一区二区三区乱码| 国产在线综合视频| 亚洲欧美一区二区久久| 国产在线视频你懂的| 狠狠躁夜夜躁人人爽超碰91| 成人毛片一区二区三区| 欧美精品第一页| 成人午夜福利视频| 亚洲精品一区久久久久久| 91吃瓜网在线观看| 欧美成人精品激情在线观看| h片在线观看视频免费| 日本午夜精品理论片a级appf发布| 欧美成人app| 91在线免费看网站| 日韩a级大片| 午夜精品电影在线观看| 911久久香蕉国产线看观看| 狠狠干 狠狠操| 免费精品视频在线| 涩视频在线观看| 中文字幕不卡的av| 久久99久久久| 欧美体内she精视频| www.亚洲天堂.com| 亚洲视频日韩精品| 1区2区3区在线视频| 日本精品va在线观看| 亚洲成人a级片| 久久久久天天天天| 亚洲精品在线观看91| 久久国产亚洲精品无码| 精品一二线国产| 蜜桃传媒一区二区亚洲av| 亚洲人成伊人成综合网小说| 日本中文字幕久久| 精品久久久影院| 欧美日韩视频在线播放| 91精品国产91久久久久久不卡| 国产日本亚洲| 亚洲成色www久久网站| 亚洲激情亚洲| 亚欧美一区二区三区| 久久久久一区二区三区四区| 免费在线视频一区二区| 欧美喷潮久久久xxxxx| 四虎在线免费看| 欧美高清自拍一区| 日韩一区精品| 欧美一级二级三级| 1024日韩| 美女久久久久久久久| 综合久久久久久| 中文字幕在线观看欧美| 亚洲色图美腿丝袜| 色戒汤唯在线| 国产一区免费在线| 亚洲特色特黄| 一级黄色免费毛片| 国产精品久久久久一区二区三区| 亚洲s码欧洲m码国产av| 亚洲第一精品自拍| 欧美xxx黑人xxx水蜜桃| 91免费在线视频网站| 四季av在线一区二区三区| 三级a在线观看| 久久精品在线观看| 精品免费囯产一区二区三区 | 一本色道88久久加勒比精品| 久久无码专区国产精品s| 亚洲乱码中文字幕综合| 国产精品丝袜黑色高跟鞋| 最新亚洲国产精品| 成人性片免费| 午夜精品福利一区二区| 日韩电影在线观看一区| 国产jjizz一区二区三区视频| 日韩欧美一区视频| 男女污视频在线观看| 国产91色在线播放| 欧美综合在线视频观看| 无码日韩人妻精品久久蜜桃| 日本一区二区动态图| 在线免费看av的网站| 中文字幕免费精品一区| 久久精品资源| 欧洲精品视频在线| 成人在线视频首页| 日韩免费不卡视频| 日韩成人在线播放| 欧美动物xxx| 日日骚一区二区网站| 奇米精品一区二区三区在线观看| 欧美aaa级片| 91精品国产高清一区二区三区| www红色一片_亚洲成a人片在线观看_| 亚洲自拍中文字幕| 国内自拍视频一区二区三区| 99久久人妻精品免费二区| 欧美性xxxxx极品娇小| melody高清在线观看| 成人伊人精品色xxxx视频| 欧美福利专区| 国产伦精品一区二区三区妓女| 日本久久精品电影| 黄色免费在线观看| 国产一区自拍视频| 日本v片在线高清不卡在线观看| 国产jizz18女人高潮| 欧美大片顶级少妇| 9i看片成人免费高清| 亚洲成人av动漫| 国产精品资源在线看| 狠狠躁夜夜躁人人爽天天高潮| 一本一本久久a久久精品综合小说| 国产精品麻豆成人av电影艾秋| 中文字幕在线乱| 91在线观看污| 怡春院在线视频| 欧美激情精品久久久久久变态| 一区二区美女| aaa一级黄色片| 欧美三级欧美成人高清www| av影片在线看| 国产精品视频入口| 麻豆成人av在线| 亚洲日本韩国在线| 日韩一区在线视频| 亚洲福利网站| 国产高清av片| 色哦色哦哦色天天综合| 伊人手机在线| 日韩区国产区| 99精品桃花视频在线观看| 中文字幕资源网| 国产91精品久久久| 欧美69wwwcom| 亚洲av熟女国产一区二区性色| 亚洲第一网站男人都懂| 日本成人一区二区| 久久美女福利视频|