日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

MindSpore!这款刚刚开源的深度学习框架我爱了!

發布時間:2025/3/15 pytorch 67 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MindSpore!这款刚刚开源的深度学习框架我爱了! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

猶記得今年的華為開發者大會 HDC 2020 上,一直受人矚目的深度學習框架 MindSpore 終于開源了。

我之前一直關注 MindSpore,還是挺期待的。MindSpore 是一款支持端、邊、云獨立/協同的統一訓練和推理框架。與 TensorFlow、PyTorch ?等流行深度學習框架對標,MindSpore 旨在大幅度降低 AI 應用開發門檻,讓人工智能無處不在。

MindSpore 最大的特點就是開發門檻大大降低,提高開發效率,這樣可以顯著減少模型開發時間。

因此,使用MindSpore的優勢可以總結為以下四點:

  • 簡單的開發體驗

  • 靈活的調試模式

  • 充分發揮硬件潛能

  • 全場景快速部署

既然開源了,那就趕緊上手,試一試這款開源的 MindSpore 怎么樣!本文我將介紹 MindSpore 的安裝和上手教程,通過一個簡單的圖像識別案例來跑完整個 AI 訓練和測試流程。

一、MindSpore 的安裝

開源框架 MindSpore 的安裝方法有很多,可以在 Windows、Ubuntu 上安裝,也可以在華為 Ascend 910 上安裝。各種詳盡的安裝方法請見下面的鏈接:

https://www.mindspore.cn/install

下面介紹兩種最簡單的安裝方法!

1. Docker 安裝

Docker 安裝最為簡單,可參考:

https://gitee.com/mindspore/mindspore#docker-image

以?0.3.0-alpha 版本為例:

  • CPU:

    docker pull mindspore/mindspore-cpu:0.3.0-alpha

  • GPU:

    docker pull mindspore/mindspore-gpu:0.3.0-alpha

安裝好后,可以看到安裝的鏡像,并使用下面的命令創建一個你的容器:

docker run -it mindspore/mindspore-cpu:0.3.0-alpha /bin/bash

2. Win10+Anaconda+MindSpore

使用 Win10 +Anaconda+MindSpore 的方式進行安裝也非常簡單,本文將采用這種方式安裝 MindSpore。

在 MindSpore 安裝首頁里,選擇安裝相關配置:

  • 版本:0.3.0-alpha

  • 硬件平臺:CPU

  • 操作系統:Windows-64

  • 編程語言:Python 3.7.5

首先,在 Win10?上安裝 Anaconda,Anaconda 是一個開源的 Python 發行版本,其包含了 conda、Python 等 180 多個科學包及其依賴項。

然后,創建一個虛擬環境。

1). 打開 Anaconda 組件中的 Anaconda Prompt 終端:

2). 使用下面的命令,創建一個虛擬環境 mindspore(名字可以自定義),并進入虛擬環境:

conda create -n mindspore python=3.7.5 conda?activate?mindspore

3). 安裝依賴庫,根據 https://gitee.com/mindspore/mindspore/blob/r0.3/requirements.txt 列出的依賴庫,使用 conda 命令安裝。例如:

conda?install?numpy

4). 根據之前選擇的相關配置,在網站:https://www.mindspore.cn/versions 中選擇所要相應的 MindSpore 版本:

mindspore-0.3.0-cp37-cp37m-win_amd64.whl

可以將.whl 文件下載到本地,使用 pip 安裝(使用 conda 命令在線安裝速度可能比較慢,因此可以選擇將.whl文件下載到本地,使用 pip 命令安裝):

pip install mindspore-0.3.0-cp37-cp37m-win_amd64.whl

最后測試是否安裝成功,進入 Python shell,執行如下命令,如果沒有提示 No module named 'mindspore' 等加載錯誤的信息,則說明安裝成功。

至此,安裝完成!

二、基于本地 Jupyter 實現?MNIST 手寫數據集分類

1. 安裝?Jupyter?Notebook

首先,在虛擬環境 mindspore 中安裝 Jupyter Notebook。方法是:打開 Anaconda 組件 Anaconda Navigator。

在 Anaconda Navigator 中,Application on 選擇剛建立的虛擬環境 mindspore,在組件 Jupyter Notebook 下點擊 install,安裝。安裝完成后如下圖:

點擊 Notebook 下的 Launch,即可打開 Jupyter Notebook。

2. 下載數據集

MNIST 手寫數據集想必大家都很熟悉了,包含 0-9 的數字,由 60000 張訓練圖片和 10000 張測試圖片組成。

MNIST 數據集下載頁面:

http://yann.lecun.com/exdb/mnist/

使用 MindSpore,我們可以通過直接定義一個 download_dataset 函數來自動下載 MNIST 數據集:

def download_dataset():"""Download the dataset from http://yann.lecun.com/exdb/mnist/."""print("******Downloading the MNIST dataset******")train_path = "./MNIST_Data/train/"test_path = "./MNIST_Data/test/"train_path_check = os.path.exists(train_path)test_path_check = os.path.exists(test_path)if train_path_check == False and test_path_check ==False:os.makedirs(train_path)os.makedirs(test_path)train_url = {"http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz", "http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz"}test_url = {"http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz", "http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz"}for url in train_url:url_parse = urlparse(url)# split the file name from urlfile_name = os.path.join(train_path,url_parse.path.split('/')[-1])if not os.path.exists(file_name.replace('.gz','')):file = urllib.request.urlretrieve(url, file_name)unzipfile(file_name)os.remove(file_name)for url in test_url:url_parse = urlparse(url)# split the file name from urlfile_name = os.path.join(test_path,url_parse.path.split('/')[-1])if not os.path.exists(file_name.replace('.gz','')):file = urllib.request.urlretrieve(url, file_name)unzipfile(file_name)os.remove(file_name)

該函數實現將數據集自動下載在本地的 ./MNIST_Data 目錄下,訓練集放在子目錄 /train 下,測試集放在子目錄 /test 下。

3.?數據預處理

MNIST 數據集準備好了之后,下一步就要對數據集進行一些預處理,包括圖片尺寸調整為 32x32(因為我們使用的是 LeNet-5 網絡,后面會介紹),像素歸一化、batch_size 設為 32(可調整),等等。

MindSpore 提供了 mindspore.dataset.MnistDataset 來直接定義 Minist 數據集,非常方便。使用 mindspore.dataset.MnistDataset.map 映射函數,將數據操作應用到數據集。

我們定義 create_dataset() 函數來創建數據集:

def create_dataset(data_path, batch_size=32, repeat_size=1,num_parallel_workers=1):""" create dataset for train or testArgs:data_path: Data pathbatch_size: The number of data records in each grouprepeat_size: The number of replicated data recordsnum_parallel_workers: The number of parallel workers"""# define datasetmnist_ds = ds.MnistDataset(data_path)# define operation parametersresize_height, resize_width = 32, 32rescale = 1.0 / 255.0shift = 0.0rescale_nml = 1 / 0.3081shift_nml = -1 * 0.1307 / 0.3081# define map operationsresize_op = CV.Resize((resize_height, resize_width), interpolation=Inter.LINEAR) # Resize images to (32, 32)rescale_nml_op = CV.Rescale(rescale_nml, shift_nml) # normalize imagesrescale_op = CV.Rescale(rescale, shift) # rescale imageshwc2chw_op = CV.HWC2CHW() # change shape from (height, width, channel) to (channel, height, width) to fit network.type_cast_op = C.TypeCast(mstype.int32) # change data type of label to int32 to fit network# apply map operations on imagesmnist_ds = mnist_ds.map(input_columns="label", operations=type_cast_op, num_parallel_workers=num_parallel_workers)mnist_ds = mnist_ds.map(input_columns="image", operations=resize_op, num_parallel_workers=num_parallel_workers)mnist_ds = mnist_ds.map(input_columns="image", operations=rescale_op, num_parallel_workers=num_parallel_workers)mnist_ds = mnist_ds.map(input_columns="image", operations=rescale_nml_op, num_parallel_workers=num_parallel_workers)mnist_ds = mnist_ds.map(input_columns="image", operations=hwc2chw_op, num_parallel_workers=num_parallel_workers)# apply DatasetOpsbuffer_size = 10000mnist_ds = mnist_ds.shuffle(buffer_size=buffer_size) # 10000 as in LeNet train scriptmnist_ds = mnist_ds.batch(batch_size, drop_remainder=True)mnist_ds = mnist_ds.repeat(repeat_size)return mnist_ds

通過上面的函數,就完成了對剛下載的 MNIST 數據集的預處理。

4.?定義網絡

LeNet-5 是一種用于手寫體字符識別的非常高效的卷積神經網絡。LeNet-5 共有 7 層,不包含輸入,每層都包含可訓練參數;每個層有多個 Feature Map,每個 FeatureMap通過一種卷積濾波器提取輸入的一種特征。

1) 模型初始化

使用 mindspore.common.initializer.TruncatedNormal 方法對參數進行初始化,定義 conv 和 fc_with_initialize 分別對卷積層和全連接層進行初始化。

import mindspore.nn as nn from mindspore.common.initializer import TruncatedNormaldef conv(in_channels, out_channels, kernel_size, stride=1, padding=0):"""Conv layer weight initial."""weight = weight_variable()return nn.Conv2d(in_channels, out_channels,kernel_size=kernel_size, stride=stride, padding=padding,weight_init=weight, has_bias=False, pad_mode="valid")def fc_with_initialize(input_channels, out_channels):"""Fc layer weight initial."""weight = weight_variable()bias = weight_variable()return nn.Dense(input_channels, out_channels, weight, bias)def weight_variable():"""Weight initial."""return TruncatedNormal(0.02)

使用?mindspore.common.initializer.TruncatedNormal 方法,可以非常便捷地實現網絡權重系數的初始化操作,不需要自定義初始化函數。

2)?定義 LeNet-5 網絡

MindSpore 來定義 LeNet-5 網絡也很簡單,根據網絡結構,定義相應的卷積層和全連接層即可。在初始化函數 __init__ 種定義神經網絡的各層,然后通過定義 construct 方法來完成神經網絡的前向構造。

class LeNet5(nn.Cell):"""Lenet network structure."""# define the operator requireddef __init__(self):super(LeNet5, self).__init__()self.conv1 = conv(1, 6, 5)self.conv2 = conv(6, 16, 5)self.fc1 = fc_with_initialize(16 * 5 * 5, 120)self.fc2 = fc_with_initialize(120, 84)self.fc3 = fc_with_initialize(84, 10)self.relu = nn.ReLU()self.max_pool2d = nn.MaxPool2d(kernel_size=2, stride=2)self.flatten = nn.Flatten()# use the preceding operators to construct networksdef construct(self, x):x = self.conv1(x)x = self.relu(x)x = self.max_pool2d(x)x = self.conv2(x)x = self.relu(x)x = self.max_pool2d(x)x = self.flatten(x)x = self.fc1(x)x = self.relu(x)x = self.fc2(x)x = self.relu(x)x = self.fc3(x)return x

LeNet-5 是一個非常典型且簡單的卷積神經網絡,從?construct 方法可以詳細看到 LeNet-5 各層的結構。

3) 定義損失函數

MindSpore 支持的損失函數有 SoftmaxCrossEntropyWithLogits、L1Loss、MSELoss 等。這里使用 SoftmaxCrossEntropyWithLogits 交叉熵損失函數。

from mindspore.nn.loss import SoftmaxCrossEntropyWithLogits# define the loss function net_loss?=?SoftmaxCrossEntropyWithLogits(is_grad=False,?sparse=True,?reduction='mean')

4) 定義網絡梯度下降算法

MindSpore 支持的梯度下降算法有 Adam、AdamWeightDecay、Momentum 等。這里使用流行的 Momentum 算法。其中,學習率設為 0.01,momentum 參數設為 0.9。

# learning rate setting lr?=?0.01 momentum?=?0.9 #?define?the?optimizer net_opt?=?nn.Momentum(network.trainable_params(),?lr,?momentum)

5. 訓練網絡

1) 模型保存

mindspore.train.callback.ModelCheckpoint 方法可以保存網絡模型和參數。

config_ck = CheckpointConfig(save_checkpoint_steps=1875, keep_checkpoint_max=10) #?save?the?network?model?and?parameters?for?subsequence?fine-tuning ckpoint_cb?=?ModelCheckpoint(prefix="checkpoint_lenet",?config=config_ck)

2) 訓練網絡

訓練網絡使用 model.train 方法進行。這里把 epoch_size 設置為 1,對數據集進行 1 個迭代的訓練。訓練的過程中會打印 loss 值的變化。

from mindspore.nn.metrics import Accuracy from mindspore.train.callback import LossMonitor from mindspore.train import Modeldef train_net(args, model, epoch_size, mnist_path, repeat_size, ckpoint_cb, sink_mode):"""define the training method"""print("============== Starting Training ==============")#load training datasetds_train = create_dataset(os.path.join(mnist_path, "train"), 32, repeat_size)model.train(epoch_size,?ds_train,?callbacks=[ckpoint_cb,?LossMonitor()],?dataset_sink_mode=sink_mode) epoch_size?=?1 mnist_path?=?"./MNIST_Data #?group?layers?into?an?object?with?training?and?evaluation?features model?=?Model(network,?net_loss,?net_opt,?metrics={"Accuracy":?Accuracy()}) train_net(args,?model,?epoch_size,?mnist_path,?repeat_size,?ckpoint_cb)

其中,mnist_path 是 MNIST 數據集路徑。

3) 硬件信息

在主函數中,別忘了配置 MindSpore 運行的硬件信息。因為我們是在 CPU 環境下,所以 ‘--device_target’ 設置為 “CPU”。

parser = argparse.ArgumentParser(description='MindSpore LeNet Example') parser.add_argument('--device_target',?type=str,?default="CPU",?choices=['Ascend',?'GPU',?'CPU'],help='device where the code will be implemented (default: CPU)') args?=?parser.parse_args(args=[]) context.set_context(mode=context.GRAPH_MODE,?device_target=args.device_target)

這里的 '--device_target' 默認是 “CPU”,根據硬件情況也可以選擇 “Ascend” 或 “GPU”。使用的是圖模式 “context.GRAPH_MODE”。

4) 模型訓練

執行程序,模型訓練開始。訓練過程中會打印 loss 值:

... epoch: 1 step: 262, loss is 1.9212162 epoch: 1 step: 263, loss is 1.8498616 epoch: 1 step: 264, loss is 1.7990671 epoch: 1 step: 265, loss is 1.9492403 epoch: 1 step: 266, loss is 2.0305142 epoch: 1 step: 267, loss is 2.0657792 epoch: 1 step: 268, loss is 1.9582214 epoch: 1 step: 269, loss is 0.9459006 epoch: 1 step: 270, loss is 0.8167224 epoch: 1 step: 271, loss is 0.7432692 ...

可以看到 loss 總體來說會逐步減小,精度逐步提高,最終的 loss 為 0.067。

訓練完成之后,得到保存的模型文件:

checkpoint_lenet-1_1875.ckpt

6. 模型測試

在得到模型文件后,使用 model.eval()?接口讀入測試數據集,通過模型運行測試數據集得到的結果。定義測試函數 test_net():

def test_net(args, network, model, mnist_path):"""Define the evaluation method."""print("============== Starting Testing ==============")# load the saved model for evaluationparam_dict = load_checkpoint("checkpoint_lenet-1_1875.ckpt")# load parameter to the networkload_param_into_net(network, param_dict)# load testing datasetds_eval = create_dataset(os.path.join(mnist_path, "test"))acc = model.eval(ds_eval, dataset_sink_mode=False)print("============== Accuracy:{} ==============".format(acc))

運行測試網絡:

test_net(args, network, model, mnist_path) ============== Starting Testing ============== ============== Accuracy:{'Accuracy': 0.9663461538461539} ==============

最終,可以看到剛剛訓練的 LeNet-5 網絡模型在測試集上的精度是 96.63%,效果非常不錯。

至此,我們使用 MindSpore 框架訓練 LeNet-5 模型已經完成。實現了基于本地 Jupyter 實現 MNIST 手寫數據集分類。總的來說,MindSpore 提供了很多模塊化的方法來進行模型搭建和訓練,非常方便我們能夠快速搭建一個神經網絡模型。大家可以根據自己實際需求,上手搭建一個自己的神經網絡試試。

本節完整代碼:

https://gitee.com/mindspore/docs/blob/master/tutorials/tutorial_code/lenet.py

三、在云服務器上使用 MindSpore

除了可以在本地使用 MindSpore 框架之外,我們還可以在華為云服務器上使用 MindSpore。在華為云上使用 MindSpore 的還有一個好處是,我們可以申請使用昇騰 AI 處理器資源池作為硬件。

ModelArts 是華為云提供的面向開發者的一站式 AI 開發平臺,而且集成了 MindSpore。下面我們將在 ModelArts 下使用 ResNet-50 網絡識別 CIFAR-10 圖片。

1. 準備 ModelArts

1) 進入華為云官網,注冊賬號。

具體操作:

https://support.huaweicloud.com/prepare-modelarts/modelarts_08_0001.html

2)?獲取訪問密鑰并完成 ModelArts 配置。

具體操作:

https://support.huaweicloud.com/prepare-modelarts/modelarts_08_0002.html

3)?創建 OBS 桶

具體操作:

https://support.huaweicloud.com/prepare-modelarts/modelarts_08_0003.html

2. 申請服務器昇騰 AI 處理器資源

為了在 ModelArts 上使用華為云昇騰 AI 處理器,我們需要申請體驗資格,申請方式也很簡單,可在下面的網站上進行申請:

https://console.huaweicloud.com/modelarts/?region=cn-north-4#/dashboard/applyModelArtsAscend910Beta

申請時的內容大家可以填仔細些,一般正常的話兩個工作日就批下來了。

3.?數據準備

1)?下載 CIFAR-10 數據集

CIFAR-10?該數據集共有 60000 張彩色圖像,這些圖像是 32*32,分為 10 個類,每類 6000 張圖。

CIFAR-10 數據集下載地址:

http://www.cs.toronto.edu/~kriz/cifar.html

注意下載 CIFAR-10 binary version 版本。

2)?新建一個自己的 OBS 桶(例如:mine-ms-dataset)

ModelArts 使用對象存儲服務(Object Storage Service,簡稱 OBS)進行數據存儲,因此,在開始訓練任務之前,需要將數據上傳至 OBS。

首先,登錄 OBS 管理控制臺:

https://storage.huaweicloud.com/obs/?region=cn-north-4#/obs/manager/buckets

創建 OBS 桶 mine-ms-dataset(名稱可修改,下面類似)。

然后,在剛創建的 OBS 桶里,創建用于存放數據的文件夾:在桶列表單擊待操作的桶,在左側導航欄,單擊“對象”,新建文件夾 mine-cifar-10

最后,將下載好的 CIFAR-10 數據集按照以下目錄結構上傳至數據目錄 mine-cifar-10 中:

└─對象存儲/mine-ms-dataset/mine-cifar-10├─train│ data_batch_1.bin│ data_batch_2.bin│ data_batch_3.bin│ data_batch_4.bin│ data_batch_5.bin│└─evaltest_batch.bin

4. 程序準備

新建一個 OBS 桶(例如:mine-resnet50-train),在桶中創建代碼目錄(例如:mine-resnet50_cifar10_train)。同時在該桶中創建 output 目錄和 log 目錄,用來存放模型和日志。

將網址:

https://gitee.com/mindspore/docs/tree/master/tutorials/tutorial_code/sample_for_cloud/

中的兩個 .py 文件 dataset.pyresnet50_train.py 下載并上傳到代碼目錄 mine-resnet50_cifar10_train 中。

代碼目錄 mine-resnet50_cifar10_train 結構如下:

└─對象存儲/mine-resnet50-train├─mine-resnet50_cifar10_train│ dataset.py│ resnet50_train.py│├─output└─log

5.?創建訓練任務

準備好數據和執行腳本以后,下面就可以在云服務器上創建訓練任務了。

1)?進入 ModelArts 控制臺

打開華為云 ModelArts 主頁

https://www.huaweicloud.com/product/modelarts.html

點擊“進入控制臺”。

2) 使用 MindSpore 作為常用框架創建訓練作業

在左側導航欄中選擇“訓練管理 > 訓練作業”,默認進入“訓練作業”列表。

在訓練作業列表中,單擊左上角“創建”,進入“創建訓練作業”頁面。

在創建訓練作業頁面,訓練作業名稱自定義,例如 mine-resnet50-trainjob。填寫訓練作業相關參數,具體配置參數如下:

值得注意的時,算法來源常用框架選擇 Ascend-Powered-Engine,因為我們使用的是硬件是華為云昇騰 AI 處理器。MindSpore 版本選擇 MindSpore-0.1-python3.7-aarch64 即可。

配置完之后,點擊下一步 -> 提交 -> 返回訓練作業列表,可以看到訓練作業 mine-resnet50-trainjob 正在運行:

整個運行過程大概? 8 分半鐘,顯示運行成功,表示模型訓練測試完成。

最后,點擊訓練作業 mine-resnet50-trainjob,在日志里可以看到模型在測試集上的準確率為 92.49%,說明該模型效果不錯。

我們還可以從 OBS 種下載日志文件并查看。

以上就是在云上使用 MindSpore 的簡單教程。

四、總結:

本文主要通過兩個實際應用案例對開源框架 MindSpore 進行介紹。一是基于本地 Jupyter Notebook 的 MNIST 手寫數據識別;二是基于華為云服務器的 CIFAR-10 圖像分類。兩個案例均圍繞并使用了 MindSpore。

從我個人的使用感覺來看,MindSpore 用起來還是很順手的,而且函數封裝得比較簡潔,使用起來較為方便。通過手把手的教程,大家完全可以自己動手實操一下,感受一下開源框架 MindSpore 的魅力。

大家也可以根據自己的具體應用場景和實用案例,使用 MindSpore,搭建神經網絡模型,解決實際問題。無論是計算機視覺還是自然語言處理,相信 MindSpore 都能給大家帶來流暢的體驗。

參考資料:

https://www.mindspore.cn/

https://www.mindspore.cn/tutorial/zh-CN/master/index.html

https://support.huaweicloud.com/modelarts/index.html

總結

以上是生活随笔為你收集整理的MindSpore!这款刚刚开源的深度学习框架我爱了!的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 婷婷色婷婷| 成人做受视频试看60秒 | 无码黑人精品一区二区 | 久久久久久久国产 | 无码人妻精品一区二 | 亚洲av久久久噜噜噜噜 | 国产内射一区二区 | 中文字幕一区二区三区人妻四季 | 素人av在线 | 久久久久久久亚洲av无码 | 色婷婷社区| 国产成人综合一区二区三区 | 欧美男人又粗又长又大 | 国产一区精品久久 | 国产一级片免费在线观看 | 日韩电影精品 | xxx国产在线观看 | 99re这里只有精品66 | 免费av网址大全 | av免费网址在线观看 | 四虎av网址 | 天堂网2020 | 日韩精品视频在线观看免费 | 免费美女av | 久久久久一区二区 | 久热欧美 | 丝袜av网站 | 欧美日韩一区视频 | 国产农村妇女毛片精品久久 | 日日噜噜噜噜久久久精品毛片 | 九九精品影院 | 国产精品腿扒开做爽爽爽挤奶网站 | 蜜桃臀aⅴ精品一区二区三区 | 无码毛片aaa在线 | 另类小说婷婷 | 99久久精品国产毛片 | 国产精品情侣呻吟对白视频 | 日韩欧美国产视频 | 亚洲欧美精品在线 | 亚洲欧美综合视频 | 丁香六月五月婷婷 | 艳妇乳肉豪妇荡乳 | 色一情一交一乱一区二区三区 | 亚洲免费av电影 | 福利视频在线看 | 锦绣未央在线观看 | 成年人视频在线免费观看 | 91精品国产亚洲 | 免费人成在线观看视频播放 | 欧美成人国产精品一区二区 | 成人在线观看免费 | 爱露出 | 老子影院午夜伦不卡大全 | 亚洲黄片一区二区三区 | 成人91在线 | 欧美成人免费一级 | 黄色av网站免费观看 | 国产成人黄色片 | 免费看日产一区二区三区 | 国产日产久久高清欧美一区 | 亚洲第5页| 69成人免费视频 | av激情网站| a级片在线观看视频 | 国产av电影一区二区三区 | 欧美日韩精品在线 | 天天狠狠操 | 在线播放成人 | 日本阿v视频 | 午夜三级网站 | 日本亚洲一区 | 亚洲第一成肉网 | 免费看裸体网站 | 夜夜春av | 美国一级大黄一片免费中文 | 成人免费看片视频 | 中文字幕不卡一区 | 男女污网站 | 在线黄色网页 | 亚洲三级视频在线观看 | 日韩欧美高清dvd碟片 | 中文字幕人妻一区二区三区 | 国产又粗又猛又黄又爽的视频 | いいなり北条麻妃av101 | 欧美性生交xxxxx久久久缅北 | 中文字幕人乱码中文字 | 金鱼妻日剧免费观看完整版全集 | 久久精品国产亚洲av麻豆 | 色婷婷综合久久久久中文 | 麻豆视频污 | 欧美一区二区三区成人片在线 | 丁香六月婷婷激情 | 久久福利网 | 黄视频在线 | 六月婷婷综合 | 国内精品久久久久久久久久 | 中文字幕一区二区人妻电影 | 91色在线 | 中国女人做爰视频 |