目錄:
作為一家“創(chuàng)意+整合+營(yíng)銷”的成都網(wǎng)站建設(shè)機(jī)構(gòu),我們?cè)跇I(yè)內(nèi)良好的客戶口碑。成都創(chuàng)新互聯(lián)公司提供從前期的網(wǎng)站品牌分析策劃、網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、網(wǎng)站建設(shè)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、創(chuàng)意表現(xiàn)、網(wǎng)頁(yè)制作、系統(tǒng)開(kāi)發(fā)以及后續(xù)網(wǎng)站營(yíng)銷運(yùn)營(yíng)等一系列服務(wù),幫助企業(yè)打造創(chuàng)新的互聯(lián)網(wǎng)品牌經(jīng)營(yíng)模式與有效的網(wǎng)絡(luò)營(yíng)銷方法,創(chuàng)造更大的價(jià)值。
介紹
動(dòng)機(jī)
先決條件
數(shù)據(jù)采集
了解數(shù)據(jù)
數(shù)據(jù)清理
加載訓(xùn)練集
數(shù)據(jù)預(yù)處理- 圖像
數(shù)據(jù)預(yù)處理- 字幕
使用生成器函數(shù)準(zhǔn)備數(shù)據(jù)
Word嵌入
模型架構(gòu)
推理
評(píng)估
結(jié)論和未來(lái)的工作
參考
1.簡(jiǎn)介
你在下面的圖片中看到了什么?
你能寫(xiě)一個(gè)標(biāo)題嗎?
你們當(dāng)中有些人可能會(huì)說(shuō)“一只白色的狗趴在草地上”,有些人可能會(huì)說(shuō)“有一只帶有褐色斑點(diǎn)的白狗”,還有一些人可能會(huì)說(shuō)“狗在草地上還有一些粉紅色的花朵”。
絕對(duì)所有這些標(biāo)題都與此圖像相關(guān),也可能還有其他一些標(biāo)題。但我想說(shuō)的是,對(duì)于我們?nèi)祟悂?lái)說(shuō),看一眼照片就能夠用適當(dāng)?shù)恼Z(yǔ)言來(lái)描述它,這很容易。即使是5歲的孩子也可以輕松地做到這一點(diǎn)。
但是,你能編寫(xiě)一個(gè)計(jì)算機(jī)程序,將圖像作為輸入并產(chǎn)生相關(guān)的標(biāo)題作為輸出嗎?
簡(jiǎn)單的架構(gòu)
在深度神經(jīng)網(wǎng)絡(luò)發(fā)展之前,即使是計(jì)算機(jī)視覺(jué)領(lǐng)域最先進(jìn)的研究人員,這個(gè)問(wèn)題也是很難想象的。但隨著深度學(xué)習(xí)的出現(xiàn),如果您擁有所需的數(shù)據(jù)集,則可以非常輕松地解決此問(wèn)題。
Andrej Karapathy在斯坦福大學(xué)的博士論文中對(duì)這個(gè)問(wèn)題進(jìn)行了很好的研究[1],他現(xiàn)在也是特斯拉的AI主任。
這篇文章的目的是解釋(盡可能簡(jiǎn)單的話)深度學(xué)習(xí)如何用于解決為給定圖像生成標(biāo)題的問(wèn)題,因此名稱為Image Captioning。
為了更好地了解這個(gè)問(wèn)題,我強(qiáng)烈建議使用Microsoft創(chuàng)建的這個(gè)系統(tǒng),稱為Caption Bot。只需轉(zhuǎn)到此鏈接并嘗試上傳您想要的任何圖片;這個(gè)系統(tǒng)會(huì)為它生成一個(gè)標(biāo)題。(https://www.captionbot.ai/)
2.動(dòng)機(jī)
我們必須首先了解這個(gè)問(wèn)題對(duì)現(xiàn)實(shí)世界場(chǎng)景的重要性。在這些應(yīng)用程序中,它的問(wèn)題的解決方案可能非常有用。
自動(dòng)駕駛汽車- 自動(dòng)駕駛是最大的挑戰(zhàn)之一,如果我們可以適當(dāng)?shù)孛枋銎囍車膱?chǎng)景,它可以提升自動(dòng)駕駛系統(tǒng)。
對(duì)盲人的幫助- 我們可以為盲人創(chuàng)造一種產(chǎn)品,引導(dǎo)他們?cè)跊](méi)有其他人支持的情況下在公路上行駛。我們可以通過(guò)首先將場(chǎng)景轉(zhuǎn)換為文本然后將文本轉(zhuǎn)換為語(yǔ)音來(lái)實(shí)現(xiàn)此目的。兩者現(xiàn)在都是深度學(xué)習(xí)的著名應(yīng)用。
在今天閉路電視攝像機(jī)無(wú)處不在,但在觀看這個(gè)世界的同時(shí),如果我們還可以生成相關(guān)字幕,那么一旦某些惡意活動(dòng)發(fā)生,我們就可以立即發(fā)出警報(bào)。這可能有助于減少一些犯罪和/或事故。
自動(dòng)字幕可以幫助使Google圖片搜索與Google搜索一樣好用,因?yàn)槊總€(gè)圖片都可以先轉(zhuǎn)換為標(biāo)題,然后根據(jù)標(biāo)題執(zhí)行搜索。
3.先決條件
本文假設(shè)您熟悉基本的深度學(xué)習(xí)概念,如多層感知器、卷積神經(jīng)網(wǎng)絡(luò)、遞歸神經(jīng)網(wǎng)絡(luò)、遷移學(xué)習(xí)、梯度下降、過(guò)度擬合、概率、文本處理、Python語(yǔ)法和數(shù)據(jù)結(jié)構(gòu)、Keras庫(kù)等。
4.數(shù)據(jù)收集
有很多開(kāi)源數(shù)據(jù)集可用于此問(wèn)題,如Flickr 8k(包含8k圖像),F(xiàn)lickr 30k(包含30k圖像),MS COCO(包含180k圖像)等。
但是為了本案例研究的目的,我使用了Flickr 8k數(shù)據(jù)集(https://forms.illinois.edu/sec/1713398)在不是非常高端的PC /筆記本電腦的系統(tǒng)上,訓(xùn)練具有大量圖像的模型可能是不可行的。
該數(shù)據(jù)集包含8000個(gè)圖像,每個(gè)圖像有5個(gè)字幕(正如我們?cè)凇昂?jiǎn)介”部分中已經(jīng)看到的那樣,圖像可以有多個(gè)字幕,所有字幕都是同時(shí)相關(guān)的)。
這些圖像分叉如下:
訓(xùn)練集- 6000圖像
Dev Set - 1000張圖片
測(cè)試集- 1000張圖像
5.了解數(shù)據(jù)
如果您從我提供的鏈接下載了數(shù)據(jù),那么,與圖像一起,您還將獲得一些與圖像相關(guān)的文本文件。其中一個(gè)文件是“Flickr8k.token.txt”,其中包含每個(gè)圖像的名稱及其5個(gè)標(biāo)題。我們可以按如下方式閱讀此文件:
文本文件如下:
因此,每行包含<圖像名稱> #i <caption>,其中0≤i≤4
即圖像名稱,標(biāo)題號(hào)(0到4)和實(shí)際標(biāo)題。
現(xiàn)在,我們創(chuàng)建一個(gè)名為“描述”的字典,其中包含圖像的名稱(不帶.jpg擴(kuò)展名)作為鍵,以及相應(yīng)圖像的5個(gè)標(biāo)題列表作為值。
例如,參考上面的截圖,字典將如下所示:
6.數(shù)據(jù)清理
當(dāng)我們處理文本時(shí),我們通常會(huì)執(zhí)行一些基本的清理工作,例如低層包裝所有單詞(否則“hello”和“Hello”將被視為兩個(gè)單獨(dú)的單詞),刪除特殊標(biāo)記(如'%','$','#'等),消除包含數(shù)字的單詞(如'hey199'等)。
以下代碼執(zhí)行以下基本清理步驟:
在數(shù)據(jù)集中8000*5(即40000)圖像字幕(語(yǔ)料庫(kù))中創(chuàng)建所有獨(dú)特單詞的詞匯表:
這意味著我們?cè)谒?0000個(gè)圖像標(biāo)題中都有8763個(gè)獨(dú)特的單詞。我們將所有這些標(biāo)題及其圖像名稱寫(xiě)在一個(gè)新文件中,即“descript.txt”并將其保存在磁盤(pán)上。
但是,如果我們仔細(xì)考慮一下,其中的很多這些詞只會(huì)出現(xiàn)很少次,比如1、2或3次。由于我們正在創(chuàng)建一個(gè)預(yù)測(cè)模型,我們不希望我們的詞匯表中包含所有單詞,而是更容易出現(xiàn)更常見(jiàn)的單詞。這有助于模型對(duì)異常值變得更加穩(wěn)健并減少錯(cuò)誤。
因此,我們只考慮在整個(gè)語(yǔ)料庫(kù)中出現(xiàn)至少10次的那些詞。代碼如下:
所以現(xiàn)在我們的詞匯表中只有1651個(gè)獨(dú)特的單詞
7.加載訓(xùn)練集
文本文件“Flickr_8k.trainImages.txt”包含屬于訓(xùn)練集的圖像的名稱。所以我們將這些名稱加載到列表“train”中。
因此,我們將名為“train”的列表中的6000個(gè)訓(xùn)練圖像分開(kāi)。
現(xiàn)在我們從Python詞典“train_descriptions”中的“descriptions.txt”(保存在硬盤(pán)上)加載這些圖像的描述。
但是,當(dāng)我們加載它們時(shí),我們將在每個(gè)標(biāo)題中添加兩個(gè)標(biāo)記,如下所示(稍后解釋):
'startseq' - >這是一個(gè)開(kāi)始序列標(biāo)記,將在每個(gè)標(biāo)題的開(kāi)頭添加。
'endseq' - >這是一個(gè)結(jié)束序列標(biāo)記,將在每個(gè)標(biāo)題的末尾添加。
8.數(shù)據(jù)預(yù)處理- 圖像
圖像只是我們模型的輸入(X)。 您可能已經(jīng)知道,模型的任何輸入都必須以向量的形式給出。
我們需要將每個(gè)圖像轉(zhuǎn)換為固定大小的矢量,然后將其作為輸入饋送到神經(jīng)網(wǎng)絡(luò)。 為此,我們使用Google Research創(chuàng)建的InceptionV3模型(卷積神經(jīng)網(wǎng)絡(luò))選擇遷移學(xué)習(xí)。
該模型在Imagenet數(shù)據(jù)集上進(jìn)行訓(xùn)練,以對(duì)1000種不同類別的圖像進(jìn)行圖像分類。 但是,我們的目的不是對(duì)圖像進(jìn)行分類,而是為每個(gè)圖像獲取固定長(zhǎng)度的信息矢量。 此過(guò)程稱為自動(dòng)特征工程。
我們只是從模型中刪除最后一個(gè)softmax圖層,并為每個(gè)圖像提取2048長(zhǎng)度向量(瓶頸特征),如下所示:
特征向量提?。ㄌ卣鞴こ蹋?/p>
代碼如下:
現(xiàn)在我們將每個(gè)圖像傳遞給該模型以獲得相應(yīng)的2048長(zhǎng)度特征向量,如下所示:
我們將所有瓶頸訓(xùn)練功能保存在Python字典中,并使用Pickle文件將其保存在磁盤(pán)上,即“encoded_train_images.pkl”,其鍵是圖像名稱,值是對(duì)應(yīng)的2048長(zhǎng)度特征向量。
注意:如果您沒(méi)有高端PC /筆記本電腦,此過(guò)程可能需要一到兩個(gè)小時(shí)。
類似地,我們編碼所有測(cè)試圖像并將它們保存在文件“encoded_test_images.pkl”中。
9.數(shù)據(jù)預(yù)處理- 字幕
我們必須注意,字幕是我們想要預(yù)測(cè)的。因此,在訓(xùn)練期間,標(biāo)題將是模型正在學(xué)習(xí)預(yù)測(cè)的目標(biāo)變量(Y)。
但對(duì)整個(gè)標(biāo)題的預(yù)測(cè)是不可能同時(shí)發(fā)生的,我們將逐字預(yù)測(cè)字幕。因此,我們需要將每個(gè)單詞編碼為固定大小的向量。然而,這部分將在后面看到模型設(shè)計(jì)時(shí)看到,但是現(xiàn)在我們將創(chuàng)建兩個(gè)Python詞典,即“wordtoix”(發(fā)音為- word to index)和“ixtoword”(發(fā)音為- index to word)。
簡(jiǎn)單地說(shuō),我們將用整數(shù)(索引)表示詞匯表中的每個(gè)唯一單詞。如上所示,我們?cè)谡Z(yǔ)料庫(kù)中有1652個(gè)唯一的單詞,因此每個(gè)單詞將由1到1652之間的整數(shù)索引表示。
這兩個(gè)Python字典可以使用如下:
wordtoix ['abc'] - >返回單詞'abc'的索引
ixtoword [k] - >返回索引為'k'的單詞
使用的代碼如下:
還有一個(gè)我們需要計(jì)算的參數(shù),即標(biāo)題的最大長(zhǎng)度,我們這樣做如下:
所以任何標(biāo)題的最大長(zhǎng)度是34。
10.使用生成器函數(shù)準(zhǔn)備數(shù)據(jù)
這是本案例研究中最重要的步驟之一。在這里,我們將了解如何以便于作為深度學(xué)習(xí)模型的輸入的方式準(zhǔn)備數(shù)據(jù)。
從現(xiàn)在開(kāi)始,我將嘗試通過(guò)以下示例解釋剩余的步驟:
考慮我們有3個(gè)圖像及其3個(gè)相應(yīng)的標(biāo)題如下:
Caption_1 - >黑貓坐在草地上
Caption_2 - >白貓正在路上行走
Caption_3 - >黑貓正走在草地上散步
現(xiàn)在,假設(shè)我們將使用前兩個(gè)圖像及其標(biāo)題來(lái)訓(xùn)練模型,我們將使用第三個(gè)圖像來(lái)測(cè)試我們的模型。
現(xiàn)在我們要回答的問(wèn)題是:我們?nèi)绾螌⑵錁?gòu)建為監(jiān)督學(xué)習(xí)問(wèn)題?數(shù)據(jù)矩陣是什么樣的?我們有多少數(shù)據(jù)點(diǎn)?等
首先,我們需要將兩個(gè)圖像轉(zhuǎn)換為它們對(duì)應(yīng)的2048長(zhǎng)度特征向量,如上所述。設(shè)“Image_1”和“Image_2”分別為前兩個(gè)圖像的特征向量
其次,讓我們通過(guò)在兩者中添加兩個(gè)標(biāo)記“startseq”和“endseq”來(lái)構(gòu)建前兩個(gè)(列車)字幕的詞匯表:(假設(shè)我們已經(jīng)執(zhí)行了基本的清理步驟)
Caption_1 - >“startseq黑貓坐在草地上endseq”
Caption_2 - >“startseq白貓正在路上行走”
vocab = {black,cat,endseq,grass,is,on,road,sat,startseq,the,walking,white}
讓我們給出詞匯表中每個(gè)單詞的索引:
黑色-1,貓-2,endseq -3,草-4,是-5,在-6,道路-7,坐-8,startseq -9,-10,行走-11,白色-12
現(xiàn)在讓我們嘗試將其構(gòu)建為監(jiān)督學(xué)習(xí)問(wèn)題,其中我們有一組數(shù)據(jù)點(diǎn)D = {Xi,Yi},其中Xi是數(shù)據(jù)點(diǎn)'i'的特征向量,Yi是對(duì)應(yīng)的目標(biāo)變量。
讓我們拍攝第一張圖像矢量Image_1及其相應(yīng)的標(biāo)題“startseq,黑貓坐在草地上”。回想一下,Image vector是輸入,標(biāo)題是我們需要預(yù)測(cè)的。但我們預(yù)測(cè)標(biāo)題的方式如下:
我們第一次提供圖像矢量和第一個(gè)單詞作為輸入,并嘗試預(yù)測(cè)第二個(gè)單詞,即:
輸入= Image_1 +'startseq';輸出='the'
然后我們提供圖像矢量和前兩個(gè)單詞作為輸入并嘗試預(yù)測(cè)第三個(gè)單詞,即:
輸入= Image_1 +'startseq';輸出='貓'
等等…
因此,我們可以總結(jié)一個(gè)圖像的數(shù)據(jù)矩陣及其相應(yīng)的標(biāo)題如下:
對(duì)應(yīng)于一個(gè)圖像及其標(biāo)題的數(shù)據(jù)點(diǎn)
必須注意的是,一個(gè)圖像+標(biāo)題不是單個(gè)數(shù)據(jù)點(diǎn),而是多個(gè)數(shù)據(jù)點(diǎn),具體取決于標(biāo)題的長(zhǎng)度。
同樣,如果我們同時(shí)考慮圖像及其標(biāo)題,我們的數(shù)據(jù)矩陣將如下所示:
圖像和標(biāo)題的數(shù)據(jù)矩陣
我們現(xiàn)在必須明白,在每個(gè)數(shù)據(jù)點(diǎn)中,不僅僅是作為系統(tǒng)輸入的圖像,還有一個(gè)部分字幕,它有助于預(yù)測(cè)序列中的下一個(gè)字。
由于我們正在處理序列,我們將使用循環(huán)神經(jīng)網(wǎng)絡(luò)來(lái)讀取這些部分字幕(稍后將詳細(xì)介紹)。
但是,我們已經(jīng)討論過(guò),我們不會(huì)傳遞標(biāo)題的實(shí)際英文文本,而是我們將傳遞索引序列,其中每個(gè)索引代表一個(gè)唯一的單詞。
由于我們已經(jīng)為每個(gè)單詞創(chuàng)建了一個(gè)索引,現(xiàn)在讓我們用它們的索引替換單詞,并理解數(shù)據(jù)矩陣將是什么樣子:
用索引替換單詞后的數(shù)據(jù)矩陣
由于我們將進(jìn)行批處理(稍后解釋),我們需要確保每個(gè)序列的長(zhǎng)度相等。因此,我們需要在每個(gè)序列的末尾追加0。但是我們應(yīng)該在每個(gè)序列中添加多少個(gè)零?
這就是我們計(jì)算標(biāo)題最大長(zhǎng)度為34的原因(如果你還記得)。因此,我們將附加許多零,這將導(dǎo)致每個(gè)序列的長(zhǎng)度為34。
數(shù)據(jù)矩陣將如下所示:
在每個(gè)序列上附加零,使它們?nèi)L(zhǎng)相同34
需要數(shù)據(jù)生成器:
我希望這能讓您更好地了解我們?nèi)绾螢榇藛?wèn)題準(zhǔn)備數(shù)據(jù)集。然而,這有一個(gè)很大的問(wèn)題。在上面的例子中,我只考慮了2個(gè)圖像和標(biāo)題,這些圖像和標(biāo)題導(dǎo)致了15個(gè)數(shù)據(jù)點(diǎn)。
但是,在我們的實(shí)際訓(xùn)練數(shù)據(jù)集中,我們有6000張圖像,每張圖像有5個(gè)字幕。這使得總共30000個(gè)圖像和標(biāo)題。即使假設(shè)平均每個(gè)字幕只有5個(gè)字長(zhǎng),也會(huì)導(dǎo)致總計(jì)30000 * 5,即150000個(gè)數(shù)據(jù)點(diǎn)。
我們?cè)僮鲆恍┯?jì)算:
每個(gè)數(shù)據(jù)點(diǎn)的長(zhǎng)度是多少?
數(shù)據(jù)點(diǎn)的長(zhǎng)度=圖像矢量的長(zhǎng)度+部分字幕的長(zhǎng)度。
圖像特征向量的長(zhǎng)度= 2048(已經(jīng)討論過(guò))
但部分字幕的長(zhǎng)度是多少?
嗯,你可能認(rèn)為它是34,但這是錯(cuò)的。
每個(gè)單詞(或索引)將通過(guò)一種單詞嵌入技術(shù)映射(嵌入)到更高維度的空間。
之后,在模型構(gòu)建階段,我們將看到每個(gè)單詞/索引使用預(yù)先訓(xùn)練的GLOVE單詞嵌入模型映射到200長(zhǎng)的向量。
現(xiàn)在每個(gè)序列包含34個(gè)索引,其中每個(gè)索引是長(zhǎng)度為200的向量。因此,一個(gè)數(shù)據(jù)點(diǎn)的長(zhǎng)度為:
2048 +(34 * 256)= 8848。
從最小的方面來(lái)看,我們至少可以獲得150,000個(gè)數(shù)據(jù)點(diǎn)。因此,數(shù)據(jù)矩陣的大小是:
150,000 * 10752 = 1327200000塊。
現(xiàn)在,即使我們假設(shè)一個(gè)塊占用2個(gè)字節(jié),然后,為了存儲(chǔ)該數(shù)據(jù)矩陣,我們將需要接近3 GB的主存儲(chǔ)器。 (回想一下,我們假設(shè)字幕的平均長(zhǎng)度為5個(gè)字,可能更多)。
這是非常大的要求,即使我們能夠設(shè)法將這么多數(shù)據(jù)加載到RAM中,它也會(huì)使系統(tǒng)變得非常慢。
出于這個(gè)原因,我們?cè)谏疃葘W(xué)習(xí)中使用了很多數(shù)據(jù)生成器。數(shù)據(jù)生成器是一種在Python中本機(jī)實(shí)現(xiàn)的功能。Keras API提供的ImageDataGenerator類只不過(guò)是Python中生成器函數(shù)的實(shí)現(xiàn)。
那么使用生成器函數(shù)如何解決這個(gè)問(wèn)題呢?
如果您了解深度學(xué)習(xí)的基礎(chǔ)知識(shí),那么您必須知道要在特定數(shù)據(jù)集上訓(xùn)練模型,我們需要使用某些版本的隨機(jī)梯度下降(SGD),如Adam,Rmsprop,Adagrad等。
對(duì)于SGD,我們不計(jì)算整個(gè)數(shù)據(jù)集的損失來(lái)更新梯度。而是在每次迭代中,我們計(jì)算一批數(shù)據(jù)點(diǎn)(通常為64,128,256等)上的損失以更新梯度。
這意味著我們不需要立即將整個(gè)數(shù)據(jù)集存儲(chǔ)在內(nèi)存中。即使我們?cè)趦?nèi)存中有當(dāng)前的一批點(diǎn),但它足以達(dá)到我們的目的。
Python中的生成器函數(shù)完全用于此目的。它就像一個(gè)迭代器,從最后一次調(diào)用它的位置恢復(fù)功能。
數(shù)據(jù)生成器的代碼如下:
11.字嵌入
如上所述,我們將把每個(gè)單詞(索引)映射到一個(gè)200長(zhǎng)的向量,為此,我們將使用預(yù)先訓(xùn)練好的GLOVE模型:
現(xiàn)在,對(duì)于我們?cè)~匯表中的所有1652個(gè)獨(dú)特單詞,創(chuàng)建了一個(gè)嵌入矩陣,該矩陣將在訓(xùn)練之前加載到模型中。
12.模型架構(gòu)
由于輸入由兩部分組成,即圖像矢量和部分字幕,因此我們無(wú)法使用Keras庫(kù)提供的Sequential API。 出于這個(gè)原因,我們使用Functional API,它允許我們創(chuàng)建合并模型。
首先讓我們看一下包含高級(jí)子模塊的簡(jiǎn)要架構(gòu):
高水平的架構(gòu)
我們將模型定義如下:
讓我們看看模型摘要:
模型中的參數(shù)摘要
下圖有助于可視化網(wǎng)絡(luò)結(jié)構(gòu)并更好地理解兩個(gè)輸入流:
帶有注釋的架構(gòu)圖
右側(cè)的黑色文本是為您提供的注釋,用于將您對(duì)數(shù)據(jù)準(zhǔn)備的理解映射到模型體系結(jié)構(gòu)。
LSTM(長(zhǎng)短期記憶)層只是一個(gè)專門的回歸神經(jīng)網(wǎng)絡(luò)來(lái)處理序列輸入(在我們的例子中是部分字幕)。
如果您已按照上一節(jié)進(jìn)行操作,我認(rèn)為閱讀這些注釋可幫助您以直接的方式理解模型體系結(jié)構(gòu)。
回想一下,我們已經(jīng)從預(yù)先訓(xùn)練的GLOVE模型中創(chuàng)建了一個(gè)嵌入矩陣,我們需要在開(kāi)始訓(xùn)練之前將其包含在模型中:
請(qǐng)注意,由于我們使用的是預(yù)先訓(xùn)練好的嵌入層,因此我們需要在訓(xùn)練模型之前將其凍結(jié)(trainable = False),以便在反向傳播期間不會(huì)更新它。
最后,我們使用adam優(yōu)化器編譯模型
訓(xùn)練期間的超參數(shù):
然后將該模型訓(xùn)練30個(gè)時(shí)期,初始學(xué)習(xí)率為0.001,每批3個(gè)圖片(批量)。然而,在20個(gè)時(shí)期之后,學(xué)習(xí)率降低到0.0001并且模型被訓(xùn)練為每批6張圖片。
這通常是有道理的,因?yàn)樵谟?xùn)練的后期階段,模型正趨向收斂,我們必須降低學(xué)習(xí)率,以便我們朝著最小值邁出更小的步伐。隨著時(shí)間的推移增加批量大小有助于您的梯度更新更強(qiáng)大。
時(shí)間:我在www.paperspace.com上使用了GPU + Gradient Notebook,因此我花了大約一個(gè)小時(shí)訓(xùn)練模型。但是,如果您在沒(méi)有GPU的PC上進(jìn)行訓(xùn)練,則可能需要8到16個(gè)小時(shí),具體取決于您的系統(tǒng)配置。
13.推理
所以到目前為止我們已經(jīng)看到了如何準(zhǔn)備數(shù)據(jù)和構(gòu)建模型。在本系列的最后一步中,我們將了解如何通過(guò)傳入新圖像來(lái)測(cè)試(推斷)我們的模型,即如何為新測(cè)試圖像生成標(biāo)題。
回想一下,在我們看到如何準(zhǔn)備數(shù)據(jù)的示例中,我們只使用了前兩個(gè)圖像及其標(biāo)題。現(xiàn)在讓我們使用第三個(gè)圖像,并嘗試了解我們希望如何生成標(biāo)題。
第三個(gè)圖像矢量和標(biāo)題如下:
Image_3 - >黑貓正在草地上行走
此示例中的詞匯還包括:
vocab = {black,cat,endseq,grass,is,on,road,sat,startseq,the,walking,white},具有以下索引:
黑色-1,貓-2,endseq -3,草-4,是-5,在-6,道路-7,坐-8,startseq -9,-10,行走-11,白色-12
我們將迭代生成標(biāo)題,一次一個(gè)字如下:
迭代1:
我們提供圖像矢量Image_3以及'startseq'作為模型的部分標(biāo)題。 (您現(xiàn)在應(yīng)該理解'startseq'的重要性,它在推理期間用作任何圖像的初始部分標(biāo)題)。
我們現(xiàn)在期望我們的模型預(yù)測(cè)第一個(gè)單詞“the”。
但等等,該模型生成一個(gè)12長(zhǎng)的向量(在示例中,而在原始示例中為1652長(zhǎng)向量),這是詞匯表中所有單詞的概率分布。出于這個(gè)原因,我們貪婪地選擇具有最大概率的單詞,給定特征向量和部分標(biāo)題。
如果模型訓(xùn)練得很好,我們必須期望單詞“the”的概率最大:
推論1
這稱為最大似然估計(jì)(MLE),即我們根據(jù)給定輸入的模型選擇最可能的單詞。有時(shí)這種方法也被稱為貪婪搜索,因?yàn)槲覀冐澙返剡x擇具有最大概率的單詞。
迭代2:
這一次讓我們假設(shè)模型已經(jīng)預(yù)測(cè)了前一次迭代中的“the”。所以現(xiàn)在我們將模型的輸入作為圖像矢量Image_3和部分標(biāo)題“startseq the”。現(xiàn)在我們期望模型在給定圖像特征向量和部分字幕的情況下產(chǎn)生“黑色”一詞的最高概率。
推論2
通過(guò)這種方式,我們繼續(xù)迭代以生成序列中的下一個(gè)單詞。但這里的一個(gè)重要問(wèn)題是我們什么時(shí)候停止?
因此,當(dāng)滿足以下兩個(gè)條件之一時(shí),我們就會(huì)停止:
我們遇到'endseq',這意味著模型認(rèn)為這是標(biāo)題的結(jié)尾。 (您現(xiàn)在應(yīng)該了解'endseq'標(biāo)記的重要性)
我們達(dá)到模型生成的單詞數(shù)的最大閾值。
如果滿足上述任何條件,我們將打破循環(huán)并將生成的標(biāo)題報(bào)告為給定圖像的模型輸出。推理代碼如下:
14.評(píng)估
為了理解模型有多好,讓我們嘗試在測(cè)試數(shù)據(jù)集的圖像上生成標(biāo)題(即模型在訓(xùn)練期間沒(méi)有看到的圖像)。
輸出- 1
注意:我們必須了解模型如何精確識(shí)別顏色。
輸出- 2
輸出- 3
輸出- 4
輸出- 5
當(dāng)然,如果我只向你展示合適的字幕,那我就是在騙你。世界上沒(méi)有任何模型是完美的,這種模式也會(huì)犯錯(cuò)誤。讓我們看一些例子,其中標(biāo)題不是很相關(guān),有時(shí)甚至是不相關(guān)的。
輸出 - 6
可能是襯衫的顏色與背景中的顏色混合在一起
輸出- 7
為什么模特將著名的拉斐爾·納達(dá)爾歸為女性?可能是因?yàn)殚L(zhǎng)發(fā)。
輸出- 8
這次模型得到的語(yǔ)法不正確
輸出- 9
很明顯,該模型盡力了解情景,但標(biāo)題仍然不是很好。
輸出- 10
再一個(gè)例子,模型失敗,標(biāo)題無(wú)關(guān)緊要。
總而言之,我必須說(shuō),我的初始化模型,沒(méi)有任何嚴(yán)格的超參數(shù)調(diào)整,在生成圖像標(biāo)題方面做得不錯(cuò)。
很重要的一點(diǎn):
我們必須明白,用于測(cè)試的圖像必須在語(yǔ)義上與用于訓(xùn)練模型的圖像相關(guān)。例如,如果我們?cè)谪垺⒐返鹊膱D像上訓(xùn)練我們的模型,我們就不能在飛機(jī)、瀑布等圖像上進(jìn)行測(cè)試。這是一個(gè)例子,火車和測(cè)試裝置的分布會(huì)有很大不同,在這種情況下,世界上沒(méi)有機(jī)器學(xué)習(xí)模型可以提供良好的性能。
15.結(jié)論和未來(lái)的工作
請(qǐng)參閱我的GitHub鏈接,以訪問(wèn)Jupyter Notebook中編寫(xiě)的完整代碼。
(https://github.com/hlamba28/Automatic-Image-Captioning.git)
請(qǐng)注意,由于模型的隨機(jī)性,您生成的標(biāo)題(如果您嘗試復(fù)制代碼)可能與我的情況下生成的標(biāo)題不完全相似。
當(dāng)然,這只是第一個(gè)解決方案,可以進(jìn)行大量修改以改善此解決方案,如:
使用更大的數(shù)據(jù)集。
改變模型架構(gòu),例如包括一個(gè)注意模塊。
進(jìn)行更多超參數(shù)調(diào)整(學(xué)習(xí)率、批量大小、層數(shù)、單位數(shù)、輟學(xué)率等)。
使用交叉驗(yàn)證集來(lái)了解過(guò)度擬合。
在推理期間使用Beam Search而不是Greedy Search。
使用BLEU評(píng)分來(lái)評(píng)估和衡量模型的性能。
以適當(dāng)?shù)拿嫦驅(qū)ο蟮姆绞骄帉?xiě)代碼,以便其他人更容易復(fù)制:-)
16.參考文獻(xiàn)
https://cs.stanford.edu/people/karpathy/cvpr2015.pdf
https://arxiv.org/abs/1411.4555
https://arxiv.org/abs/1703.09137
https://arxiv.org/abs/1708.02043
https://machinelearningmastery.com/develop-a-deep-learning-caption-generation-model-in-python/
https://www.youtube.com/watch?v=yk6XDFm3J2c
https://www.appliedaicourse.com/
文章標(biāo)題:我用Keras?教電腦為圖像生成標(biāo)題!
鏈接URL:http://chinadenli.net/article48/jgcsep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、網(wǎng)站制作、云服務(wù)器、網(wǎng)站設(shè)計(jì)、軟件開(kāi)發(fā)、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)