国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

PyTorch Cookbook(常用代碼合集)

共 19826字,需瀏覽 40分鐘

 ·

2021-02-01 20:15

↑↑↑關(guān)注后"星標"Datawhale
每日干貨?&?每月組隊學(xué)習(xí),不錯過
?Datawhale學(xué)習(xí)?
作者:張皓,南京大學(xué),編輯:機器學(xué)習(xí)實驗室

眾所周知,程序猿在寫代碼時通常會在網(wǎng)上搜索大量資料,其中大部分是代碼段。然而,這項工作常常令人心累身疲,耗費大量時間。所以,今天小編轉(zhuǎn)載了知乎上的一篇文章,介紹了一些常用PyTorch代碼段,希望能夠為奮戰(zhàn)在電腦桌前的眾多程序猿們提供幫助!

本文代碼基于 PyTorch 1.x 版本,需要用到以下包:


import?collections
import?os
import?shutil
import?tqdm

import?numpy?as?np
import?PIL.Image
import?torch
import?torchvision


基礎(chǔ)配置


檢查 PyTorch 版本


torch.__version__???????????????#?PyTorch?version
torch.version.cuda??????????????#?Corresponding?CUDA?version
torch.backends.cudnn.version()??#?Corresponding?cuDNN?version
torch.cuda.get_device_name(0)???#?GPU?type


更新 PyTorch


PyTorch 將被安裝在 anaconda3/lib/python3.7/site-packages/torch/目錄下。


conda?update?pytorch?torchvision?-c?pytorch


固定隨機種子


torch.manual_seed(0)
torch.cuda.manual_seed_all(0)


指定程序運行在特定 GPU 卡上


在命令行指定環(huán)境變量


CUDA_VISIBLE_DEVICES=0,1?python?train.py


或在代碼中指定


os.environ['CUDA_VISIBLE_DEVICES']?=?'0,1'


判斷是否有 CUDA 支持


torch.cuda.is_available()


設(shè)置為 cuDNN benchmark 模式


Benchmark 模式會提升計算速度,但是由于計算中有隨機性,每次網(wǎng)絡(luò)前饋結(jié)果略有差異。


torch.backends.cudnn.benchmark?=?True


如果想要避免這種結(jié)果波動,設(shè)置


torch.backends.cudnn.deterministic?=?True


清除 GPU 存儲


有時 Control-C 中止運行后 GPU 存儲沒有及時釋放,需要手動清空。在 PyTorch 內(nèi)部可以


torch.cuda.empty_cache()


或在命令行可以先使用 ps 找到程序的 PID,再使用 kill 結(jié)束該進程


ps?aux?|?grep?pythonkill?-9?[pid]


或者直接重置沒有被清空的 GPU


nvidia-smi?--gpu-reset?-i?[gpu_id]


張量處理


張量基本信息


tensor.type()???#?Data?type
tensor.size()???#?Shape?of?the?tensor.?It?is?a?subclass?of?Python?tuple
tensor.dim()????#?Number?of?dimensions.


數(shù)據(jù)類型轉(zhuǎn)換


#?Set?default?tensor?type.?Float?in?PyTorch?is?much?faster?than?double.
torch.set_default_tensor_type(torch.FloatTensor)

#?Type?convertions.
tensor?=?tensor.cuda()
tensor?=?tensor.cpu()
tensor?=?tensor.float()
tensor?=?tensor.long()

torch.Tensor 與 np.ndarray 轉(zhuǎn)換

#?torch.Tensor?->?np.ndarray.
ndarray?=?tensor.cpu().numpy()

#?np.ndarray?->?torch.Tensor.
tensor?=?torch.from_numpy(ndarray).float()
tensor?=?torch.from_numpy(ndarray.copy()).float()??#?If?ndarray?has?negative?stride


torch.Tensor 與 PIL.Image 轉(zhuǎn)換


PyTorch 中的張量默認采用 N×D×H×W 的順序,并且數(shù)據(jù)范圍在 [0, 1],需要進行轉(zhuǎn)置和規(guī)范化。


#?torch.Tensor?->?PIL.Image.
image?=?PIL.Image.fromarray(torch.clamp(tensor?*?255,?min=0,?max=255
????).byte().permute(1,?2,?0).cpu().numpy())
image?=?torchvision.transforms.functional.to_pil_image(tensor)??#?Equivalently?way

#?PIL.Image?->?torch.Tensor.
tensor?=?torch.from_numpy(np.asarray(PIL.Image.open(path))
????).permute(2,?0,?1).float()?/?255
tensor?=?torchvision.transforms.functional.to_tensor(PIL.Image.open(path))??#?Equivalently?way


np.ndarray 與 PIL.Image 轉(zhuǎn)換


#?np.ndarray?->?PIL.Image.
image?=?PIL.Image.fromarray(ndarray.astypde(np.uint8))

#?PIL.Image?->?np.ndarray.
ndarray?=?np.asarray(PIL.Image.open(path))


從只包含一個元素的張量中提取值


這在訓(xùn)練時統(tǒng)計 loss 的變化過程中特別有用。否則這將累積計算圖,使 GPU 存儲占用量越來越大。


value?=?tensor.item()


張量形變


張量形變常常需要用于將卷積層特征輸入全連接層的情形。相比 torch.view,torch.reshape 可以自動處理輸入張量不連續(xù)的情況。


tensor?=?torch.reshape(tensor,?shape)


打亂順序


tensor?=?tensor[torch.randperm(tensor.size(0))]??#?Shuffle?the?first?dimension

水平翻轉(zhuǎn)

PyTorch 不支持 tensor[::-1] 這樣的負步長操作,水平翻轉(zhuǎn)可以用張量索引實現(xiàn)。


#?Assume?tensor?has?shape?N*D*H*W.tensor?=?tensor[:,?:,?:,?torch.arange(tensor.size(3)?-?1,?-1,?-1).long()]

復(fù)制張量

有三種復(fù)制的方式,對應(yīng)不同的需求。


#?Operation?????????????????|??New/Shared?memory?|?Still?in?computation?graph?|
tensor.clone()????????????#?|????????New?????????|??????????Yes???????????????|
tensor.detach()???????????#?|??????Shared????????|??????????No????????????????|
tensor.detach.clone()()???#?|????????New?????????|??????????No????????????????|


拼接張量

注意 torch.cat 和 torch.stack 的區(qū)別在于 torch.cat 沿著給定的維度拼接,而 torch.stack 會新增一維。例如當(dāng)參數(shù)是 3 個 10×5 的張量,torch.cat 的結(jié)果是 30×5 的張量,而 torch.stack 的結(jié)果是 3×10×5 的張量。


tensor?=?torch.cat(list_of_tensors,?dim=0)
tensor?=?torch.stack(list_of_tensors,?dim=0)


將整數(shù)標記轉(zhuǎn)換成獨熱(one-hot)編碼

PyTorch 中的標記默認從 0 開始。


N?=?tensor.size(0)
one_hot?=?torch.zeros(N,?num_classes).long()
one_hot.scatter_(dim=1,?index=torch.unsqueeze(tensor,?dim=1),?src=torch.ones(N,?num_classes).long())

得到非零/零元素

torch.nonzero(tensor)???????????????#?Index?of?non-zero?elements
torch.nonzero(tensor?==?0)??????????#?Index?of?zero?elements
torch.nonzero(tensor).size(0)???????#?Number?of?non-zero?elements
torch.nonzero(tensor?==?0).size(0)??#?Number?of?zero?elements


張量擴展


#?Expand?tensor?of?shape?64*512?to?shape?64*512*7*7.
torch.reshape(tensor,?(64,?512,?1,?1)).expand(64,?512,?7,?7)


矩陣乘法


#?Matrix?multiplication:?(m*n)?*?(n*p)?->?(m*p).
result?=?torch.mm(tensor1,?tensor2)

#?Batch?matrix?multiplication:?(b*m*n)?*?(b*n*p)?->?(b*m*p).
result?=?torch.bmm(tensor1,?tensor2)

#?Element-wise?multiplication.
result?=?tensor1?*?tensor2


計算兩組數(shù)據(jù)之間的兩兩歐式距離


#?X1?is?of?shape?m*d.
X1?=?torch.unsqueeze(X1,?dim=1).expand(m,?n,?d)
#?X2?is?of?shape?n*d.
X2?=?torch.unsqueeze(X2,?dim=0).expand(m,?n,?d)
#?dist?is?of?shape?m*n,?where?dist[i][j]?=?sqrt(|X1[i,?:]?-?X[j,?:]|^2)
dist?=?torch.sqrt(torch.sum((X1?-?X2)?**?2,?dim=2))


模型定義


卷積層


最常用的卷積層配置是


conv?=?torch.nn.Conv2d(in_channels,?out_channels,?kernel_size=3,?stride=1,?padding=1,?bias=True)conv?=?torch.nn.Conv2d(in_channels,?out_channels,?kernel_size=1,?stride=1,?padding=0,?bias=True)


如果卷積層配置比較復(fù)雜,不方便計算輸出大小時,可以利用如下可視化工具輔助

鏈接:https://ezyang.github.io/convolution-visualizer/index.html


0GAP(Global average pooling)層


gap?=?torch.nn.AdaptiveAvgPool2d(output_size=1)


雙線性匯合(bilinear pooling)


X?=?torch.reshape(N,?D,?H?*?W)????????????????????????#?Assume?X?has?shape?N*D*H*W
X?=?torch.bmm(X,?torch.transpose(X,?1,?2))?/?(H?*?W)??#?Bilinear?pooling
assert?X.size()?==?(N,?D,?D)
X?=?torch.reshape(X,?(N,?D?*?D))
X?=?torch.sign(X)?*?torch.sqrt(torch.abs(X)?+?1e-5)???#?Signed-sqrt?normalization
X?=?torch.nn.functional.normalize(X)??????????????????#?L2?normalization


多卡同步 BN(Batch normalization)


當(dāng)使用 torch.nn.DataParallel 將代碼運行在多張 GPU 卡上時,PyTorch 的 BN 層默認操作是各卡上數(shù)據(jù)獨立地計算均值和標準差,同步 BN 使用所有卡上的數(shù)據(jù)一起計算 BN 層的均值和標準差,緩解了當(dāng)批量大?。╞atch size)比較小時對均值和標準差估計不準的情況,是在目標檢測等任務(wù)中一個有效的提升性能的技巧。


鏈接:https://github.com/vacancy/Synchronized-BatchNorm-PyTorch


類似 BN 滑動平均


如果要實現(xiàn)類似 BN 滑動平均的操作,在 forward 函數(shù)中要使用原地(inplace)操作給滑動平均賦值。


class?BN(torch.nn.Module)
????def?__init__(self):
????????...
????????self.register_buffer('running_mean',?torch.zeros(num_features))

????def?forward(self,?X):
????????...
????????self.running_mean?+=?momentum?*?(current?-?self.running_mean)


計算模型整體參數(shù)量


num_parameters?=?sum(torch.numel(parameter)?for?parameter?in?model.parameters())


類似 Keras 的 model.summary() 輸出模型信息


鏈接:https://github.com/sksq96/pytorch-summary


模型權(quán)值初始化


注意 model.modules() 和 model.children() 的區(qū)別:model.modules() 會迭代地遍歷模型的所有子層,而 model.children() 只會遍歷模型下的一層。


#?Common?practise?for?initialization.
for?layer?in?model.modules():
????if?isinstance(layer,?torch.nn.Conv2d):
????????torch.nn.init.kaiming_normal_(layer.weight,?mode='fan_out',
??????????????????????????????????????nonlinearity='relu')
????????if?layer.bias?is?not?None:
????????????torch.nn.init.constant_(layer.bias,?val=0.0)
????elif?isinstance(layer,?torch.nn.BatchNorm2d):
????????torch.nn.init.constant_(layer.weight,?val=1.0)
????????torch.nn.init.constant_(layer.bias,?val=0.0)
????elif?isinstance(layer,?torch.nn.Linear):
????????torch.nn.init.xavier_normal_(layer.weight)
????????if?layer.bias?is?not?None:
????????????torch.nn.init.constant_(layer.bias,?val=0.0)

#?Initialization?with?given?tensor.
layer.weight?=?torch.nn.Parameter(tensor)


部分層使用預(yù)訓(xùn)練模型


注意如果保存的模型是 torch.nn.DataParallel,則當(dāng)前的模型也需要是


model.load_state_dict(torch.load('model,pth'),?strict=False)


將在 GPU 保存的模型加載到 CPU


model.load_state_dict(torch.load('model,pth',?map_location='cpu'))



數(shù)據(jù)準備、特征提取與微調(diào)


得到視頻數(shù)據(jù)基本信息


import?cv2
video?=?cv2.VideoCapture(mp4_path)
height?=?int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
width?=?int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
num_frames?=?int(video.get(cv2.CAP_PROP_FRAME_COUNT))
fps?=?int(video.get(cv2.CAP_PROP_FPS))
video.release()


TSN 每段(segment)采樣一幀視頻


K?=?self._num_segments
if?is_train:
????if?num_frames?>?K:
????????#?Random?index?for?each?segment.
????????frame_indices?=?torch.randint(
????????????high=num_frames?//?K,?size=(K,),?dtype=torch.long)
????????frame_indices?+=?num_frames?//?K?*?torch.arange(K)
????else:
????????frame_indices?=?torch.randint(
????????????high=num_frames,?size=(K?-?num_frames,),?dtype=torch.long)
????????frame_indices?=?torch.sort(torch.cat((
????????????torch.arange(num_frames),?frame_indices)))[0]
else:
????if?num_frames?>?K:
????????#?Middle?index?for?each?segment.
????????frame_indices?=?num_frames?/?K?//?2
????????frame_indices?+=?num_frames?//?K?*?torch.arange(K)
????else:
????????frame_indices?=?torch.sort(torch.cat((??????????????????????????????
????????????torch.arange(num_frames),?torch.arange(K?-?num_frames))))[0]
assert?frame_indices.size()?==?(K,)
return?[frame_indices[i]?for?i?in?range(K)]


提取 ImageNet 預(yù)訓(xùn)練模型某層的卷積特征


#?VGG-16?relu5-3?feature.
model?=?torchvision.models.vgg16(pretrained=True).features[:-1]
#?VGG-16?pool5?feature.
model?=?torchvision.models.vgg16(pretrained=True).features
#?VGG-16?fc7?feature.
model?=?torchvision.models.vgg16(pretrained=True)
model.classifier?=?torch.nn.Sequential(*list(model.classifier.children())[:-3])
#?ResNet?GAP?feature.
model?=?torchvision.models.resnet18(pretrained=True)
model?=?torch.nn.Sequential(collections.OrderedDict(
????list(model.named_children())[:-1]))

with?torch.no_grad():
????model.eval()
????conv_representation?=?model(image)


提取 ImageNet 預(yù)訓(xùn)練模型多層的卷積特征


class?FeatureExtractor(torch.nn.Module):
????"""Helper?class?to?extract?several?convolution?features?from?the?given
????pre-trained?model.

????Attributes:
????????_model,?torch.nn.Module.
????????_layers_to_extract,?list?or?set

????Example:
????????>>>?model?=?torchvision.models.resnet152(pretrained=True)
????????>>>?model?=?torch.nn.Sequential(collections.OrderedDict(
????????????????list(model.named_children())[:-1]))
????????>>>?conv_representation?=?FeatureExtractor(
????????????????pretrained_model=model,
????????????????layers_to_extract={'layer1',?'layer2',?'layer3',?'layer4'})(image)
????"""

????def?__init__(self,?pretrained_model,?layers_to_extract):
????????torch.nn.Module.__init__(self)
????????self._model?=?pretrained_model
????????self._model.eval()
????????self._layers_to_extract?=?set(layers_to_extract)

????def?forward(self,?x):
????????with?torch.no_grad():
????????????conv_representation?=?[]
????????????for?name,?layer?in?self._model.named_children():
????????????????x?=?layer(x)
????????????????if?name?in?self._layers_to_extract:
????????????????????conv_representation.append(x)
????????????return?conv_representation


其他預(yù)訓(xùn)練模型

鏈接:https://github.com/Cadene/pretrained-models.pytorch


微調(diào)全連接層


model?=?torchvision.models.resnet18(pretrained=True)
for?param?in?model.parameters():
????param.requires_grad?=?False
model.fc?=?nn.Linear(512,?100)??#?Replace?the?last?fc?layer
optimizer?=?torch.optim.SGD(model.fc.parameters(),?lr=1e-2,?momentum=0.9,?weight_decay=1e-4)


以較大學(xué)習(xí)率微調(diào)全連接層,較小學(xué)習(xí)率微調(diào)卷積層


model?=?torchvision.models.resnet18(pretrained=True)
finetuned_parameters?=?list(map(id,?model.fc.parameters()))
conv_parameters?=?(p?for?p?in?model.parameters()?if?id(p)?not?in?finetuned_parameters)
parameters?=?[{'params':?conv_parameters,?'lr':?1e-3},?
??????????????{'params':?model.fc.parameters()}]
optimizer?=?torch.optim.SGD(parameters,?lr=1e-2,?momentum=0.9,?weight_decay=1e-4)



模型訓(xùn)練


常用訓(xùn)練和驗證數(shù)據(jù)預(yù)處理


其中 ToTensor 操作會將 PIL.Image 或形狀為 H×W×D,數(shù)值范圍為 [0, 255] 的 np.ndarray 轉(zhuǎn)換為形狀為 D×H×W,數(shù)值范圍為 [0.0, 1.0] 的 torch.Tensor。


train_transform?=?torchvision.transforms.Compose([
????torchvision.transforms.RandomResizedCrop(size=224,
?????????????????????????????????????????????scale=(0.08,?1.0)),
????torchvision.transforms.RandomHorizontalFlip(),
????torchvision.transforms.ToTensor(),
????torchvision.transforms.Normalize(mean=(0.485,?0.456,?0.406),
?????????????????????????????????????std=(0.229,?0.224,?0.225)),
?])
?val_transform?=?torchvision.transforms.Compose([
????torchvision.transforms.Resize(224),
????torchvision.transforms.CenterCrop(224),
????torchvision.transforms.ToTensor(),
????torchvision.transforms.Normalize(mean=(0.485,?0.456,?0.406),
?????????????????????????????????????std=(0.229,?0.224,?0.225)),
])


訓(xùn)練基本代碼框架


for?t?in?epoch(80):
????for?images,?labels?in?tqdm.tqdm(train_loader,?desc='Epoch?%3d'?%?(t?+?1)):
????????images,?labels?
=?images.cuda(),?labels.cuda()
????????scores?=?model(images)
????????loss?=?loss_function(scores,?labels)
????????optimizer.zero_grad()
????????loss.backward()
????????optimizer.step()


標記平滑(label smoothing)


for?images,?labels?in?train_loader:
????images,?labels?=?images.cuda(),?labels.cuda()
????N?=?labels.size(0)
????#?C?is?the?number?of?classes.
????smoothed_labels?=?torch.full(size=(N,?C),?fill_value=0.1?/?(C?-?1)).cuda()
????smoothed_labels.scatter_(dim=1,?index=torch.unsqueeze(labels,?dim=1),?value=0.9)

????score?=?model(images)
????log_prob?=?torch.nn.functional.log_softmax(score,?dim=1)
????loss?=?-torch.sum(log_prob?*?smoothed_labels)?/?N
????optimizer.zero_grad()
????loss.backward()
????optimizer.step()


Mixup


beta_distribution?=?torch.distributions.beta.Beta(alpha,?alpha)
for?images,?labels?in?train_loader:
????images,?labels?=?images.cuda(),?labels.cuda()

????#?Mixup?images.
????lambda_?=?beta_distribution.sample([]).item()
????index?=?torch.randperm(images.size(0)).cuda()
????mixed_images?=?lambda_?*?images?+?(1?-?lambda_)?*?images[index,?:]

????#?Mixup?loss.????
????scores?=?model(mixed_images)
????loss?=?(lambda_?*?loss_function(scores,?labels)?
????????????+?(1?-?lambda_)?*?loss_function(scores,?labels[index]))

????optimizer.zero_grad()
????loss.backward()
????optimizer.step()


L1 正則化


l1_regularization?=?torch.nn.L1Loss(reduction='sum')
loss?=?...??#?Standard?cross-entropy?loss
for?param?in?model.parameters():
????loss?+=?torch.sum(torch.abs(param))
loss.backward()


不對偏置項進行 L2 正則化/權(quán)值衰減(weight decay)


bias_list?=?(param?for?name,?param?in?model.named_parameters()?if?name[-4:]?==?'bias')
others_list?=?(param?for?name,?param?in?model.named_parameters()?if?name[-4:]?!=?'bias')
parameters?=?[{'parameters':?bias_list,?'weight_decay':?0},????????????????
??????????????{'parameters':?others_list}]
optimizer?=?torch.optim.SGD(parameters,?lr=1e-2,?momentum=0.9,?weight_decay=1e-4)


梯度裁剪(gradient clipping)


torch.nn.utils.clip_grad_norm_(model.parameters(),?max_norm=20)


計算 Softmax 輸出的準確率


score?=?model(images)
prediction?=?torch.argmax(score,?dim=1)
num_correct?=?torch.sum(prediction?==?labels).item()
accuruacy?=?num_correct?/?labels.size(0)


可視化模型前饋的計算圖

鏈接:https://github.com/szagoruyko/pytorchviz


可視化學(xué)習(xí)曲線


有 Facebook 自己開發(fā)的 Visdom 和 Tensorboard 兩個選擇。


https://github.com/facebookresearch/visdom


https://github.com/lanpa/tensorboardX


#?Example?using?Visdom.
vis?=?visdom.Visdom(env='Learning?curve',?use_incoming_socket=False)
assert?self._visdom.check_connection()
self._visdom.close()
options?=?collections.namedtuple('Options',?['loss',?'acc',?'lr'])(
????loss={'xlabel':?'Epoch',?'ylabel':?'Loss',?'showlegend':?True},
????acc={'xlabel':?'Epoch',?'ylabel':?'Accuracy',?'showlegend':?True},
????lr={'xlabel':?'Epoch',?'ylabel':?'Learning?rate',?'showlegend':?True})

for?t?in?epoch(80):
????tran(...)
????val(...)
????vis.line(X=torch.Tensor([t?+?1]),?Y=torch.Tensor([train_loss]),
?????????????name='train',?win='Loss',?update='append',?opts=options.loss)
????vis.line(X=torch.Tensor([t?+?1]),?Y=torch.Tensor([val_loss]),
?????????????name='val',?win='Loss',?update='append',?opts=options.loss)
????vis.line(X=torch.Tensor([t?+?1]),?Y=torch.Tensor([train_acc]),
?????????????name='train',?win='Accuracy',?update='append',?opts=options.acc)
????vis.line(X=torch.Tensor([t?+?1]),?Y=torch.Tensor([val_acc]),
?????????????name='val',?win='Accuracy',?update='append',?opts=options.acc)
????vis.line(X=torch.Tensor([t?+?1]),?Y=torch.Tensor([lr]),
?????????????win='Learning?rate',?update='append',?opts=options.lr)


得到當(dāng)前學(xué)習(xí)率


#?If?there?is?one?global?learning?rate?(which?is?the?common?case).
lr?=?next(iter(optimizer.param_groups))['lr']

#?If?there?are?multiple?learning?rates?for?different?layers.
all_lr?=?[]
for?param_group?in?optimizer.param_groups:
????all_lr.append(param_group['lr'])


學(xué)習(xí)率衰減


#?Reduce?learning?rate?when?validation?accuarcy?plateau.
scheduler?=?torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer,?mode='max',?patience=5,?verbose=True)
for?t?in?range(0,?80):
????train(...);?val(...)
????scheduler.step(val_acc)

#?Cosine?annealing?learning?rate.
scheduler?=?torch.optim.lr_scheduler.CosineAnnealingLR(optimizer,?T_max=80)
#?Reduce?learning?rate?by?10?at?given?epochs.
scheduler?=?torch.optim.lr_scheduler.MultiStepLR(optimizer,?milestones=[50,?70],?gamma=0.1)
for?t?in?range(0,?80):
????scheduler.step()????
????train(...);?val(...)

#?Learning?rate?warmup?by?10?epochs.
scheduler?=?torch.optim.lr_scheduler.LambdaLR(optimizer,?lr_lambda=lambda?t:?t?/?10)
for?t?in?range(0,?10):
????scheduler.step()
????train(...);?val(...)


保存與加載斷點


注意為了能夠恢復(fù)訓(xùn)練,我們需要同時保存模型和優(yōu)化器的狀態(tài),以及當(dāng)前的訓(xùn)練輪數(shù)。


#?Save?checkpoint.
is_best?=?current_acc?>?best_acc
best_acc?=?max(best_acc,?current_acc)
checkpoint?=?{
????'best_acc':?best_acc,????
????'epoch':?t?+?1,
????'model':?model.state_dict(),
????'optimizer':?optimizer.state_dict(),
}
model_path?=?os.path.join('model',?'checkpoint.pth.tar')
torch.save(checkpoint,?model_path)
if?is_best:
????shutil.copy('checkpoint.pth.tar',?model_path)

#?Load?checkpoint.
if?resume:
????model_path?=?os.path.join('model',?'checkpoint.pth.tar')
????assert?os.path.isfile(model_path)
????checkpoint?=?torch.load(model_path)
????best_acc?=?checkpoint['best_acc']
????start_epoch?=?checkpoint['epoch']
????model.load_state_dict(checkpoint['model'])
????optimizer.load_state_dict(checkpoint['optimizer'])
????print('Load?checkpoint?at?epoch?%d.'?%?start_epoch)


計算準確率、查準率(precision)、查全率(recall)


#?data['label']?and?data['prediction']?are?groundtruth?label?and?prediction?
#?for?each?image,?respectively.
accuracy?=?np.mean(data['label']?==?data['prediction'])?*?100

#?Compute?recision?and?recall?for?each?class.
for?c?in?range(len(num_classes)):
????tp?=?np.dot((data['label']?==?c).astype(int),
????????????????(data['prediction']?==?c).astype(int))
????tp_fp?=?np.sum(data['prediction']?==?c)
????tp_fn?=?np.sum(data['label']?==?c)
????precision?=?tp?/?tp_fp?*?100
????recall?=?tp?/?tp_fn?*?100


PyTorch 其他注意事項


模型定義


  • 建議有參數(shù)的層和匯合(pooling)層使用 torch.nn 模塊定義,激活函數(shù)直接使用 torch.nn.functional。torch.nn 模塊和 torch.nn.functional 的區(qū)別在于,torch.nn 模塊在計算時底層調(diào)用了 torch.nn.functional,但 torch.nn 模塊包括該層參數(shù),還可以應(yīng)對訓(xùn)練和測試兩種網(wǎng)絡(luò)狀態(tài)。使用 torch.nn.functional 時要注意網(wǎng)絡(luò)狀態(tài),如


def?forward(self,?x):
????...
????x?=?torch.nn.functional.dropout(x,?p=0.5,?training=self.training)


  • model(x) 前用 model.train() 和 model.eval() 切換網(wǎng)絡(luò)狀態(tài)。

  • 不需要計算梯度的代碼塊用 with torch.no_grad() 包含起來。model.eval() 和 torch.no_grad() 的區(qū)別在于,model.eval() 是將網(wǎng)絡(luò)切換為測試狀態(tài),例如 BN 和隨機失活(dropout)在訓(xùn)練和測試階段使用不同的計算方法。torch.no_grad() 是關(guān)閉 PyTorch 張量的自動求導(dǎo)機制,以減少存儲使用和加速計算,得到的結(jié)果無法進行 loss.backward()。

  • torch.nn.CrossEntropyLoss 的輸入不需要經(jīng)過 Softmax。torch.nn.CrossEntropyLoss 等價于 torch.nn.functional.log_softmax + torch.nn.NLLLoss。

  • loss.backward() 前用 optimizer.zero_grad() 清除累積梯度。optimizer.zero_grad() 和 model.zero_grad() 效果一樣。


PyTorch 性能與調(diào)試


  • torch.utils.data.DataLoader 中盡量設(shè)置 pin_memory=True,對特別小的數(shù)據(jù)集如 MNIST 設(shè)置 pin_memory=False 反而更快一些。num_workers 的設(shè)置需要在實驗中找到最快的取值。

  • 用 del 及時刪除不用的中間變量,節(jié)約 GPU 存儲。

  • 使用 inplace 操作可節(jié)約 GPU 存儲,如


x?=?torch.nn.functional.relu(x,?inplace=True)


  • 減少 CPU 和 GPU 之間的數(shù)據(jù)傳輸。例如如果你想知道一個 epoch 中每個 mini-batch 的 loss 和準確率,先將它們累積在 GPU 中等一個 epoch 結(jié)束之后一起傳輸回 CPU 會比每個 mini-batch 都進行一次 GPU 到 CPU 的傳輸更快。

  • 使用半精度浮點數(shù) half() 會有一定的速度提升,具體效率依賴于 GPU 型號。需要小心數(shù)值精度過低帶來的穩(wěn)定性問題。

  • 時常使用 assert tensor.size() == (N, D, H, W) 作為調(diào)試手段,確保張量維度和你設(shè)想中一致。

  • 除了標記 y 外,盡量少使用一維張量,使用 n*1 的二維張量代替,可以避免一些意想不到的一維張量計算結(jié)果。

  • 統(tǒng)計代碼各部分耗時


with?torch.autograd.profiler.profile(enabled=True,?use_cuda=False)?as?profile:
????...
print(profile)


或者在命令行運行


python?-m?torch.utils.bottleneck?main.py


致謝


感謝 @些許流年和@El tnoto的勘誤。由于作者才疏學(xué)淺,更兼時間和精力所限,代碼中錯誤之處在所難免,敬請讀者批評指正。


參考資料


  • PyTorch 官方代碼:pytorch/examples (https://link.zhihu.com/?target=https%3A//github.com/pytorch/examples)

  • PyTorch 論壇:PyTorch Forums (https://link.zhihu.com/?target=https%3A//discuss.pytorch.org/latest%3Forder%3Dviews)

  • PyTorch 文檔:http://pytorch.org/docs/stable/index.html (https://link.zhihu.com/?target=http%3A//pytorch.org/docs/stable/index.html)

  • 其他基于 PyTorch 的公開實現(xiàn)代碼,無法一一列舉?

張皓:南京大學(xué)計算機系機器學(xué)習(xí)與數(shù)據(jù)挖掘所(LAMDA)碩士生,研究方向為計算機視覺和機器學(xué)習(xí),特別是視覺識別和深度學(xué)習(xí)。

個人主頁:http://lamda.nju.edu.cn/zhangh/

知乎鏈接:https://zhuanlan.zhihu.com/p/59205847?


“整理不易,三連
瀏覽 28
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 在线观看视频亚洲| 69国产精品成人无码| 粉嫩av在线| 大香蕉精品一区| 91人人澡| 日韩在线不卡视频| 无码一区二区三区在线观看| 国产成人精品免费看视频| 日韩欧美黄色片| 韩剧《邻居的妻子》电视剧| 欧美黄视频| 91无码在线视频| 久久天堂AV综合合色蜜桃网| 亚洲中文AV在线| 亚洲s在线| 500部大龄熟乱4K视频| 国产成人大片| 一道本无码在线视频| 操逼短视频| 91人体视频| 翔田千里被操120分钟| 亚洲激情网| 国产激情视频在线播放| 欧美高清无码在线观看| 欧美性爱XXXX黑人XYX性爽| 欧美午夜精品久久久久免费视| 999reav| 中文字幕永久免费| 99热都是精品| 蜜臀久久99精品久久久兰草影视| 中文字幕成人网站| 国产精品一区av| 黄色一级生活片| 成人网肏逼视频| 爱爱视频日本| 91探花在线观看| 老妇槡BBBB槡BBBB槡| www.日韩一区| 九色91PORNY国产| 16一17女人毛片| 国产欧美日韩综合| 亚洲一级黄色电影| 青娱乐偷拍| 99爱在线观看| 欧美黄色成人网站| 国产一级a毛一级a毛视频在线网站) | 日韩操逼一区| 新亚洲天堂男子Av-| www.大鸡巴| 中文字幕第6页| 亚洲高清无码一区二区三区| 久久婷香| 色综合大香蕉| 手机AV在线观看| 悠悠色导航| 中文字幕性| 欧美男女日逼视频| 亚洲中文字幕av| 8050午夜网| 国产婷婷久久| 中文字幕第6页| 大肉大捧一出免费观看| 久久久久久综合| 黄色不卡| 爆操网站| 青青草成人AV| 成人三级片网| 欧美色图在线观看视频| 青娱乐成人在线视频| 欧美自拍一区| 99亚洲欲妇| 奶大丰满一乱一视频一区二区三区在| 五月天狠狠干| 黄色视频在线免费播放| 国产区AV| а√最新版在线中文8| 国产精品久久久999| 国产videos| 91天天看| 日本道在线视频| 国产精品资源在线观看| 99色热视频| 91福利院| 国产午夜福利视频在线观看| 男女啪网站| AV在线播放中文字幕| av三级片在线播放| 久久成人A片| 健身房被教练3p喷水了| 九九久久影院| 男女操逼视频网站免费观看| 亚洲无码一级电影| footjobvk| 久久香蕉综合在线| 成人性生活一级片| 一本道不卡色色| 日韩毛片在线观看| 三级成人网站| 牛牛av| 99在线免费视频| 天天干天天干天天| 高清无码在线免费观看| 无码三级视频| 成人大战香蕉最新视频| 香蕉黄色三级片| 亚洲中文字幕在线播放| 伊人黄色| 人人妻人人爽| yOujiZZ欧美精品| 九九99电影| 中文字幕无码视频| 亚洲日色| 大香蕉一级红色片青青河边草| 婷婷色色婷婷五月天| 爱爱导航| www.zaixianshipin| 久久永久免费精品人妻专区| 天天干天天撸影视| 久久久久久麻豆| 青青草99热| 亚洲一区免费| 久久精品视频播放| 天天操人人爽| av天堂资源在线| 懂色av懂色av粉嫩av| 在桌下含她的花蒂和舌头H视频 | 黄色免费视频网站| 黄色一级小说| 精品无码视频在线| 免费操B| 亚洲系列中文字幕| 熟女综合| 999国产精品| 日韩激情无码一区二区| 日韩色网站| 久久中文视频| www.骚逼| 成人黄色在线观看| 逼逼AV网站-日韩电影| 日韩A片免费| 亚洲欧美日韩无码| 国产极品无码| 欧美亚洲在线观看| 日本韩国欧美18| 久久黄色精品视频| 粉嫩护士小泬18p| 亚洲欧美成人电影| 激情五月天色| 成年人观看视频| 午夜18视频在线观看| 色五月激情| 婷婷情色五月| 91毛片观看| 国产日韩91| 欧美色图俺去了| 色悠悠国产| 自拍偷拍一区二区| 四季AV一区二区夜夜嗨| 五十路av| 91在线资源| 国产精品久久| 国产麻豆精品ThePorn| 中字幕视频在线永久在线观看免费 | 中文字幕在线不卡| 日韩无码电影网| 九九九精品| 亚洲精品字幕久久久久| 一级乱伦网站| 九九五月天| 黄色片大全| 国产视频一区二区三区四区五区| 亚洲av在线免费观看| 欧美老女人操逼| 日韩成人精品| 欧美视频A| 六十路老熟女码视频| 九九人妻| 天天操网址| 黄色福利在线观看| 大香蕉A片| www.国产豆花精品区| 大香蕉伊人网在线| 久草视频在线免费播放| 91超碰在线播放| 无码精品久久| 色五月综合| 黄色激情五月天| 亚洲福利久久| 欧美va亚洲va| 国产精彩无码视频| 成人1区| 99久久婷婷国产综合精品hsex,亚| 中文字幕av在线观看| 另类老妇性BBBWBBW| 久久露脸国语精品国产91| xxx一区二区| 亚洲aⅤ| 高潮国产视频| 亚洲成人av在线| 国产在线观看免费成人视频| 国产精品无码成人AV电影| 操逼超碰| a级网站| 国产毛片基地| 色婷婷亚洲| AAA级片| 免费视频亚洲| 成人性生活片| 波多野结衣亚洲无码| 国产成人视频| 欧美日韩h| 国产成人AV一区二区三区在线观看| 五月天激情小说网| 国产肏逼视频| 99热国产| 男人天堂网AV| 国产乱人伦无码视频| 欧美黄色网址| 人人妻人人澡人人爽人人| 99成人乱码一区二区三区在线| 五月天婷婷久久| 99热播| 強姦婬片A片AAA毛片Mⅴ| 开心四房播播第四婷婷| 九九re| 狠狠色五月亚洲91| 做爱无码| 北条麻妃无码| 国产精品黑人ThePorn| 91人妻人人澡人人添人人爽| 国产成人精品二三区麻豆| 久免费视频| 激情五月天小说网| 成人在线H| 天天综合7799| 内射少妇18| 国产乱伦片、| 中文字幕第一页av| 911精品国产一区二区在线| 成人欧美一区二区三区黑人免费 | 成人无遮挡| 91视频一区二区| 国产精品视频一区二区三区在线观看 | 青青网站| 内射学生妹视频| 午夜8050| 波多野结衣在线网站| 亚洲无码视频免费观看| 欧美精品国产动漫| 日日搔av一区二区三区| 日韩一级免费毛片| 国产激倩都市一区二区三区欧美 | 欧洲激情网| 欧美在线观看视频一区| 91无码人妻精品1国产四虎| 亚州在线视频| 蜜桃黄片AV在线观看| 99re视频在线播放| 亚洲日韩欧美在线观看| 最好看的MV中文字幕国语电影| 中文字幕在线欧美| 亚洲91网站| 亚洲精品视频在线播放| 无毛无码| 日本爱爱免费播放视频| 北条麻妃无码精品AV| 亚洲在线观看| 国精产品一区一区三区有限公司杨| 91精品国产综合久久久蜜臀主演| 欧美一区二区在线观看| 欧美婷婷在线| 超碰人人爱国产视| 中文字幕乱码亚洲无线码在线日噜噜| 91无码高清视频| 麻豆影音先锋| A片视频网站| 久久久久久一区| 一区在线免费观看| 国产一区在线视频| 91九色精品女同系列| 国产三级麻豆| 成人性生活免费视频| 欧一美一伦一A片| 在线观看老湿视频福利| 亚洲色久| 超碰自拍97| 国产视频不卡| 人妻少妇视频| 青草视屏| av无码中文| 成人性生活A级毛片网站| 免费视频亚洲| 91成人小电影| 欧美韩日| 国产久久在线观看| 亚洲婷婷在线| 中文字幕五月天| 日本在线视频一区二区| 亚洲成人在线播放| 久久精品人人| 色色丁香| 欧美黑人操逼视频| 青青草原视频在线| 五月网| 97在线免费| 69网站| 青青草东路热vv| 日韩精品在线视频观看| 51成人网| 婷婷男人天堂| va在线| 欧美经典自拍狼友| 色婷婷18正码国产| 国产成人av在线播放| 久草大香蕉在线视频| 成人亚洲AV| 亚洲男人天堂网| 人妻啪啪| 夜夜草视频| 精品色片| 欧美伊人大香蕉| 欧美人操逼一二区| 亚洲大片在线观看| 欧美丰满人妻免费视频人| 国产一区二区三区四区五区六区七区| 高清无码波多野结衣| 影视先锋成人在线| 69成人视频| 影音先锋亚洲无码| 九九九av| 女人的天堂av| 双腿张开被9个男人调教| 91人妻人人人人爽| 亚洲精品字幕久久久久| 精品黄色片| 欧美日韩中国操逼打炮| 成人网站www污污污网站公司| 日韩人妻精品无码久久| 久久久91人妻无码精品蜜桃ID | 日本在线精品视频| 中文字幕免| 青草超碰| 日韩23岁观看| 99re超碰| 欧美成人综合| 中文字幕少妇| 国产夫妻在线| 成人性爱视频免费观看| 69视频网| 操逼激情视频| 欧美黄片免费观看| 1024大香蕉| 在线免费观看AV片| 久久精品无码一区二区无码性色 | 在线不卡视频| 97人妻一区二区精品视频| 亚洲成人在线免费观看| 国产一道本| 国产高清精品软件丝瓜软件| 亚洲无色| 国产成人av在线播放| 五月天婷婷在线视频| 日韩有码第一页| 中文字幕+乱码+中文字幕一区| 美女自慰网站在线观看| 中国老熟女2老女人| 猛男大粗猛爽H男人味| 波多野结衣被操| 99国产精品免费视频观看8| 国产成人在线精品| 欧美成人网站在线| 久草大香蕉在线视频| 久久免费黄色| 成人一区二区电影| 成人三级片在线播放| 国产精品对白| 中文字幕在线不卡| 国产欧美另类| 日韩十八禁| 久久婷婷五月丁香| 国产福利91精品一区二区三区| 日韩性爱一区| 五月久久婷婷| 99re国产视频| 亚洲第一黄色| 少妇婷婷| 伊人综合电影| 亚洲爱爱网| 国产污视频| 久久91欧美特黄A片| 亚洲无码一区二区三| 思思99热| 在线观看黄色网页| 亚洲欧洲在线视频| 99日韩精品| 在线观看日韩三级片av| 日本国产在线| 少妇搡BBBB搡BBB搡打电话| 欧美精品成人免码在线| 大香蕉伊人手机在线| 亚洲AV无码成人精品区欧洲| 久久av一区二区三区观看| 精品中文字幕在线观看| 久久人人操人人| 五月天网址| 亚洲日韩视频在线播放| 欧美第一网站| 国产精品成人无码a无码| 操b视频免费| 日韩一区二区三区在线| 欧美日韩色情| 动图综合亚洲综合欧美男男| 精品一区电影| 伊人五月婷婷| 婷婷久久亚洲| 色老久久| 精品人妻一区二区三区日产| 99er在线观看视频| 国产成人女人在线观看| 青青草视频| 特一级黄色| 欧美三P囗交做爰| 91鲁| 青青草免费福利视频| 亚洲精品一区二区三| 欧美成人免费观看| 国产无码免费视频| 欧美激情三区| 久久精品视频播放| 亚洲午夜视频在线观看| 成人婷婷五月天| 偷偷撸在线| 91亚洲精品久久久久久久久久久久 | 欧美日韩国产成人电影| 欧美性受XXXX黑人XYX性爽| 911精品人妻一区二区三区A片| 亚洲无码A区| 天天摸天天操| 内射老熟女| 国产欧美一区二区三区国产幕精品| 免费无码国产| 国产超碰青青草| 久久久久亚洲| 翔田千里無碼破解| 高清无码视频在线| 激情六月天| 狠狠干在线观看| AV超碰| 亚洲精品高清无码| 欧美人操逼视频| 国产一级特黄aaa大片| 黄色成人网站在线| sm国产在线调教视频| 色999网址| 超碰人人摸| 夜夜爽7777精品国产三级| 91爱爱| 嫩BBB槡BBBB槡BBBB撒尿 | 欧美级毛片一进一出| 欧洲亚洲在线| 日韩成人无码片| 99久久精品国产一区色| 中文字幕在线观看二区| 久久久www成人免费毛片| 欧美日韩免费在线观看| 国产三级麻豆| 大香蕉伊人青青草| 久久久毛片| 人人操人人操人人操人人| 中文字幕AV免费观看| 97无码精品人妻| 伊人影院在线观看| 精品国产精品三级精品AV网址| 东京热免费视频| 欧美日韩国内| 亚洲天堂一区在线观看| 欧美性爱精品一区| 草久影院| 亚洲视频www| 五月天婷婷AV| 欧美后门菊门交| 41ts午夜福利| 久久免费毛片| 黄片免费视频| 亚洲AV成人精品一区二区三区| 欧美成人三级在线播放| 亚洲无码激情在线| 久久精品小视频| 免费A在线观看| 人人操人人网站| 麻豆成人91精品二区三区| 91蝌蚪视频在线观看| 蜜臀AV在线观看| 69成人导航| 亚洲AV免费在线| 欧美成人三级精品| 亚洲国产综合AV在线| 亚洲成人视频在线观看| 无码精品视频在线观看| 韩国免费一级a一片在线播放| 影音先锋色站| 国产午夜成人福利在线| 无套免费视频欧美| 青青久视频| 日韩性爱一区二区| 国产无码高潮在线| 色综合天天综合成人网| 色中色av| 国产在线观看欧美| 国产精品无码永久免费不卡| 91精品在线免费观看| 狠狠操免费| 日韩中文毛片| aⅴ视频| 色情片在线观看| 成人网站AV| 俺去了无码| 成人自拍偷拍视频| 国产成人视频免费观看| 狠狠色噜噜狠狠狠7777| 欧美天天性| 黄片免费视频| 午夜无码熟妇丰满人妻| 在线观看免费黄色| 久久先锋| 天天日天天日天天日| 久久er| 91热在线| 免费操B| 麻豆熟妇乱妇熟色A片在线看| 欧美国产日韩欧美亚洲国产| 豆花视频成人| 十八禁无码网站在线观看| 亚洲午夜无码久久久| 亚洲精品一区二区三区四区高清| 亚洲AV网站| 成片免费观看视频大全| 人人妻人人插| 欧美成人手机在线观看| 国产美女18毛片水真多| 亚洲三级网站| 白嫩外女BBWBBWBBW| 大荫蒂视频另类XX| 日韩第五页| 欧美性爱动态| 日韩无码专区| 国产精品你懂的| 中文字幕日本在线| 中文无码在线观看中文字幕av中文| 嫩草A片www在线观看| AV天堂影视在线观看| 一级黄色电影网站| 婷婷综合五月天| 久久公开视频| 国产91无码精品秘入口| 黄色电影一区二区三区| 日韩三区| 日韩精品123| 欧美日韩视频在线播放| 黄色天堂| 蜜臀精品色无码蜜臀AV| 日韩一区欧美| 一区二区三区精品| 东方AV在线观看| 亚洲福利网站| 中文字幕成人在线观看| www.xxx| 亚洲经典免费视频| 亚洲一级免费免费在线观看| 欧美a在线| 黄色一级片视频| 久久在线精品| 麻豆视频免费观看| 18网站视频| 3D动漫精选啪啪一期二期三期| 国产黄色在线观看| 九九在线视频| 波多野结衣成人在线| 亚洲精品色图| 久久久久久免费毛片精品| 国产精品无码无套在线照片| 色婷婷Av一区| 国产绿奴09-01| 亚洲国产三级| 天天激情| 老鸭窝在线观看视频| 亚洲国产日本| 91爱在线| 国产在线看片| 久久久久久亚洲AV黄床| 亚洲区无码| 欧美大片视频| yw在线观看| 中文丰满亲子伦| 撸一撸在线| 18久久| ThePorn-成人网站入口| 日本视频免费| 日韩在线99| 欧美国产日韩视频| 亚洲精品字幕久久久久| 亚洲国产精品成人综合色五月| 精品蜜桃一区二区三区| 中文字幕一区二区三区四区50岁| 国产免费黄色片| 婷色| 操逼操逼逼| 北条麻妃在线播放一区| 成人免费观看的毛视频| 东方成人AV| 亚洲成人在线网站| 国产黄色精品视频| 欧美成人免费电影| 日韩视频网址| 亚洲中文无码电影| 国产视频a| 欧美日韩肏屄视频| 国产精品一区一区三区| 一道本无码免费视频| 精品久久免费| 午夜撸一撸| 在线看片a| 天天爽日日澡AAAA片| 国产91在线播放| 日韩欧美中文在线| 正在播放JUQ-878木下凛凛子| 四虎永久在线精品| caopeng97| 欧美日韩成人在线观看| 大香蕉大香蕉视频网| 美日韩精品| 天天爽夜夜爽夜夜爽精品| 少妇久久久久久久久久| 人人操人人爱人人妻| 高清无码视频在线| 亚洲成人动漫在线| 91AV免费看| 青青精品视频| www五月天com| 国产一级特黄aaa大片| 成人免费区一区二区三区| 麻豆精东一区二区欧美国产| 国产一级一片免费播放放a| 日韩一级二级| 人人插人人| 国产一级二级三级| 动漫3d啪啪成人h动漫| 亚洲中文字幕免费观看| 91看片| 国产一卡二卡三卡| 91女人18毛片水多的意思| 国产综合精品久久久久成人AV| 国产一级A片久久久免费看快餐| 久久久久性爱| 亚洲无码成人片| 无码精品电影| 玖玖成人电影| 亚洲五月天在线| 最新国产在线| 日本特级黄A片免费观看| 久久综合伊人| 五月婷久久| 久久久久久久久国产| 一级A片免费视频| 91中文字幕+乱码| 一级日逼片| 69国产| 高清无码在线免费| 91网站在线看| 91香蕉国产| 人妻视频网| www.sese| 天天做天天爱| 国产无码网站| 尤物AV| 91探花视频精选在线播放| 操美女逼逼| 自拍偷拍亚洲| 亚洲中文无码视频| 97超碰免费| 黄片www| 夜夜撸| 俺来也官网欧美久久精品| 国产精品欧美综合在线| 黄色福利网址| 久久久久久成人无码| 国产精品系列视频| 伊人久久久影视大全| 五月丁香人妻| 99久久网站| 亚洲第一成年人网站| 怡春院在线视频| a无码视频在线观看| 欧美精品性爱视频| 成人网站三级片| 欧美日韩中文| 丰满人妻一区二区| 超碰在线大香蕉| 精品毛片| 国产激情综合| 天天日天天草| 亚洲中文视频| 中文字幕日韩无码电影| 天天综合字幕一区二区| av色欲| 国产亚洲网| 翔田千里在线观看| 激情久久AV一区AV二区AV三区 | 九色视频在线观看| 黄色大片AV| 人妻人人干| 91在线无码精品入口电车| 国产乱叫456在线| 国产女人在线视频| 亚洲.无码.制服.日韩.中文字幕 | 色色9999| 亚洲无码不卡| 女生自慰在线观看| 人人操碰人人| 精品日韩在线视频| 免费在线a视频| 亚洲精品女人| 精品国产重口乱子伦| 国产精品无码专区AV免费播放 | 免费黄色电影在线观看| 午夜撸一撸| 超碰C| 蜜桃免费网站| 日本国产欧美| 俄罗斯白嫩BBwBBwBBw91| 翔田千里無碼破解| 欧美一级aa| 欧美后门菊门交| 丁香婷婷色五月| 2025毛片| 99国产精品久久久久久久| 日韩黄色电影网| 性BBW| 欧美日韩成人在线观看| 亚洲日韩一级片| 久久五月天婷婷| 精品福利在线观看| 日韩午夜欧美精品一二三区| 青青草国产在线视频| 91人人妻人人澡人人爽人人精品| 亚洲自拍中文字幕| 中文电视剧字幕在线播放免费视频| 丁香五月激情五月| 婷婷日韩一区二区三区| 逼特逼视频| 内射黄片| 国产日韩一区二区三免费高清| 无码av免费| 亚洲无码18禁| 青青草免费在线| 99久久久成人国产精品| 91精品婷婷国产| 精品视频导航| 伊人成人片| 处破女初破全过免费看| 国产视频二区| 少妇搡BBBB搡BBB搡澳门| 日韩无码专区| 国产精品一级无码免费播放| 精品久热| 黄色视频导航| 成人做爰100部免费网站| 欧美一卡二卡三卡| 国产欧美一区二区人妻喷水 | 久久水密桃| 九色无码| 97国产在线观看| 亚洲av播放| 狠狠操综合网| 亚洲精品中文字幕在线| 69激情网| 欧美日韩一区二区三区四区| 久热福利视频| 色色视频网站| 亚洲无码影院| 玖玖中文字幕| 无码人妻一区二区三区蜜桃视频| 围内精品久久久久久久久久‘变脸| 91精品久久久久久粉嫩| 久久一本| 天堂v在线观看| 黄色大片视频| 国产精品自拍三级| 亚洲最大的成人网站| 国产在线观看免费视频| 日韩免费在线观看一区入口| 在线三级av| 大地影视中文第三页最新在线观看| 国产毛片毛片毛片| 亚洲成人国产| 精品乱子伦一区二区三区毛| 91国内产香蕉| 欧美AA视频| 久久国产精品网站| 亚洲天堂AB| 久久精品无码一区二区无码性色 | 日韩一级高清| 超碰久草| AA片免费看| 国产一级a毛一级a毛观看视频网站www.jn | 黄色成人视频在线免费观看| 亚洲无码高清在线| 五月丁香亚洲综合| 蜜臀久久99精品久久久久久婷婷| 人人爽人人| 国产九九| 国产女人18毛片水真多18| 青青草黄色视频| 深爱五月激情| 黄色三级片网站| 天堂无码视频在线播放| 天天操夜夜干| 男人的天堂视频网站| 97精品| 爱爱视频无码| 黄色视频免费在线观看网站| 国产午夜无码视频在线观看| 日韩AV在线免费观看| 一本色道久久综合狠狠| 在线欧美日韩| 在线播放JUY-925被丈夫上司侵犯的第7天 | 欧美喷水视频| 粉嫩小泬粉嫩小泬在线| 国产内射无码| 青青草原av| 高清毛片AAAAAAAAA郊外| 无码人妻丰满熟妇区蜜桃| 国产一二三四区| 人妻丝袜中出北条麻妃| 亚洲高清无码视频大全| 大香蕉国产精品视频| 超碰狠狠操| 久久福利网| 在线观看视频无码| 成人免费黄色| 火淫玖玖免费精品| 操极品少妇逼| 99久久99九九九99九他书对| 亚洲色视频| 一区二区三区国产精品| 亚洲日本中文| 成人啪啪视频| 中文字幕一区二区三区人妻在线视频| 91精品婷婷国产综合久久蝌蚪| 欧美成人网站在线| 日韩一级在线| a片网站在线观看| 日韩精品一区二区三区中文在线 | 一本到在线视频| 国内精品久久久| 中文字幕视频一区日日骚| 成人影视在线免费观看| 99这里有精品视频| 日韩高清无码免费| 国产精品美女久久久久久久久| 日本免费不卡| 国产一级内射| 黑人无码AV| 成年人视频在线免费观看| 天天干天天日天天干| 天堂av中文字幕| 99热这里只有精| 国产美女高潮| 人人看人人摸人人插| 夜夜爽妓女77777毛片A片| 黑人操逼视频| 很很撸在线视频| 免费视频久久| 97无码精品人妻| 免费无码婬片AAAAA片| 欧美在线视频播放| 久久精品福利| 日韩少妇AV| 99视频在线看| 性感91影院| 欧美日黄| 美女自慰网站在线观看| 日韩精品一区二区三| 极品少妇久久久| h片免费观看| 欧美成人一区二区三区片| 人人爽人人操人人| 伊人网在线视频观看| 亚洲另类av| 国产多人搡BBBB槡BBBB | 97人妻人人澡人人爽人人精品 | 五月天社区| 精品福利一区二区三区| 日韩骚货| 激情操逼| 91av导航| 色六月婷婷| 欧美级毛片高潮| 大鸡巴久久久久久久| 久久久国产91桃色一区二区三区|