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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Lesson 12.5 softmax回归建模实验

發布時間:2025/4/5 编程问答 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Lesson 12.5 softmax回归建模实验 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Lesson 12.5 softmax回歸建模實驗

接下來,繼續上一節內容,我們進行softmax回歸建模實驗。

  • 導入相關的包
# 隨機模塊 import random# 繪圖模塊 import matplotlib as mpl import matplotlib.pyplot as plt# numpy import numpy as np# pytorch import torch from torch import nn,optim import torch.nn.functional as F from torch.utils.data import Dataset,TensorDataset,DataLoader from torch.utils.tensorboard import SummaryWriter# 自定義模塊 from torchLearning import *# 導入以下包從而使得可以在jupyter中的一個cell輸出多個結果 from IPython.core.interactiveshell import InteractiveShell InteractiveShell.ast_node_interactivity = "all"

查看自定義模塊是否導入成功

tensorGenCla? #Signature: #tensorGenCla( # num_examples=500, # num_inputs=2, # num_class=3, # deg_dispersion=[4, 2], # bias=False, #) #Docstring: #分類數據集創建函數。 # #:param num_examples: 每個類別的數據數量 #:param num_inputs: 數據集特征數量 #:param num_class:數據集標簽類別總數 #:param deg_dispersion:數據分布離散程度參數,需要輸入一個列表,其中第一個參數表示每個類別數組均值的參考、第二個參數表示隨機數組標準差。 #:param bias:建立模型邏輯回歸模型時是否帶入截距 #:return: 生成的特征張量和標簽張量,其中特征張量是浮點型二維數組,標簽張量是長正型二維數組。 #File: f:\code file\pytorch實戰\torchlearning.py #Type: function

一、softmax回歸手動實現

??根據此前的介紹,面對分類問題,更為通用的處理辦法將其轉化為啞變量的形式,然后使用softmax回歸進行處理,這種處理方式同樣適用于二分類和多分類問題。此處以多分類問題為例,介紹softmax的手動實現形式。

【補充】softmax的另一種理解角度

??我們都知道,softmax是用于挑選最大值的一種方法,通過以下公式對不同類的計算結果進行數值上的轉化
δk=ezk∑Kek\delta_k = \frac{e^{z_k}}{\sum^Ke^k}δk?=Kekezk??
這種轉化可以將結果放縮到0-1之間,并且使用softmax進行最大值的比較,相比max(softmax是max的柔化版本),能有效避免損失函數求解時在0點不可導的問題,損失函數的函數特性,將是后續我們選擇優化算法的關鍵。具體我們可以通過下述圖像進行比較。

from matplotlib import pyplotdef max_x(x, delta=0.):x = np.array(x)negative_idx = x < deltax[negative_idx] = 0.return x x = np.array(range(-10, 10)) s_j = np.array(x)hinge_loss = max_x(s_j, delta=1.)pyplot.plot(s_j, hinge_loss) pyplot.title("Max Function")

def cross_entropy_test(s_k, s_j):soft_max = 1/(1+np.exp(s_k - s_j))cross_entropy_loss = -np.log(soft_max)return cross_entropy_loss s_i = 0 s_k = np.array(range(-10, 10))soft_x = cross_entropy_test(s_k, s_i)pyplot.plot(x, hinge_loss) pyplot.plot(range(-10, 10), soft_x) pyplot.title("softmax vs Max")


我們以三分類數據集為例,手動構建softmax回歸。

1.生成數據集

??利用此前的數據集生成函數,創建一個三分類、且內部離散程度不是很高的分類數據集

# 設置隨機數種子 torch.manual_seed(420) features, labels = tensorGenCla(bias=True, deg_dispersion=[6, 2]) plt.scatter(features[:, 0], features[:, 1], c = labels)

features #tensor([[-6.0141, -4.9911, 1.0000], # [-4.6593, -6.7657, 1.0000], # [-5.9395, -5.2347, 1.0000], # ..., # [ 6.4622, 4.1406, 1.0000], # [ 5.7278, 9.2208, 1.0000], # [ 4.9705, 3.1236, 1.0000]])

2.建模流程

  • Stage 1.模型選擇

圍繞建模目標,我們可以構建一個只包含一層的神經網絡進行建模。

根據此前課程的介紹,輸出層的每個神經元輸出結果都代表某條樣本在三個類別中softmax后的取值,此時神經網絡擁有兩層,且是全連接。此時從特征到輸出結果,就不再是簡單的線性方程變換,而是矩陣相乘之后進行softmax轉化。

def softmax(X, w):m = torch.exp(torch.mm(X, w))sp = torch.sum(m, 1).reshape(-1, 1)return m / sp

此處X是特征張量,w是由兩層之間的連接權重所組成的矩陣,且w的行數就是輸入數據特征的數量,w的列數就是輸出層的神經元個數,或者說就是分類問題的類別總數。計算過程我們可以通過下述例子進行說明:

f = features[: 10] l = labels[: 10] f l #tensor([[-6.0141, -4.9911, 1.0000], # [-4.6593, -6.7657, 1.0000], # [-5.9395, -5.2347, 1.0000], # [-7.0262, -4.5792, 1.0000], # [-2.3817, -5.1295, 1.0000], # [-0.7093, -5.4693, 1.0000], # [-4.1530, -6.8751, 1.0000], # [-1.9636, -3.3003, 1.0000], # [-6.5046, -6.0710, 1.0000], # [-6.1291, -7.1835, 1.0000]]) #tensor([[0], # [0], # [0], # [0], # [0], # [0], # [0], # [0], # [0], # [0]]) w = torch.arange(9).reshape(3, 3).float() w #tensor([[0., 1., 2.], # [3., 4., 5.], # [6., 7., 8.]]) m1 = torch.mm(f, w) m1 #tensor([[ -8.9733, -18.9785, -28.9837], # [-14.2971, -24.7221, -35.1471], # [ -9.7042, -19.8785, -30.0527], # [ -7.7375, -18.3429, -28.9483], # [ -9.3886, -15.8998, -22.4111], # [-10.4079, -15.5865, -20.7651], # [-14.6253, -24.6535, -34.6816], # [ -3.9010, -8.1649, -12.4289], # [-12.2130, -23.7886, -35.3642], # [-15.5506, -27.8632, -40.1758]])

此時,上述矩陣的每一行都代表每一條數據在三個類別上的線性方程計算結果,然后需要進行softmax轉化

torch.sum(w, 1) #tensor([ 3., 12., 21.]) torch.exp(m1) #tensor([[1.2675e-04, 5.7245e-09, 2.5854e-13], # [6.1777e-07, 1.8336e-11, 5.4426e-16], # [6.1026e-05, 2.3275e-09, 8.8770e-14], # [4.3617e-04, 1.0809e-08, 2.6787e-13], # [8.3669e-05, 1.2439e-07, 1.8493e-10], # [3.0193e-05, 1.7016e-07, 9.5900e-10], # [4.4494e-07, 1.9640e-11, 8.6693e-16], # [2.0222e-02, 2.8446e-04, 4.0014e-06], # [4.9654e-06, 4.6637e-11, 4.3803e-16], # [1.7639e-07, 7.9282e-13, 3.5635e-18]]) torch.sum(torch.exp(m1), 1) # 計算每一行的exp之后求和 #tensor([1.2675e-04, 6.1779e-07, 6.1028e-05, 4.3619e-04, 8.3794e-05, 3.0364e-05, 4.4495e-07, 2.0511e-02, 4.9655e-06, 1.7639e-07]) torch.exp(m1) / torch.sum(torch.exp(m1), 1).reshape(-1, 1) #tensor([[9.9995e-01, 4.5163e-05, 2.0398e-09], # [9.9997e-01, 2.9681e-05, 8.8098e-10], # [9.9996e-01, 3.8138e-05, 1.4546e-09], # [9.9998e-01, 2.4781e-05, 6.1412e-10], # [9.9851e-01, 1.4845e-03, 2.2070e-06], # [9.9436e-01, 5.6040e-03, 3.1583e-05], # [9.9996e-01, 4.4139e-05, 1.9484e-09], # [9.8594e-01, 1.3869e-02, 1.9509e-04], # [9.9999e-01, 9.3923e-06, 8.8216e-11], # [1.0000e+00, 4.4946e-06, 2.0202e-11]])

上述結果的每一行就是經過sofrmax轉化之后每一條數據在三個不同類別上的取值。該函數和nn.functional中softmax函數功能一致。只不過需要注意的是,我們定義的softmax函數需要輸入原始數據和系數矩陣,而F.softmax需要輸入輸出節點中經過線性運算的結果以及softmax的方向(按行還是按列)。

softmax(f, w) #tensor([[9.9995e-01, 4.5163e-05, 2.0398e-09], # [9.9997e-01, 2.9681e-05, 8.8098e-10], # [9.9996e-01, 3.8138e-05, 1.4546e-09], # [9.9998e-01, 2.4781e-05, 6.1412e-10], # [9.9851e-01, 1.4845e-03, 2.2070e-06], # [9.9436e-01, 5.6040e-03, 3.1583e-05], # [9.9996e-01, 4.4139e-05, 1.9484e-09], # [9.8594e-01, 1.3869e-02, 1.9509e-04], # [9.9999e-01, 9.3923e-06, 8.8216e-11], # [1.0000e+00, 4.4946e-06, 2.0202e-11]]) F.softmax(m1, 1) #tensor([[9.9995e-01, 4.5163e-05, 2.0398e-09], # [9.9997e-01, 2.9681e-05, 8.8098e-10], # [9.9996e-01, 3.8138e-05, 1.4546e-09], # [9.9998e-01, 2.4781e-05, 6.1412e-10], # [9.9851e-01, 1.4845e-03, 2.2069e-06], # [9.9436e-01, 5.6040e-03, 3.1583e-05], # [9.9996e-01, 4.4139e-05, 1.9484e-09], # [9.8594e-01, 1.3869e-02, 1.9509e-04], # [9.9999e-01, 9.3923e-06, 8.8216e-11], # [1.0000e+00, 4.4946e-06, 2.0202e-11]])
  • Stage 2.確定目標函數

??此時目標函數就是交叉熵損失函數。由于標簽已經經過了啞變量轉化,因此交叉熵的主體就是每條數據的真實類別對應概率的累乘結果。作為多分類問題的最通用的損失函數,我們有必要簡單回顧交叉熵計算過程:

f = torch.tensor([[0.6, 0.2, 0.2], [0.3, 0.4, 0.3]]) l = torch.tensor([0, 1])f l #tensor([[0.6000, 0.2000, 0.2000], # [0.3000, 0.4000, 0.3000]]) #tensor([0, 1])

其中f代表兩條數據在三個類別上通過softmax輸出的比例結果,l代表這兩條數據的真實標簽,我們可以將這兩條數據在不同類別上的概率取值看成是隨機變量,而這兩個隨機變量在真實類別上的聯合概率分布的具體取值則是0.6*0.4,進一步,交叉熵損失函數 = -log(所有數據的在真實類別上的聯合概率分布) / 數據總量。據此我們可定義交叉熵損失函數如下:

def m_cross_entropy(soft_z, y):y = y.long()prob_real = torch.gather(soft_z, 1, y)return (-(1/y.numel()) * torch.log(prob_real).sum())

注意,根據對數運算性質,有log(x1x2)=log(x1)+log(x2)log(x_1x_2)=log(x_1)+log(x_2)log(x1?x2?)=log(x1?)+log(x2?),因此我們可以將交叉熵損失函數中聯合概率分布的累乘轉化為累加,如果是累乘可以使用以下函數進行計算。但此處更推薦使用累加而不是累乘進行計算,大家想想是什么原因?

#def m_cross_entropy(soft_z, y): # y = y.long() # prob_real = torch.gather(soft_z, 1, y) # return (-(1/y.numel()) * torch.log(torch.prod(prob_real)))

gather函數基本使用方法

l f #tensor([0, 1]) #tensor([[0.6000, 0.2000, 0.2000], # [0.3000, 0.4000, 0.3000]]) torch.gather(f, 1, l.reshape(-1, 1).long()) # 相當于批量索引 #tensor([[0.6000], # [0.4000]])

再在外側乘以-1/N即可構成啞變量情況下分類問題的交叉熵損失函數的計算結果。

-1 / 2 * (torch.log(torch.tensor(0.6) * torch.tensor(0.4))) #tensor(0.7136) -1 / 2 * (torch.log(torch.tensor(0.6))+torch.log(torch.tensor(0.4))) #tensor(0.7136)

當然也可以直接使用上述定義的m_cross_entropy函數進行計算

m_cross_entropy(f, l.reshape(-1, 1).long()) #tensor(0.7136)

當然,我們也可以使用nn.CrossEntropyLoss()完成交叉熵損失函數的計算,需要注意的是,nn.CrossEntropyLoss()會自動完成softmax過程,調用該函數時,我們只需要輸入線性方程計算結果即可。

f = features[: 10] l = labels[: 10] w = torch.arange(9).reshape(3, 3).float() f l w #tensor([[-6.0141, -4.9911, 1.0000], # [-4.6593, -6.7657, 1.0000], # [-5.9395, -5.2347, 1.0000], # [-7.0262, -4.5792, 1.0000], # [-2.3817, -5.1295, 1.0000], # [-0.7093, -5.4693, 1.0000], # [-4.1530, -6.8751, 1.0000], # [-1.9636, -3.3003, 1.0000], # [-6.5046, -6.0710, 1.0000], # [-6.1291, -7.1835, 1.0000]]) #tensor([[0], # [0], # [0], # [0], # [0], # [0], # [0], # [0], # [0], # [0]]) #tensor([[0., 1., 2.], # [3., 4., 5.], # [6., 7., 8.]]) criterion = nn.CrossEntropyLoss() criterion(torch.mm(f, w), l.flatten()) #tensor(0.0021) m_cross_entropy(softmax(f, w), l) #tensor(0.0021)

需要注意的是,交叉熵損失函數本質上還是關于w參數的函數方程。我們在進行反向傳播時也是將w視為葉節點,通過梯度計算逐步更新w的取值。

  • Stage 3.定義優化算法

首先需要定義在softmax回歸下的準確率計算函數

def m_accuracy(soft_z, y):acc_bool = torch.argmax(soft_z, 1).flatten() == y.flatten()acc = torch.mean(acc_bool.float())return(acc)

上述函數的soft_z是經過softmax轉化之后模型整體輸出結果。其中argmax返回最大值的索引值

torch.argmax(torch.tensor([1, 2])) #tensor(1)

而對于從0開始進行計數的類別來說,以及softmax函數的輸出結果——每一行代表每一條數據在各類別上的softmax取值,我們對softmax的輸出結果進行逐行的最大值索引值的計算,即可直接得出每一條數據在當前模型計算結果下所屬類別的判別結果。

softmax(f, w) torch.argmax(softmax(f, w), 1) #tensor([[9.9995e-01, 4.5163e-05, 2.0398e-09], # [9.9997e-01, 2.9681e-05, 8.8098e-10], # [9.9996e-01, 3.8138e-05, 1.4546e-09], # [9.9998e-01, 2.4781e-05, 6.1412e-10], # [9.9851e-01, 1.4845e-03, 2.2070e-06], # [9.9436e-01, 5.6040e-03, 3.1583e-05], # [9.9996e-01, 4.4139e-05, 1.9484e-09], # [9.8594e-01, 1.3869e-02, 1.9509e-04], # [9.9999e-01, 9.3923e-06, 8.8216e-11], # [1.0000e+00, 4.4946e-06, 2.0202e-11]]) #tensor([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

上述準確率函數可直接輸入線性方程組計算結果,也可輸入softmax之后的結果,softmax本身不影響大小排序。

梯度調整的函數繼續沿用sgd函數。

def sgd(params, lr):params.data -= lr * params.grad params.grad.zero_()
  • Stage.4 訓練模型
# 設置隨機數種子 torch.manual_seed(420) # 數值創建 features, labels = tensorGenCla(bias = True, deg_dispersion = [6, 2]) plt.scatter(features[:, 0], features[:, 1], c = labels)

# 設置隨機數種子 torch.manual_seed(420) ? # 初始化核心參數 batch_size = 10 # 每一個小批的數量 lr = 0.03 # 學習率 num_epochs = 3 # 訓練過程遍歷幾次數據 w = torch.randn(3, 3, requires_grad = True) # 隨機設置初始權重 ? # 參與訓練的模型方程 net = softmax # 使用回歸方程 loss = m_cross_entropy # 交叉熵損失函數 ? train_acc = [] ? # 模型訓練過程 for epoch in range(num_epochs):for X, y in data_iter(batch_size, features, labels):l = loss(net(X, w), y)l.backward()sgd(w, lr)train_acc = m_accuracy(net(features, w), labels)print('epoch %d, acc %f' % (epoch + 1, train_acc)) #<torch._C.Generator at 0x24329b5ccd0> #epoch 1, acc 0.820667 #epoch 2, acc 0.942667 #epoch 3, acc 0.956667 # 查看模型結果 w #tensor([[-0.8271, -0.3262, 0.1712], # [-0.0423, 0.3347, 0.8580], # [-0.3393, 1.6311, -0.6399]], requires_grad=True)
  • 模型調試

首先,先嘗試多迭代幾輪,觀察模型收斂速度

# 設置隨機數種子 torch.manual_seed(420) # 迭代輪數 num_epochs = 20# 設置初始權重 w = torch.randn(3, 3, requires_grad = True) # 設置列表容器 train_acc = []# 執行迭代 for i in range(num_epochs):for epoch in range(i):for X, y in data_iter(batch_size, features, labels):l = loss(net(X, w), y)l.backward()sgd(w, lr)train_acc.append(m_accuracy(net(features, w), labels))# 繪制圖像查看準確率變化情況 plt.plot(list(range(num_epochs)), train_acc)

train_acc #[tensor(0.4473), # tensor(0.8220), # tensor(0.9547), # tensor(0.9653), # tensor(0.9693), # tensor(0.9693), # tensor(0.9693), # tensor(0.9707), # tensor(0.9673), # tensor(0.9707), # tensor(0.9667), # tensor(0.9713), # tensor(0.9707), # tensor(0.9713), # tensor(0.9707), # tensor(0.9707), # tensor(0.9700), # tensor(0.9700), # tensor(0.9707), # tensor(0.9693)]

和此前的邏輯回歸實驗結果類似,在數據內部離散程度較低的情況下,模型收斂速度較快。當然,這里我們可以進行簡單拓展,那就是當每一輪epoch時w都進行不同的隨機取值,會不會影響模型的收斂速度。

# 取10組不同的w,在迭代10輪的情況下觀察其收斂速度 for i in range(10):# torch.manual_seed(420) w = torch.randn(3, 3, requires_grad = True)train_acc = []for epoch in range(10):for X, y in data_iter(batch_size, features, labels):l = loss(net(X, w), y)l.backward()sgd(w, lr)train_acc.append(m_accuracy(net(features, w), labels))plt.plot(list(range(10)), train_acc)


能夠發現,盡管初始w的隨機取值會影響前期模型的準確率,但在整體收斂速度較快的情況下,基本在5輪左右模型都能達到較高的準確率。也就是說,損失函數的初始值點各不相同,但通過一輪輪梯度下降算法的迭代,都能夠找到(逼近)最小值點。此處即驗證了梯度下降算法本身的有效性,同時也說明對于該數據集來說,找到(逼近)損失函數的最小值點并不困難。

二、softmax回歸的快速實現

??接下來,嘗試通過調庫快速sofrmax回歸。經過一輪手動實現,我們已經對softmax回歸的各種建模細節以及數學運算過程已經非常熟悉,調庫實現也就更加容易。

  • 定義核心參數
batch_size = 10 # 每一個小批的數量 lr = 0.03 # 學習率 num_epochs = 3 # 訓練過程遍歷幾次數據
  • 數據準備
# 設置隨機數種子 torch.manual_seed(420) # 創建數據集 features, labels = tensorGenCla(deg_dispersion = [6, 2]) labels = labels.float() # 損失函數要求標簽也必須是浮點型 data = TensorDataset(features, labels) batchData = DataLoader(data, batch_size = batch_size, shuffle = True)features #tensor([[-6.0141, -4.9911], # [-4.6593, -6.7657], # [-5.9395, -5.2347], # ..., # [ 6.4622, 4.1406], # [ 5.7278, 9.2208], # [ 4.9705, 3.1236]])
  • Stage 1.定義模型
class softmaxR(nn.Module):def __init__(self, in_features=2, out_features=3, bias=False): # 定義模型的點線結構super(softmaxR, self).__init__()self.linear = nn.Linear(in_features, out_features)def forward(self, x): # 定義模型的正向傳播規則out = self.linear(x) return out# 實例化模型和 softmax_model = softmaxR()

由于我們所采用的CrossEntropyLoss類進行的損失函數求解,該類會自動對輸入對象進行softmax轉化,因此上述過程仍然只是構建了模型基本架構。

  • Stage 2.定義損失函數
criterion = nn.CrossEntropyLoss()
  • Stage 3.定義優化方法
optimizer = optim.SGD(softmax_model.parameters(), lr = lr)
  • Stage 4.模型訓練
def fit(net, criterion, optimizer, batchdata, epochs):for epoch in range(epochs):for X, y in batchdata:zhat = net.forward(X)y = y.flatten().long() # 損失函數計算要求轉化為整數loss = criterion(zhat, y)optimizer.zero_grad()loss.backward()optimizer.step()

接下來,即可執行模型訓練

fit(net = softmax_model, criterion = criterion, optimizer = optimizer, batchdata = batchData, epochs = num_epochs)

查看模型訓練結果

softmax_model #softmaxR( # (linear): Linear(in_features=2, out_features=3, bias=True) ) # 查看模型參數 print(list(softmax_model.parameters())) #[Parameter containing: #tensor([[-0.3947, -0.7395], # [ 0.1667, -0.2784], # [ 0.6445, 0.2392]], requires_grad=True), Parameter containing: #tensor([-0.9082, 1.5810, -0.6922], requires_grad=True)] # 計算交叉熵損失 criterion(softmax_model(features), labels.flatten().long()) #tensor(0.1668, grad_fn=<NllLossBackward>) # 借助F.softmax函數,計算準確率 m_accuracy(F.softmax(softmax_model(features), 1), labels) #tensor(0.9620) F.softmax(softmax_model(features), 1) #tensor([[9.5957e-01, 4.0428e-02, 6.4515e-06], # [9.5540e-01, 4.4593e-02, 5.5352e-06], # [9.6062e-01, 3.9378e-02, 5.7618e-06], # ..., # [4.5679e-03, 1.5779e-01, 8.3765e-01], # [2.4782e-04, 2.0569e-02, 9.7918e-01], # [2.3951e-02, 3.7729e-01, 5.9876e-01]], grad_fn=<SoftmaxBackward>)

2.模型調試

首先,上述結果能否在多迭代幾輪的情況下逐步提升

# 設置隨機數種子 torch.manual_seed(420) # 創建數據集 features, labels = tensorGenCla(deg_dispersion = [6, 2]) labels = labels.float() # 損失函數要求標簽也必須是浮點型 data = TensorDataset(features, labels) batchData = DataLoader(data, batch_size = batch_size, shuffle = True) #<torch._C.Generator at 0x1f9803ffd30> # 設置隨機數種子 torch.manual_seed(420) # 初始化核心參數 num_epochs = 20 SF1 = softmaxR() cr1 = nn.CrossEntropyLoss() op1 = optim.SGD(SF1.parameters(), lr = lr)# 創建列表容器 train_acc = []# 執行建模 for epochs in range(num_epochs):fit(net = SF1, criterion = cr1, optimizer = op1, batchdata = batchData, epochs = epochs)epoch_acc = m_accuracy(F.softmax(SF1(features), 1), labels)train_acc.append(epoch_acc)# 繪制圖像查看準確率變化情況 plt.plot(list(range(num_epochs)), train_acc)


和手動實現相同,此處模型也展示了非??斓氖諗克俣?。當然需要再次強調,當num_epochs=20時,SF1參數已經訓練了(19+18+…+1)次了。

然后考慮增加數據集分類難度

# 設置隨機數種子 torch.manual_seed(420) # 創建數據集 features, labels = tensorGenCla(deg_dispersion = [6, 4]) labels = labels.float() # 損失函數要求標簽也必須是浮點型 data = TensorDataset(features, labels) batchData = DataLoader(data, batch_size = batch_size, shuffle = True) #<torch._C.Generator at 0x1f9803ffd30> plt.scatter(features[:, 0], features[:, 1], c = labels)

# 設置隨機數種子 torch.manual_seed(420) # 初始化核心參數 num_epochs = 20 SF1 = softmaxR() cr1 = nn.CrossEntropyLoss() op1 = optim.SGD(SF1.parameters(), lr = lr)# 創建列表容器 train_acc = []# 執行建模 for epochs in range(num_epochs):fit(net = SF1, criterion = cr1, optimizer = op1, batchdata = batchData, epochs = epochs)epoch_acc = m_accuracy(F.softmax(SF1(features), 1), labels)train_acc.append(epoch_acc)# 繪制圖像查看準確率變化情況 plt.plot(list(range(num_epochs)), train_acc)

train_acc #[tensor(0.1420), # tensor(0.7607), # tensor(0.7987), # tensor(0.7987), # tensor(0.7980), # tensor(0.7967), # tensor(0.7847), # tensor(0.8053), # tensor(0.7973), # tensor(0.7913), # tensor(0.7967), # tensor(0.8000), # tensor(0.8000), # tensor(0.7980), # tensor(0.8000), # tensor(0.7827), # tensor(0.8007), # tensor(0.7993), # tensor(0.7980), # tensor(0.7953)]

我們發現,收斂速度仍然很快,模型很快就到達了比較穩定的狀態。但和此前的邏輯回歸實驗相同,模型結果雖然比較穩定,但受到數據集分類難度提升影響,模型準確率卻不高,基本維持在80%左右。一般來說,此時就代表模型抵達了判別效力上界,此時模型已經無法有效捕捉數據集中規律。

但到底什么叫做模型判別效力上界呢?從根本上來說就是模型已經到達(逼近)損失函數的最小值點,但模型的評估指標卻無法繼續提升。首先,我們可以初始選擇多個w來觀察損失函數是否已經逼近最小值點而不是落在了局部最小值點附近。

# 初始化核心參數 cr1 = nn.CrossEntropyLoss()# 創建列表容器 train_acc = []# 執行建模 for i in range(10):SF1 = softmaxR()op1 = optim.SGD(SF1.parameters(), lr = lr)fit(net = SF1, criterion = cr1, optimizer = op1, batchdata = batchData, epochs = 10)epoch_acc = m_accuracy(F.softmax(SF1(features), 1), labels)train_acc.append(epoch_acc)train_acc #[tensor(0.7940), # tensor(0.7900), # tensor(0.7960), # tensor(0.7880), # tensor(0.7887), # tensor(0.7980), # tensor(0.7980), # tensor(0.7873), # tensor(0.7960), # tensor(0.8000)]

初始化不同的w發現最終模型準確率仍然是80%左右,也從側面印證迭代過程沒有問題,模型已經到達(逼近)最小值點。也就是說問題并不是出在損失函數的求解上,而是出在損失函數的構造上。此時的損失函數哪怕取得最小值點,也無法進一步提升模型效果。而損失函數的構造和模型的構造直接相關,此時若要進一步提升模型效果,就需要調整模型結構了。這也將是下一階段模型調優核心討論的內容。

補充閱讀內容

【損失損失函數取值和模型評估指標之間關系】

??很多時候,損失函數求得最小值也不一定能夠使得模型獲得較好的擬合效果。

def plot_polynomial_fit(x, y, deg):p = np.poly1d(np.polyfit(x, y, deg))t = np.linspace(0, 1, 200)plt.plot(x, y, 'ro', t, p(t), '-')n_dots = 20 x = np.linspace(0, 1, n_dots) # 從0到1,等寬排布的20個數 y = np.sqrt(x) + 0.2*np.random.rand(n_dots) - 0.1 plot_polynomial_fit(x, y, 1)


【關于PyTorch GPU運算的相關介紹】
??在課程剛開始的時候,我們就介紹了關于pytorch GPU版本的安裝,如果此前安裝過GPU版本PyTorch,此處就可以使用GPU進行運算了。在PyTorch 1.0版本之后,CPU計算的代碼和GPU計算的代碼基本可以通用,甚至可以通過全局變量直接控制一份代碼在CPU和GPU上快速切換。
??當然,GPU運算也分為分布式GPU計算和單GPU運算,二者在代碼規則上并無區別,單在計算流程上略有不同,此處先介紹單GPU計算方法,分布式GPU運算將在后續進行講解。
??但通過實踐我們能夠看出,GPU計算在小規模運算時并無優勢,另外,由CPU運算切換至GPU運算也非常便捷,因此如果暫時沒有GPU環境的同學也不用太擔心,可用先了解GPU運算背后原理,待有條件時再進行實踐。

  • 測試是否可進行GPU計算

根據此前介紹,我們可用通過torch.cuda.is_available()判斷是否可用GPU進行計算

torch.cuda.is_available() #True
  • CPU存儲與GPU存儲

??CPU運算和GPU運算的核心區別就在于張量存儲位置的區別,如果張量是存儲在GPU上,則張量運算時就會自動調用CUDA進行GPU運算。默認情況下創建的張量是存儲在CPU內存上,也就是默認情況張量都是CPU運算。

tc = torch.randn(4) tc #tensor([ 1.1650, 2.0070, 0.6959, -0.4931])

通過.cuda或者.cpu即可生成一個存儲在gpu或者cpu上的相同數據的對象

tg = tc.cuda() tg #tensor([ 1.1650, 2.0070, 0.6959, -0.4931], device='cuda:0') tg.cpu() #tensor([ 1.1650, 2.0070, 0.6959, -0.4931])

當然,我們也可用通過.to()方法來進行轉化

tg.to('cpu') #tensor([ 1.1650, 2.0070, 0.6959, -0.4931]) tc.to('cuda') #tensor([ 1.1650, 2.0070, 0.6959, -0.4931], device='cuda:0')
  • device屬性

通過張量的device屬性,我們能夠查看張量存儲信息,并且能在創建張量時就直接創建存儲在同一個GPU上的張量

tg.device #device(type='cuda', index=0) torch.randn(4, device=tg.device) #tensor([ 0.2777, 0.2940, 0.9860, -0.4056], device='cuda:0')
  • CPU張量和GPU張量彼此不能相互運算
torch.dot(tg, tc) #RuntimeError: expected all tensors to be on the same device. Found: cuda:0, cpu

當然,如果是分布式GPU運算,存儲在不同GPU上的張量彼此也無法運算

  • 模型參數存儲位置

??通過前例我們也發現了,在實例化模型的過程中,如果需要在GPU上運行,則需要在實例化過程對模型進行.cuda操作,核心作用就是將模型的參數保存在GPU上,從而可以和同樣在GPU上的數據進行計算。當然,我們可以通過以下方式讓模型和數據自動在cpu和gpu上切換。

CUDA = torch.cuda.is_available()if CUDA:features = features.cuda()labels = labels.cuda()model = model_class().cuda() else:model = model_class()
  • 模型運算

接下來,我們可以嘗試將上述模型的運行過程放在GPU上執行。

#創建數據 torch.manual_seed(420) features, labels = tensorGenCla(deg_dispersion = [6, 4]) labels = labels.float() features = features.cuda() labels = labels.cuda()data = TensorDataset(features, labels) batchData = DataLoader(data, batch_size = batch_size, shuffle = True) #<torch._C.Generator at 0x1f9803ffd30> features #tensor([[-6.0282, -3.9822], # [-3.3185, -7.5314], # [-5.8790, -4.4695], # ..., # [ 6.9244, 2.2811], # [ 5.4556, 12.4416], # [ 3.9411, 0.2473]], device='cuda:0')

此時features已保存在GPU上,根據標記能看出目前是保存在第一塊GPU上。如果要將其轉移至CPU上,可通過.cpu方法在cpu上新生成一個數據。

而利用GPU進行計算時,則需要在實例化模型時加上.cuda,使得模型初始化參數也保存在GPU上。

# 初始化核心參數 num_epochs = 20 SF4 = softmaxR().cuda() cr4 = nn.CrossEntropyLoss() op4 = optim.SGD(SF4.parameters(), lr = lr)# 創建列表容器 train_acc = []import time start = time.perf_counter()# 執行建模 for epochs in range(num_epochs):fit(net = SF4, criterion = cr4, optimizer = op4, batchdata = batchData, epochs = epochs)epoch_acc = m_accuracy(F.softmax(SF4(features), 1), labels)epoch_acc = epoch_acc.cpu()train_acc.append(epoch_acc)# 繪制圖像查看準確率變化情況 plt.plot(list(range(num_epochs)), train_acc)finish = time.perf_counter() time_cost = finish - start print("計算時間:%s" % time_cost) #計算時間:14.391150299999936


從直觀感受上來看,在當前運算規模上,GPU的計算速度并不比CPU快。

#創建數據 torch.manual_seed(420) features, labels = tensorGenCla(deg_dispersion = [6, 4]) labels = labels.float() data = TensorDataset(features, labels) batchData = DataLoader(data, batch_size = 10, shuffle = True) #<torch._C.Generator at 0x1f9803ffd30> # 初始化核心參數 num_epochs = 20 SF4 = softmaxR() cr4 = nn.CrossEntropyLoss() op4 = optim.SGD(SF4.parameters(), lr = lr)# 創建列表容器 train_acc = []import time start = time.perf_counter()# 執行建模 for epochs in range(num_epochs):fit(net = SF4, criterion = cr4, optimizer = op4, batchdata = batchData, epochs = epochs)epoch_acc = m_accuracy(F.softmax(SF4(features), 1), labels)epoch_acc = epoch_acc.cpu()train_acc.append(epoch_acc)# 繪制圖像查看準確率變化情況 plt.plot(list(range(num_epochs)), train_acc)finish = time.perf_counter() time_cost = finish - start print("計算時間:%s" % time_cost) #計算時間:8.631832600000052


限于在當前的運算規模,GPU運算對計算效率并不如CPU。但針對此模型,我們可以增加帶入訓練的數據集大小、減少每次訓練的小批數據量(增加每一個epoch的迭代次數)、增加整體迭代次數,在運算時間超過4小時時,GPU計算速度將超過CPU計算速度,如以下規模的計算:
【以下代碼運算量較大,謹慎運行!!!】
【以下代碼運算量較大,謹慎運行!!!】
【以下代碼運算量較大,謹慎運行!!!】

#創建數據 torch.manual_seed(420) features, labels = tensorGenCla(num_examples=100000, deg_dispersion = [6, 4]) labels = labels.float() features = features.cuda() labels = labels.cuda()data = TensorDataset(features, labels) batchData = DataLoader(data, batch_size = batch_size, shuffle = True) # 設置隨機數種子 torch.manual_seed(420) # 初始化核心參數 num_epochs = list(range(1, 61)) SF4 = softmaxR().cuda() cr4 = nn.CrossEntropyLoss() op4 = optim.SGD(SF4.parameters(), lr = lr, momentum=0.3)# 創建列表容器 train_acc = []# 減少每批輸入的數據量 batchData = DataLoader(data, batch_size = 5, shuffle = True)import time start = time.perf_counter()# 執行建模 for epochs in num_epochs:fit(net = SF4, criterion = cr4, optimizer = op4, batchdata = batchData, epochs = epochs)epoch_acc = m_accuracy(F.softmax(SF4(features), 1), labels)epoch_acc = epoch_acc.cpu()train_acc.append(epoch_acc)# 繪制圖像查看準確率變化情況 plt.plot(num_epochs, train_acc)finish = time.perf_counter() time_cost = finish - start print("計算時間:%s" % time_cost) # 設置隨機數種子 torch.manual_seed(420) features, labels = tensorGenCla(num_examples=100000, deg_dispersion = [6, 4]) labels = labels.float() data = TensorDataset(features, labels) batchData = DataLoader(data, batch_size = 5, shuffle = True)# 初始化核心參數 num_epochs = list(range(1, 61)) SF3 = softmaxR() cr3 = nn.CrossEntropyLoss() op3 = optim.SGD(SF3.parameters(), lr = lr, momentum=0.3)# 創建列表容器 train_acc = []import time start = time.perf_counter()# 執行建模 for epochs in num_epochs:fit(net = SF3, criterion = cr3, optimizer = op3, batchdata = batchData, epochs = epochs)epoch_acc = m_accuracy(F.softmax(SF3(features), 1), labels)train_acc.append(epoch_acc)# 繪制圖像查看準確率變化情況 plt.plot(num_epochs, train_acc)finish = time.perf_counter() time_cost = finish - start print("計算時間:%s" % time_cost)

??通過此前的實驗我們發現,在數據量和運算規模較小的情況下(當然也是神經網絡層數較少的原因),GPU運算速度甚至要慢于CPU的計算速度,因此一般課上我們都采用CPU進行計算,待有接觸到大規模神經網絡的時候再開啟GPU加速,當然肯定還是處在CPU可運算的范圍。

【本節函數模塊添加】
本節課程結束后,需要將以下函數寫入torchLearning模塊,方便后續調用。

  • sigmoid、logistic、cal、accuracy、cross_entropy
  • acc_zhat、softmax、m_cross_entropy、m_accuracy

下節課開始,我們將正式進入到神經網絡優化算法部分內容。

總結

以上是生活随笔為你收集整理的Lesson 12.5 softmax回归建模实验的全部內容,希望文章能夠幫你解決所遇到的問題。

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

欧美视频国产视频 | 亚洲一级免费观看 | 久久久精选 | www.亚洲| 亚洲精品国内 | 国产精品毛片一区二区 | 久久久久麻豆 | 特级大胆西西4444www | 国产又黄又爽又猛视频日本 | 91porny九色91啦中文 | 黄色网在线免费观看 | 九九热只有这里有精品 | 久久婷婷国产色一区二区三区 | 久久97久久 | 国产一区在线视频播放 | 一级a性色生活片久久毛片波多野 | 天天插天天干 | 在线观看一区 | 亚洲日本一区二区在线 | 中文一区在线观看 | 久久人人爽视频 | 国产精品av免费观看 | 久久夜色精品国产欧美乱 | 九九九在线观看视频 | 久久影视网 | 91成人免费在线视频 | 欧美综合色在线图区 | 青青草国产免费 | 午夜久久影视 | 久免费视频| 欧美激情第28页 | 亚洲最大色 | 久久超级碰视频 | 久久资源总站 | 91av中文| 久久久91精品国产一区二区精品 | 亚洲午夜久久久久久久久 | 九九九热精品免费视频观看 | 四虎视频| 在线观看免费黄色 | 99久高清在线观看视频99精品热在线观看视频 | 碰天天操天天 | 国产一区二区三区免费视频 | 五月天丁香亚洲 | 最新91在线视频 | 黄色aa久久 | 91传媒91久久久 | 99在线热播精品免费99热 | 色婷婷综合视频在线观看 | 日本久久久精品视频 | 日日爽天天爽 | 久香蕉 | 亚洲影视九九影院在线观看 | 日韩视频欧美视频 | 国产精品久久久久久久久久久久午夜 | av永久网址 | 在线免费观看国产黄色 | 国产美女免费 | 美女视频是黄的免费观看 | 91综合久久一区二区 | 国产涩涩网站 | 国产高潮久久 | 亚洲国产网站 | 欧美午夜剧场 | 久久五月网| 欧美日韩免费观看一区二区三区 | 久久国产片 | 欧美一区二区三区免费观看 | 色婷婷久久 | www.天天成人国产电影 | 国产一在线精品一区在线观看 | 久久国产精品第一页 | 国产精品嫩草影院99网站 | 99福利影院 | 亚洲电影网站 | av一区在线 | 日韩在线播放欧美字幕 | 日韩在线电影一区二区 | 国产精品成久久久久三级 | a色视频| 最新日韩在线 | 超碰av在线播放 | 免费在线看v | 亚洲狠狠 | 国产黄色av网站 | 成人免费精品 | 成 人 黄 色 免费播放 | 激情图片qvod | 国产午夜精品理论片在线 | 国产精品国产毛片 | 国产精品久久久久影院日本 | 九九久久精品 | 亚洲国产一区二区精品专区 | 久久在线播放 | 日韩精品你懂的 | 久久精品人| 国产亚洲综合性久久久影院 | 国产裸体视频网站 | 正在播放一区二区 | 欧美性生活久久 | 91成人在线看 | 成人免费视频在线观看 | 欧美日视频| av网站免费看| 日韩有码欧美 | 久久av一区二区三区亚洲 | 日韩中文字幕在线观看 | 日韩久久久久 | 92av视频 | 久久艹精品| 成人a视频在线观看 | 9热精品 | 亚洲欧洲精品一区 | 女人18毛片a级毛片一区二区 | 97视频在线观看播放 | av电影免费在线看 | a级一a一级在线观看 | 国产最新福利 | 日韩精品网址 | 成年人黄色在线观看 | 国产成人黄色 | 玖玖在线免费视频 | 在线视频日韩精品 | 国产精品一区二区在线观看免费 | 国产专区欧美专区 | 三级毛片视频 | 久久精彩免费视频 | 日韩区欠美精品av视频 | 9999在线视频| 久久精品—区二区三区 | 国产一级免费观看视频 | 天天摸天天舔天天操 | 欧美一区二区在线 | 超碰在线9 | 国产在线观看黄 | 91社区国产高清 | 欧洲精品久久久久毛片完整版 | 免费看的黄色 | 欧美a性| 免费看短 | 成人性生交大片免费观看网站 | 国产精品第10页 | 国产人在线成免费视频 | 国产精品热视频 | 亚洲男男gⅴgay双龙 | 2024国产精品视频 | 波多野结衣在线观看一区二区三区 | 亚洲aⅴ乱码精品成人区 | av高清一区| 日韩视频免费观看高清 | 亚洲精品一区二区网址 | 国产在线欧美在线 | 国产精品岛国久久久久久久久红粉 | 欧美精品v国产精品 | 久久久成人精品 | 中文字幕欧美激情 | 不卡av免费在线观看 | 日韩视频一区二区在线 | 91av资源在线| 91精品专区 | 网站免费黄色 | 99精品视频网站 | 人人干干人人 | 射综合网 | 欧美日韩另类在线观看 | 久久久午夜精品福利内容 | 国产69久久久欧美一级 | 色综合久久久久综合99 | 91九色视频网站 | 天天干天天草 | 国产精品嫩草影视久久久 | 亚洲视频在线观看网站 | 久久手机免费视频 | 久久视频免费 | 91av免费在线观看 | 日日爽 | 91av视频播放 | 精品a在线 | 日韩高清国产精品 | 国色综合 | 黄色三级网站 | 国产 欧美 日产久久 | 综合色站导航 | 九九爱免费视频在线观看 | 日韩免费av在线 | 五月天最新网址 | 久久爱资源网 | 丁香花中文在线免费观看 | 精品国产一区二区三区四区vr | 久久久九色精品国产一区二区三区 | 国产亚洲精品久久久久久无几年桃 | 午夜精品一区二区三区在线 | 日韩国产在线观看 | 国产大陆亚洲精品国产 | 免费视频91蜜桃 | 国产中文字幕视频在线观看 | 天堂在线视频免费观看 | 欧美精品一区二区蜜臀亚洲 | 国产永久免费 | 国产一级视频在线免费观看 | 91精品专区 | 正在播放久久 | 超级碰碰碰免费视频 | 国产精品一区二区在线观看 | 在线视频手机国产 | 三日本三级少妇三级99 | 欧美巨大荫蒂茸毛毛人妖 | 日韩天堂在线观看 | 97超级碰碰碰视频在线观看 | 91福利社在线观看 | www激情久久| 国产v亚洲v | 国产精品原创在线 | 国产黄色片在线免费观看 | 久久久久日本精品一区二区三区 | 999久久国精品免费观看网站 | 在线导航福利 | 久久视频在线免费观看 | 96精品在线 | 欧美淫视频 | 特黄特黄的视频 | 激情五月视频 | 久久久国产网站 | 久久精品屋 | 日本 在线 视频 中文 有码 | 精品国产99国产精品 | 欧美一区二区在线刺激视频 | 在线91精品 | 欧美做受高潮1 | 国产超碰在线 | 99免费在线 | 久久天| 丁香午夜| 国产视频 亚洲视频 | 在线观看免费中文字幕 | 日韩精品2区 | 亚洲国产欧美在线人成大黄瓜 | 国产午夜三级一二三区 | 国产精品久久久久久一区二区三区 | 国产淫片免费看 | 精品亚洲欧美一区 | www看片网站 | 日本久久电影 | 玖玖视频 | 黄色免费电影网站 | 久久久久精 | 四虎影视精品成人 | www.天天色 | 久久精品电影院 | 在线观看日韩精品视频 | 亚洲男女精品 | 日韩在线视频播放 | 国产精品久久三 | 香蕉视频网站在线观看 | 日本爱爱片| 亚洲黄色av | 国产91精品一区二区麻豆亚洲 | 日韩精品免费一线在线观看 | 中文字幕 国产视频 | 亚洲精品在线网站 | 日本韩国精品一区二区在线观看 | 日韩在线免费观看视频 | 在线超碰av | 日p视频在线观看 | 久草视频国产 | 亚洲综合欧美激情 | 国产精品岛国久久久久久久久红粉 | 欧美精品网站 | 欧美性生活大片 | 91九色精品国产 | 免费久久视频 | 国产生活一级片 | 亚洲a资源 | 另类老妇性bbwbbw高清 | 91激情视频在线播放 | 日韩在线资源 | 日韩视频一区二区在线观看 | 成人97视频一区二区 | 人人爽人人看 | 高清精品久久 | 国产激情免费 | 婷婷中文字幕综合 | 欧美一二三在线 | www亚洲视频 | 九九久久电影 | 亚洲日本va午夜在线影院 | 久久久久网址 | 伊人国产在线播放 | 91精品国产欧美一区二区成人 | 欧美久久久久久久久久久久 | 又黄又爽又刺激视频 | 久久国产99| 96视频在线 | 国产成人综 | 国产精品免费久久久 | 日韩av美女 | 国产成人精品综合久久久久99 | 97精品国产97久久久久久免费 | 日三级在线 | 国产精品资源在线观看 | 国产成人久久精品 | 亚洲精品国偷自产在线99热 | 国产精品永久久久久久久久久 | 日本中文字幕视频 | 91在线影视 | 久久视频在线视频 | 成人黄色视| 日本护士撒尿xxxx18 | 97精品国产97久久久久久粉红 | 亚洲国产激情 | www.大网伊人 | 日韩在线视频一区二区三区 | 免费成人av电影 | 国产精品毛片一区二区在线看 | 国产三级av在线 | 97偷拍视频| 国产精品人成电影在线观看 | 99亚洲精品 | 久久视频在线免费观看 | 久草网免费 | 亚洲做受高潮欧美裸体 | www日 | 久久好看免费视频 | 欧美久草网 | 亚洲欧美日韩中文在线 | 午夜av网站 | 日韩精品专区在线影院重磅 | 亚洲日韩欧美一区二区在线 | 亚洲精品一区二区三区新线路 | 一级黄色片在线播放 | 成人永久视频 | 欧洲精品一区二区 | 亚洲午夜久久久综合37日本 | 色网免费观看 | 波多野结衣在线播放一区 | 成人黄色毛片视频 | 日韩动态视频 | 久久99久久99精品免视看婷婷 | 国产91aaa| www激情久久 | 天天干,天天操 | 在线观看国产永久免费视频 | 欧美日韩国产一区二区在线观看 | 狠狠色丁香婷婷综合久小说久 | 色天天天 | 在线看av的网址 | 国内揄拍国内精品 | 国产精品久久久久久久午夜 | 亚洲特级毛片 | 国产精品mv在线观看 | 91精品天码美女少妇 | 国产精品美女久久久 | 草久久久 | 中文字幕二区在线观看 | 亚洲精品综合欧美二区变态 | 亚洲欧洲国产精品 | 国产日本三级 | 午夜精品福利在线 | 九九精品视频在线看 | 亚洲一区网 | 婷婷伊人五月天 | 久久艹免费| 日韩久久精品一区二区三区 | 91理论电影 | 97超碰免费在线观看 | 香蕉视频国产在线观看 | 国产精品成人免费一区久久羞羞 | 日韩在线色视频 | 午夜久草 | 青青河边草手机免费 | 96亚洲精品久久 | 五月天婷婷免费视频 | 黄色小说网站在线 | 久久久国产一区二区三区 | 国产精彩视频一区二区 | 日韩中文字幕a | 欧美美女视频在线观看 | 成人av免费在线播放 | 在线电影a | 欧美日本不卡视频 | 91色国产在线 | 成人在线观看资源 | 成年免费在线视频 | 欧美少妇xxx | 色噜噜狠狠色综合中国 | av超碰在线| 婷婷色网 | 国内揄拍国内精品 | 日韩系列 | 在线激情网| 国产精品久久久久久久久久尿 | 欧美一级日韩免费不卡 | 国产成人精品av久久 | 亚洲欧洲中文日韩久久av乱码 | 美女视频黄在线 | 超碰97av在线 | 久久99精品视频 | 精品一区欧美 | 成人av资源网站 | 免费一级片在线 | 国产精品免费久久久久久久久久中文 | 日韩精品专区在线影院重磅 | 欧美日韩精品网站 | 国内精品久久久久久久久久 | 最近中文字幕视频完整版 | 91精品在线免费视频 | 麻豆传媒视频在线 | 国产一区私人高清影院 | 国产中文字幕网 | 高清av免费观看 | 色大片免费看 | 免费黄色网址网站 | 免费看黄在线 | 日韩精品免费在线观看视频 | www.神马久久 | 91.精品高清在线观看 | 成人永久在线 | 中文字幕欧美三区 | 黄色91在线观看 | 丁香六月在线 | 91中文字幕 | 成人国产精品入口 | 国产精品自产拍在线观看桃花 | 国产精品美女久久久久久久网站 | 色视频网站在线观看一=区 a视频免费在线观看 | 97国产视频| 91成人精品 | 狠狠色丁香婷婷综合橹88 | 日韩免费在线看 | 一区二区精品久久 | av电影久久 | 91精品在线免费观看视频 | 中文字幕亚洲不卡 | 久久国产欧美日韩精品 | 青草视频在线 | 国产成人一区二区三区在线观看 | 亚洲专区视频在线观看 | 亚洲免费av观看 | 日韩在线观看视频一区二区三区 | 激情av资源 | 黄色毛片大全 | 国产亚洲va综合人人澡精品 | 国产乱老熟视频网88av | 果冻av在线 | 日韩中文久久 | 欧美在线视频一区二区三区 | 久久久久久久18 | 亚洲最大成人免费网站 | 免费成人黄色片 | 亚洲精品欧洲精品 | www.五月激情.com | 丝袜少妇在线 | 国产成人精品一区二区三区福利 | 9久久精品 | 午夜免费福利片 | 精品国产福利在线 | 在线观看日韩中文字幕 | 午夜电影久久 | 成人免费看片网址 | 美女网站黄免费 | 亚洲免费视频在线观看 | 日批视频在线播放 | 丰满少妇久久久 | 国产99久久久国产精品免费看 | 日韩精品久久久久久久电影竹菊 | 国产在线最新 | 国产原创在线 | 国产一级h | 在线免费观看黄色大片 | 国产污视频在线观看 | 午夜精品一区二区三区免费 | 日韩二区在线 | 91精品一区二区三区蜜臀 | 国产91对白在线 | 韩日av在线| 久久久久久久久久久高潮一区二区 | 久热电影 | 91九色国产在线 | 在线亚洲天堂网 | 日日爽夜夜操 | 91亚洲精品久久久蜜桃网站 | 国产黄色精品在线观看 | 久久视频免费观看 | 视频国产在线观看18 | 国产精品1区2区 | 天天操天天摸天天爽 | av电影免费在线看 | 国产护士hd高朝护士1 | 国产香蕉视频在线播放 | 亚洲人成精品久久久久 | 国产97在线看 | 奇米影音四色 | 久草视频在线新免费 | 国内精品久久影院 | 亚洲影视九九影院在线观看 | 久久国产成人午夜av影院宅 | 国产又粗又猛又黄视频 | 亚洲五月 | 超碰97av在线| 久热电影 | 91最新在线观看 | 午夜精品久久久久久久久久久 | 韩国三级一区 | 国产精品久久久久四虎 | 99这里只有久久精品视频 | 亚洲视频axxx| 久久官网| 狠狠色综合欧美激情 | 九九免费在线视频 | 99久久夜色精品国产亚洲 | 中文在线字幕免费观 | 深爱激情综合网 | 亚洲精品视频在线观看视频 | 91网页版在线观看 | www.夜色.com| 免费h精品视频在线播放 | 综合色综合色 | 成人av一区二区在线观看 | 国产精品手机在线播放 | 天天草天天插 | 国产成人精品午夜在线播放 | 日本最新高清不卡中文字幕 | 色婷婷狠狠五月综合天色拍 | 久青草电影| 日本精品久久久久中文字幕 | 欧美日韩国产亚洲乱码字幕 | 欧美国产日韩中文 | 激情综合网天天干 | 国产黄色精品在线 | av成人在线电影 | 免费av视屏 | 婷婷网址 | 日韩黄色免费电影 | 天天干天天综合 | www91在线| 国产精品成人免费精品自在线观看 | 黄色中文字幕在线 | 99精品美女 | av资源免费看 | 久久久69 | 国产 中文 日韩 欧美 | 婷婷深爱网 | 国产夫妻性生活自拍 | 中文字幕 在线 一 二 | 四虎www com | 日韩高清免费电影 | 国产一区二区三区午夜 | 探花视频免费在线观看 | 日韩精品中文字幕在线不卡尤物 | 免费视频97 | 国内精品久久久久久久影视简单 | 久久黄色片 | 婷婷av网站 | 成年人免费看的视频 | 韩国视频一区二区三区 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 在线观看第一页 | 日韩精品一卡 | 不卡的一区二区三区 | 最近中文字幕在线播放 | 在线看片中文字幕 | 91成人网在线观看 | 久久精品久久精品 | 草久在线视频 | 国产一级电影 | 中文字幕国产亚洲 | 97在线精品国自产拍中文 | 99久久日韩精品视频免费在线观看 | 最近乱久中文字幕 | 五月天综合在线 | 国产精品第一视频 | 国产裸体无遮挡 | 激情综合网天天干 | 91在线观看高清 | 黄色小网站免费看 | 韩国精品在线观看 | 日韩精品一区二区三区免费观看 | 亚洲成人黄色在线观看 | 五月婷丁香网 | 日韩久久精品一区二区三区下载 | 欧美日韩色婷婷 | 亚洲精品乱码久久久久久蜜桃91 | 一区二区三区高清在线 | 精品久久久久久国产91 | 99在线观看视频网站 | 麻豆视频免费入口 | 日本精品一区二区三区在线播放视频 | 91完整视频| 亚洲一级二级三级 | 91成人免费观看视频 | 丁香九月激情 | 精品国产一区二区三区噜噜噜 | 天天天干天天射天天天操 | 国产中文字幕在线观看 | 在线观看中文 | 天天躁日日躁狠狠躁av中文 | 亚洲久久视频 | 亚洲一级性 | 国产精品一区二区视频 | 久久久综合精品 | 美女视频免费精品 | www.超碰| 成人在线免费av | 国产视频在线观看一区 | 在线欧美小视频 | 成人免费色 | 在线观看中文字幕一区 | 国产精品黄色影片导航在线观看 | 国产精品爽爽爽 | 精品伦理一区二区三区 | www.久久色| 久久av电影| 91视频在线观看大全 | 日韩精品影视 | 人人精品| 亚洲综合精品在线 | 91热视频在线观看 | 国产二区av | 久草精品视频 | 四虎在线永久免费观看 | 国产精品资源 | 午夜精品福利一区二区三区蜜桃 | 精品在线免费视频 | 黄a网| 亚洲成av人片在线观看www | 亚洲成人精品在线观看 | 中文字幕人成一区 | 日本精品在线看 | 国产精品igao视频网入口 | 久久国产品 | 91免费网站在线观看 | 一级一片免费看 | 国产成人在线观看免费 | 人人揉人人揉人人揉人人揉97 | 成人免费在线电影 | 最新av在线免费观看 | 少妇bbr搡bbb搡bbb | 久久久久久久久久久网 | 色久av| 青春草国产视频 | 国产精品毛片一区视频 | 在线免费观看国产视频 | 久久婷婷精品视频 | 久久官网| 一级黄毛片 | av黄在线播放 | 久久蜜臀一区二区三区av | 国产精品theporn| 中文在线8资源库 | 粉嫩一二三区 | 国产网站在线免费观看 | 国产人成看黄久久久久久久久 | 色综合天天狠狠 | 在线观看一区二区精品 | 91精品推荐 | 国内成人综合 | 婷婷在线免费观看 | 午夜av网站 | 久久99精品热在线观看 | 中文字幕在线观看视频一区二区三区 | 九九久久久久久久久激情 | 1区2区3区在线观看 三级动图 | 国产日产精品一区二区三区四区的观看方式 | 黄色影院在线免费观看 | 中文在线字幕免费观 | 狠狠干在线 | 91九色在线视频观看 | www.激情五月.com | 中文字幕在线视频网站 | 国产精品av免费在线观看 | 国产精品久久久久久久婷婷 | 成人av直播| 一区二区不卡视频在线观看 | 国产精品欧美一区二区三区不卡 | 国产精品福利无圣光在线一区 | 国产专区精品视频 | 国产精品永久 | 在线国产欧美 | 激情五月播播久久久精品 | 久久精品视频网址 | 天天干,夜夜操 | 亚洲一级黄色大片 | 嫩嫩影院理论片 | 日日躁你夜夜躁你av蜜 | 91av视频在线免费观看 | www.在线看片.com | 亚洲欧洲一区二区在线观看 | 国产黄免费 | 国产小视频在线看 | 手机看片久久 | 国产剧情av在线播放 | 国产黄色成人av | 国产91在| 欧美性性网 | 日韩欧美一区二区在线观看 | 午夜影院一级 | 不卡av在线免费观看 | 日韩视频中文字幕 | 日韩精品高清不卡 | 91污视频在线观看 | a级国产乱理论片在线观看 伊人宗合网 | 亚洲国产成人久久 | 久久国产区 | 久久精品激情 | 亚洲精品一区二区三区四区高清 | 91精品国自产在线偷拍蜜桃 | 91香蕉视频污在线 | 国产精品一区二区三区在线 | 欧美激情精品久久久久 | 香蕉视频在线网站 | 欧美色图另类 | 精品视频免费在线 | 日日夜夜精品视频天天综合网 | 丁香六月婷婷激情 | 久久精品站 | 99久精品| 免费在线91| 91刺激视频 | 免费观看一级 | 久久五月婷婷综合 | 亚洲无吗视频在线 | 久av在线| 亚洲午夜精品久久久久久久久 | 综合久久五月天 | 欧美伦理电影一区二区 | h动漫中文字幕 | 超碰99人人 | 久久久久久久久电影 | 日韩二区三区在线 | 97香蕉久久超级碰碰高清版 | 国产精品久久久久久久久久ktv | av五月婷婷 | av中文字幕网| 久久精品7 | 成人av资源网 | 在线观看午夜av | 欧美日韩免费观看一区二区三区 | 亚洲欧洲精品久久 | 婷婷久久网站 | 午夜国产一区二区三区四区 | 欧美色久 | 精品国产一区二区三区在线 | 欧美亚洲另类在线视频 | 首页av在线 | 91精品国产自产在线观看 | 亚洲精品视频www | 69国产精品视频 | 91久久国产综合精品女同国语 | 97天天综合网 | 精品国产一区二区三区不卡 | av一级二级 | 精品久久久久久久久久 | 99久久国产免费,99久久国产免费大片 | 蜜臀av性久久久久av蜜臀三区 | 国产韩国日本高清视频 | 国产欧美中文字幕 | 久久亚洲美女 | 日韩精品第一区 | 99精品视频在线观看免费 | 亚洲在线黄色 | 444av| 日韩av网页 | 91久久精品日日躁夜夜躁国产 | 欧美性色黄大片在线观看 | 日韩在线免费电影 | 欧美另类视频 | 婷婷在线综合 | 天天综合色天天综合 | 国产91小视频| 日韩电影中文 | 狠狠做深爱婷婷综合一区 | 国产一区二区在线播放视频 | 成人午夜影视 | 97视频在线免费播放 | 久久国产色 | 色婷婷激情 | 欧美日韩高清国产 | av成人在线网站 | 日韩在线三区 | 六月婷色 | 天天操人人干 | 日韩在线视频线视频免费网站 | 国产亚洲91 | 不卡的av在线播放 | 麻豆视频国产精品 | 日本精品久久久久中文字幕5 | 久久久99精品免费观看 | 日韩高清av在线 | 欧美在线视频一区二区三区 | 久草在线官网 | 91豆花在线 | 成人h动漫在线看 | 国产视频精品久久 | 在线影院 国内精品 | 丁香资源影视免费观看 | 亚洲精品国产第一综合99久久 | 又黄又爽又无遮挡的视频 | 国产精品福利在线播放 | 国产日韩精品一区二区三区在线 | 麻豆久久一区二区 | 久久精品国产精品 | 婷婷综合电影 | 伊人成人久久 | 粉嫩一二三区 | 亚洲精品1234区 | 九九有精品 | 久久成年人网站 | 狠狠色噜噜狠狠狠狠2022 | 久久国产精品精品国产色婷婷 | 激情欧美一区二区三区 | 日韩欧美一区二区三区在线 | 69成人在线 | 久久精品一区二区三区四区 | 日韩免费在线一区 | www.狠狠操.com | 在线观看国产永久免费视频 | 久草电影免费在线观看 | 日韩一区二区久久 | 狠狠色丁香婷婷综合久小说久 | 18+视频网站链接 | 玖玖玖国产精品 | 24小时日本在线www免费的 | 国产精品中文字幕在线 | 亚洲jizzjizz日本少妇 | 91成人在线视频 | 国产精品成人久久久久久久 | 亚洲 欧美 国产 va在线影院 | 欧美一级免费黄色片 | 国产精品a成v人在线播放 | 在线成人中文字幕 | 二区三区中文字幕 | 成人在线视频论坛 | 国产97色在线| 久久69av | 国产又黄又爽无遮挡 | 久久高清av | 国产护士hd高朝护士1 | 亚洲精品在线观看av | 亚洲国内精品 | 日韩啪啪小视频 | 久久久久久久久久久国产精品 | 二区三区中文字幕 | 青青河边草手机免费 | 日韩午夜一级片 | 久久久久久不卡 | a在线视频v视频 | 亚洲精品乱码久久 | 中文字幕一区二区三区在线观看 | 毛片基地黄久久久久久天堂 | 国产美女网站在线观看 | 人人澡人人澡人人 | 精品国产一区二区三区免费 | 久久久久婷 | 久久亚洲专区 | 日韩在线视频播放 | 亚洲最大激情中文字幕 | 成人黄色电影在线 | 日韩欧美视频免费观看 | 天天av在线播放 | 在线电影av| 久久影院亚洲 | 国产精品久久久久久久久婷婷 | 中文在线中文资源 | 国产一区影院 | 91在线精品视频 | 国产在线观看av | 天天干,天天操 | 国产视频导航 | 91c网站色版视频 | 在线看片中文字幕 | 天天添夜夜操 | 夜夜操网 | 91大神精品视频在线观看 | 中文国产字幕 | 91毛片在线| 国产在线观看你懂得 | 久久中国精品 | 91成版人在线观看入口 | 99久热精品 | 亚洲国产欧美一区二区三区丁香婷 | 91av蜜桃| 欧美巨大荫蒂茸毛毛人妖 | 精品中文字幕在线观看 | 久久婷五月 | 久久不射电影院 | 在线黄色国产电影 | 人人爽人人爽人人片av | 中文字幕在线第一页 | 在线观看黄色 | 久草香蕉在线 | 久久久久电影 | 精品免费国产一区二区三区四区 | 人人澡人人草 | 久久天堂影院 | 免费福利视频导航 | 日本99干网 | 国产成人在线一区 | 亚洲91精品 | 日韩午夜av | 国产乱对白刺激视频在线观看女王 | 伊人婷婷综合 | 国产中出在线观看 | 91精品视频在线观看免费 | 中文字幕在线网 | 免费在线观看毛片网站 | 成年人网站免费在线观看 | 久久精品网站视频 | 免费在线激情视频 | 99r精品视频在线观看 | 亚洲午夜精品久久久久久久久久久久 | 久草视频在线免费看 | 欧美精品久久久久久久久久 | av免费观看高清 | 丁香五月亚洲综合在线 | 又色又爽又黄 | 色妞色视频一区二区三区四区 | 97精品国产97久久久久久粉红 | 国产一区网址 | 在线观看日本韩国电影 | 亚洲资源| 欧美一级片免费在线观看 | 91传媒91久久久 | 国产人成免费视频 | 色播六月天 | 99久久精品一区二区成人 | 国产精品一区二区麻豆 | 日本精品视频在线观看 | 久久视屏网 | 久久国产精品免费观看 | 日本在线h| 久草在线最新视频 | 久久久久久久久久久国产精品 | 探花视频免费观看 | 国产99久久久国产精品免费二区 | 福利一区二区三区四区 | 免费色视频网址 | 国产视频2区 | 日韩影视在线观看 | 欧美精品在线观看免费 | 久久高清av | 免费视频黄 | 综合色站导航 | 中文字幕在线视频免费播放 | 播五月综合 | 亚洲成av人影院 | 黄色一级在线视频 | 欧美va电影 | 成人在线免费观看视视频 | 91精品国产高清自在线观看 | 国产精品女同一区二区三区久久夜 | 久久综合一本 | 久久男人中文字幕资源站 | 亚洲精品久久久久久国 | 中文字幕在线播放视频 | 少妇高潮流白浆在线观看 | 亚洲 成人 欧美 | 99综合影院在线 | 激情av在线播放 | 91精品在线免费观看视频 | 久艹视频免费观看 | 免费一级片在线观看 | 超级碰碰碰视频 | 久久热亚洲 | 欧美韩日在线 | 黄色综合 | 色综合夜色一区 | 免费av高清 | 久久免费一级片 | 日韩欧美精品一区 | 欧美91av | 91麻豆精品国产91久久久无需广告 | 久久第四色 | 一级久久精品 | 手机av观看| 992tv在线成人免费观看 | 久久一区国产 | 国产精品一区二区免费看 | 日日天天av | 久久九九影视网 | 天天操 夜夜操 | 九9热这里真品2 | 91在线视频网址 | 亚洲一区 av | 亚洲不卡在线 | 美女网站在线免费观看 | 中文字幕av免费观看 | 亚洲成年人免费网站 | 久久综合毛片 | 99一级片| 精品亚洲国产视频 | 国产精品18p | 国产福利免费在线观看 | 亚洲精品一区二区精华 | 国产一区在线视频观看 | 久久久久网址 | 中文在线资源 | av久久在线 | 国产成人精品一区一区一区 |