<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          基于Keras的多標(biāo)簽圖像分類

          共 6974字,需瀏覽 14分鐘

           ·

          2021-08-25 04:06


          向AI轉(zhuǎn)型的程序員都關(guān)注了這個(gè)號(hào)??????

          機(jī)器學(xué)習(xí)AI算法工程   公眾號(hào):datayx



          本篇記錄一下自己項(xiàng)目中用到的keras相關(guān)的部分。由于本項(xiàng)目既有涉及multi-class(多類分類),也有涉及multi-label(多標(biāo)記分類)的部分,multi-class分類網(wǎng)上已經(jīng)很多相關(guān)的文章了。這里就說一說multi-label的搭建網(wǎng)絡(luò)的部分。之后如果有時(shí)間的時(shí)候,再說一說cross validation(交叉驗(yàn)證)和在epoch的callback函數(shù)中處理一些多標(biāo)簽度量metric的問題。


          multi-label多標(biāo)記監(jiān)督學(xué)習(xí)

          其實(shí)我個(gè)人比較喜歡把label翻譯為標(biāo)簽。那可能學(xué)術(shù)上翻譯multi-label多翻譯為多標(biāo)記。其實(shí)和多標(biāo)簽一個(gè)意思。


          multi-class 和 multi-label的區(qū)別

          multi-class是相對(duì)于binary二分類來說的,意思是需要分類的東西不止有兩個(gè)類別,可能是3個(gè)類別取一個(gè)(如iris分類),或者是10個(gè)類別取一個(gè)(如手寫數(shù)字識(shí)別mnist)。


          而multi-label是更加general的一種情況了,它說為什么一個(gè)sample的標(biāo)簽只能有1個(gè)呢。為什么一張圖片不是貓就是狗呢?難道我不能訓(xùn)練一個(gè)人工智能,它能告訴我這張圖片既有貓又有狗呢?


          其實(shí)關(guān)于多標(biāo)簽學(xué)習(xí)的研究,已經(jīng)有很多成果了。 

          主要解法是 

          * 不擴(kuò)展基礎(chǔ)分類器的本來算法,只通過轉(zhuǎn)換原始問題來解決多標(biāo)簽問題。如BR, LP等。 

          * 擴(kuò)展基礎(chǔ)分類器的本來算法來適配多標(biāo)簽問題。如ML-kNN, BP-MLL等。 

          這里不展開了。有興趣的同學(xué)可以自己去研究一下。


          keras的multi-label

          廢話不多說,直接上代碼。


          稍微解說一下: 

          * 整個(gè)網(wǎng)絡(luò)是fully connected全連接網(wǎng)絡(luò)。 

          * 網(wǎng)絡(luò)結(jié)構(gòu)是輸入層=你的特征的維度 

          * 隱藏層是500*100,激勵(lì)函數(shù)都是relu。隱藏層的節(jié)點(diǎn)數(shù)量和深度請(qǐng)根據(jù)自己的數(shù)量來自行調(diào)整,這里只是舉例。 

          * 輸出層是你的label的維度。使用sigmoid作為激勵(lì),使輸出值介于0-1之間。 

          * 訓(xùn)練數(shù)據(jù)的label請(qǐng)用0和1的向量來表示。0代表這條數(shù)據(jù)沒有這個(gè)位的label,1代表這條數(shù)據(jù)有這個(gè)位的label。假設(shè)3個(gè)label的向量[天空,人,大海]的向量值是[1,1,0]的編碼的意思是這張圖片有天空,有人,但是沒有大海。 

          * 使用binary_crossentropy來進(jìn)行損失函數(shù)的評(píng)價(jià),從而在訓(xùn)練過程中不斷降低交叉商。實(shí)際變相的使1的label的節(jié)點(diǎn)的輸出值更靠近1,0的label的節(jié)點(diǎn)的輸出值更靠近0。



          有了這個(gè)結(jié)構(gòu),就可以run起來一個(gè)multi label的神經(jīng)網(wǎng)絡(luò)了。這個(gè)只是基礎(chǔ)中的基礎(chǔ),關(guān)于multi-label的度量代碼才是我們研究一個(gè)機(jī)器學(xué)習(xí)問題的核心。




          1. 多標(biāo)簽圖像數(shù)據(jù)集

          我們將采用如下所示的多標(biāo)簽圖像數(shù)據(jù)集,一個(gè)服飾圖片數(shù)據(jù)集,總共是 2167 張圖片,六大類別:

          • 黑色牛仔褲(Black Jeans, 344張)

          • 藍(lán)色連衣裙(Blue Dress,386張)

          • 藍(lán)色牛仔褲(Blue Jeans, 356張)

          • 藍(lán)色襯衫(Blue Shirt, 369張)

          • 紅色連衣裙(Red Dress,380張)

          • 紅色襯衫(Red Shirt,332張)

          因此我們的 CNN 網(wǎng)絡(luò)模型的目標(biāo)就是同時(shí)預(yù)測(cè)衣服的顏色以及類型。



            項(xiàng)目代碼和數(shù)據(jù)集 獲取方式:

            關(guān)注微信公眾號(hào) datayx  然后回復(fù) 多標(biāo)簽分類 即可獲取。

            AI項(xiàng)目體驗(yàn)地址 https://loveai.tech


          2. 多標(biāo)簽分類項(xiàng)目結(jié)構(gòu)

          整個(gè)多標(biāo)簽分類的項(xiàng)目結(jié)構(gòu)如下所示:

          ├── classify.py
          ├── dataset
          │ ├── black_jeans [344 entries
          │ ├── blue_dress [386 entries]
          │ ├── blue_jeans [356 entries]
          │ ├── blue_shirt [369 entries]
          │ ├── red_dress [380 entries]
          │ └── red_shirt [332 entries]
          ├── examples
          │ ├── example_01.jpg
          │ ├── example_02.jpg
          │ ├── example_03.jpg
          │ ├── example_04.jpg
          │ ├── example_05.jpg
          │ ├── example_06.jpg
          │ └── example_07.jpg
          ├── fashion.model
          ├── mlb.pickle
          ├── plot.png
          ├── pyimagesearch
          │ ├── __init__.py
          │ └── smallervggnet.py
          ├── search_bing_api.py
          └── train.py
          • 1

          • 2

          • 3

          • 4

          • 5

          • 6

          • 7

          • 8

          • 9

          • 10

          • 11

          • 12

          • 13

          • 14

          • 15

          • 16

          • 17

          • 18

          • 19

          • 20

          • 21

          • 22

          • 23

          • 24



          簡單介紹每份代碼和每個(gè)文件夾的功能作用:

          • search_bing_api.py :主要是圖片下載,但本文會(huì)提供好數(shù)據(jù)集,所以可以不需要運(yùn)行該代碼;

          • train.py :最主要的代碼,處理和加載數(shù)據(jù)以及訓(xùn)練模型;

          • fashion.model :保存的模型文件,用于 classify.py 進(jìn)行對(duì)測(cè)試圖片的分類;

          • mlb.pickle:由 scikit-learn 模塊的 MultiLabelBinarizer 序列化的文件,將所有類別名字保存為一個(gè)序列化的數(shù)據(jù)結(jié)構(gòu)形式

          • plot.png :繪制訓(xùn)練過程的準(zhǔn)確率、損失隨訓(xùn)練時(shí)間變化的圖

          • classify.py :對(duì)新的圖片進(jìn)行測(cè)試

          三個(gè)文件夾:

          • dataset:數(shù)據(jù)集文件夾,包含六個(gè)子文件夾,分別對(duì)應(yīng)六個(gè)類別

          • pyimagesearch :主要包含建立 Keras 的模型代碼文件–smallervggnet.py

          • examples:7張測(cè)試圖片

          3. 基于 Keras 建立的網(wǎng)絡(luò)結(jié)構(gòu)

          本文采用的是一個(gè)簡化版本的 VGGNetVGGNet 是 2014 年由 Simonyan 和 Zisserman 提出的,論文–Very Deep Convolutional Networks for Large Scale Image Recognition

          這里先來展示下 SmallerVGGNet 的實(shí)現(xiàn)代碼,首先是加載需要的 Keras 的模塊和方法:




          接著開始定義網(wǎng)絡(luò)模型–SmallerVGGNet 類,它包含 build 方法用于建立網(wǎng)絡(luò),接收 5 個(gè)參數(shù),width, height, depth 就是圖片的寬、高和通道數(shù)量,然后 classes 是數(shù)據(jù)集的類別數(shù)量,最后一個(gè)參數(shù) finalAct 表示輸出層的激活函數(shù),注意一般的圖像分類采用的是 softmax 激活函數(shù),但是多標(biāo)簽圖像分類需要采用 sigmoid 。





          接著,就開始建立網(wǎng)絡(luò)模型了,總共是 5 層的卷積層,最后加上一個(gè)全連接層和輸出層,其中卷積層部分可以說是分為三個(gè)部分,每一部分都是基礎(chǔ)的卷積層、RELU 層、BatchNormalization 層,最后是一個(gè)最大池化層(MaxPoolingLayer)以及 Dropout 層。





          4. 實(shí)現(xiàn)網(wǎng)絡(luò)模型以及訓(xùn)練

          現(xiàn)在已經(jīng)搭建好我們的網(wǎng)絡(luò)模型SmallerVGGNet 了,接下來就是 train.py 這份代碼,也就是實(shí)現(xiàn)訓(xùn)練模型的代碼。

          首先,同樣是導(dǎo)入必須的模塊,主要是 keras ,其次還有繪圖相關(guān)的 matplotlibcv2,處理數(shù)據(jù)和標(biāo)簽的 sklearn 、pickle 等。

          # set the matplotlib backend so figures can be saved in the background
          import matplotlib
          matplotlib.use("Agg")

          # import the necessary packages
          from keras.preprocessing.image import ImageDataGenerator
          from keras.optimizers import Adam
          from keras.preprocessing.image import img_to_array
          from sklearn.preprocessing import MultiLabelBinarizer
          from sklearn.model_selection import train_test_split
          from pyimagesearch.smallervggnet import SmallerVGGNet
          import matplotlib.pyplot as plt
          from imutils import paths
          import numpy as np
          import argparse
          import random
          import pickle
          import cv2
          import os
          • 1

          • 2

          • 3

          • 4

          • 5

          • 6

          • 7

          • 8

          • 9

          • 10

          • 11

          • 12

          • 13

          • 14

          • 15

          • 16

          • 17

          • 18

          • 19



          注意,這里需要提前安裝的第三方模塊包括 Keras, scikit-learn, matplotlib, imutils, OpenCV,安裝命令如下:

          pip install keras, scikit-learn, matplotlib, imutils, opencv-python

          • 1

          當(dāng)然,還需要安裝 tensorflow ,如果僅僅采用 CPU 版本,可以直接 pip install tensorflow ,而如果希望采用 GPU ,那就需要安裝 CUDA,具體教程可以看看如下教程:

          https://www.pyimagesearch.com/2017/09/27/setting-up-ubuntu-16-04-cuda-gpu-for-deep-learning-with-python/

          接著,繼續(xù)設(shè)置命令行參數(shù):



          這里主要是四個(gè)參數(shù):

          • --dataset: 數(shù)據(jù)集路徑

          • --model : 保存的模型路徑

          • --labelbin : 保存的多標(biāo)簽二進(jìn)制對(duì)象路徑

          • --plot : 保存繪制的訓(xùn)練準(zhǔn)確率和損失圖

          然后,設(shè)置一些重要的參數(shù),包括訓(xùn)練的總次數(shù) EPOCHS 、初始學(xué)習(xí)率 INIT_LR、批大小 BS、輸入圖片大小 IMAGE_DIMS :



          因此,labels 就是一個(gè)嵌套列表的列表,每個(gè)子列表都包含兩個(gè)元素。

          然后就是數(shù)據(jù)的預(yù)處理,包括轉(zhuǎn)換為 numpy 的數(shù)組,對(duì)數(shù)據(jù)進(jìn)行歸一化操作,以及采用 scikit-learn 的方法 MultiLabelBinarizer 將標(biāo)簽進(jìn)行 One-hot 編碼操作:



          訓(xùn)練集和測(cè)試集采用scikit-learn 的方法 train_test_split ,按照比例 8:2 劃分。

          然后就是初始化模型對(duì)象、優(yōu)化方法,開始訓(xùn)練:


          這里采用的是 Adam 優(yōu)化方法,損失函數(shù)是 binary cross-entropy 而非圖像分類常用的 categorical cross-entropy,原因主要是多標(biāo)簽分類的目標(biāo)是將每個(gè)輸出的標(biāo)簽作為一個(gè)獨(dú)立的伯努利分布,并且希望單獨(dú)懲罰每一個(gè)輸出節(jié)點(diǎn)。

          最后就是保存模型,繪制曲線圖的代碼了:




          在訓(xùn)練結(jié)束后,訓(xùn)練集和測(cè)試集上的準(zhǔn)確率分別是 98.57% 和 98.42 ,繪制的訓(xùn)練損失和準(zhǔn)確率折線圖圖如下所示,上方是訓(xùn)練集和測(cè)試集的準(zhǔn)確率變化曲線,下方則是訓(xùn)練集和測(cè)試集的損失圖,從這看出,訓(xùn)練的網(wǎng)絡(luò)模型并沒有遭遇明顯的過擬合或者欠擬合問題。




          5. 測(cè)試網(wǎng)絡(luò)模型

          訓(xùn)練好模型后,就是測(cè)試新的圖片了,首先先完成代碼 classify.py ,代碼如下:






          其他的樣例圖片都可以通過相同的命令,只需要修改輸入圖片的名字即可,然后就是其中最后一張圖片,是比較特殊的,輸入命令如下所示:



          展示的結(jié)果,這是一條黑色連衣裙,但預(yù)測(cè)結(jié)果給出黑色牛仔褲的結(jié)果。




          這里的主要原因就是黑色連衣裙并不在我們的訓(xùn)練集類別中。這其實(shí)也是目前圖像分類的一個(gè)問題,無法預(yù)測(cè)未知的類別,因?yàn)橛?xùn)練集并不包含這個(gè)類別,因此 CNN 沒有見過,也就預(yù)測(cè)不出來。


          6. 小結(jié)

          本文介紹了如何采用 Keras 實(shí)現(xiàn)多標(biāo)簽圖像分類,主要的兩個(gè)關(guān)鍵點(diǎn):

          1. 輸出層采用 sigmoid 激活函數(shù),而非 softmax 激活函數(shù);

          2. 損失函數(shù)采用 binary cross-entropy ,而非 categorical cross-entropy

          原文地址

          https://www.pyimagesearch.com/2018/05/07/multi-label-classification-with-keras/


          機(jī)器學(xué)習(xí)算法AI大數(shù)據(jù)技術(shù)

           搜索公眾號(hào)添加: datanlp

          長按圖片,識(shí)別二維碼




          閱讀過本文的人還看了以下文章:


          TensorFlow 2.0深度學(xué)習(xí)案例實(shí)戰(zhàn)


          基于40萬表格數(shù)據(jù)集TableBank,用MaskRCNN做表格檢測(cè)


          《基于深度學(xué)習(xí)的自然語言處理》中/英PDF


          Deep Learning 中文版初版-周志華團(tuán)隊(duì)


          【全套視頻課】最全的目標(biāo)檢測(cè)算法系列講解,通俗易懂!


          《美團(tuán)機(jī)器學(xué)習(xí)實(shí)踐》_美團(tuán)算法團(tuán)隊(duì).pdf


          《深度學(xué)習(xí)入門:基于Python的理論與實(shí)現(xiàn)》高清中文PDF+源碼


          特征提取與圖像處理(第二版).pdf


          python就業(yè)班學(xué)習(xí)視頻,從入門到實(shí)戰(zhàn)項(xiàng)目


          2019最新《PyTorch自然語言處理》英、中文版PDF+源碼


          《21個(gè)項(xiàng)目玩轉(zhuǎn)深度學(xué)習(xí):基于TensorFlow的實(shí)踐詳解》完整版PDF+附書代碼


          《深度學(xué)習(xí)之pytorch》pdf+附書源碼


          PyTorch深度學(xué)習(xí)快速實(shí)戰(zhàn)入門《pytorch-handbook》


          【下載】豆瓣評(píng)分8.1,《機(jī)器學(xué)習(xí)實(shí)戰(zhàn):基于Scikit-Learn和TensorFlow》


          《Python數(shù)據(jù)分析與挖掘?qū)崙?zhàn)》PDF+完整源碼


          汽車行業(yè)完整知識(shí)圖譜項(xiàng)目實(shí)戰(zhàn)視頻(全23課)


          李沐大神開源《動(dòng)手學(xué)深度學(xué)習(xí)》,加州伯克利深度學(xué)習(xí)(2019春)教材


          筆記、代碼清晰易懂!李航《統(tǒng)計(jì)學(xué)習(xí)方法》最新資源全套!


          《神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)》最新2018版中英PDF+源碼


          將機(jī)器學(xué)習(xí)模型部署為REST API


          FashionAI服裝屬性標(biāo)簽圖像識(shí)別Top1-5方案分享


          重要開源!CNN-RNN-CTC 實(shí)現(xiàn)手寫漢字識(shí)別


          yolo3 檢測(cè)出圖像中的不規(guī)則漢字


          同樣是機(jī)器學(xué)習(xí)算法工程師,你的面試為什么過不了?


          前海征信大數(shù)據(jù)算法:風(fēng)險(xiǎn)概率預(yù)測(cè)


          【Keras】完整實(shí)現(xiàn)‘交通標(biāo)志’分類、‘票據(jù)’分類兩個(gè)項(xiàng)目,讓你掌握深度學(xué)習(xí)圖像分類


          VGG16遷移學(xué)習(xí),實(shí)現(xiàn)醫(yī)學(xué)圖像識(shí)別分類工程項(xiàng)目


          特征工程(一)


          特征工程(二) :文本數(shù)據(jù)的展開、過濾和分塊


          特征工程(三):特征縮放,從詞袋到 TF-IDF


          特征工程(四): 類別特征


          特征工程(五): PCA 降維


          特征工程(六): 非線性特征提取和模型堆疊


          特征工程(七):圖像特征提取和深度學(xué)習(xí)


          如何利用全新的決策樹集成級(jí)聯(lián)結(jié)構(gòu)gcForest做特征工程并打分?


          Machine Learning Yearning 中文翻譯稿


          螞蟻金服2018秋招-算法工程師(共四面)通過


          全球AI挑戰(zhàn)-場(chǎng)景分類的比賽源碼(多模型融合)


          斯坦福CS230官方指南:CNN、RNN及使用技巧速查(打印收藏)


          python+flask搭建CNN在線識(shí)別手寫中文網(wǎng)站


          中科院Kaggle全球文本匹配競(jìng)賽華人第1名團(tuán)隊(duì)-深度學(xué)習(xí)與特征工程



          不斷更新資源

          深度學(xué)習(xí)、機(jī)器學(xué)習(xí)、數(shù)據(jù)分析、python

           搜索公眾號(hào)添加: datayx  


          瀏覽 90
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  一区二区三区在线播放 | 俺也去也大香蕉 | 天堂AV资源 | 青草娱乐视频在线观看 | 大香蕉AV永久在线 |