成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java 代碼居然能玩轉(zhuǎn) AI?這個神器把機(jī)器學(xué)習(xí)干懵了

人工智能
相信各位 Java 老哥們已經(jīng)對 DL4J 這個神器有了一定的了解。它讓咱們不用拋棄熟悉的 Java 生態(tài),就能在 AI 領(lǐng)域大展拳腳。從簡單的手寫數(shù)字識別,到復(fù)雜的分布式推薦系統(tǒng),DL4J 提供了完整的工具鏈。

兄弟們,是不是每次刷到 AI 相關(guān)的文章,看到滿屏的 Python 代碼就犯嘀咕:咱 Java 程序員在 AI 領(lǐng)域就只能當(dāng)看客嗎?今天咱就來聊聊這個能讓 Java 玩轉(zhuǎn) AI 的神器 ——Deeplearning4j(簡稱 DL4J),讓咱們手里的 Java 代碼也能在 AI 圈兒支棱起來!

一、當(dāng) Java 遇上 AI:一場遲到的雙向奔赴

說起機(jī)器學(xué)習(xí)框架,Python 陣營的 TensorFlow、PyTorch 那是相當(dāng)風(fēng)光,仿佛 AI 領(lǐng)域就是 Python 的天下。咱們 Java 程序員平時聊起 AI,總有點 “別人家孩子” 的感覺:人家 Python 天生自帶動態(tài)類型的靈活,還有數(shù)不清的機(jī)器學(xué)習(xí)庫,上手那叫一個快。再看看咱們 Java,穩(wěn)穩(wěn)的 “企業(yè)級老大哥” 形象,寫后端那是得心應(yīng)手,可一提到 AI,好像就跟穿慣了西裝的紳士突然要去跳街舞,總覺得哪兒不對勁。

但別忘了,Java 可是有著自己的獨門優(yōu)勢。咱 Java 生態(tài)那叫一個龐大,尤其是在企業(yè)級應(yīng)用里,銀行、金融、電商這些關(guān)鍵領(lǐng)域,后端系統(tǒng)大量都是 Java 寫的。要是能在 Java 里直接搞 AI,那可太方便了 —— 不用想著怎么把 Python 訓(xùn)練好的模型和 Java 后端對接,不用頭疼跨語言調(diào)用的各種坑,直接在同一個項目里就能完成從數(shù)據(jù)處理到模型訓(xùn)練、再到服務(wù)部署的全流程。這時候,Deeplearning4j 就像專為 Java 量身定制的 AI 神器,帶著 Java 開啟了在 AI 領(lǐng)域的逆襲之路。

(一)Deeplearning4j 是個啥?

Deeplearning4j 是第一個專為 Java 和 Scala 設(shè)計的開源分布式深度學(xué)習(xí)框架。啥意思呢?就是說咱 Java 程序員可以用熟悉的 Java 語法來寫機(jī)器學(xué)習(xí)代碼,不用去學(xué)另一門語言。而且它支持分布式訓(xùn)練,這對處理大規(guī)模數(shù)據(jù)可太友好了,畢竟企業(yè)級場景里的數(shù)據(jù)量往往大得驚人。

它可不是孤軍奮戰(zhàn),背后有強(qiáng)大的生態(tài)支持。和 Java 常用的庫比如 ND4J(數(shù)值計算庫,專門處理多維數(shù)組,DL4J 的底層依賴)、Hadoop、Spark 都能很好地集成。也就是說,咱們可以借助 Hadoop 來處理海量數(shù)據(jù),用 Spark 進(jìn)行分布式計算,再結(jié)合 DL4J 來構(gòu)建機(jī)器學(xué)習(xí)模型,整個流程在 Java 生態(tài)里無縫銜接,簡直舒服到家了。

(二)為啥說它讓機(jī)器學(xué)習(xí) “懵圈”?

以前用 Python 做機(jī)器學(xué)習(xí),雖然靈活,但在企業(yè)級部署的時候可沒少讓人頭疼。比如訓(xùn)練好的模型要部署到 Java 后端,得考慮各種接口調(diào)用問題,數(shù)據(jù)格式轉(zhuǎn)換、版本兼容都是麻煩事兒。而 Deeplearning4j 直接讓 Java 具備了端到端的 AI 能力,從數(shù)據(jù)加載、預(yù)處理,到模型構(gòu)建、訓(xùn)練,再到最后的模型保存、服務(wù)部署,全部都能在 Java 環(huán)境里搞定。這就相當(dāng)于在 Java 的地盤上,搭建了一個完整的 AI 生產(chǎn)線,那些習(xí)慣了 Python 生態(tài)的機(jī)器學(xué)習(xí)框架,估計得琢磨琢磨:“這 Java 咋不按套路出牌,自己搞了一套呢?”

二、從零開始:用 Java 寫第一個機(jī)器學(xué)習(xí)模型

說了這么多,咱別光動嘴,直接上手實操。就從最簡單的手寫數(shù)字識別開始,看看用 Deeplearning4j 怎么玩。

(一)環(huán)境準(zhǔn)備:先把 “裝備” 配齊

首先得在項目里引入 DL4J 的依賴。如果是用 Maven 管理項目,那就簡單了,在 pom.xml 里加上這幾行:

<dependencies>
    <dependency>
        <groupId>org.deeplearning4j</groupId>
        <artifactId>deeplearning4j-core</artifactId>
        <version>1.0.0-beta7</version>
    </dependency>
    <dependency>
        <groupId>org.nd4j</groupId>
        <artifactId>nd4j-native-platform</artifactId>
        <version>1.0.0-beta7</version>
    </dependency>
    <dependency>
        <groupId>org.datavec</groupId>
        <artifactId>datavec-api</artifactId>
        <version>1.0.0-beta7</version>
    </dependency>
</dependencies>

這里要注意,nd4j-native-platform 會根據(jù)你的操作系統(tǒng)自動選擇對應(yīng)的本地庫,要是遇到問題,檢查一下是不是系統(tǒng)版本不兼容。

(二)數(shù)據(jù)處理:把 “原材料” 準(zhǔn)備好

手寫數(shù)字識別常用的數(shù)據(jù)集是 MNIST,DL4J 里有現(xiàn)成的工具類可以加載這個數(shù)據(jù)集。不過咱先別急著用,先講講數(shù)據(jù)處理的基本流程。

首先,MNIST 數(shù)據(jù)集里的每個數(shù)字都是一張 28x28 的灰度圖像,每個像素點的取值是 0 - 255,代表灰度值。我們需要把這些圖像數(shù)據(jù)轉(zhuǎn)換成模型能處理的格式。在 DL4J 里,常用的是 INDArray 類型,這其實就是 ND4J 里的多維數(shù)組,相當(dāng)于其他框架里的張量(Tensor)。

加載數(shù)據(jù)的代碼大概是這樣的:

DataSetIterator mnistTrain = new MnistDataSetIterator(64, true);
DataSetIterator mnistTest = new MnistDataSetIterator(64, false);

這里的 64 是批量大?。╞atch size),也就是說每次訓(xùn)練的時候,模型會拿 64 張圖片來計算梯度、更新參數(shù)。true 表示是訓(xùn)練集,會打亂數(shù)據(jù)順序,讓訓(xùn)練更有效。

(三)模型構(gòu)建:搭起咱們的 “AI 小作坊”

接下來就是構(gòu)建模型了。對于手寫數(shù)字識別,我們可以用一個簡單的多層感知機(jī)(MLP),或者更高級一點,用卷積神經(jīng)網(wǎng)絡(luò)(CNN)。這里先從多層感知機(jī)開始,后面再進(jìn)階到 CNN。

多層感知機(jī)的結(jié)構(gòu)大概是這樣的:輸入層、隱藏層、輸出層。輸入層的神經(jīng)元數(shù)量是 28x28 = 784,因為每張圖片展平后是 784 個像素點;輸出層是 10 個神經(jīng)元,對應(yīng) 0 - 9 這 10 個數(shù)字。隱藏層我們可以設(shè)一個 100 個神經(jīng)元的層。

用 DL4J 構(gòu)建模型的代碼是這樣的:

MultiLayerConfiguration config = new NeuralNetConfiguration.Builder()
       .seed(12345)
       .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
       .updater(new Nesterovs.Builder().learningRate(0.01).build())
       .weightInit(new XavierInit())
       .list()
       .layer(0, new DenseLayer.Builder()
               .nIn(784)
               .nOut(100)
               .activation("relu")
               .build())
       .layer(1, new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD)
               .nIn(100)
               .nOut(10)
               .activation("softmax")
               .build())
       .setInputType(InputType.feedForward(784))
       .build();
MultiLayerNetwork model = new MultiLayerNetwork(config);
model.init();

這里面有幾個關(guān)鍵的概念:

  • 優(yōu)化算法(Optimization Algorithm):這里用的是隨機(jī)梯度下降(SGD)的變種 Nesterov 加速梯度法,比普通 SGD 收斂得更快。
  • 權(quán)重初始化(Weight Init):Xavier 初始化可以讓權(quán)重分布更合理,避免梯度消失或爆炸的問題。
  • 激活函數(shù)(Activation Function):隱藏層用 ReLU 函數(shù),讓模型具備非線性擬合能力;輸出層用 softmax 函數(shù),輸出每個類別的概率。

(四)模型訓(xùn)練:讓 “小作坊” 運轉(zhuǎn)起來

訓(xùn)練模型其實就是讓模型不斷學(xué)習(xí)數(shù)據(jù)中的規(guī)律,調(diào)整自己的參數(shù)。DL4J 里訓(xùn)練模型很簡單,用一個循環(huán),每次從數(shù)據(jù)迭代器里取一批數(shù)據(jù),然后調(diào)用 model.fit (dataSet) 就行了。

int numEpochs = 10;
for (int i = 0; i < numEpochs; i++) {
    model.fit(mnistTrain);
    mnistTrain.reset();
    Evaluation eval = new Evaluation(10);
    while (mnistTest.hasNext()) {
        DataSet data = mnistTest.next();
        INDArray output = model.output(data.getFeatureMatrix());
        eval.eval(data.getLabels(), output);
    }
    System.out.println("Epoch " + (i + 1) + " Evaluation:");
    System.out.println(eval.stats());
    mnistTest.reset();
}

這里的 epoch 是指整個數(shù)據(jù)集被訓(xùn)練一次的次數(shù)。每次訓(xùn)練完一個 epoch,我們用測試集來評估模型的性能,看看準(zhǔn)確率是多少。Evaluation 類會幫我們計算各種指標(biāo),比如準(zhǔn)確率、精確率、召回率等。

(五)模型預(yù)測:讓 “AI 小能手” 干活啦

訓(xùn)練好模型后,就可以用它來預(yù)測新的數(shù)據(jù)了。比如我們有一張手寫數(shù)字的圖片,轉(zhuǎn)換成 28x28 的灰度矩陣,然后展平成 784 維的向量,輸入到模型里,模型就會輸出一個 10 維的向量,每個元素代表屬于對應(yīng)數(shù)字的概率,取概率最大的那個就是預(yù)測結(jié)果。

INDArray input = // 假設(shè)這是預(yù)處理好的輸入數(shù)據(jù)
INDArray output = model.output(input);
int predictedClass = Nd4j.argMax(output, 1).getInt(0);
System.out.println("Predicted class: " + predictedClass);

到這兒,咱們的第一個 Java 版機(jī)器學(xué)習(xí)模型就跑起來了。是不是發(fā)現(xiàn),其實用 Java 搞 AI 也沒想象中那么難?接下來咱再深入聊聊 DL4J 的核心概念,讓大家理解得更透徹。

三、深入 DL4J:那些讓 Java 玩轉(zhuǎn) AI 的關(guān)鍵技術(shù)

(一)張量(INDArray):AI 世界的 “通用語言”

在 DL4J 里,幾乎所有的數(shù)據(jù)處理都是圍繞 INDArray 進(jìn)行的。它就像 AI 世界里的 “通用語言”,無論是輸入數(shù)據(jù)、模型權(quán)重,還是中間結(jié)果,都是用 INDArray 來表示的。

INDArray 是一個多維數(shù)組,可以是一維、二維、三維甚至更高維。比如在圖像識別里,一張彩色圖像是三維的(高度、寬度、通道數(shù)),一個批次的圖像就是四維的(批次大小、高度、寬度、通道數(shù))。ND4J 為 INDArray 提供了強(qiáng)大的數(shù)值計算能力,支持各種矩陣運算,比如加減乘除、轉(zhuǎn)置、求逆等,而且底層會根據(jù)硬件情況自動選擇最優(yōu)的實現(xiàn),比如用 CPU 的多線程或者 GPU 的加速(需要配置 CUDA 環(huán)境)。

(二)層(Layer):模型的 “積木塊”

DL4J 里的層就像搭積木一樣,我們可以用不同的層來構(gòu)建各種復(fù)雜的模型。常見的層有:

  • 全連接層(DenseLayer):每個神經(jīng)元都與上一層的所有神經(jīng)元相連,是最基礎(chǔ)的層,前面的手寫數(shù)字識別模型里就用到了。
  • 卷積層(ConvolutionLayer):專門用于處理圖像數(shù)據(jù),通過卷積核來提取圖像的局部特征,比如邊緣、紋理等。
  • 循環(huán)層(RnnLayer、LSTM、GRU):用于處理序列數(shù)據(jù),比如文本、時間序列等,能捕捉序列中的前后依賴關(guān)系。
  • 池化層(PoolingLayer):通常接在卷積層后面,對特征圖進(jìn)行下采樣,減少參數(shù)數(shù)量,同時保留主要特征。

每種層都有自己的參數(shù)和配置,比如卷積層的卷積核大小、步長,循環(huán)層的隱藏單元數(shù)量等。通過組合這些層,我們可以構(gòu)建出適合不同任務(wù)的模型。

(三)數(shù)據(jù)迭代器(DataSetIterator):數(shù)據(jù)的 “傳送帶”

在機(jī)器學(xué)習(xí)中,數(shù)據(jù)處理是很重要的一環(huán)。DL4J 的 DataSetIterator 就像一條 “傳送帶”,源源不斷地把數(shù)據(jù)送到模型里。它不僅支持加載常見的數(shù)據(jù)集,還可以自定義,方便處理各種格式的自有數(shù)據(jù)。

比如我們有一個 CSV 格式的數(shù)據(jù)集,就可以自己實現(xiàn)一個 DataSetIterator,讀取 CSV 文件,進(jìn)行數(shù)據(jù)清洗、轉(zhuǎn)換等操作,然后按批次輸出給模型。這對于企業(yè)級應(yīng)用來說非常實用,因為實際項目中的數(shù)據(jù)往往存儲在各種地方,格式也各不相同,需要靈活的數(shù)據(jù)處理能力。

(四)分布式訓(xùn)練:應(yīng)對大規(guī)模數(shù)據(jù)的 “秘密武器”

前面提到 DL4J 支持分布式訓(xùn)練,這在處理大規(guī)模數(shù)據(jù)時至關(guān)重要。想象一下,如果有上億條數(shù)據(jù),單臺機(jī)器根本處理不過來,這時候就需要分布式系統(tǒng),把數(shù)據(jù)和計算任務(wù)分配到多個節(jié)點上并行處理。

DL4J 集成了 Hadoop 和 Spark,可以利用它們的分布式計算能力。比如在 Spark 上,可以把模型訓(xùn)練任務(wù)分發(fā)到多個 executor 節(jié)點,每個節(jié)點處理一部分?jǐn)?shù)據(jù),然后通過參數(shù)服務(wù)器(Parameter Server)來同步模型參數(shù)。這樣可以大大加快訓(xùn)練速度,處理海量數(shù)據(jù)也不在話下。

四、進(jìn)階玩法:用 Java 搞定更復(fù)雜的 AI 任務(wù)

(一)圖像識別:從手寫數(shù)字到復(fù)雜圖像

前面的手寫數(shù)字識別只是小試牛刀,DL4J 在圖像識別領(lǐng)域還能玩出更多花樣。比如構(gòu)建一個卷積神經(jīng)網(wǎng)絡(luò)(CNN)來處理更復(fù)雜的圖像數(shù)據(jù),像 CIFAR - 10 數(shù)據(jù)集(包含 10 類自然圖像)。

CNN 的結(jié)構(gòu)通常是 “卷積層 + 池化層” 交替出現(xiàn),然后接全連接層。在 DL4J 里構(gòu)建 CNN 也很方便:

ConvolutionLayer convLayer = new ConvolutionLayer.Builder(5, 5)
       .nIn(1)
       .stride(1, 1)
       .nOut(20)
       .activation("relu")
       .build();
SubsamplingLayer poolingLayer = new SubsamplingLayer.Builder(SubsamplingLayer.PoolingType.MAX)
       .kernelSize(2, 2)
       .stride(2, 2)
       .build();

這里的卷積層用 5x5 的卷積核,輸出 20 個特征圖,池化層用最大池化,把特征圖的大小減半。通過多層這樣的結(jié)構(gòu),模型可以提取到更高級的圖像特征,從而識別更復(fù)雜的圖像。

(二)自然語言處理:讓 Java 理解文字的魅力

Java 在企業(yè)級應(yīng)用中經(jīng)常需要處理文本數(shù)據(jù),比如日志分析、用戶評論情感分析等。DL4J 也提供了豐富的自然語言處理(NLP)支持,比如詞嵌入(Word Embedding)、循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)、Transformer 等。

以情感分析為例,我們需要把文本轉(zhuǎn)換成模型能處理的數(shù)值形式。常用的方法是先對文本進(jìn)行分詞、去除停用詞等預(yù)處理,然后用 Word2Vec、GloVe 等模型生成詞向量,或者直接用 DL4J 里的 EmbeddingLayer 來學(xué)習(xí)詞向量。

EmbeddingLayer embeddingLayer = new EmbeddingLayer.Builder()
       .nIn(vocabSize)
       .nOut(embeddingSize)
       .build();

然后結(jié)合 LSTM 層來捕捉文本中的序列依賴關(guān)系,最后通過全連接層和 softmax 層輸出情感分類結(jié)果(正面、負(fù)面、中性)。

(三)與 Spark 集成:在分布式環(huán)境中大展拳腳

假設(shè)我們有一個電商平臺,需要對用戶的行為日志進(jìn)行分析,構(gòu)建推薦系統(tǒng)。日志數(shù)據(jù)可能分布在多個服務(wù)器上,存儲在 HDFS 中,這時候就可以用 Spark 來讀取和處理數(shù)據(jù),然后用 DL4J 來訓(xùn)練推薦模型。

具體流程大概是這樣的:Spark 讀取 HDFS 上的日志數(shù)據(jù),進(jìn)行清洗、特征工程,生成訓(xùn)練數(shù)據(jù)集;然后把數(shù)據(jù)集分發(fā)到各個 Spark 節(jié)點,每個節(jié)點用 DL4J 進(jìn)行模型訓(xùn)練,參數(shù)通過 Spark 的廣播變量或分布式存儲來同步;最后訓(xùn)練好的模型可以保存到分布式文件系統(tǒng)中,供線上服務(wù)調(diào)用。

這種集成方式充分發(fā)揮了 Java 生態(tài)的優(yōu)勢,讓我們在處理大規(guī)模數(shù)據(jù)時游刃有余。

五、DL4J 的優(yōu)缺點:咱不吹不黑,理性分析

(一)優(yōu)點:Java 程序員的 “AI 福音”

  1. 無縫融入 Java 生態(tài):這是 DL4J 最大的優(yōu)勢。對于已經(jīng)有 Java 后端系統(tǒng)的企業(yè)來說,不需要切換技術(shù)棧,直接在現(xiàn)有項目中引入 DL4J 就能開展 AI 工作,大大降低了技術(shù)門檻和集成成本。
  2. 強(qiáng)大的分布式支持:結(jié)合 Hadoop、Spark 等分布式框架,能夠輕松處理海量數(shù)據(jù),這在企業(yè)級場景中至關(guān)重要。很多 Python 框架在分布式訓(xùn)練方面雖然也有支持,但和 Java 生態(tài)的集成度遠(yuǎn)不如 DL4J。
  3. 類型安全和調(diào)試便利:Java 是靜態(tài)類型語言,編譯時就能發(fā)現(xiàn)很多錯誤,這對于復(fù)雜的機(jī)器學(xué)習(xí)模型開發(fā)來說,能減少很多運行時的問題。而且 Java 的調(diào)試工具非常成熟,程序員可以更方便地排查模型訓(xùn)練中的問題。

(二)缺點:客觀存在,咱得心里有數(shù)

  1. 入門門檻稍高:雖然對于 Java 程序員來說,語法不是問題,但機(jī)器學(xué)習(xí)本身有一定的理論門檻,需要掌握線性代數(shù)、概率論、深度學(xué)習(xí)等知識。而且 DL4J 的文檔和社區(qū)資源相對于 TensorFlow、PyTorch 來說,還是少了一些,遇到問題可能需要花更多時間排查。
  2. 靈活性稍遜:Python 之所以在 AI 領(lǐng)域流行,很大程度上是因為它的動態(tài)類型和靈活的語法,方便快速實驗和迭代。DL4J 作為 Java 框架,在代碼的靈活性上自然比不上 Python,比如構(gòu)建復(fù)雜的自定義層,可能需要寫更多的代碼。
  3. GPU 支持相對有限:雖然 DL4J 也支持 GPU 加速,但主要依賴 CUDA 和 cuDNN,而且配置過程相對復(fù)雜,對于沒有 GPU 環(huán)境的開發(fā)者來說,訓(xùn)練速度可能不如 Python 框架在 GPU 上的表現(xiàn)。

結(jié)語:Java 程序員,是時候在 AI 領(lǐng)域秀一把了

說了這么多,相信各位 Java 老哥們已經(jīng)對 DL4J 這個神器有了一定的了解。它讓咱們不用拋棄熟悉的 Java 生態(tài),就能在 AI 領(lǐng)域大展拳腳。從簡單的手寫數(shù)字識別,到復(fù)雜的分布式推薦系統(tǒng),DL4J 提供了完整的工具鏈。

可能有人會說:“AI 領(lǐng)域 Python 還是主流,我學(xué)這個有必要嗎?” 咱覺得,技多不壓身,尤其是在企業(yè)級場景中,Java 的優(yōu)勢不可替代。而且,掌握了 DL4J,再去學(xué)其他框架也會更容易,因為機(jī)器學(xué)習(xí)的核心原理都是相通的。

所以,別再看著 Python 玩 AI 眼饞了,趕緊打開 IDE,新建一個 Java 項目,試試用 DL4J 寫個機(jī)器學(xué)習(xí)模型。說不定下一個在企業(yè)里用 Java 搞定 AI 難題的,就是你!

責(zé)任編輯:武曉燕 來源: 石杉的架構(gòu)筆記
相關(guān)推薦

2024-11-11 14:57:56

JWTSession微服務(wù)

2024-11-12 13:41:49

2024-08-27 00:00:01

AI應(yīng)用框架

2021-03-26 15:18:11

代碼工具Mockoon

2021-07-14 15:06:50

SDK版本 jar

2019-09-27 09:13:55

Redis內(nèi)存機(jī)制

2018-06-05 08:45:50

系統(tǒng)蘋果軟件

2018-10-11 10:37:31

JavaScript開源 機(jī)器學(xué)習(xí)

2021-12-30 20:20:46

機(jī)器學(xué)習(xí)銷售語言

2020-06-29 11:24:39

華為云

2020-02-24 10:45:44

代碼開發(fā)工具

2022-02-21 14:32:32

SpringBoot框架微服務(wù)

2012-07-19 14:42:58

Windows 8微軟

2022-08-03 20:18:58

機(jī)器學(xué)習(xí)算法分析數(shù)據(jù)

2017-04-13 09:57:39

機(jī)器學(xué)習(xí)人工智能AI

2022-03-15 17:12:03

大數(shù)據(jù)機(jī)器學(xué)習(xí)人工智能

2023-10-30 19:51:52

ESlint檢測工具代碼

2025-03-12 00:48:58

2022-06-07 10:25:45

機(jī)器學(xué)習(xí)Shapash

2023-11-15 14:34:05

MySQL悲觀鎖
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 日韩一区二区在线观看 | 国产视频一区二区三区四区五区 | 观看av| 亚洲va在线va天堂va狼色在线 | 999久久久免费精品国产 | 综合久久av | 黑人巨大精品欧美黑白配亚洲 | 夜夜爽99久久国产综合精品女不卡 | 一区二区三区四区电影 | 桃色五月| 欧美不卡视频一区发布 | 亚洲欧洲一区二区 | 91久久| 四季久久免费一区二区三区四区 | 欧美综合国产精品久久丁香 | 黄a在线观看 | 日韩日韩日韩日韩日韩日韩日韩 | 日韩精品一区二区三区视频播放 | 亚洲精品久| 国产一区二区三区四区hd | 国产亚洲www | 欧美天堂一区 | 欧美一级片免费看 | 91最新视频 | 午夜爱爱网 | 久久97精品 | 欧美一级黄色片 | 国产黑丝在线 | 又黑又粗又长的欧美一区 | 欧美a区 | 久久久一二三区 | 久久久久免费 | 日韩av在线一区二区 | 毛片区| 国产精品美女久久久久久免费 | 成人免费在线观看 | 91视视频在线观看入口直接观看 | 草久视频 | 亚洲精品天堂 | 999久久久免费精品国产 | 久久久国产一区二区三区 |