MMF的初步介紹:一個規范化的VQA,Image Captioning等視覺-語言多模態任務框架


  在VQA, Image Caption等任務中,構建模型是一件工作量較大的工作。有沒有什么能減少這些重復的工作量呢?與此同時,Pytorch,tensorflow等開源的深度學習工具包發布,大大減少了研究人員在構建模型上的重復工作。於是,有機構開始着手以Pytorch為基礎,構建了VQA的框架。由Facebook AI Research實驗室使用python語言,以pytorch為基礎,編寫的框架MMF解決了這個問題。同時,MMF不僅包括了VQA,還有其它的很多VL多模態任務,如Image Caption等。

  如何運行MMF框架

  MMF的官方代碼在Github上可以看到,而且附帶了大量的說明。同時,其官方網站https://mmf.sh/上也有較為詳細的介紹。但是初學者很容易”亂花漸欲迷人眼“,所以我就根據自己以前運行MMF的一些經驗教訓,介紹幾個重點的內容,方便小白入門理解。

 

 

 

  1. MMF框架是用python語言寫成的,使用了大量Pytorch工具包中的代碼。所以要順利運行代碼,需要一些python的基礎知識。python是腳本語言,和C++、Java等語言有所不同,python是邊解釋邊執行的。其本身並沒有嚴格的一個”主程序入口“,也就是每一個文件理論上都可以執行。當然,為了規范,python還是會用一些語法規則模擬出一個主程序入口。如果工程中一個.py文件中有類似的如下語句,那么這個文件很大幾率就是要運行的程序的入口,執行這個文件一般就可以運行程序。
    if __name__=="__main__":
        function()  #do something
  1. 深度學習模型是千變萬化的,僅各種參數就有很多種組合,如果僅僅依靠執行一個文件不能靈活地滿足實驗中參數修改的需求。python提供了一種方便調整參數的方法,使用如下格式。當然,可修改的參數arg1,arg2,…,argn要在文件的代碼中定義。
    python executeFile.py --arg1 arg2 ...
  2. 以上的方法還是有些不太靈活,python中還支持這樣的方式:將參數配置,編寫成能夠被讀取的.yaml格式的文件,例如default.yaml,dataset.yaml等。調用yaml配置文件的代碼需要在文件中定義好。當訓練時,執行程序通過調用存儲在具體位置的yaml配置文件,從中獲取參數配置,例如使用哪一種方式訓練,使用哪一種數據集,迭代次數,batch_size等信息。這樣,當訓練計划有變時,我們只需要改變相應的yaml配置文件中的參數,執行同樣的指令仍然可以實現程序的調整運行。該類型的指令如下:
    python configs/default.yaml  dataset=XXX train_val   '''類似的格式,不是完全符合'''
  3. 在mmf/setup.py中,對這種命令格式進行了進一步的打包,3中的指令,變為以下類型。在該更改中,會涉及到setuptools工具包,具體的使用說明請查閱該python工具包的文檔。

    mmf_run configs/default.yaml  dataset=XXX train_val   '''類似的格式,不是完全符合'''

  如果你已經學習了python的一些基本的語法知識,同時了解以上幾種python程序運行方式,那么你離成功運行程序成功前進了一大步。因為你知道了程序的入口,也就把握住了整體。

  下一步。就是為程序配置各種文件環境了。因為python程序的一大特點是有很多種封裝好可下載的工具包,一些程序的編寫離不開這些包的支持,所以你需要確認一下requirement.txt中的各種要求有沒有滿足,沒有的要下載到正確的位置。這方面的知識,包括pytorch的安裝使用,其它包的安裝,如果包下載速度慢如何使用鏡像網站資源進行快速下載,anaconda、cuda等的安裝。這些問題各種網站上已經有詳細的說明解答,我就不多說了。
  安裝、配置好各種文件后,我們繼續按照mmf的說明一步一步進行。

  下一步,就是mmf的直接運行,相關步驟在mmf的官方網站上寫的已經比較清楚了:

 

  

  在Quickstart中,以運行VQA中經典的M4C模型為樣例,通過在Linux的終端輸入training下方的命令行,進行運行。

  注意,訓練時會使用到很多參數,但以上的命令行中出現的config,dataset,model,run_type這些都是不可或缺的參數,而其它沒有輸入指明的,都是采用已經配置好的默認參數,這些參數可以在配置文件如 mmf/configs/defaults.yaml , mmf/configs/models/ 等位置中找到,並且可以通過修改這些數值更改默認選項。

 

   當然,你也可以在命令行中添加這些參數,讓這一次的運行參數改變:

mmf_run config=projects/m4c/configs/textvqa/defaults.yaml \
    datasets=textvqa \
    model=m4c \
    run_type=train_val \
    training.batch_size=32 \
    training.max_updates=44000 \
    training.log_interval=10 \
    training.checkpoint_interval=100 \
    training.evaluation_interval=1000 \
   env.save_dir = /xxx/path_for_save_checkpoint_file \
checkpoint.resume_file = /xxx/path_for_load_specific_checkpoint_file
  

  運行前,最好把requirements.txt 文件中記錄的python程序所需要的各種包一次下載好。

  輸入Quickstart命令后,程序開始運行,首先要載入各種准備數據,評價結果的工具包,以及其它訓練參數等。

  注意,模型訓練需要的數據很大!(約64GB),雖然這個程序會在指定路徑檢測不到數據集的情況下自動下載數據,但是由於網絡等問題,經常會下了半天中斷又重新開始,所以建議最好先在本地找個可靠的網絡,使用mmf/configs/zoo里面的配置文件中記錄的數據集鏈接,進行下載,然后將壓縮文件上傳到配置文件configs/dataset中的指定路徑下。

 

   后面是模型的載入,模型結構的輸出,可以看出模型層數還是非常多的:

 

   打印模型的參數結構后,如果沒有問題,模型就開始訓練了。在當前調整后的參數下,程序總共迭代44000次,每100次打印結果,訓練使用的m4c_decoding_bce_with_mask損失,即BCE二元交叉熵損失,每1000次保存checkpoints文件作為記錄,同時計算當前訓練參數下,模型在val驗證集上的指標得分。一般來說,隨着迭代次數的增加,損失loss整體下降。准確率等指標逐漸上升,就說明當前模型訓練整體是正確的。

 

 

   我是在服務器上訓練的模型,使用一塊GTX2080的顯卡,訓練結果大約花費了11個小時。尾聲階段,可以看出訓練的結果在驗證集上的准確率39%左右,這個和M4C的論文Iterative Answer Prediction with Pointer-Augmented,CVPR2020 中提到的結果是基本一樣的,這說明我們成功地復現了該模型的代碼。

 

 

 

  該論文中,還有一個M4C(ours, w/ST-VQA)的情況,這個取得了更高的得分,需要在數據集中添加額外的ST-VQA作為輔助的訓練數據集,具體的操作請查閱mmf文檔,以及M4C模型多個更改好的配置文件。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM