準(zhǔn)備
一個(gè)style image 、一個(gè) content image以及一個(gè)訓(xùn)練好的CNN(一般用VGG網(wǎng)絡(luò)就可以,可以去github上下載)


輸入
有三個(gè),分別是:noise image、content image、 style image
功能
將style image和content image進(jìn)行融合,即將style image的風(fēng)格放到content image中,但又不損失content image里面的內(nèi)容。
原理
從卷積神經(jīng)網(wǎng)絡(luò)的可視化可以知道,在低層的神經(jīng)網(wǎng)絡(luò)中會(huì)有一些紋理、顏色的一些低級(jí)特征識(shí)別,越往上層,學(xué)習(xí)到的feature map越復(fù)雜,就會(huì)出現(xiàn)一些特定的pattern,比如:人臉、鳥的腿等等。(具體可以參看這個(gè)可視化的paper)
1.所以考慮讓content image在接近輸出的神經(jīng)層算content_feature_maps,讓style image在接近輸入的神經(jīng)層算style_feature_maps.
2.對(duì)noise image做相同的操作,得到noise_style_feature_maps (獲取maps的層數(shù)和style image相同)和 noise_content_feature_maps(獲取maps的層數(shù)和content image相同)
3.計(jì)算noise_content_feature_maps和content_feature_maps之間的loss,記為content loss,計(jì)算方法如下:
4.之后計(jì)算noise_style_feature_maps和style_feature_maps之間的loss,記為style loss,計(jì)算方法如下,即各自gram matrix的MSE:
- 什么是gram matrix?:
????gram matrix是:一個(gè)vector x(列向量),如果計(jì)算它的gram matrix就是,gram matrix可以衡量兩個(gè)feature map之間的相似程度。
-
為什么不直接用MSE呢?
因?yàn)閟tyle衡量的是紋理、顏色等一不一樣,所以計(jì)算的是某種相關(guān)性。而不需要像content那樣每個(gè)像素點(diǎn)都比較接近(即內(nèi)容比較接近),所以在這里計(jì)算的是gram matrix的MSE。
5.最后呢,最小化style_loss+content_loss
結(jié)果
下面是我自己跑出來的結(jié)果,比較難看,但是已經(jīng)有了風(fēng)格遷移的味道,有些內(nèi)容有點(diǎn)失真,我感覺應(yīng)該是訓(xùn)練的不夠,但是鑒于我的電腦太久遠(yuǎn)了,一運(yùn)行就卡的不行,就這樣的結(jié)果也是跑了很長時(shí)間的了。

代碼
見我的github。代碼里面只需要運(yùn)行style_transfer.py文件即可。還有一個(gè)VGG網(wǎng)絡(luò)的訓(xùn)練參數(shù)文件“vgg16.npy”需要下載,這個(gè)文件比較大,上傳太費(fèi)時(shí)了,可以去github上找,或者網(wǎng)盤。
有什么問題可以及時(shí)留言,歡迎批評(píng)指正!