孫澤 張俊
(武漢工程大學(xué)計(jì)算機(jī)科學(xué)與工程學(xué)院 湖北省武漢市 430205)
機(jī)器作畫(huà)一直是近些年來(lái)研究的一個(gè)重難點(diǎn),得益于硬件等條件的提升,人工智能迅速發(fā)展,并取得了前所未有的成就,現(xiàn)在它能做到的不僅僅是辨識(shí)技術(shù),也能從事藝術(shù)創(chuàng)作?,F(xiàn)在的藝術(shù)創(chuàng)作不再局限于傳統(tǒng)的畫(huà)筆、畫(huà)布創(chuàng)作,而是能通過(guò)Deep Dream 技術(shù)、生成對(duì)抗網(wǎng)絡(luò)等深度學(xué)習(xí)的方法進(jìn)行生成[1]。
Deep Dream 是由Google 公司提出的,特殊點(diǎn)在于通過(guò)機(jī)器模仿人類視覺(jué)認(rèn)知,產(chǎn)生圖像。其繪制出的作品極具藝術(shù)特色,同時(shí)也是有一定的商業(yè)價(jià)值的,比如Google 舉辦的藝術(shù)展中,阿克肯的一幅作品以8000 美元的價(jià)格成功拍賣(mài)[2]。在我們視覺(jué)系統(tǒng)上建模的Deep Dream 程序,看到了我們未知的內(nèi)容并以非凡的方式融合圖像,人工神經(jīng)網(wǎng)絡(luò)可謂開(kāi)啟了一個(gè)全新的藝術(shù)子流派[3]。
卷積神經(jīng)網(wǎng)絡(luò)可用于多分類任務(wù),輸入一張圖片,神經(jīng)網(wǎng)絡(luò)便會(huì)輸出一個(gè)向量,數(shù)值大小代表取各個(gè)類別的概率大小,輸出值與真實(shí)值比較,兩者之間的差距用損失函數(shù)來(lái)量化,損失函數(shù)指引網(wǎng)絡(luò)模型參數(shù)的變化方向,分類任務(wù)常用交叉熵?fù)p失函數(shù),如式1 所示,p(x)表示x 的真實(shí)概率值,q(x)表示x 的預(yù)測(cè)概率值,H(p,q)表示預(yù)測(cè)值與真實(shí)值之間的損失,上述RegCNN 同樣使用交叉熵?fù)p失函數(shù)訓(xùn)練而成。
梯度的方向就是損失函數(shù)值增長(zhǎng)最快的方向,常用梯度下降算法來(lái)優(yōu)化參數(shù),使參數(shù)不斷更新,如式(2)所示,L 為損失函數(shù),W 為網(wǎng)絡(luò)模型參數(shù),lr 為學(xué)習(xí)率,學(xué)習(xí)率決定了使損失函數(shù)達(dá)到最小值的每一步的步長(zhǎng)[4]。損失值越小,模型輸出值與真實(shí)值更接近,即模型更優(yōu),這也是分類任務(wù)的最終優(yōu)化目標(biāo)。
而Deep Dream 卻是將損失最大化,首先將圖片傳入預(yù)訓(xùn)練的卷積神經(jīng)網(wǎng)絡(luò),卷積層有固定的參數(shù)權(quán)值,經(jīng)過(guò)卷積運(yùn)算后得到特征圖,再將特征圖傳入非線性激活函數(shù)得到輸出激活值,如式(3)、(4)所示。
上式中,O(i,j)為輸出矩陣O 中(i,j)位置的元素,I 為輸入矩陣,K 為m×n 的核矩陣,b 為偏置項(xiàng),兩次累加完成卷積核與輸入特征圖對(duì)應(yīng)位置相乘累加的過(guò)程。σ 為激活函數(shù),完成非線性變換,增強(qiáng)了網(wǎng)絡(luò)的表達(dá)能力。
選擇某一個(gè)卷積層激活值的輸出或者某一個(gè)特定卷積層通道激活值的輸出,對(duì)其取平均后將其作為損失值,損失對(duì)圖片像素值求導(dǎo),再使用梯度上升算法更新像素值以最大化損失,損失越大,即表明圖片上的特征與預(yù)訓(xùn)練模型卷積層提取到的特征越相似,卷積層學(xué)習(xí)到的特征在圖片上的反饋越明顯。整個(gè)訓(xùn)練過(guò)程中,神經(jīng)網(wǎng)絡(luò)模型的參數(shù)值是固定的,優(yōu)化改變的是圖片像素值。
卷積神經(jīng)網(wǎng)絡(luò)雖然在實(shí)際應(yīng)用中取得了較好的效果,但缺乏可解釋性。在2013年的“Visualizing and Understanding Convolutional Neural Networks”這篇文章提出了使用反卷積等方法進(jìn)行特征可視化的方法。反卷積即卷積的逆過(guò)程,將卷積得到的特征圖傳入反卷積,即可得到特征圖的可視化結(jié)果[5]。這在一定程度上解釋了卷積神經(jīng)網(wǎng)絡(luò)所提取到的內(nèi)部特征。DeepDream 的靈感來(lái)源于此,但不同的是,Deep Dream 以這種“訓(xùn)練圖像”的方式來(lái)可視化網(wǎng)絡(luò),如圖1 所示。
圖1:DeepDream 原理圖
全連接神經(jīng)網(wǎng)絡(luò)參數(shù)量過(guò)多,訓(xùn)練起來(lái)較為困難,也極其容易出現(xiàn)過(guò)擬合的現(xiàn)象[6]。所以現(xiàn)在的用于分類的神經(jīng)網(wǎng)絡(luò)通常是先利用卷積層對(duì)圖像進(jìn)行特征提取,將提取到的降維之后的特征圖傳入全連接網(wǎng)絡(luò),卷積層通過(guò)權(quán)值共享大大減少了計(jì)算量[7]。
LeNet-5 是早期極具代表性的卷積神經(jīng)網(wǎng)絡(luò),于1998年被Yann LeCun 等人提出,其成功地將卷積神經(jīng)網(wǎng)絡(luò)應(yīng)用在了手寫(xiě)數(shù)字體識(shí)別的問(wèn)題上,LeNet-5 網(wǎng)絡(luò)由兩個(gè)卷積層、兩個(gè)池化層以及全連接層構(gòu)成[8],此經(jīng)典結(jié)構(gòu)為以后卷積神經(jīng)網(wǎng)絡(luò)的發(fā)展奠定了基礎(chǔ)。AlexNet 是在LeNet-5 之后被Alex 提出的,其網(wǎng)絡(luò)由五個(gè)卷積層和三個(gè)全連接層構(gòu)成,訓(xùn)練時(shí)使用Dropout 隨機(jī)忽略一部分神經(jīng)元,防止模型過(guò)擬合,使用ReLU 作為卷積層的激活函數(shù)以提升訓(xùn)練速度,使用最大池化而不是平均池化,使用兩塊GPU 加速訓(xùn)練[9],獲得了2012年ImageNet[10]競(jìng)賽的冠軍。VGGNet 證明了網(wǎng)絡(luò)深度的增加可提高識(shí)別準(zhǔn)確率,在2.2 小節(jié)對(duì)其進(jìn)行介紹。GoogLeNet是2014年Christian Szegedy 等人提出的一種全新的深度神經(jīng)網(wǎng)絡(luò),它在同一層內(nèi)使用不同尺寸的卷積核,增加了網(wǎng)絡(luò)的寬度,其網(wǎng)絡(luò)由多個(gè)Inception 塊串聯(lián)而成,相比于VGGNet,GoogLeNet 的參數(shù)量更少,準(zhǔn)確率更高,在ImageNet 上的top-5 錯(cuò)誤率為6.67%[11]。ResNet 于2015年由Kaiming He 等人提出,創(chuàng)新性地提出了殘差網(wǎng)絡(luò)結(jié)構(gòu),殘差塊使用了跳躍連接,此結(jié)構(gòu)訓(xùn)練優(yōu)化相對(duì)容易,緩解了網(wǎng)絡(luò)過(guò)深導(dǎo)致的梯度彌散問(wèn)題,通過(guò)學(xué)習(xí)恒等映射,解決模型性能退化的問(wèn)題,以此進(jìn)一步加深網(wǎng)絡(luò)層數(shù),提升識(shí)別準(zhǔn)確率,ResNet 在ImageNet 上的top-5 錯(cuò)誤率僅為3.57%[12]。繼ResNet 之后,DenseNet 被Gao Huang 等人提出,與殘差塊不同的是,DenseBlock中每一個(gè)網(wǎng)絡(luò)層的輸入來(lái)自前面所有層的輸出,這種網(wǎng)絡(luò)結(jié)構(gòu)相比ResNet 具有更少的參數(shù)量,密集的跳躍連接使得模型更易訓(xùn)練,也可以緩解梯度彌散的問(wèn)題,同時(shí)作者發(fā)現(xiàn)此結(jié)構(gòu)具有一定的正則效果,同等參數(shù)量的情況下,DenseNet 的性能優(yōu)于ResNet[13]。
卷積神經(jīng)網(wǎng)絡(luò)發(fā)展迅速,現(xiàn)已廣泛應(yīng)用于計(jì)算機(jī)視覺(jué)、自然語(yǔ)言處理等領(lǐng)域,并取得了顯著成果。本文將DeepDream 分別在RegCNN 和經(jīng)典卷積神經(jīng)網(wǎng)絡(luò)VGG19 上進(jìn)行實(shí)現(xiàn)與改進(jìn)。
圖5:原圖
為了生成藝術(shù)化的圖片,首先提出了在RegCNN(Regular Convolutional Neural Network)網(wǎng)絡(luò)模型上實(shí)現(xiàn)的方法。本文中RegCNN 為作者搭建的卷積神經(jīng)網(wǎng)絡(luò),模型架構(gòu)如圖2 所示。其由4個(gè)標(biāo)準(zhǔn)的“卷積層-BN層-激活層-池化層”塊和3層全連接層組成,為五分類模型。卷積層均采用3×3 的卷積核,步長(zhǎng)為1,使用全零填充保證卷積操作后特征圖的大小不變,4 個(gè)卷積層卷積核的個(gè)數(shù)分別為64、128、256、512;BN 層對(duì)特征圖中的值進(jìn)行批標(biāo)準(zhǔn)化,加速網(wǎng)絡(luò)的收斂[14];激活層均采用ReLU 激活函數(shù)[15],如式(5)所示;池化層為最大池化,尺寸2×2,步長(zhǎng)為2,使用全零填充,將特征圖的大小變?yōu)樵瓉?lái)的一半,減少計(jì)算量,起到數(shù)據(jù)降維的作用,防止過(guò)擬合。卷積層與池化層相結(jié)合,使得特征圖大小不斷減小,數(shù)目不斷增多,以此保證卷積層提取到的特征信息不會(huì)過(guò)少。三個(gè)全連接層的結(jié)點(diǎn)數(shù)為256、128、5,前兩層使用RELU 激活函數(shù),最后一層不使用激活函數(shù),以配合使用交叉熵?fù)p失函數(shù)。
圖2:網(wǎng)絡(luò)結(jié)構(gòu)
VGG19 模型是在AlexNet 之后提出來(lái)的,它在網(wǎng)絡(luò)深度上進(jìn)行改進(jìn),即加大了網(wǎng)絡(luò)深度,相比于AlexNet 網(wǎng)絡(luò),VGG19 具有更強(qiáng)的特征提取能力[16]。VGG 網(wǎng)絡(luò)在ImageNet 數(shù)據(jù)集上的Top5誤差率為7.5%,采用3×3 的卷積核與2×2 的池化核[17],既減少了參數(shù)量,又能保證提取到的信息不減少。
訓(xùn)練RegCNN 模型,本文使用的是Pokemon 數(shù)據(jù)集,數(shù)據(jù)集圖片從網(wǎng)絡(luò)爬取獲得,部分樣本如圖3 所示。數(shù)據(jù)集圖片有5 種類別,共1168 張。數(shù)據(jù)集劃分為訓(xùn)練集、驗(yàn)證集和測(cè)試集,由于此數(shù)據(jù)集較小,為了防止在驗(yàn)證集和測(cè)試集上的準(zhǔn)確率有大幅的波動(dòng),使用60%-20%-20%的比例劃分訓(xùn)練集、驗(yàn)證集和測(cè)試集。
圖3:部分樣本圖
圖片送入模型之前要對(duì)其進(jìn)行預(yù)處理。將圖片大小調(diào)整到(224,224),并對(duì)圖片進(jìn)行隨機(jī)水平旋轉(zhuǎn),這屬于數(shù)據(jù)增強(qiáng)的方法,可在一定程度上增強(qiáng)模型的泛化能力。神經(jīng)網(wǎng)絡(luò)對(duì)0 附近的值比較敏感,因此預(yù)處理還將[0,255]的圖片像素值轉(zhuǎn)換到[-1,1]之間,利于網(wǎng)絡(luò)的收斂。
Reg CNN 訓(xùn)練時(shí)使用Adam 優(yōu)化器,Adam 優(yōu)化器結(jié)合一階動(dòng)量與二階動(dòng)量并修正偏差,在神經(jīng)網(wǎng)絡(luò)訓(xùn)練時(shí)取得的效果是較好的[4],學(xué)習(xí)率初始設(shè)置0.001,使用ReduceLROnPlateau 類實(shí)例讓學(xué)習(xí)率動(dòng)態(tài)變化,當(dāng)驗(yàn)證集準(zhǔn)確率經(jīng)過(guò)10 個(gè)epoch 后沒(méi)有提高,則將學(xué)習(xí)率變?yōu)樵瓉?lái)的1/10。采用early stopping 技術(shù)防止過(guò)擬合,20個(gè)epoch 后驗(yàn)證集準(zhǔn)確率沒(méi)有提升0.001 則停止訓(xùn)練。訓(xùn)練時(shí)同時(shí)使用ModelCheckpoint 類實(shí)例保存最優(yōu)參數(shù),以便下次訓(xùn)練時(shí)不必重新開(kāi)始或直接使用最優(yōu)參數(shù)進(jìn)行預(yù)測(cè)分類。損失函數(shù)使用分類問(wèn)題最常見(jiàn)的交叉熵?fù)p失函數(shù),評(píng)估指標(biāo)為準(zhǔn)確率。如圖4 所示,最終訓(xùn)練完成后,在驗(yàn)證集上的準(zhǔn)確率可達(dá)95.7%,測(cè)試集上的準(zhǔn)確率為93.4%。結(jié)果表明,RegCNN 模型訓(xùn)練的效果是較好的。
圖4:訓(xùn)練集與驗(yàn)證集的準(zhǔn)確率和損失對(duì)比圖
使用訓(xùn)練完畢的RegCNN 模型,可根據(jù)網(wǎng)絡(luò)層名稱或者索引獲取到特定層的輸出,可以選擇任意的層,這里選擇“activation”激活層的輸出。以“activation”激活層的輸出和Reg CNN 模型的輸入構(gòu)建新的模型,命名為dream_model。
此處圖片在傳入dream_model 之前,同樣要進(jìn)行預(yù)處理操作,并且給單張圖片添加一個(gè)batch 維度,后送入dream_model 模型得到輸出。模型的輸出即為上述“activation”激活層的輸出,形狀為H×W×C,對(duì)輸出值取平均后得到標(biāo)量,將此標(biāo)量作為損失值。
損失確定后,即可使用損失對(duì)圖片像素值求導(dǎo),接著對(duì)得到的導(dǎo)數(shù)進(jìn)行標(biāo)準(zhǔn)化處理,更新圖片像素值,具體實(shí)現(xiàn)為像素值加上標(biāo)準(zhǔn)化后的導(dǎo)數(shù)與學(xué)習(xí)率的乘積,每更新一次圖片像素值便進(jìn)行限值操作,使像素值的范圍處于[-1,1]之間。當(dāng)訓(xùn)練完成顯示圖片時(shí),再還原像素值的范圍到[0,255]。
單次訓(xùn)練函數(shù)train_step 定義為對(duì)圖片進(jìn)行一次梯度上升更新像素值。循環(huán)調(diào)用train_step函數(shù)110次,可以看到效果圖如圖6所示,同一張圖片,經(jīng)過(guò)模型的處理,改變了一種藝術(shù)效果。
圖6:全通道生成圖
圖6 是選擇“activation”層的整個(gè)輸出作為優(yōu)化目標(biāo)的,也可以選擇某一個(gè)特定通道的輸出,例如選擇“activation”層的第11個(gè)通道,實(shí)現(xiàn)方法是在損失計(jì)算時(shí)增加一個(gè)切片操作,獲取輸出特征圖的某一通道值而不是整個(gè)特征圖的值。同一層的不同通道生成效果也是不同的。
通過(guò)實(shí)驗(yàn)發(fā)現(xiàn),生成的原始圖片仍存在一些問(wèn)題:圖片有噪聲、分辨率低等,影響了圖片藝術(shù)化的效果,基于此,可利用多尺度變換對(duì)生成圖的質(zhì)量進(jìn)行優(yōu)化改進(jìn)。多尺度變換優(yōu)化指的是將圖片縮放到不同的大小,由小到大,在圖片每一種不同的尺寸上進(jìn)行梯度上升算法的多次迭代,最后再將圖片還原為初始大小。
由于涉及到不同尺寸的圖片輸入,這就要求深度神經(jīng)網(wǎng)絡(luò)中不能包含全連接層,即全卷積網(wǎng)絡(luò),本文對(duì)VGG19 進(jìn)行微調(diào),去掉全連接層得到全卷積神經(jīng)網(wǎng)絡(luò),同時(shí)加載ImageNet 數(shù)據(jù)集上的權(quán)值。首先選擇VGG19 中的“block1_conv1”卷積層作為dream_model 的輸出,首先按照第4 節(jié)所述方法生成原始圖,效果如圖7所示。
圖7:VGG19 初始生成圖
每一種尺寸循環(huán)迭代50 次train_step,接著將處理后的圖片按一定比例放大,同樣進(jìn)行50 次的更新迭代,重復(fù)前述步驟直至圖片大小達(dá)到設(shè)定的最大尺寸,最后再將圖片變換為原始大小進(jìn)行顯示。尺寸優(yōu)化后的效果圖如圖8 所示,可以看到,經(jīng)過(guò)優(yōu)化后的圖片分辨率有一定的提高。
圖8:尺寸變化優(yōu)化
多尺度變換雖提高了生成圖的質(zhì)量,但仍存在邊緣模糊、細(xì)節(jié)處理不到位等問(wèn)題,且如果圖片尺寸很大,傳入神經(jīng)網(wǎng)絡(luò)后計(jì)算時(shí)間和消耗的內(nèi)存也會(huì)很大。解決此問(wèn)題,可以將圖片分割為多個(gè)互不相交的小圖片,將每一個(gè)分割后的小圖片傳入神經(jīng)網(wǎng)絡(luò)計(jì)算梯度。為了防止分割后的小圖片拼接還原時(shí)接縫的出現(xiàn),在分割之前先對(duì)圖片進(jìn)行隨機(jī)移動(dòng),梯度計(jì)算完成后再還原移動(dòng)。
分割計(jì)算梯度時(shí),采用與圖片等大小的初值為零的矩陣gradients 存儲(chǔ)圖片梯度信息,分塊計(jì)算的梯度值累加在gradients 上,之后根據(jù)shift 保存的移動(dòng)量還原移動(dòng),使得gradients 矩陣與原圖片相對(duì)應(yīng),最后再將梯度值標(biāo)準(zhǔn)化。
與多尺度變換的方法相結(jié)合,改變圖片的尺寸,在每一個(gè)不同的尺寸上隨機(jī)移動(dòng)圖片、分割計(jì)算梯度,使用梯度上升法更新像素值。圖9 為最終優(yōu)化生成的圖片,生成圖分辨率、清晰度均有所提高,圖片細(xì)節(jié)上得到了優(yōu)化。
圖9:尺寸變換和分割計(jì)算梯度優(yōu)化
同樣使用VGG19 中的“block1_conv1”卷積層作為dream_model 的輸出,選取不同的圖片進(jìn)行對(duì)比,對(duì)比效果如圖10 所示,通過(guò)對(duì)比發(fā)現(xiàn),經(jīng)過(guò)多尺度變換與圖片分割優(yōu)化產(chǎn)生的藝術(shù)圖,相較于原始生成圖,解決了分辨率低、有噪聲等問(wèn)題,并且在邊緣等細(xì)節(jié)上處理得更加完善。
圖10:對(duì)比圖
本文首先在RegCNN 上進(jìn)行藝術(shù)圖的生成,但由于生成圖有噪聲、分辨率低等問(wèn)題需要對(duì)其進(jìn)行改進(jìn),通過(guò)將圖片隨機(jī)移動(dòng)、分割為小圖片的方法,并與多尺度相結(jié)合,完成了最終的優(yōu)化改進(jìn)。實(shí)驗(yàn)表明,優(yōu)化改進(jìn)提高了生成圖片的分辨率,消除了圖中存在的噪聲,完善了對(duì)邊緣等細(xì)節(jié)的處理。