最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊

MoCo----偽代碼

2021-12-29 15:16 作者:如果我是泡橘子  | 我要投稿


MoCo的偽代碼
  • 首先定義了一些參數(shù)fq、fk,它們分別是query和key的編碼器

  • queue這個(gè)隊(duì)列指的是字典,里面一共有k個(gè)key,所以它的維度是c*k,c指的是每個(gè)特征的維度

  • m是動(dòng)量

  • t是算InfoNCE loss的時(shí)候的那個(gè)溫度

整個(gè)模型的前向過程:

  • 首先初始化兩個(gè)編碼器,對于query編碼器fq來說,它是隨機(jī)初始話的,然后將fq的參數(shù)直接復(fù)制給fk,這樣就把fk也初始化了

  • 接下來從data loader里拿一個(gè)batch的數(shù)據(jù),這里數(shù)據(jù)用x表示,它有n個(gè)sample(在MoCo的代碼中,默認(rèn)的batch-size就是256,也就是n等于256,所以是非常標(biāo)準(zhǔn)的batch-size,是可以在常用的GPU上進(jìn)行訓(xùn)練的)

  • 接下來的第一步就是得到一個(gè)正樣本對,所以從原始的數(shù)據(jù)x開始,先做一次數(shù)據(jù)增強(qiáng),得到一個(gè)query的圖片,然后再去隨機(jī)的做一次數(shù)據(jù)增強(qiáng),得到一個(gè)key的圖片,因?yàn)檫@個(gè)query和key都是從同一個(gè)數(shù)據(jù)x得到的,它的語義不應(yīng)該發(fā)生太大的變化,所以這個(gè)xq、xk就成為了一個(gè)正樣本對

  • 接下來將query的數(shù)據(jù)通過query的編碼器做一次前向,從而得到真正的特征q,q的特征維度是n*c,也就是256*128

  • 為了便于理解,這里再具體化一些,假如編碼器fq、fk就是一個(gè)Res50的網(wǎng)絡(luò),Res50等到最后一層做完global average pooling之后會(huì)得到一個(gè)2048維的特征

  • 一般如果是在ImageNet數(shù)據(jù)集上去做有監(jiān)督訓(xùn)練的時(shí)候,會(huì)加一個(gè)分類頭,將這個(gè)2048維變成1000維,這樣就可以做分類了

  • 這里作者就是將1000換成了128,也就是說從2048維變成了128維

  • 這里為什么使用128?其實(shí)是為了跟之前的工作保持一致,也就是之前memory bank的工作(文獻(xiàn)61)。memory bank這篇文章中,為了讓整個(gè)memory bank變得盡可能的小,所以特征的維度選的也相對比較小,只有128

  • 通過編碼器fk得到正樣本的那個(gè)key的維度也是256*128

  • 因?yàn)槭莗ytorch的代碼,所以用了detach操作將gradient去掉,這樣對于key來說就沒有梯度回傳了,反正也是要放到隊(duì)列中去的

  • 下一步就是計(jì)算logit,也就是之前公式1中算InfoNCE loss的時(shí)候的分子(q * k+),這樣就得到了正樣本的logit,它的特征維度就變成了n * 1,256,1

  • 如何計(jì)算負(fù)樣本的logit?首先從隊(duì)列中把負(fù)樣本拿出來,也就是代碼中的queue,接下來就是計(jì)算公式1中InfoNCE的分母,也就是對query * ki求和(i是從0到k的),做完了這一步的乘法之后,就得到了負(fù)樣本的logit,也就是n * k,所以就是256 * 65536(因?yàn)镸oCo中默認(rèn)的字典大小是65536)

  • 最后總體的logit(既有正樣本又有負(fù)樣本,所有的logit拼接起來)就變成了256 *65537的一個(gè)向量,也就是像公式1中所說的,現(xiàn)在所做的其實(shí)就是k + 1路的分類問題

  • 一旦有了正負(fù)樣本的logit,接下來就是算loss了,這里其實(shí)就是用了一個(gè)cross entropy loss去實(shí)現(xiàn)的,既然是交叉熵loss,肯定就得有一個(gè)ground truth(作者在這里巧妙地設(shè)計(jì)了一個(gè)全零的向量作為ground truth,之所以使用全零,是因?yàn)榘凑兆髡叩倪@種實(shí)現(xiàn)方式,所有的正樣本永遠(yuǎn)都是在logit的第一個(gè)位置上,也就是位置0,所以對于正樣本來說,如果找對了那個(gè)key,在分類任務(wù)中得到的正確的類別就是類別0,所以巧妙地使用了這種方式創(chuàng)建了一個(gè)ground truth,從而計(jì)算出了對比學(xué)習(xí)的loss)

  • 有了loss之后,自然就是先做一次梯度回傳,有了梯度之后就可以去更新query的編碼器了

  • 接下來就到了MoCo的第二個(gè)貢獻(xiàn)(動(dòng)量更新),因?yàn)椴幌胱宖k變得太快,所以fk的參數(shù)大部分都是從上一個(gè)時(shí)刻的參數(shù)直接搬過來的,只有非常少的一部分是從當(dāng)前更新過的fq中拿過來的,這樣就保證了key network是緩慢更新的

  • 最后一步是更新隊(duì)列,將新算的key放進(jìn)隊(duì)列中,然后將最老的key從隊(duì)列中移出

讀完偽代碼,應(yīng)該是對MoCo有了一個(gè)更全面的了解,建議查看MoCo的官方代碼,寫的極其出色,非常簡潔明了,而且基本上就跟偽代碼一模一樣





----end----

MoCo----偽代碼的評(píng)論 (共 條)

分享到微博請遵守國家法律
霸州市| 乐清市| 林州市| 名山县| 洛扎县| 新宾| 辛集市| 札达县| 永和县| 福海县| 崇州市| 华容县| 神农架林区| 雷山县| 博爱县| 寿阳县| 华宁县| 诸暨市| 青海省| 兰考县| 和平区| 肇庆市| 河北区| 芮城县| 永康市| 廊坊市| 贺州市| 溧阳市| 钟祥市| 沁水县| 德格县| 辽源市| 北安市| 亳州市| 日照市| 聊城市| 徐州市| 图片| 汶上县| 清河县| 韶山市|