<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 創(chuàng)建自己的圖像標(biāo)題生成器

          共 11277字,需瀏覽 23分鐘

           ·

          2021-02-22 15:24

          總覽
          • 了解圖像字幕生成器如何使用編碼器-解碼器工作
          • 知道如何使用Keras創(chuàng)建自己的圖像標(biāo)題生成器
          介紹
          圖像標(biāo)題生成器是人工智能的熱門研究領(lǐng)域,涉及圖像理解和該圖像的語言描述。生成格式正確的句子需要對(duì)語言的句法和語義理解。能夠使用準(zhǔn)確形成的句子描述圖像的內(nèi)容是一項(xiàng)非常具有挑戰(zhàn)性的任務(wù),但是通過幫助視障人士更好地理解圖像的內(nèi)容,它也會(huì)產(chǎn)生巨大的影響。
          與已進(jìn)行充分研究的圖像分類或?qū)ο笞R(shí)別任務(wù)相比,此任務(wù)要困難得多。
          最大的挑戰(zhàn)是絕對(duì)能夠創(chuàng)建一個(gè)描述,該描述不僅必須捕獲圖像中包含的對(duì)象,而且還必須表達(dá)這些對(duì)象之間的相互關(guān)系。
          考慮以下來自Flickr8k數(shù)據(jù)集的圖像:

          您在上圖中看到了什么?
          您可以輕松地說出“雪中的黑狗和棕狗”或“雪中的小狗玩?!被颉把┲械膬芍徊览醽喒贰?。作為人類,對(duì)于我們來說看這樣的圖像并適當(dāng)?shù)孛枋鏊坪鹾苋菀住?/span>
          讓我們看看如何從頭開始創(chuàng)建圖片說明生成器,該生成器可以為上述圖片以及更多圖片提供有意義的描述!
          開始之前的先決條件:
          1、Python編程
          2、Keras及其模塊
          3、卷積神經(jīng)網(wǎng)絡(luò)及其實(shí)現(xiàn)
          4、RNN和LSTM
          5、轉(zhuǎn)移學(xué)習(xí)
          問題陳述的處理
          我們將使用編碼器-解碼器模型解決此問題。在這里,我們的編碼器模型將圖像的編碼形式和文本標(biāo)題的編碼形式結(jié)合在一起,并饋送到解碼器。我們的模型會(huì)將CNN視為“圖像模型”,將RNN / LSTM視為“語言模型”,以對(duì)不同長度的文本序列進(jìn)行編碼。然后,將兩種編碼所產(chǎn)生的向量合并并由密集層進(jìn)行處理,以進(jìn)行最終預(yù)測。我們將創(chuàng)建一個(gè)合并體系結(jié)構(gòu),以使圖像不屬于RNN / LSTM,從而能夠使用來自單獨(dú)訓(xùn)練集中的圖像和語句來訓(xùn)練處理圖像的神經(jīng)網(wǎng)絡(luò)部分和分別處理語言的部分。
          在我們的合并模型中,可以在每次預(yù)測之前將圖像的不同表示形式與最終RNN狀態(tài)進(jìn)行組合。

          將圖像特征與文本編碼合并到體系結(jié)構(gòu)中的下一個(gè)階段是有利的,并且與傳統(tǒng)注入體系結(jié)構(gòu)(CNN作為編碼器和RNN作為解碼器)相比,可以用較小的層生成更好的字幕。
          為了對(duì)圖像特征進(jìn)行編碼,我們將使用轉(zhuǎn)移學(xué)習(xí)。我們可以使用很多模型,例如VGG-16,InceptionV3,ResNet等。我們將使用inceptionV3模型,該模型具有比其他參數(shù)最少的訓(xùn)練參數(shù),并且性能也比其他參數(shù)好。為了對(duì)文本序列進(jìn)行編碼,我們將每個(gè)單詞映射到200維向量。為此,將使用預(yù)訓(xùn)練的手套模型。此映射將在稱為嵌入層的輸入層之后的單獨(dú)層中完成。為了生成字幕,我們將使用兩種流行的方法,即“貪婪搜索”和“波束搜索”。這些方法將幫助我們選擇最佳單詞來準(zhǔn)確定義圖像。我希望這使您對(duì)我們?nèi)绾翁幚泶藛栴}陳述有所了解。
          讓我們深入研究圖像標(biāo)題生成器的實(shí)現(xiàn)和創(chuàng)建!
          了解數(shù)據(jù)集
          許多數(shù)據(jù)集用于圖像字幕方法的訓(xùn)練,測試和評(píng)估。數(shù)據(jù)集在各種角度上都不同,例如圖像數(shù)量,每個(gè)圖像的字幕數(shù)量,字幕格式和圖像大小。三個(gè)數(shù)據(jù)集:Flickr8k,F(xiàn)lickr30k和MS COCO數(shù)據(jù)集被廣泛使用。在Flickr8k數(shù)據(jù)集中,每個(gè)圖像都與五個(gè)不同的標(biāo)題相關(guān)聯(lián),這些標(biāo)題描述了圖像中所描述的實(shí)體和事件。通過將每個(gè)圖像與多個(gè)獨(dú)立產(chǎn)生的句子相關(guān)聯(lián),數(shù)據(jù)集捕獲了一些可用于描述同一圖像的語言多樣性。
          Flickr8k體積小巧,可以使用CPU在低端筆記本電腦/臺(tái)式機(jī)上輕松進(jìn)行培訓(xùn),因此是一個(gè)很好的入門數(shù)據(jù)集。我們的數(shù)據(jù)集結(jié)構(gòu)如下:

          讓我們來構(gòu)建圖片說明生成器!
          步驟1:導(dǎo)入所需的庫
          在這里,我們將利用Keras庫創(chuàng)建模型并進(jìn)行訓(xùn)練。如果您想要GPU進(jìn)行訓(xùn)練,則可以使用Google Colab或Kaggle筆記本。
          import?numpy?as?np
          from?numpy?import?array
          import?matplotlib.pyplot?as?plt
          %matplotlib?inline
          ?
          import?string
          import?os
          import?glob
          from?PIL?import?Image
          from?time?import?time
          ?
          from?keras?import?Input,?layers
          from?keras?import?optimizers
          from?keras.optimizers?import?Adam
          from?keras.preprocessing?import?sequence
          from?keras.preprocessing?import?image
          from?keras.preprocessing.text?import?Tokenizer
          from?keras.preprocessing.sequence?import?pad_sequences
          from?keras.layers?import?LSTM,?Embedding,?Dense,?Activation,?Flatten,?Reshape,?Dropout
          from?keras.layers.wrappers?import?Bidirectional
          from?keras.layers.merge?import?add
          from?keras.applications.inception_v3?import?InceptionV3
          from?keras.applications.inception_v3?import?preprocess_input
          from?keras.models?import?Model
          from?keras.utils?import?to_categorical
          步驟2:數(shù)據(jù)加載和預(yù)處理
          我們將定義所需文件的所有路徑,并保存圖像id及其標(biāo)題。
          token_path?=?"../input/flickr8k/Data/Flickr8k_text/Flickr8k.token.txt"
          train_images_path?=?'../input/flickr8k/Data/Flickr8k_text/Flickr_8k.trainImages.txt'
          test_images_path?=?'../input/flickr8k/Data/Flickr8k_text/Flickr_8k.testImages.txt'
          images_path?=?'../input/flickr8k/Data/Flicker8k_Dataset/'
          glove_path?=?'../input/glove6b'
          ?
          doc?=?open(token_path,'r').read()
          print(doc[:410])
          輸出如下:

          因此,我們可以看到存儲(chǔ)圖片ID及其標(biāo)題的格式。接下來,我們創(chuàng)建一個(gè)名為“descriptions”的字典,其中包含圖像的名稱作為鍵,并包含對(duì)應(yīng)圖像的5個(gè)標(biāo)題的列表作為值。
          descriptions?=?dict()
          for?line?in?doc.split('\n'):
          ????????tokens?=?line.split()
          ????????if?len(line)?>?2:
          ??????????image_id?=?tokens[0].split('.')[0]
          ??????????image_desc?=?'?'.join(tokens[1:])
          ??????????if?image_id?not?in?descriptions:
          ??????????????descriptions[image_id]?=?list()
          ??????????descriptions[image_id].append(image_desc)
          現(xiàn)在,讓我們執(zhí)行一些基本的文本清除操作以消除標(biāo)點(diǎn)符號(hào),并將我們的描述轉(zhuǎn)換為小寫。
          table?=?str.maketrans('',?'',?string.punctuation)
          for?key,?desc_list?in?descriptions.items():
          ????for?i?in?range(len(desc_list)):
          ????????desc?=?desc_list[i]
          ????????desc?=?desc.split()
          ????????desc?=?[word.lower()?for?word?in?desc]
          ????????desc?=?[w.translate(table)?for?w?in?desc]
          ????????desc_list[i]?=??'?'.join(desc)
          讓我們可視化示例圖片及其標(biāo)題:
          pic?=?'1000268201_693b08cb0e.jpg'
          x=plt.imread(images_path+pic)
          plt.imshow(x)
          plt.show()
          descriptions['1000268201_693b08cb0e']
          輸出如下:

          接下來,我們創(chuàng)建數(shù)據(jù)集中所有8000 * 5(即40000)圖像標(biāo)題中存在的所有唯一單詞的詞匯表。我們?cè)谒?0000個(gè)圖像標(biāo)題中都有8828個(gè)唯一的單詞。
          vocabulary?=?set()
          for?key?in?descriptions.keys():
          ????????[vocabulary.update(d.split())?for?d?in?descriptions[key]]
          print('Original?Vocabulary?Size:?%d'?%?len(vocabulary))
          輸出如下:

          現(xiàn)在,以與token.txt文件相同的格式保存圖像ID及其新清除的標(biāo)題:
          lines?=?list()
          for?key,?desc_list?in?descriptions.items():
          ????for?desc?in?desc_list:
          ????????lines.append(key?+?'?'?+?desc)
          new_descriptions?=?'\n'.join(lines)
          接下來,我們從“Flickr_8k.trainImages.txt”文件的可變火車中加載所有6000個(gè)訓(xùn)練圖像ID:
          doc?=?open(train_images_path,'r').read()
          dataset?=?list()
          for?line?in?doc.split('\n'):
          ????if?len(line)?>?1:
          ??????identifier?=?line.split('.')[0]
          ??????dataset.append(identifier)
          ?
          train?=?set(dataset)
          現(xiàn)在,我們將所有訓(xùn)練和測試圖像分別保存在train_imgtest_img列表中:
          img?=?glob.glob(images_path?+?'*.jpg')
          train_images?=?set(open(train_images_path,?'r').read().strip().split('\n'))
          train_img?=?[]
          for?i?in?img:?
          ????if?i[len(images_path):]?in?train_images:
          ????????train_img.append(i)
          ?
          test_images?=?set(open(test_images_path,?'r').read().strip().split('\n'))
          test_img?=?[]
          for?i?in?img:?
          ????if?i[len(images_path):]?in?test_images:?
          ????????test_img.append(i)
          現(xiàn)在,我們將訓(xùn)練圖像的描述加載到字典中。但是,我們將在每個(gè)標(biāo)題中添加兩個(gè)標(biāo)記,分別是“ startseq”和“ endseq”:
          train_descriptions?=?dict()
          for?line?in?new_descriptions.split('\n'):
          ????tokens?=?line.split()
          ????image_id,?image_desc?=?tokens[0],?tokens[1:]
          ????if?image_id?in?train:
          ????????if?image_id?not?in?train_descriptions:
          ????????????train_descriptions[image_id]?=?list()
          ????????desc?=?'startseq?'?+?'?'.join(image_desc)?+?'?endseq'
          ????????train_descriptions[image_id].append(desc)
          創(chuàng)建所有訓(xùn)練標(biāo)題的列表:
          all_train_captions?=?[]
          for?key,?val?in?train_descriptions.items():
          ????for?cap?in?val:
          ????????all_train_captions.append(cap)
          為了使我們的模型更加健壯,我們將詞匯量減少到僅在整個(gè)語料庫中出現(xiàn)至少10次的單詞。
          word_count_threshold?=?10
          word_counts?=?{}
          nsents?=?0
          for?sent?in?all_train_captions:
          ????nsents?+=?1
          ????for?w?in?sent.split('?'):
          ????????word_counts[w]?=?word_counts.get(w,?0)?+?1
          vocab?=?[w?for?w?in?word_counts?if?word_counts[w]?>=?word_count_threshold]
          ?
          print('Vocabulary?=?%d'?%?(len(vocab)))
          輸出如下:

          現(xiàn)在,我們創(chuàng)建兩個(gè)字典以將單詞映射到索引,反之亦然。另外,我們?cè)谠~匯表后面加上1,因?yàn)槲覀冊(cè)诤竺婕由?以使所有字幕的長度相等。
          ixtoword?=?{}
          wordtoix?=?{}
          ix?=?1
          for?w?in?vocab:
          ????wordtoix[w]?=?ix
          ????ixtoword[ix]?=?w
          ????ix?+=?1
          ?
          vocab_size?=?len(ixtoword)?+?1
          因此,現(xiàn)在我們的總詞匯量為1660。我們還需要找出字幕的最大長度,因?yàn)槲覀儾荒苡腥我忾L度的字幕。
          all_desc?=?list()
          for?key?in?train_descriptions.keys():
          ????[all_desc.append(d)?for?d?in?train_descriptions[key]]
          lines?=?all_desc
          max_length?=?max(len(d.split())?for?d?in?lines)
          ?
          print('Description?Length:?%d'?%?max_length)
          輸出如下:

          步驟3:Glove嵌入
          詞向量將詞映射到向量空間,在這里類似的詞被聚在一起,而不同的詞則被分離。與Word2Vec相比,使用Glove的優(yōu)勢在于GloVe不僅依賴于單詞的局部上下文,還合并了全局單詞共現(xiàn)以獲得單詞向量。
          Glove背后的基本前提是我們可以從同現(xiàn)矩陣中得出單詞之間的語義關(guān)系。對(duì)于我們的模型,我們將使用Glove將38字長標(biāo)題中的所有字映射到200維向量。
          embeddings_index?=?{}?
          f?=?open(os.path.join(glove_path,?'glove.6B.200d.txt'),?encoding="utf-8")
          for?line?in?f:
          ????values?=?line.split()
          ????word?=?values[0]
          ????coefs?=?np.asarray(values[1:],?dtype='float32')
          ????embeddings_index[word]?=?coefs
          接下來,我們制作形狀矩陣(1660,200),該矩陣由我們的詞匯表和200維向量組成。
          embedding_dim?=?200
          embedding_matrix?=?np.zeros((vocab_size,?embedding_dim))
          for?word,?i?in?wordtoix.items():
          ????embedding_vector?=?embeddings_index.get(word)
          ????if?embedding_vector?is?not?None:
          ????????embedding_matrix[i]?=?embedding_vector
          步驟4:模型建立與培訓(xùn)
          正如您從我們的方法中看到的那樣,我們選擇了使用InceptionV3網(wǎng)絡(luò)進(jìn)行轉(zhuǎn)移學(xué)習(xí),該網(wǎng)絡(luò)在ImageNet數(shù)據(jù)集上進(jìn)行了預(yù)訓(xùn)練。
          model?=?InceptionV3(weights='imagenet')
          我們必須記住,這里不需要分類圖像,只需要為圖像提取圖像矢量即可。因此,我們從inceptionV3模型中刪除了softmax層。
          model_new?=?Model(model.input,?model.layers[-2].output)

          由于我們使用的是InceptionV3,因此我們需要對(duì)輸入進(jìn)行預(yù)處理,然后再將其輸入模型。因此,我們定義了一個(gè)預(yù)處理函數(shù)以將圖像重塑為(299 x 299)并饋入Keras的preprocess_input()函數(shù)。

          def?preprocess(image_path):
          ????img?=?image.load_img(image_path,?target_size=(299,?299))
          ????x?=?image.img_to_array(img)
          ????x?=?np.expand_dims(x,?axis=0)
          ????x?=?preprocess_input(x)
          ????return?x
          現(xiàn)在我們可以繼續(xù)對(duì)訓(xùn)練和測試圖像進(jìn)行編碼,即提取形狀為(2048,)的圖像矢量。
          def?encode(image):
          ????image?=?preprocess(image)?
          ????fea_vec?=?model_new.predict(image)?
          ????fea_vec?=?np.reshape(fea_vec,?fea_vec.shape[1])
          ????return?fea_vec
          ?
          encoding_train?=?{}
          for?img?in?train_img:
          ????encoding_train[img[len(images_path):]]?=?encode(img)
          train_features?=?encoding_train
          ?
          encoding_test?=?{}
          for?img?in?test_img:
          ????encoding_test[img[len(images_path):]]?=?encode(img)
          現(xiàn)在定義模型,我們正在創(chuàng)建一個(gè)合并模型,其中我們將圖像矢量和部分標(biāo)題結(jié)合在一起。因此,我們的模型將包含3個(gè)主要步驟:
          1、處理文本中的序列
          2、從圖像中提取特征向量
          3、通過連接以上兩層,使用softmax解碼輸出
          inputs1?=?Input(shape=(2048,))
          fe1?=?Dropout(0.5)(inputs1)
          fe2?=?Dense(256,?activation='relu')(fe1)
          ?
          inputs2?=?Input(shape=(max_length,))
          se1?=?Embedding(vocab_size,?embedding_dim,?mask_zero=True)(inputs2)
          se2?=?Dropout(0.5)(se1)
          se3?=?LSTM(256)(se2)
          ?
          decoder1?=?add([fe2,?se3])
          decoder2?=?Dense(256,?activation='relu')(decoder1)
          outputs?=?Dense(vocab_size,?activation='softmax')(decoder2)
          ?
          model?=?Model(inputs=[inputs1,?inputs2],?outputs=outputs)
          model.summary()
          輸出如下:

          Input_3是輸入到嵌入層的最大長度為34的部分標(biāo)題。這是單詞映射到200-d手套嵌入的地方。緊隨其后的是0.5的落差,以避免過度擬合。然后將其輸入LSTM中以處理序列。
          Input_2是我們的InceptionV3網(wǎng)絡(luò)提取的圖像矢量。緊隨其后的是0.5的落差,以避免過度擬合,然后將其饋入“全連接”層。
          然后,通過添加圖像模型和語言模型將其連接起來,并饋入另一個(gè)“完全連接”層。該層是softmax層,可為我們的1660個(gè)單詞詞匯提供概率。
          步驟5:模型訓(xùn)練
          在訓(xùn)練模型之前,我們需要記住,我們不想在嵌入層(預(yù)訓(xùn)練的Glove向量)中重新訓(xùn)練權(quán)重。
          model.layers[2].set_weights([embedding_matrix])
          model.layers[2].trainable?=?False
          接下來,使用Categorical_Crossentropy作為Loss函數(shù)并使用Adam作為優(yōu)化器來編譯模型。
          model.compile(loss='categorical_crossentropy',?optimizer='adam')
          由于我們的數(shù)據(jù)集有6000張圖像和40000個(gè)標(biāo)題,我們將創(chuàng)建一個(gè)可以批量訓(xùn)練數(shù)據(jù)的函數(shù)。
          def?data_generator(descriptions,?photos,?wordtoix,?max_length,?num_photos_per_batch):
          ????X1,?X2,?y?=?list(),?list(),?list()
          ????n=0
          ????#?loop?for?ever?over?images
          ????while?1:
          ????????for?key,?desc_list?in?descriptions.items():
          ????????????n+=1
          ????????????#?retrieve?the?photo?feature
          ????????????photo?=?photos[key+'.jpg']
          ????????????for?desc?in?desc_list:
          ????????????????#?encode?the?sequence
          ????????????????seq?=?[wordtoix[word]?for?word?in?desc.split('?')?if?word?in?wordtoix]
          ????????????????#?split?one?sequence?into?multiple?X,?y?pairs
          ????????????????for?i?in?range(1,?len(seq)):
          ????????????????????#?split?into?input?and?output?pair
          ????????????????????in_seq,?out_seq?=?seq[:i],?seq[i]
          ????????????????????#?pad?input?sequence
          ????????????????????in_seq?=?pad_sequences([in_seq],?maxlen=max_length)[0]
          ????????????????????#?encode?output?sequence
          ????????????????????out_seq?=?to_categorical([out_seq],?num_classes=vocab_size)[0]
          ????????????????????#?store
          ????????????????????X1.append(photo)
          ????????????????????X2.append(in_seq)
          ????????????????????y.append(out_seq)
          ?
          ????????????if?n==num_photos_per_batch:
          ????????????????yield?([array(X1),?array(X2)],?array(y))
          ????????????????X1,?X2,?y?=?list(),?list(),?list()
          ????????????????n=0
          接下來,讓我們訓(xùn)練30個(gè)時(shí)期的模型,批處理大小為3,每個(gè)時(shí)期2000步。在Kaggle GPU上,模型的完整訓(xùn)練耗時(shí)1小時(shí)40分鐘。
          epochs?=?30
          batch_size?=?3
          steps?=?len(train_descriptions)//batch_size
          ?
          generator?=?data_generator(train_descriptions,?train_features,?wordtoix,?max_length,?batch_size)
          model.fit(generator,?epochs=epochs,?steps_per_epoch=steps,?verbose=1)
          步驟6:貪心搜索
          當(dāng)模型生成一個(gè)1660長的矢量時(shí),該矢量在詞匯表中所有單詞的概率分布上,我們會(huì)貪婪地選擇具有最高概率的單詞以進(jìn)行下一個(gè)單詞預(yù)測。此方法稱為貪心搜索。
          def?greedySearch(photo):
          ????in_text?=?'startseq'
          ????for?i?in?range(max_length):
          ????????sequence?=?[wordtoix[w]?for?w?in?in_text.split()?if?w?in?wordtoix]
          ????????sequence?=?pad_sequences([sequence],?maxlen=max_length)
          ????????yhat?=?model.predict([photo,sequence],?verbose=0)
          ????????yhat?=?np.argmax(yhat)
          ????????word?=?ixtoword[yhat]
          ????????in_text?+=?'?'?+?word
          ????????if?word?==?'endseq':
          ????????????break
          ?
          ????final?=?in_text.split()
          ????final?=?final[1:-1]
          ????final?=?'?'.join(final)
          ????return?final
          Beam Search是我們獲取前k個(gè)預(yù)測的地方,將其再次輸入模型中,然后使用模型返回的概率對(duì)其進(jìn)行排序。因此,列表將始終包含前k個(gè)預(yù)測,并且我們選擇概率最高的預(yù)測,直到遇到“ endseq”或達(dá)到最大字幕長度為止。
          def?beam_search_predictions(image,?beam_index?=?3):
          ????start?=?[wordtoix["startseq"]]
          ????start_word?=?[[start,?0.0]]
          ????while?len(start_word[0][0])?????????temp?=?[]
          ????????for?s?in?start_word:
          ????????????par_caps?=?sequence.pad_sequences([s[0]],?maxlen=max_length,?padding='post')
          ????????????preds?=?model.predict([image,par_caps],?verbose=0)
          ????????????word_preds?=?np.argsort(preds[0])[-beam_index:]
          ????????????#?Getting?the?top?(n)?predictions?and?creating?a?
          ????????????#?new?list?so?as?to?put?them?via?the?model?again
          ????????????for?w?in?word_preds:
          ????????????????next_cap,?prob?=?s[0][:],?s[1]
          ????????????????next_cap.append(w)
          ????????????????prob?+=?preds[0][w]
          ????????????????temp.append([next_cap,?prob])
          ????????????????????
          ????????start_word?=?temp
          ????????#?Sorting?according?to?the?probabilities
          ????????start_word?=?sorted(start_word,?reverse=False,?key=lambda?l:?l[1])
          ????????#?Getting?the?top?words
          ????????start_word?=?start_word[-beam_index:]
          ????
          ????start_word?=?start_word[-1][0]
          ????intermediate_caption?=?[ixtoword[i]?for?i?in?start_word]
          ????final_caption?=?[]
          ????
          ????for?i?in?intermediate_caption:
          ????????if?i?!=?'endseq':
          ????????????final_caption.append(i)
          ????????else:
          ????????????break
          ?
          ????final_caption?=?'?'.join(final_caption[1:])
          ????return?final_caption
          步驟7:評(píng)估
          現(xiàn)在,我們?cè)诓煌膱D像上測試模型,并查看其生成的字幕。我們還將研究由貪婪搜索和Beam搜索生成的具有不同k值的不同字幕。
          首先,我們將看一下本文開頭看到的示例圖像。我們看到圖片的標(biāo)題是“雪中的黑狗和棕狗”。讓我們看看我們的模型如何比較。
          pic?=?'2398605966_1d0c9e6a20.jpg'
          image?=?encoding_test[pic].reshape((1,2048))
          x=plt.imread(images_path+pic)
          plt.imshow(x)
          plt.show()
          ?
          print("Greedy?Search:",greedySearch(image))
          print("Beam?Search,?K?=?3:",beam_search_predictions(image,?beam_index?=?3))
          print("Beam?Search,?K?=?5:",beam_search_predictions(image,?beam_index?=?5))
          print("Beam?Search,?K?=?7:",beam_search_predictions(image,?beam_index?=?7))
          print("Beam?Search,?K?=?10:",beam_search_predictions(image,?beam_index?=?10))

          您可以看到我們的模型能夠識(shí)別出雪中的兩只狗。但與此同時(shí),它把黑狗誤分類為白狗。然而,它能夠構(gòu)成一個(gè)恰當(dāng)?shù)木渥觼硐袢祟愐粯用枋鰣D像。
          我們?cè)賮砜匆恍┦纠?/span>
          pic?=?list(encoding_test.keys())[1]
          image?=?encoding_test[pic].reshape((1,2048))
          x=plt.imread(images_path+pic)
          plt.imshow(x)
          plt.show()
          ?
          print("Greedy:",greedySearch(image))
          print("Beam?Search,?K?=?3:",beam_search_predictions(image,?beam_index?=?3))
          print("Beam?Search,?K?=?5:",beam_search_predictions(image,?beam_index?=?5))
          print("Beam?Search,?K?=?7:",beam_search_predictions(image,?beam_index?=?7))

          在這里我們可以看到我們準(zhǔn)確地描述了圖像中發(fā)生的事情。您還將注意到使用Beam Search生成的字幕要比Greedy Search更好。
          我們還來看看由我們的模型生成的錯(cuò)誤標(biāo)題:

          我們可以看到,該模型在光束搜索中顯然對(duì)圖像中的人數(shù)進(jìn)行了錯(cuò)誤分類,但是我們的貪婪搜索能夠識(shí)別出該人。
          瞧!我們已經(jīng)成功創(chuàng)建了自己的圖像標(biāo)題生成器!
          下一步是什么?
          我們今天開發(fā)的僅僅是開始。關(guān)于此主題的研究很多,您可以制作出更好的圖像標(biāo)題生成器。
          您可以實(shí)施以改善模型的事情:
          1、利用較大的數(shù)據(jù)集,尤其是MS COCO數(shù)據(jù)集或比MS COCO大26倍的Stock3M數(shù)據(jù)集。
          2、利用評(píng)估指標(biāo)來衡量機(jī)器生成的文本的質(zhì)量,例如BLEU(雙語評(píng)估研究)。
          3、實(shí)現(xiàn)基于注意力的模型:基于注意力的機(jī)制在深度學(xué)習(xí)中正變得越來越流行,因?yàn)樗鼈兛梢栽谏奢敵鲂蛄袝r(shí)動(dòng)態(tài)地專注于輸入圖像的各個(gè)部分。
          4、基于圖像的事實(shí)描述不足以生成高質(zhì)量的字幕。我們可以添加外部知識(shí)以生成有吸引力的圖像標(biāo)題。因此,處理開放域數(shù)據(jù)集可能是一個(gè)有趣的前景。
          尾注
          恭喜你!您已經(jīng)學(xué)習(xí)了如何從頭開始制作圖像字幕生成器。在這樣做的同時(shí),您還學(xué)習(xí)了如何將計(jì)算機(jī)視覺和自然語言處理領(lǐng)域整合在一起,并實(shí)現(xiàn)了一種類似于Beam Search的方法,該方法能夠生成比標(biāo)準(zhǔn)更好的描述。
          從使用的數(shù)據(jù)集到實(shí)施的方法論,還有很多地方可以改進(jìn)。確保嘗試一些建議,以改善發(fā)電機(jī)的性能,并與我分享您的結(jié)果!

          作者:沂水寒城,CSDN博客專家,個(gè)人研究方向:機(jī)器學(xué)習(xí)、深度學(xué)習(xí)、NLP、CV

          Blog:?http://yishuihancheng.blog.csdn.net


          贊 賞 作 者



          更多閱讀



          2020 年最佳流行 Python 庫 Top 10


          2020 Python中文社區(qū)熱門文章 Top 10


          5分鐘快速掌握 Python 定時(shí)任務(wù)框架

          特別推薦




          點(diǎn)擊下方閱讀原文加入社區(qū)會(huì)員

          瀏覽 64
          點(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>
                  国产又黄又硬又粗 | 97人妻人人澡 | 四虎精品成人无码A片 | 成人黄色大香蕉 | 手机免费看国产黄色电影 |