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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

PyTorch框架学习十七——Batch Normalization

發布時間:2024/7/23 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PyTorch框架学习十七——Batch Normalization 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

PyTorch框架學習十七——Batch Normalization

  • 一、BN的概念
  • 二、Internal Covariate Shift(ICS)
  • 三、BN的一個應用案例
  • 四、PyTorch中BN的實現
    • 1._BatchNorm類
    • 2.nn.BatchNorm1d/2d/3d
      • (1)nn.BatchNorm1d
      • (2)nn.BatchNorm2d
      • (3)nn.BatchNorm3d

本次筆記關注深度學習中非常常用的標準化方法:BN。

BN首次于論文《Batch Normalization:Accelerating Deep Network Training by Reducing Internel Covariate》中提出,本來是想要解決訓練過程中隨著網絡層數的加深而導致的數據尺度/分布變化的問題,但是同時還發現了很多其他非常有用的優點,因此自從提出以來就受到了廣泛的應用。相應的,LN、IN和GN在基于BN的思想上紛紛被提出,適用于各自不同的場景。

一、BN的概念

Batch Normalization:批歸一化,批指的是一小批數據,通常為mini-batch,標準化指的是要將數據標準化為0均值、1方差。

建議看BN的論文,這里提煉一下BN使用的優點:

  • 可用更大的lr,加速模型收斂。
  • 可不用精心設計權值初始化,這一點很實用(其實是很省事)
  • 可不用Dropout或用較小的Dropout
  • 可不用L2或用較小的weight decay
  • 可不用LRN(local response normalization)
  • 以及BN提出的本意,解決了隨著網絡層數的加深而導致的數據尺度/分布變化的問題
  • 下面給出了BN的算法過程:

    輸入是一小批的數據以及要學習的參數γ和β,首先求這一小批數據的均值和方差,然后使用這個均值和方差進行標準化數據,這樣得到的數據就服從0均值1標準差。但到這里還沒有結束,BN還多了一個仿射變換的步驟,即將標準化后的數據縮放并平移,但是這個是一個可學習的過程,參數γ和β是在訓練過程中不斷被學習的,如果模型覺得需要,就可以進行仿射變換,這一步的作用是可以增加模型的容量,使得模型更加靈活,選擇性更多。

    二、Internal Covariate Shift(ICS)

    這個就是BN論文本來要解決的問題,訓練過程中隨著網絡層數的增加,數據的分布會隨之變化,下面舉了一個例子,具體如下圖所示:

    這是一個全連接網絡,第一層為輸入層X,第一個全連接層的權值為W1,則第一個全連接層的輸出H1等于X和W1向量相乘,假設輸入X滿足0均值1標準差,即標準化后的結果。

    若W初始化時也是1標準差,那么H1的方差的結果如上圖計算得為n,即經過一層全連接層,數據的分布范圍就擴大了n倍,那么經過多層,數據的分布將會越來越大,這樣反向求梯度的時候也會非常大,也就是梯度爆炸現象。

    再試想一下,如果初始化的時候W的方差很小,小于1/n,那么H1的方差的結果將會小于1,那么經過多層,數據的分布將會越來越小,這樣反向求梯度的時候也會非常小,也就是梯度消失現象。

    以上所述的就是ICS,而BN所做的就是在每一層全連接層后面將數據分布變化的數據再標準化回0均值1標準差,以此來消除對后續網絡層的影響,從而消除了ICS。

    下面將構造一個100層,每層256個神經元的全連接網絡,觀察其數據分布隨網絡層數的變化:

    import torch import numpy as np import torch.nn as nn import sys, os from tools.common_tools import set_seedset_seed(1) # 設置隨機種子class MLP(nn.Module):def __init__(self, neural_num, layers=100):super(MLP, self).__init__()self.linears = nn.ModuleList([nn.Linear(neural_num, neural_num, bias=False) for i in range(layers)])self.bns = nn.ModuleList([nn.BatchNorm1d(neural_num) for i in range(layers)])self.neural_num = neural_numdef forward(self, x):for (i, linear), bn in zip(enumerate(self.linears), self.bns):x = linear(x)# method 3# x = bn(x)x = torch.relu(x)if torch.isnan(x.std()):print("output is nan in {} layers".format(i))breakprint("layers:{}, std:{}".format(i, x.std().item()))return xdef initialize(self):for m in self.modules():if isinstance(m, nn.Linear):# method 1nn.init.normal_(m.weight.data, std=1) # normal: mean=0, std=1# method 2 kaiming# nn.init.kaiming_normal_(m.weight.data)neural_nums = 256 layer_nums = 100 batch_size = 16net = MLP(neural_nums, layer_nums) net.initialize()inputs = torch.randn((batch_size, neural_nums)) # normal: mean=0, std=1output = net(inputs) print(output)

    代碼中有3種情況:

    • 第一個是使用正態分布給權值初始化,使得權值0均值1標準差,且沒有使用BN層,將每一層網絡的數據標準差打印出來如下所示:
    layers:0, std:9.352246284484863 layers:1, std:112.47123718261719 layers:2, std:1322.8056640625 layers:3, std:14569.42578125 layers:4, std:154672.765625 layers:5, std:1834038.125 layers:6, std:18807982.0 layers:7, std:209553056.0 layers:8, std:2637502976.0 layers:9, std:32415457280.0 layers:10, std:374825549824.0 layers:11, std:3912853094400.0 layers:12, std:41235926482944.0 layers:13, std:479620541448192.0 layers:14, std:5320927071961088.0 layers:15, std:5.781225696395264e+16 layers:16, std:7.022147146707108e+17 layers:17, std:6.994718592201654e+18 layers:18, std:8.473501588274335e+19 layers:19, std:9.339794309346954e+20 layers:20, std:9.56936220412742e+21 layers:21, std:1.176274650258599e+23 layers:22, std:1.482641634599281e+24 layers:23, std:1.6921343606923352e+25 layers:24, std:1.9741450942615745e+26 layers:25, std:2.1257213262324592e+27 layers:26, std:2.191710730990783e+28 layers:27, std:2.5254503817521246e+29 layers:28, std:3.221308876879874e+30 layers:29, std:3.530952437322462e+31 layers:30, std:4.525353644890983e+32 layers:31, std:4.715011552268428e+33 layers:32, std:5.369590669553154e+34 layers:33, std:6.712318470791119e+35 layers:34, std:7.451114589527308e+36 output is nan in 35 layers tensor([[3.2626e+36, 0.0000e+00, 7.2932e+37, ..., 0.0000e+00, 0.0000e+00,2.5465e+38],[3.9237e+36, 0.0000e+00, 7.5033e+37, ..., 0.0000e+00, 0.0000e+00,2.1274e+38],[0.0000e+00, 0.0000e+00, 4.4932e+37, ..., 0.0000e+00, 0.0000e+00,1.7016e+38],...,[0.0000e+00, 0.0000e+00, 2.4222e+37, ..., 0.0000e+00, 0.0000e+00,2.5295e+38],[4.7380e+37, 0.0000e+00, 2.1580e+37, ..., 0.0000e+00, 0.0000e+00,2.6028e+38],[0.0000e+00, 0.0000e+00, 6.0878e+37, ..., 0.0000e+00, 0.0000e+00,2.1695e+38]], grad_fn=<ReluBackward0>)

    正如上面分析的一樣,數據變得越來越大。

    • 第二種情況是找到一種合適的初始化方法,使得其沒有ICS,這里使用了kaiming_normal初始化,結果如下:
    layers:0, std:0.8266295790672302 layers:1, std:0.8786815404891968 layers:2, std:0.9134421944618225 layers:3, std:0.8892470598220825 layers:4, std:0.8344280123710632 layers:5, std:0.874537467956543 layers:6, std:0.7926970720291138 layers:7, std:0.7806458473205566 layers:8, std:0.8684563636779785 layers:9, std:0.9434137344360352 layers:10, std:0.964215874671936 layers:11, std:0.8896796107292175 layers:12, std:0.8287257552146912 layers:13, std:0.8519770503044128 layers:14, std:0.83543461561203 layers:15, std:0.802306056022644 layers:16, std:0.8613607287406921 layers:17, std:0.7583686709403992 layers:18, std:0.8120225071907043 layers:19, std:0.791111171245575 layers:20, std:0.7164373397827148 layers:21, std:0.778393030166626 layers:22, std:0.8672043085098267 layers:23, std:0.8748127222061157 layers:24, std:0.9020991921424866 layers:25, std:0.8585717082023621 layers:26, std:0.7824354767799377 layers:27, std:0.7968913912773132 layers:28, std:0.8984370231628418 layers:29, std:0.8704466819763184 layers:30, std:0.9860475063323975 layers:31, std:0.9080778360366821 layers:32, std:0.9140638113021851 layers:33, std:1.0099570751190186 layers:34, std:0.9909381866455078 layers:35, std:1.0253210067749023 layers:36, std:0.8490436673164368 layers:37, std:0.703953742980957 layers:38, std:0.7186156511306763 layers:39, std:0.7250635623931885 layers:40, std:0.7030817866325378 layers:41, std:0.6325559616088867 layers:42, std:0.6623691916465759 layers:43, std:0.6960877180099487 layers:44, std:0.7140734195709229 layers:45, std:0.6329052448272705 layers:46, std:0.645889937877655 layers:47, std:0.7354376912117004 layers:48, std:0.6710689067840576 layers:49, std:0.6939154863357544 layers:50, std:0.6889259219169617 layers:51, std:0.6331775188446045 layers:52, std:0.6029314398765564 layers:53, std:0.6145529747009277 layers:54, std:0.6636687517166138 layers:55, std:0.7440096139907837 layers:56, std:0.7972176671028137 layers:57, std:0.7606151103973389 layers:58, std:0.6968684196472168 layers:59, std:0.7306802868843079 layers:60, std:0.6875628232955933 layers:61, std:0.7171440720558167 layers:62, std:0.7646605968475342 layers:63, std:0.7965087294578552 layers:64, std:0.8833741545677185 layers:65, std:0.8592953681945801 layers:66, std:0.8092937469482422 layers:67, std:0.8064812421798706 layers:68, std:0.6792411208152771 layers:69, std:0.6583347320556641 layers:70, std:0.5702279210090637 layers:71, std:0.5084437727928162 layers:72, std:0.4869327247142792 layers:73, std:0.4635041356086731 layers:74, std:0.4796812832355499 layers:75, std:0.4737212061882019 layers:76, std:0.4541455805301666 layers:77, std:0.4971913695335388 layers:78, std:0.49279505014419556 layers:79, std:0.44223514199256897 layers:80, std:0.4802999496459961 layers:81, std:0.5579249858856201 layers:82, std:0.5283756852149963 layers:83, std:0.5451982617378235 layers:84, std:0.6203728318214417 layers:85, std:0.6571894884109497 layers:86, std:0.7036821842193604 layers:87, std:0.7321069836616516 layers:88, std:0.6924358606338501 layers:89, std:0.6652534604072571 layers:90, std:0.6728310585021973 layers:91, std:0.6606624126434326 layers:92, std:0.6094606518745422 layers:93, std:0.6019104719161987 layers:94, std:0.5954217314720154 layers:95, std:0.6624558568000793 layers:96, std:0.6377887725830078 layers:97, std:0.6079288125038147 layers:98, std:0.6579317450523376 layers:99, std:0.6668478846549988 tensor([[0.0000, 1.3437, 0.0000, ..., 0.0000, 0.6444, 1.1867],[0.0000, 0.9757, 0.0000, ..., 0.0000, 0.4645, 0.8594],[0.0000, 1.0023, 0.0000, ..., 0.0000, 0.5148, 0.9196],...,[0.0000, 1.2873, 0.0000, ..., 0.0000, 0.6454, 1.1411],[0.0000, 1.3589, 0.0000, ..., 0.0000, 0.6749, 1.2438],[0.0000, 1.1807, 0.0000, ..., 0.0000, 0.5668, 1.0600]],grad_fn=<ReluBackward0>)

    數據的確沒有隨著網絡層加深而快速增大或減小,但是尋找到一種合適的初始化方法往往很花費時間。

    • 第三種情況是加入BN層,不使用初始化:
    layers:0, std:0.5751240849494934 layers:1, std:0.5803307890892029 layers:2, std:0.5825020670890808 layers:3, std:0.5823132395744324 layers:4, std:0.5860626101493835 layers:5, std:0.579832911491394 layers:6, std:0.5815905332565308 layers:7, std:0.5734466910362244 layers:8, std:0.5853903293609619 layers:9, std:0.5811620950698853 layers:10, std:0.5818504095077515 layers:11, std:0.5775734186172485 layers:12, std:0.5788553357124329 layers:13, std:0.5831498503684998 layers:14, std:0.5726235508918762 layers:15, std:0.5717664957046509 layers:16, std:0.576700747013092 layers:17, std:0.5848639607429504 layers:18, std:0.5718148350715637 layers:19, std:0.5775086879730225 layers:20, std:0.5790560841560364 layers:21, std:0.5815289616584778 layers:22, std:0.5845211744308472 layers:23, std:0.5830678343772888 layers:24, std:0.5817515850067139 layers:25, std:0.5793628096580505 layers:26, std:0.5744576454162598 layers:27, std:0.581753134727478 layers:28, std:0.5858433246612549 layers:29, std:0.5895737409591675 layers:30, std:0.5806193351745605 layers:31, std:0.5742025971412659 layers:32, std:0.5814924240112305 layers:33, std:0.5800969004631042 layers:34, std:0.5751299858093262 layers:35, std:0.5819362998008728 layers:36, std:0.57569420337677 layers:37, std:0.5824175477027893 layers:38, std:0.5741908550262451 layers:39, std:0.5768386721611023 layers:40, std:0.578640341758728 layers:41, std:0.5833579301834106 layers:42, std:0.5873513221740723 layers:43, std:0.5807022452354431 layers:44, std:0.5743744373321533 layers:45, std:0.5791332721710205 layers:46, std:0.5789337158203125 layers:47, std:0.5805914402008057 layers:48, std:0.5796007513999939 layers:49, std:0.5833531022071838 layers:50, std:0.5896912813186646 layers:51, std:0.5851364731788635 layers:52, std:0.5816906094551086 layers:53, std:0.5805508494377136 layers:54, std:0.5876169204711914 layers:55, std:0.576688826084137 layers:56, std:0.5784814357757568 layers:57, std:0.5820549726486206 layers:58, std:0.5837342739105225 layers:59, std:0.5691872835159302 layers:60, std:0.5777156949043274 layers:61, std:0.5763663649559021 layers:62, std:0.5843147039413452 layers:63, std:0.5852570533752441 layers:64, std:0.5836994051933289 layers:65, std:0.5794276595115662 layers:66, std:0.590632438659668 layers:67, std:0.5765355825424194 layers:68, std:0.5794717073440552 layers:69, std:0.5696660876274109 layers:70, std:0.5910594463348389 layers:71, std:0.5822493433952332 layers:72, std:0.5893915295600891 layers:73, std:0.5875967741012573 layers:74, std:0.5845006108283997 layers:75, std:0.573967695236206 layers:76, std:0.5823272466659546 layers:77, std:0.5769740343093872 layers:78, std:0.5787169933319092 layers:79, std:0.5757712721824646 layers:80, std:0.5799717307090759 layers:81, std:0.577584981918335 layers:82, std:0.581005334854126 layers:83, std:0.5819255113601685 layers:84, std:0.577966570854187 layers:85, std:0.5941665172576904 layers:86, std:0.5822250247001648 layers:87, std:0.5828983187675476 layers:88, std:0.5758668184280396 layers:89, std:0.5786070823669434 layers:90, std:0.5724494457244873 layers:91, std:0.5775058269500732 layers:92, std:0.5749661326408386 layers:93, std:0.5795350670814514 layers:94, std:0.5690663456916809 layers:95, std:0.5838885307312012 layers:96, std:0.578350305557251 layers:97, std:0.5750819444656372 layers:98, std:0.5843801498413086 layers:99, std:0.5825926065444946 tensor([[1.0858, 0.0000, 0.0000, ..., 0.0000, 0.0000, 0.7552],[0.0000, 0.0000, 0.3216, ..., 0.0000, 0.0000, 0.1931],[0.0000, 0.5979, 0.1423, ..., 1.2776, 0.9048, 0.0000],...,[0.8705, 0.4248, 0.0000, ..., 0.0000, 0.8963, 0.3446],[0.0000, 0.0000, 0.0000, ..., 0.5631, 0.0000, 0.4281],[1.1301, 0.0000, 0.0000, ..., 2.2642, 0.3234, 0.0000]],grad_fn=<ReluBackward0>)

    可以看得出來效果比使用kaiming_normal初始化更好,這個例子說明BN層的使用可以不用初始化而且避免了ICS的問題。

    三、BN的一個應用案例

    用LeNet解決一個人民幣二分類的問題:

    import os import numpy as np import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim import torchvision.transforms as transforms from torch.utils.tensorboard import SummaryWriter from torch.utils.data import DataLoader from matplotlib import pyplot as pltimport sys hello_pytorch_DIR = os.path.abspath(os.path.dirname(__file__)+os.path.sep+".."+os.path.sep+"..") sys.path.append(hello_pytorch_DIR)from model.lenet import LeNet, LeNet_bn from tools.my_dataset import RMBDataset from tools.common_tools import set_seedclass LeNet_bn(nn.Module):def __init__(self, classes):super(LeNet_bn, self).__init__()self.conv1 = nn.Conv2d(3, 6, 5)self.bn1 = nn.BatchNorm2d(num_features=6)self.conv2 = nn.Conv2d(6, 16, 5)self.bn2 = nn.BatchNorm2d(num_features=16)self.fc1 = nn.Linear(16 * 5 * 5, 120)self.bn3 = nn.BatchNorm1d(num_features=120)self.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, classes)def forward(self, x):out = self.conv1(x)out = self.bn1(out)out = F.relu(out)out = F.max_pool2d(out, 2)out = self.conv2(out)out = self.bn2(out)out = F.relu(out)out = F.max_pool2d(out, 2)out = out.view(out.size(0), -1)out = self.fc1(out)out = self.bn3(out)out = F.relu(out)out = F.relu(self.fc2(out))out = self.fc3(out)return outdef initialize_weights(self):for m in self.modules():if isinstance(m, nn.Conv2d):nn.init.xavier_normal_(m.weight.data)if m.bias is not None:m.bias.data.zero_()elif isinstance(m, nn.BatchNorm2d):m.weight.data.fill_(1)m.bias.data.zero_()elif isinstance(m, nn.Linear):nn.init.normal_(m.weight.data, 0, 1)m.bias.data.zero_()set_seed(1) # 設置隨機種子 rmb_label = {"1": 0, "100": 1}# 參數設置 MAX_EPOCH = 10 BATCH_SIZE = 16 LR = 0.01 log_interval = 10 val_interval = 1# ============================ step 1/5 數據 ============================ BASE_DIR = os.path.dirname(os.path.abspath(__file__)) split_dir = os.path.abspath(os.path.join(BASE_DIR, "..", "..", "data", "rmb_split")) train_dir = os.path.join(split_dir, "train") valid_dir = os.path.join(split_dir, "valid")if not os.path.exists(split_dir):raise Exception(r"數據 {} 不存在, 回到lesson-06\1_split_dataset.py生成數據".format(split_dir))norm_mean = [0.485, 0.456, 0.406] norm_std = [0.229, 0.224, 0.225]train_transform = transforms.Compose([transforms.Resize((32, 32)),transforms.RandomCrop(32, padding=4),transforms.RandomGrayscale(p=0.8),transforms.ToTensor(),transforms.Normalize(norm_mean, norm_std), ])valid_transform = transforms.Compose([transforms.Resize((32, 32)),transforms.ToTensor(),transforms.Normalize(norm_mean, norm_std), ])# 構建MyDataset實例 train_data = RMBDataset(data_dir=train_dir, transform=train_transform) valid_data = RMBDataset(data_dir=valid_dir, transform=valid_transform)# 構建DataLoder train_loader = DataLoader(dataset=train_data, batch_size=BATCH_SIZE, shuffle=True) valid_loader = DataLoader(dataset=valid_data, batch_size=BATCH_SIZE)# ============================ step 2/5 模型 ============================# net = LeNet_bn(classes=2) net = LeNet(classes=2) # net.initialize_weights()# ============================ step 3/5 損失函數 ============================ criterion = nn.CrossEntropyLoss() # 選擇損失函數# ============================ step 4/5 優化器 ============================ optimizer = optim.SGD(net.parameters(), lr=LR, momentum=0.9) # 選擇優化器 scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.1) # 設置學習率下降策略# ============================ step 5/5 訓練 ============================ train_curve = list() valid_curve = list()iter_count = 0 # 構建 SummaryWriter writer = SummaryWriter(comment='test_your_comment', filename_suffix="_test_your_filename_suffix")for epoch in range(MAX_EPOCH):loss_mean = 0.correct = 0.total = 0.net.train()for i, data in enumerate(train_loader):iter_count += 1# forwardinputs, labels = dataoutputs = net(inputs)# backwardoptimizer.zero_grad()loss = criterion(outputs, labels)loss.backward()# update weightsoptimizer.step()# 統計分類情況_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).squeeze().sum().numpy()# 打印訓練信息loss_mean += loss.item()train_curve.append(loss.item())if (i+1) % log_interval == 0:loss_mean = loss_mean / log_intervalprint("Training:Epoch[{:0>3}/{:0>3}] Iteration[{:0>3}/{:0>3}] Loss: {:.4f} Acc:{:.2%}".format(epoch, MAX_EPOCH, i+1, len(train_loader), loss_mean, correct / total))loss_mean = 0.# 記錄數據,保存于event filewriter.add_scalars("Loss", {"Train": loss.item()}, iter_count)writer.add_scalars("Accuracy", {"Train": correct / total}, iter_count)scheduler.step() # 更新學習率# validate the modelif (epoch+1) % val_interval == 0:correct_val = 0.total_val = 0.loss_val = 0.net.eval()with torch.no_grad():for j, data in enumerate(valid_loader):inputs, labels = dataoutputs = net(inputs)loss = criterion(outputs, labels)_, predicted = torch.max(outputs.data, 1)total_val += labels.size(0)correct_val += (predicted == labels).squeeze().sum().numpy()loss_val += loss.item()valid_curve.append(loss.item())print("Valid:\t Epoch[{:0>3}/{:0>3}] Iteration[{:0>3}/{:0>3}] Loss: {:.4f} Acc:{:.2%}".format(epoch, MAX_EPOCH, j+1, len(valid_loader), loss_val, correct / total))# 記錄數據,保存于event filewriter.add_scalars("Loss", {"Valid": loss.item()}, iter_count)writer.add_scalars("Accuracy", {"Valid": correct / total}, iter_count)train_x = range(len(train_curve)) train_y = train_curvetrain_iters = len(train_loader) valid_x = np.arange(1, len(valid_curve)+1) * train_iters*val_interval # 由于valid中記錄的是epochloss,需要對記錄點進行轉換到iterations valid_y = valid_curveplt.plot(train_x, train_y, label='Train') plt.plot(valid_x, valid_y, label='Valid')plt.legend(loc='upper right') plt.ylabel('loss value') plt.xlabel('Iteration') plt.show()

    首先看一下不使用BN層不使用初始化只用了LeNet的結果:

    后期數據出現不理想的情況會使得訓練損失發生較大震蕩。

    再看一下加上初始化后的結果:

    后期不再震蕩,但是前期也不是很理想。

    最后看使用加了BN層的LeNet的結果:

    相對來說,這是比較理想的損失函數曲線,盡管有震蕩,但是幅度很小。

    四、PyTorch中BN的實現

    1._BatchNorm類

    class _BatchNorm(_NormBase):def __init__(self, num_features, eps=1e-5, momentum=0.1, affine=True,track_running_stats=True):super(_BatchNorm, self).__init__(num_features, eps, momentum, affine, track_running_stats)def forward(self, input):self._check_input_dim(input)# exponential_average_factor is set to self.momentum# (when it is available) only so that it gets updated# in ONNX graph when this node is exported to ONNX.if self.momentum is None:exponential_average_factor = 0.0else:exponential_average_factor = self.momentumif self.training and self.track_running_stats:# TODO: if statement only here to tell the jit to skip emitting this when it is Noneif self.num_batches_tracked is not None:self.num_batches_tracked = self.num_batches_tracked + 1if self.momentum is None: # use cumulative moving averageexponential_average_factor = 1.0 / float(self.num_batches_tracked)else: # use exponential moving averageexponential_average_factor = self.momentumreturn F.batch_norm(input, self.running_mean, self.running_var, self.weight, self.bias,self.training or not self.track_running_stats,exponential_average_factor, self.eps)

    這是BN層需要繼承的基類,從init函數可以看出主要參數如下:

  • num_features:一個樣本的特征數量。
  • eps:分母修正項,防止標準化時除以一個為0的方差使得出錯。
  • momentum:指數加權平均估計當前mean/var。
  • affine:是否需要affine transform。
  • track_running_stats:是否為訓練狀態,因為訓練模式的mean/var是基于當前數據指數加權平均計算得到的,每個batch都不一樣,而測試模式時的mean/var是統計得到,是固定的,不隨batch而變化。
  • 此外,從forward函數中可以看到實現標準化和仿射變換操作的,是最后的return,它調用了PyTorch的functional功能,在這個調用里主要屬性有:

  • running_mean:均值。
  • running_var:方差。
  • weight:仿射變換中的gamma。
  • bias:仿射變換中的beta。
  • 對應下面這個公式里的四個參數:

    訓練時均值和方差是采用指數加權平均計算得到的,公式如下所示:

    其中,pre_running_mean是上一個batch計算得到的均值,mean_t是當前batch下求取的均值,最終的均值是這樣的一個指數加權平均的形式,方差也是同理。

    2.nn.BatchNorm1d/2d/3d

    (1)nn.BatchNorm1d

    與其他網絡層類似,BN層也有三種維度,以一維的為例:

    torch.nn.BatchNorm1d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

    參數都是基類_BatchNorm的參數。

    上面介紹了標準化的計算公式,但是BN并不是簡單的將這一個batch的數據全部放在一起求均值和方差,而是一種逐特征(在特征這個維度上)的計算方式,一維數據如下圖所示:

    每一列代表一個數據樣本,一共有三個,每個數據樣本有5個特征(類似RGB模式),每個特征下就是一個特征的維度,在一維的情況下就是(1),所以數據維度是一個3×5×1的形式,而BN所做的是將三個樣本的第一個特征進行標準化和仿射變換,即三個1這行計算均值和方差,同理,另外四行都是如此,因為是對每個特征進行單獨的計算均值和方差,所以稱為逐特征的計算方式。

    下面給出PyTorch的實現代碼:

    import torch import numpy as np import torch.nn as nn import sys, os from tools.common_tools import set_seedset_seed(1) # 設置隨機種子# ======================================== nn.BatchNorm1d flag = 1 # flag = 0 if flag:batch_size = 3num_features = 5momentum = 0.3features_shape = (1)# 下面三行就是手動構建一個B×C×features_shape :3×5×1 的上述數據feature_map = torch.ones(features_shape) # 1Dfeature_maps = torch.stack([feature_map*(i+1) for i in range(num_features)], dim=0) # 2Dfeature_maps_bs = torch.stack([feature_maps for i in range(batch_size)], dim=0) # 3Dprint("input data:\n{} shape is {}".format(feature_maps_bs, feature_maps_bs.shape))bn = nn.BatchNorm1d(num_features=num_features, momentum=momentum)running_mean, running_var = 0, 1for i in range(2):outputs = bn(feature_maps_bs)print("\niteration:{}, running mean: {} ".format(i, bn.running_mean))print("iteration:{}, running var:{} ".format(i, bn.running_var))# 以下是手動計算的驗證過程mean_t, var_t = 2, 0running_mean = (1 - momentum) * running_mean + momentum * mean_trunning_var = (1 - momentum) * running_var + momentum * var_tprint("iteration:{}, 第二個特征的running mean: {} ".format(i, running_mean))print("iteration:{}, 第二個特征的running var:{}".format(i, running_var))

    結果如下:

    input data: tensor([[[1.],[2.],[3.],[4.],[5.]],[[1.],[2.],[3.],[4.],[5.]],[[1.],[2.],[3.],[4.],[5.]]]) shape is torch.Size([3, 5, 1])iteration:0, running mean: tensor([0.3000, 0.6000, 0.9000, 1.2000, 1.5000]) iteration:0, running var:tensor([0.7000, 0.7000, 0.7000, 0.7000, 0.7000]) iteration:0, 第二個特征的running mean: 0.6 iteration:0, 第二個特征的running var:0.7iteration:1, running mean: tensor([0.5100, 1.0200, 1.5300, 2.0400, 2.5500]) iteration:1, running var:tensor([0.4900, 0.4900, 0.4900, 0.4900, 0.4900]) iteration:1, 第二個特征的running mean: 1.02 iteration:1, 第二個特征的running var:0.48999999999999994

    一開始均值和方差為0和1,momentum為0.3,第一個特征的當前均值為1方差為0,可以自己動手算一下,第一個特征的running_mean=0.7×0+0.3×1=0.3;第一個特征的running_var=0.7×1+0.3×0=0.7;剩下的計算類似,動手算一下加深理解。

    (2)nn.BatchNorm2d

    再來看一下二維的情況,其實和一維類似,只是特征本身的維度變成了二維:

    橫軸還是樣本數,縱軸還是特征數,還是將三個樣本的第一個特征算一下均值方差,第二個第三個特征類似,還是這樣一行一行的算,所以這時的輸入數據維度會變成四維的:B×C×W×H,B是一個batch樣本數,C為特征數,W和H為特征維度,如圖中應該是:3×3×2×2,下面看一下實現,為區別B和C,代碼中B為3,即三個樣本,C為6,即六個特征:

    flag = 1 # flag = 0 if flag:batch_size = 3num_features = 6momentum = 0.3features_shape = (2, 2)feature_map = torch.ones(features_shape) # 2Dfeature_maps = torch.stack([feature_map*(i+1) for i in range(num_features)], dim=0) # 3Dfeature_maps_bs = torch.stack([feature_maps for i in range(batch_size)], dim=0) # 4Dprint("input data:\n{} shape is {}".format(feature_maps_bs, feature_maps_bs.shape))bn = nn.BatchNorm2d(num_features=num_features, momentum=momentum)running_mean, running_var = 0, 1for i in range(2):outputs = bn(feature_maps_bs)print("\niter:{}, running_mean.shape: {}".format(i, bn.running_mean.shape))print("iter:{}, running_var.shape: {}".format(i, bn.running_var.shape))print("iter:{}, weight.shape: {}".format(i, bn.weight.shape))print("iter:{}, bias.shape: {}".format(i, bn.bias.shape))

    結果如下:

    input data: tensor([[[[1., 1.],[1., 1.]],[[2., 2.],[2., 2.]],[[3., 3.],[3., 3.]],[[4., 4.],[4., 4.]],[[5., 5.],[5., 5.]],[[6., 6.],[6., 6.]]],[[[1., 1.],[1., 1.]],[[2., 2.],[2., 2.]],[[3., 3.],[3., 3.]],[[4., 4.],[4., 4.]],[[5., 5.],[5., 5.]],[[6., 6.],[6., 6.]]],[[[1., 1.],[1., 1.]],[[2., 2.],[2., 2.]],[[3., 3.],[3., 3.]],[[4., 4.],[4., 4.]],[[5., 5.],[5., 5.]],[[6., 6.],[6., 6.]]]]) shape is torch.Size([3, 6, 2, 2])iter:0, running_mean.shape: torch.Size([6]) iter:0, running_var.shape: torch.Size([6]) iter:0, weight.shape: torch.Size([6]) iter:0, bias.shape: torch.Size([6])iter:1, running_mean.shape: torch.Size([6]) iter:1, running_var.shape: torch.Size([6]) iter:1, weight.shape: torch.Size([6]) iter:1, bias.shape: torch.Size([6])

    觀察一下四個參數的size為6,因為是逐特征的計算。

    (3)nn.BatchNorm3d


    只是特征維度變成三維,計算方式還是逐特征的,看一下實現,注意這里特征數又變成了4:

    flag = 1 # flag = 0 if flag:batch_size = 3num_features = 4momentum = 0.3features_shape = (2, 2, 3)feature = torch.ones(features_shape) # 3Dfeature_map = torch.stack([feature * (i + 1) for i in range(num_features)], dim=0) # 4Dfeature_maps = torch.stack([feature_map for i in range(batch_size)], dim=0) # 5Dprint("input data:\n{} shape is {}".format(feature_maps, feature_maps.shape))bn = nn.BatchNorm3d(num_features=num_features, momentum=momentum)running_mean, running_var = 0, 1for i in range(2):outputs = bn(feature_maps)print("\niter:{}, running_mean.shape: {}".format(i, bn.running_mean.shape))print("iter:{}, running_var.shape: {}".format(i, bn.running_var.shape))print("iter:{}, weight.shape: {}".format(i, bn.weight.shape))print("iter:{}, bias.shape: {}".format(i, bn.bias.shape))

    結果如下:

    input data: tensor([[[[[1., 1., 1.],[1., 1., 1.]],[[1., 1., 1.],[1., 1., 1.]]],[[[2., 2., 2.],[2., 2., 2.]],[[2., 2., 2.],[2., 2., 2.]]],[[[3., 3., 3.],[3., 3., 3.]],[[3., 3., 3.],[3., 3., 3.]]],[[[4., 4., 4.],[4., 4., 4.]],[[4., 4., 4.],[4., 4., 4.]]]],[[[[1., 1., 1.],[1., 1., 1.]],[[1., 1., 1.],[1., 1., 1.]]],[[[2., 2., 2.],[2., 2., 2.]],[[2., 2., 2.],[2., 2., 2.]]],[[[3., 3., 3.],[3., 3., 3.]],[[3., 3., 3.],[3., 3., 3.]]],[[[4., 4., 4.],[4., 4., 4.]],[[4., 4., 4.],[4., 4., 4.]]]],[[[[1., 1., 1.],[1., 1., 1.]],[[1., 1., 1.],[1., 1., 1.]]],[[[2., 2., 2.],[2., 2., 2.]],[[2., 2., 2.],[2., 2., 2.]]],[[[3., 3., 3.],[3., 3., 3.]],[[3., 3., 3.],[3., 3., 3.]]],[[[4., 4., 4.],[4., 4., 4.]],[[4., 4., 4.],[4., 4., 4.]]]]]) shape is torch.Size([3, 4, 2, 2, 3])iter:0, running_mean.shape: torch.Size([4]) iter:0, running_var.shape: torch.Size([4]) iter:0, weight.shape: torch.Size([4]) iter:0, bias.shape: torch.Size([4])iter:1, running_mean.shape: torch.Size([4]) iter:1, running_var.shape: torch.Size([4]) iter:1, weight.shape: torch.Size([4]) iter:1, bias.shape: torch.Size([4])

    總結

    以上是生活随笔為你收集整理的PyTorch框架学习十七——Batch Normalization的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    色丁香久久| 国产精品乱码久久久久久1区2区 | 欧美成人亚洲成人 | 狠狠色丁香婷婷综合最新地址 | 福利一区在线视频 | 天干啦夜天干天干在线线 | 精品国产一区二区三区免费 | 亚洲国产精品成人精品 | 久久久久国产成人精品亚洲午夜 | 久久国产免费视频 | 视频精品一区二区三区 | av中文国产 | 97视频免费| 正在播放久久 | 草免费视频 | 精品亚洲午夜久久久久91 | 国产精品国产三级国产aⅴ9色 | 婷婷久久网站 | 激情欧美一区二区三区免费看 | 麻豆视频在线免费看 | 99视频免费看 | 久久激五月天综合精品 | 五月婷在线播放 | 天天操天天射天天操 | 久久国产精品久久w女人spa | 特级免费毛片 | 啪啪动态视频 | av网站免费在线 | 亚洲午夜精品久久久久久久久 | 国产福利午夜 | 黄色大片免费播放 | 免费色婷婷| 欧美三级高清 | 久久欧美精品 | 国产小视频在线观看 | 午夜精品三区 | 国产成人精品久久久 | 国产999精品久久久 免费a网站 | 亚洲精品国产视频 | 久久精品视频18 | 国产精品一区二区果冻传媒 | 国产精品九九久久久久久久 | japanesefreesexvideo高潮 | 国产在线理论片 | 免费看国产a | 亚洲综合色av | 国产精品成人一区二区三区吃奶 | 亚洲欧美成人在线 | 色综合激情久久 | 免费在线观看一级片 | 免费福利在线 | 91精品国产乱码久久桃 | 四虎8848免费高清在线观看 | 五月婷婷av | www.香蕉视频在线观看 | 国产护士hd高朝护士1 | 麻豆国产电影 | 麻花豆传媒一二三产区 | 天天操天天干天天操天天干 | 精品视频123区在线观看 | 不卡的av在线播放 | 日黄网站 | 91在线免费播放视频 | 五月婷婷综合在线观看 | 精品99在线 | 国产v在线观看 | 欧美成人h版在线观看 | 91在线看网站 | 丝袜美腿一区 | 久久久久久久久久久久国产精品 | 欧美成人日韩 | 色偷偷男人的天堂av | 免费观看xxxx9999片 | 中文字幕亚洲欧美日韩 | 97激情影院| 国产免费成人 | 中文字幕在线视频免费播放 | 日韩有码在线播放 | 成人毛片100免费观看 | 2019中文字幕第一页 | 黄色日本片| 色综合久久久 | 国产女v资源在线观看 | 日韩网站在线观看 | 欧美日韩中文字幕在线视频 | 国产精品成人自拍 | 久久综合婷婷综合 | 日日躁夜夜躁xxxxaaaa | 久久夜色精品国产欧美乱极品 | 久久久久久久久久影视 | 特级毛片爽www免费版 | 精品久久91 | 毛片网在线播放 | 天天色草 | 久久久久久久久久久久久9999 | 中文字幕黄色 | 日批网站在线观看 | 99精品视频在线播放免费 | 中文字幕视频网站 | 日韩视频一| 天天色欧美| 欧美一级片免费观看 | 国产精品久久久影视 | 欧美亚洲国产一卡 | 在线观看久久 | 国产精品久久久久一区二区国产 | 婷婷日| 超碰97在线看 | 欧美91精品久久久久国产性生爱 | 色偷偷88欧美精品久久久 | 久久99久久99精品中文字幕 | 亚洲伊人网在线观看 | 免费看黄色小说的网站 | 99视频精品全国免费 | 久久视频网 | 国产精品久久久久久久久久99 | 久久r精品 | 亚洲在线网址 | 在线看污网站 | 超碰最新网址 | 特级黄色一级 | 日韩免费一区二区三区 | 国产精品久久久久一区二区三区 | 中文字幕乱码一区二区 | 日韩一区二区三区免费视频 | 干狠狠| 人人爽人人片 | 精品自拍网| 精品国产乱码一区二 | 97干com| 天天干,天天射,天天操,天天摸 | 日韩色在线观看 | 亚洲国产精选 | 丁香婷婷激情网 | www国产一区 | 91最新在线| 免费看的黄网站 | 成人在线播放网站 | 久久久www | 久久天堂精品视频 | 久草免费看 | 一级片免费观看视频 | 91热这里只有精品 | www.日日操.com | 免费观看性生活大片3 | 久久久精品久久 | 五月婷婷在线观看 | 国产69久久精品成人看 | 日日干天天爽 | 国产日产精品久久久久快鸭 | 午夜视频在线观看一区二区三区 | 亚洲 av网站 | 综合网av | 中文字幕在线观看第二页 | 久久久久久久久久久成人 | 午夜美女网站 | 免费成人av | 在线国产一区二区三区 | av丝袜在线 | 手机看片久久 | 免费欧美精品 | 国产不卡高清 | 四虎影视www | www激情久久 | 色视频网址 | 干干夜夜 | 国产精品久久久久久久久久久杏吧 | www.五月天婷婷 | 久久久 激情 | 色中色亚洲 | 91视视频在线直接观看在线看网页在线看 | 天天操夜夜拍 | 天天干天天操av | 欧美激情奇米色 | 91在线观看高清 | 最近中文字幕免费 | 成年人在线免费看片 | 婷婷丁香在线视频 | 天天操天天操天天操 | 久久国产影视 | 成人国产电影在线观看 | 欧美精品做受xxx性少妇 | 免费看日韩片 | 国产精品久久久久久久久蜜臀 | 中文字幕在线观看一区二区 | 国产小视频在线观看 | 欧美黑人xxxx猛性大交 | 久久久在线观看 | 97热在线观看 | 91精彩视频 | 成人免费91 | 丝袜美腿一区 | 精品视频成人 | 成人影音在线 | 精品一区在线 | 亚洲国产999 | 黄色的网站在线 | 日韩精品不卡在线观看 | 99精品久久精品一区二区 | 成人cosplay福利网站 | 91av中文 | 免费a v在线 | 在线播放av网址 | 91免费高清 | 国产欧美在线一区二区三区 | 天天曰夜夜操 | 一区二区三区四区精品 | 欧美性黑人 | 久青草国产在线 | 网站在线观看你们懂的 | a在线视频v视频 | 97在线免费 | 国产精品久久久久久久久久妇女 | 91九色丨porny丨丰满6 | 久久免费的精品国产v∧ | 欧美性生活久久 | 久久专区| www成人精品 | 五月天综合色激情 | 日韩久久网站 | 日韩免费一级电影 | 午夜精品久久久久久99热明星 | 国产成人av免费在线观看 | 91片黄在线观看 | 欧美乱码精品一区二区 | 亚洲男女精品 | 欧美亚洲精品一区 | 一区二区视频网站 | 亚洲黄色app| 亚洲天堂网视频 | 99视频精品全国免费 | 99久久精品久久久久久动态片 | 99视频免费在线观看 | 精品成人网 | 日韩在线免费观看视频 | 国产精品亚洲片在线播放 | 最新亚洲视频 | 国产精品高清在线 | 伊人资源站 | 亚洲精品国产精品国自产在线 | 成人羞羞视频在线观看免费 | 中文字幕在线观看视频网站 | 一级片视频免费观看 | 欧洲精品一区二区 | 中文字幕欧美激情 | 97电影手机版| 国产护士hd高朝护士1 | 国产一线天在线观看 | 欧美日韩国产综合一区二区 | 久久草草影视免费网 | 国产精品九九九九九 | 久久99国产视频 | 亚洲黄色片一级 | 久久久久免费精品视频 | 精品国产乱码久久久久久三级人 | 天天曰天天干 | 在线观看免费av网 | 日韩av在线小说 | 探花视频在线观看免费版 | 国产精品视频免费在线观看 | 99热这里只有精品国产首页 | 欧美中文字幕久久 | 国产亚洲精品久久久久久电影 | 香蕉97视频观看在线观看 | 一区二区三区高清在线 | 久久精品久久精品久久39 | 亚洲三级av | 人人爽人人搞 | 2018亚洲男人天堂 | 亚洲一区二区三区毛片 | 99这里都是精品 | av电影免费在线 | 国产精品激情偷乱一区二区∴ | 日韩精品免费一区二区在线观看 | 欧美一区三区四区 | 在线97| 中文字幕文字幕一区二区 | 久久一区二区免费视频 | h网站免费在线观看 | 亚洲 综合 专区 | 亚洲理论片 | 久久久久久免费网 | 国产人免费人成免费视频 | 99一级片| 国产精品亚洲成人 | 99久久99久久精品免费 | 久久草草热国产精品直播 | 久久怡红院 | 亚洲日韩中文字幕在线播放 | 欧美一级黄大片 | 99精品国产一区二区三区不卡 | 欧美日韩高清免费 | 五月婷婷色播 | 91视频久久久久 | 国产明星视频三级a三级点| 久久综合视频网 | 久久久在线 | 国产美女精品视频免费观看 | 一区二区三区电影 | 国产亚洲成av片在线观看 | 亚洲国产三级在线观看 | www.夜夜操.com| 国产91亚洲 | 欧美一级欧美一级 | 亚洲精品网址在线观看 | 极品久久久久 | 成人黄色电影在线观看 | 色综合久久久久综合体桃花网 | 成人一区二区在线观看 | 婷婷久草 | 成年人免费在线观看网站 | 99爱这里只有精品 | 亚洲精品九九 | 丝袜av一区 | 免费在线观看av片 | 午夜久久视频 | 激情影音先锋 | 国产精品一区二区在线免费观看 | 九草视频在线 | 99精品视频中文字幕 | 有码视频在线观看 | 久久这里只有精品1 | 日韩在线国产精品 | 在线观看视频三级 | 国产一级黄色免费看 | 91福利社在线观看 | 久久高视频 | 午夜在线免费视频 | 人人艹视频| 欧美日韩高清在线观看 | 国产精品美女久久久免费 | 九色在线 | 黄色视屏在线免费观看 | 在线欧美日韩 | 久久久综合色 | 国产久草在线观看 | 久久久国产精品人人片99精片欧美一 | 精壮的侍卫呻吟h | 色综合久久网 | 91色综合 | 国产一区二区三区免费在线 | 一级免费看 | 天天鲁天天干天天射 | 亚洲专区中文字幕 | 欧美亚洲精品一区 | 在线观看免费视频你懂的 | av久久久 | 91麻豆精品国产91久久久无限制版 | 日本久久久精品视频 | 成人黄色av网站 | 国产一级视频在线 | 日韩久久久久久 | 免费视频91蜜桃 | 亚洲一级黄色大片 | 久草在线手机视频 | 日韩在线观看视频免费 | 久久精品综合一区 | 成年人免费在线观看网站 | 天天曰夜夜操 | 国产成人精品在线播放 | 亚洲视频免费 | 日韩中文字幕电影 | 日韩在线观看视频网站 | 亚洲国产一区二区精品专区 | 国产一级免费av | 香蕉久久久久久久 | 视频三区在线 | 亚洲自拍av在线 | 久久精品一区二区三区国产主播 | 国产爽妇网 | 爱色婷婷| 日韩精品电影在线播放 | 黄色三级网站 | 久久精品综合视频 | 天天干国产 | 日韩有码在线观看视频 | av在线免费在线观看 | 国产亲近乱来精品 | 97精品国自产拍在线观看 | 网站你懂的 | 午夜久草 | 视频一区在线免费观看 | 精品在线视频一区 | 四虎在线观看 | 日韩精品一区二区在线观看 | 日本视频高清 | 免费看日韩片 | 天天天天天天操 | 中文av在线天堂 | 免费黄色小网站 | 高清在线一区 | 日韩精品aaa| 欧洲一区二区在线观看 | 国产成人精品av在线观 | 婷婷丁香导航 | 日本久久久久久久久 | 97精品欧美91久久久久久 | 日韩av在线免费播放 | 国产字幕在线看 | 国产一区二区免费 | 亚洲午夜精品久久久久久久久 | 日批视频在线 | 日韩| 97电影在线观看 | 人人爽人人看 | 久久一视频 | 五月婷婷一区二区三区 | 九九久久精品视频 | 五月天亚洲激情 | 日日夜夜天天 | 中文字幕 欧美性 | av电影中文字幕在线观看 | 精品国产乱码久久久久久久 | 69精品在线 | 日日夜夜网 | 日韩欧美99| 日韩字幕| 亚洲年轻女教师毛茸茸 | 亚洲成av人片在线观看无 | 中文在线a∨在线 | 亚洲激情免费 | 日本在线观看一区二区 | 午夜美女福利 | 国产精品成人自产拍在线观看 | 国产精品第52页 | 国产在线国偷精品产拍免费yy | 五月婷在线视频 | 伊人手机在线 | 中文字幕一区二区在线播放 | 亚洲精品乱码久久 | 日韩在线一区二区免费 | 婷婷亚洲综合 | 国产日韩欧美在线观看视频 | 国产中文字幕视频在线观看 | 国产在线精品福利 | 男女激情免费网站 | 欧美精品乱码99久久影院 | 日日干网址| 日日干日日色 | 亚洲国产精品女人久久久 | 在线亚洲成人 | 日日夜夜狠狠 | 国产激情小视频在线观看 | 久久久99久久 | 中文字幕美女免费在线 | 欧美动漫一区二区三区 | 久久久久福利视频 | 美女网站在线免费观看 | 亚洲最大的av网站 | 久久综合九色综合久99 | 久久久久久美女 | 成人天堂网 | 六月丁香伊人 | 日韩av中文 | 国外调教视频网站 | 国产亚洲精品久久久久久无几年桃 | 日韩精品一区二区三区高清免费 | 97夜夜澡人人爽人人免费 | 日本视频久久久 | 色妞色视频一区二区三区四区 | 国产手机视频 | 五月婷在线观看 | 麻豆极品 | 亚洲精品国产高清 | ww亚洲ww亚在线观看 | 亚洲国产精品日韩 | 一区二区三区四区在线免费观看 | 干干操操 | 欧美二区三区91 | 日本韩国在线不卡 | 麻豆视频在线免费看 | 天天色婷婷 | 91精品综合在线观看 | 爱爱av网 | 久久精品国产一区二区三区 | 91爱爱免费观看 | 国产+日韩欧美 | 欧美性色黄大片在线观看 | 免费看黄在线 | 午夜精品久久久久久久99 | 亚洲精品视频在线观看网站 | 日韩欧美大片免费观看 | 亚洲va天堂va欧美ⅴa在线 | 国产成人精品电影久久久 | 日本性动态图 | 日韩在观看线 | 中文字幕永久在线 | 成人午夜电影久久影院 | 久久久久看片 | 99国产视频 | 久久69精品久久久久久久电影好 | 国产精品尤物 | 久久精品2 | 国产在线视频一区二区三区 | 中文字幕 二区 | 韩国av永久免费 | 国产伦精品一区二区三区… | 欧美激情另类文学 | 日韩欧美电影网 | 久久6精品 | 精品美女久久 | 国产精品一区二区三区久久久 | 亚洲精品电影在线 | 青青色影院 | 国产高潮久久 | 亚洲一区网 | 一区二区精品在线观看 | 日韩精品一区二区三区三炮视频 | 国产成人精品999 | 美女视频免费一区二区 | 婷婷中文字幕综合 | 亚洲第一香蕉视频 | 伊人久久国产 | 韩国在线一区二区 | 亚洲精品美女久久17c | 香蕉视频在线网站 | 天天弄天天操 | 婷婷视频 | 天天爱天天射 | 国产福利小视频在线 | 国产精品毛片久久久久久 | 日韩欧美视频一区 | 成人在线免费观看网站 | 成人激情开心网 | 一级免费av| 久久久精品一区二区三区 | 中文字幕在线观看2018 | 色www.| 91在线视频播放 | 国产原创在线观看 | 日本黄色黄网站 | 色婷婷久久一区二区 | 成人一区影院 | 四虎国产| 久9在线 | 久久国色夜色精品国产 | 久久这里只有精品久久 | 国产大片免费久久 | av中文字幕亚洲 | 国产香蕉97碰碰碰视频在线观看 | 日韩乱码在线 | 久久免费视频6 | 最近日本韩国中文字幕 | 国产一区二区手机在线观看 | 婷婷色综合网 | 成全免费观看视频 | 国产精品免费在线视频 | 色噜噜狠狠狠狠色综合久不 | 美女搞黄国产视频网站 | 日本黄区免费视频观看 | 日韩av视屏| 久久精品欧美一区二区三区麻豆 | 天天操天天射天天添 | 天天干,夜夜操 | 国产精品一区二区三区四 | 成人欧美一区二区三区在线观看 | 久久精品视频国产 | 亚洲国内精品在线 | 玖玖在线观看视频 | 91看片淫黄大片一级在线观看 | 亚洲免费在线观看视频 | 国产精品久久久久久久久久久久午夜 | 亚洲精品黄网站 | 日韩激情在线 | 在线看的av网站 | 免费试看一区 | 国产91免费在线观看 | 在线观看视频国产 | 91视频国产免费 | 欧美性脚交 | 日韩视频免费观看高清完整版在线 | 国产一线二线三线性视频 | 91网页版免费观看 | 免费在线色电影 | 久久免费一 | 国产99色| 成人黄色电影视频 | 精品久久一级片 | 男女啪啪视屏 | 国外成人在线视频网站 | 欧美精品被 | 天天干,狠狠干 | 久草视频免费在线观看 | 天天综合亚洲 | 丁香花在线观看免费完整版视频 | 在线观看视频一区二区三区 | 久久久久久高潮国产精品视 | 日韩中文字幕视频在线观看 | 久久久久一区 | 日韩精品一区二区三区外面 | 日韩欧美在线一区 | 久久久精品小视频 | 国产区欧美 | 香蕉视频在线网站 | 激情深爱.com | 婷婷看片| 99精品在线免费观看 | 色婷丁香| 精品国产伦一区二区三区观看说明 | 摸阴视频 | 欧美日韩另类在线 | 久久99网 | 91免费观看视频网站 | 国产又粗又猛又黄又爽视频 | 久久视精品 | 亚洲精品视频在线观看免费视频 | 欧美 亚洲 另类 激情 另类 | 69热国产视频 | 欧美日韩另类在线 | 激情久久久久久久久久久久久久久久 | 精品久久1 | 国产aaa毛片| 成人播放器 | 欧美日韩性视频 | www日韩视频 | 亚洲精品在线观看中文字幕 | 夜色在线资源 | 精品美女久久久久 | 国产精品一区二区吃奶在线观看 | 亚洲不卡在线 | 色综合久久久久综合 | 久久免费99 | 午夜精品一区二区三区可下载 | 又黄又刺激又爽的视频 | 99久久日韩精品视频免费在线观看 | 久草在线视频网 | 成人中文字幕+乱码+中文字幕 | 国产中文字幕在线播放 | 丝袜足交在线 | 天天干天天摸 | 毛片一级免费一级 | 成人免费 在线播放 | 日韩欧美在线免费 | 国产不卡一二三区 | 麻豆精品视频在线观看免费 | 天天操婷婷| 一区二区三区免费看 | 四虎影视成人精品国库在线观看 | 午夜 在线| 日韩一区二区免费播放 | 久久久午夜精品理论片中文字幕 | 日韩中文字幕在线观看 | 精品国产乱码 | 精品在线播放 | 六月丁香综合网 | 亚洲免费永久精品国产 | 日韩美一区二区三区 | 成年人在线观看视频免费 | 国产精品一区二区久久 | 激情丁香5月 | 三级视频国产 | 一级片免费在线 | 久久永久视频 | 亚洲精品在线视频网站 | 久久精品久久久久电影 | 色就是色综合 | 久久一区91 | 丁香六月天婷婷 | 欧美精品国产综合久久 | 美女黄频在线观看 | 91麻豆传媒| 五月婷婷中文 | 三级在线视频观看 | 在线小视频你懂的 | 国产精品一区二区av | 亚洲精品免费看 | 一区二区三区在线免费观看视频 | 欧美综合干 | 久久99精品视频 | 综合亚洲视频 | 中文字幕在线观看91 | 亚洲黄色片| 91人人射| 国产在线免费av | 毛片区 | 成人免费视频网站 | 超碰在线人人草 | 欧美一级片免费在线观看 | 午夜精品福利一区二区 | 色天天中文 | 色婷婷免费视频 | 久久久亚洲电影 | 中文国产成人精品久久一 | 亚洲国产一区二区精品专区 | 五月天狠狠操 | 免费看色网站 | 中午字幕在线观看 | 99福利片| 国产精品门事件 | 狠色狠色综合久久 | 亚洲黄a| 国产成人一区二区三区影院在线 | 国内精品福利视频 | 六月色丁香| 国产午夜免费视频 | 日韩成人高清在线 | 中文区中文字幕免费看 | 黄色毛片在线 | 丁香 婷婷 激情 | 在线精品亚洲一区二区 | 亚洲最新av在线 | 日日夜夜天天 | 久草精品在线播放 | 亚洲免费在线观看视频 | 五月综合激情 | 亚洲精品在线一区二区三区 | 国产精品午夜久久久久久99热 | 四虎免费在线观看 | 精品久久片 | 午夜资源站| 天天操,夜夜操 | 91av社区 | 国产成人精品一区二区三区网站观看 | 欧美a级在线 | 天天做天天爱夜夜爽 | 国产成人精品午夜在线播放 | 免费观看丰满少妇做爰 | 国产成人精品日本亚洲999 | 成人免费xxx在线观看 | 成人一级免费视频 | 久久99精品久久久久久 | 在线v片| 五月婷婷丁香综合 | 91精品色| 国产成人av网 | 西西444www大胆高清图片 | 久久精品老司机 | 国产中文字幕免费 | 欧美巨大荫蒂茸毛毛人妖 | 国产青春久久久国产毛片 | 福利一区二区三区四区 | 国产美女网站在线观看 | 久久精品爱爱视频 | 蜜桃视频精品 | 又黄又爽又刺激的视频 | 日韩激情影院 | 精品黄色在线观看 | 欧美一级专区免费大片 | 亚洲天天| 天天爱天天射天天干天天 | 国产精品高潮呻吟久久av无 | 91女子私密保健养生少妇 | 欧美日韩免费视频 | 午夜美女av| 91九色在线观看视频 | 久久免费视频5 | 97香蕉视频 | 日日干激情五月 | 国产永久免费高清在线观看视频 | 成人av高清在线观看 | 久草爱| 热99在线视频 | 国内精品国产三级国产aⅴ久 | 欧美成人xxxxx| 久久精精品视频 | 五月激情五月激情 | 日韩精品国产一区 | 亚洲成av人片在线观看无 | 久久久免费精品国产一区二区 | 999久久久久久久久6666 | 亚洲黄色成人 | 久久久电影网站 | 精品一区二区三区四区在线 | 缴情综合网五月天 | 成人h电影 | 国产成人久久久77777 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 亚洲午夜精品久久久 | 免费福利小视频 | 五月婷婷丁香在线观看 | 高潮毛片无遮挡高清免费 | 四虎欧美 | а中文在线天堂 | 免费高清无人区完整版 | 最新国产精品久久精品 | 视频99爱 | 免费看的黄色 | 天天操天天添天天吹 | 欧美一二三区播放 | 麻豆久久精品 | 射九九 | 国产一二三四在线视频 | 97人人爽人人 | 91精品国产福利 | 亚洲国产婷婷 | 午夜av色 | 国产成人精品亚洲日本在线观看 | 丁香午夜 | 久久综合导航 | 91精彩在线视频 | 国产精品手机视频 | 天天玩天天干天天操 | 亚洲国产成人精品在线观看 | 香蕉视频最新网址 | 最近日韩免费视频 | 黄a网站| 久久久久久久久久久久久久电影 | 国内外成人免费在线视频 | 激情伊人五月天久久综合 | 97色婷婷成人综合在线观看 | 亚洲天堂毛片 | 毛片888 | 天海翼一区二区三区免费 | 久久精品视频国产 | 久久中文字幕导航 | 夜夜爽88888免费视频4848 | 在线韩国电影免费观影完整版 | 韩国av在线| 91在线视频免费观看 | 97电影手机版 | 国产香蕉在线 | 伊人网av | 中文字幕之中文字幕 | 日韩中文字幕视频在线观看 | 中文一区二区三区在线观看 | 一区二区三区在线观看免费视频 | 免费看一级片 | 日韩高清精品免费观看 | 日韩久久久久久久 | 精品国产aⅴ麻豆 | 四虎影视成人精品国库在线观看 | 国产尤物在线视频 | 主播av在线 | 99re久久精品国产 | 国产精品福利在线播放 | 久久精品亚洲 | 亚洲激情网站免费观看 | 亚洲欧美日韩国产精品一区午夜 | 免费看污网站 | 色综合天天天天做夜夜夜夜做 | 中文字幕在线观看视频免费 | 日本中文字幕在线播放 | 在线导航av| 三级av免费 | 日韩欧美高清一区二区三区 | 97视频网址 | 月下香电影 | 日韩专区视频 | 91亚色视频在线观看 | 92国产精品久久久久首页 | 久久一区二区三区日韩 | 色在线网| 国产丝袜一区二区三区 | 毛片激情永久免费 | 亚洲专区视频在线观看 | 久久99这里只有精品 | 天天干天天草 | 国产伦理久久精品久久久久_ | 日日草夜夜操 | 欧美精品中文字幕亚洲专区 | 国产三级视频在线 | 欧美另类视频 | 国产精品欧美久久久久天天影视 | 美女视频黄频 | 亚洲综合黄色 | 久久精品精品电影网 | 久久久久人人 | 久久不射电影院 | 亚洲一区二区三区四区精品 | 片黄色毛片黄色毛片 | 国产亚洲精品成人av久久影院 | 久久伊人精品天天 | 日韩欧美精品一区二区 | 国产爽妇网 | 久久成人精品视频 | av在线电影免费观看 | 婷婷六月天在线 | 成人av电影在线播放 | 天天干天天做天天爱 | 美女视频黄免费的久久 | 久久国产精品免费一区二区三区 | 在线小视频你懂得 | 伊人激情网 | 中文字幕av有码 | 激情欧美一区二区免费视频 | 国产精品精品久久久 | 久久不射网站 | 日韩有码网站 | 在线观看成人小视频 | 友田真希x88av| 亚洲国产精品传媒在线观看 | 欧美性做爰猛烈叫床潮 | 玖玖视频在线 | 久久超碰免费 | 久久精品79国产精品 | 九九99视频 | www国产亚洲精品久久网站 | 激情小说 五月 | 婷婷综合伊人 | 最近中文字幕免费观看 | 国产精品成人免费 | www欧美色 | 日韩av不卡播放 | 国产资源网站 | 在线免费黄 | 久久九九久久精品 | a色视频| 久久精品久久综合 | 国产伦精品一区二区三区… | 综合色中文| 免费福利视频网站 | 在线你懂 | 最近日本字幕mv免费观看在线 | 亚洲最新av在线 | 国产精品视频免费观看 | 在线天堂v| 激情久久伊人 | 久久99久久精品 | 国产精品一区二区三区四区在线观看 | 国产九九九精品视频 | 四虎小视频 | 激情在线网 | 精品综合久久久 | 最新高清无码专区 | 九九精品视频在线 | 免费日韩视| 91黄色免费看 | 欧美国产亚洲精品久久久8v | 麻豆视频入口 | 免费观看mv大片高清 | 日韩av快播电影网 | 成人毛片在线观看视频 | 成人影片在线播放 | 免费午夜视频在线观看 | 国产只有精品 | 97在线影院| 国产免费专区 | 丁香婷婷综合激情五月色 | 亚洲国产成人久久综合 | 久草在线免费在线观看 | 国产九色91| 久久男人免费视频 | 99热国产精品 | 黄色精品网站 | 亚洲成人免费 | 欧美一级黄色片 | 天天操 夜夜操 | 欧美成人中文字幕 | 婷婷色5月 | 亚洲五月综合 | 久久久久久久久综合 | 99麻豆久久久国产精品免费 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 中文字幕专区高清在线观看 | www.久艹| 在线观看理论 | 狠狠色狠狠色综合日日小说 | 精品国产观看 | 国产精品毛片久久久久久 | 国产一区在线观看免费 | 国产成人久久精品一区二区三区 | 日韩在线视频线视频免费网站 | 亚洲国产影院 | 久久短视频 | 久久精品亚洲国产 | 一区二区三区四区不卡 | 久色婷婷| 免费在线黄色av | 日韩精品视频网站 | 欧美色黄 | 久久国产电影院 | 国产精品在线看 | 欧美精品中文字幕亚洲专区 | 高潮久久久久久 | 日本电影久久 | 91精品久久久久久久久 | 色婷婷伊人 | 免费看毛片网站 | 国产精品视频最多的网站 | 欧美一区视频 | 日韩欧美在线一区 | 国产精品午夜av | 国产一区二区在线影院 | 欧美激情第八页 | 在线观看一级视频 | 三级黄色大片在线观看 | 久久久午夜剧场 | 欧美在线1| 天天操天天舔天天爽 | 成人免费观看完整版电影 | 亚洲一级久久 | 精品中文字幕在线播放 | 国产在线观看免 | 三级黄色在线 | 国产精品久久 | 九九热在线精品视频 | 亚洲国产日韩精品 | 亚洲精品一区二区三区新线路 | 精品欧美小视频在线观看 | 一二三四精品 | 国产色啪 | 一二三精品视频 | 国产91av视频在线观看 | 成人久久18免费网站图片 | 日韩一级黄色av | 国产丝袜制服在线 | 97超碰资源网 | 国产麻豆果冻传媒在线观看 |