基於Keras的關聯神經網路CorrNet綜合指南

AIBigbull2050發表於2019-08-23

選自TowardsDataScience

作者:Md Ashiqur Rahman機器之心編譯參與:胡曦月、一鳴

利用多模態資料提升機器學習表現是一個值得關注的問題。本教程介紹了一種可同時影像和音訊資料表徵的網路——CorrNet,並提供了相應的實現程式碼。

人與動物都有這五種共同的感官:視覺、聽覺、味覺、嗅覺和觸覺。除此之外我們還有其它諸如平衡感、加速感和時間感等等。人類大腦無時不刻的在處理所有來自這些感官源的資訊,這些感官中的每一個都會影響我們的決策過程。

任何對話中,唇部運動、面部表情和聲帶發聲同時有助於充分理解說話者所說的詞彙的意義。我們甚至可以在無聲狀況下單憑觀察唇部運動來理解詞彙,此時這一視覺資訊不僅僅是補充資訊,而更加是一種必要資訊了。

這一現象在「麥格克效應(McGurk effect)」的一個例子中首次提出:當一個視覺可見的音節/ga/在配音時發作了/ba/,多數人聽到的音節是卻是/da/。想要使機器學習模型達到人類這樣的效能,就需要利用各種資料來源來進行訓練。

在機器學習中,這些來自不同異構源的資料型別稱為多模態資料,如語音識別中的音訊和視覺資訊。由於多模態資料可能由不同維度和型別的資料構成,往往難以在訓練中直接使用。因此許多研究致力於解決多模態資料的通用表示。

學習多檢視資料的通用表示有助於若干下游應用,如對影片及其對應的音訊的通用表示進行學習,相比於單純使用音訊而言可以生成更加精確的字幕。那麼,怎樣學習這種通用表示呢?

關聯神經網路(CorrNet)

基於Keras的關聯神經網路CorrNet綜合指南

CorrNet 示意圖。嘗試學習兩種資料檢視的共同表示,並且從該編碼表示重構兩種檢視。 相關神經網路(CorrNet)是學習通用表示的一種方法。它的架構與傳統的單檢視深度自動編碼器幾乎相同。但它為每種資料模態都構建了編解碼對。

模型架構 考慮一個雙檢視輸入,Z = [Ia, Iv],其中,Ia 和 Iv 分別是兩種不同的資料檢視,如音訊和影片。下圖所示是在該資料輸入時 CorrNet 的一個簡單架構。

基於Keras的關聯神經網路CorrNet綜合指南

在雙模態資料 Z = [Ia, Iv] 的 CorrNet 示例中,Ia 和 Iv 是兩個不同檢視的資料(如音訊和影片),其中編碼器和解碼器都是單層的。H 為編碼表示,Ha= f( Wa.Ia+b) 為 Ia 的編碼表示,f() 是任意非線性函式(如 sigmoid、tanh 等)。Hv = f( Wa.Ia+b) 同上。雙模態資料Z的通用表示為:H = f( Wa.Ia + Wv.Iv + b)。

在解碼部分,模型試圖從通用表示*H*來重建輸入,可以用以下兩個公式表示:I』a = g(W』a.H+b』),I』v = g(W』vH+b』)。

其中 g() 為任意啟用函式,I』a **和 I』v 是經過重建得到的輸入。  訓練

在訓練階段,可以基於三種損失來計算梯度:

  • 最小化自重建誤差,也就是將 Ia 到 Ia 和 Iv 到 Iv 重建的誤差最小化。
  • 最小化交叉重建誤差,也就是將 Iv 到 Ia 和 Ia 到 Iv 重建的誤差最小化。
  • 最大化兩個檢視的隱藏表示之間的相關性,也就是最大化 Ha 和 Hv 之間的相關性。

最終得到的損失函式為:

基於Keras的關聯神經網路CorrNet綜合指南

此處,Lr() 表示重建損失,可以選擇均方誤差(MSE)或者平均絕對誤差(MAE)。目標就是最小化該損失函式。並且我們想要提升相關性時,可以將它從損失中減去,也就是說,相關性越大,損失越小。

CorrNet 實現 實現可以分為三個部分:建模、設定損失函式和訓練。

建模

在建模階段需要建立自動編碼架構。首先,匯入所有需要的包。

from *keras *import *Model*

from *keras.layers import Input,Dense,concatenate,Add*
from *keras *import backend as *K,activationsfrom tensorflow*
import *Tensor *as Tfrom* keras.engine.topology*
import *Layer*
import numpy as *np*

然後建立 CorrNet 架構。簡單起見,架構中只包含單層編碼器和解碼器。

class *ZeroPadding*(Layer):

def *__init__*(self, **kwargs):
super(ZeroPadding, self).__init__(**kwargs)
def *call*(self, x, mask=None):
return K.zeros_like(x)
def *get_output_shape_for*(self, input_shape):
return input_shape
#inputDimx,inputDimy are the dimentions two input modalities
inpx = *Input*(*shape*=(inputDimx,))
inpy = *Input*(*shape*=(inputDimx,))
*#Encoder*
hl = *Dense*(hdim_deep,*activation*='relu')(inpx)
hr = *Dense*(hdim_deep,*activation*='relu')(inpy)
h = Add()([hl,hr])
*#Common representation/Encoded representation
**#decoder
*recx = *Dense*(inputDimx,activation='relu')(h)
recy = *Dense*(inputDimy,activation='relu')(h)
*CorrNet* = *Model*( [inpx,inpy],[recx,recy,h])
*CorrNet*.summary()
'''we have to create a separate model for training this *CorrNet*
As during training we have to take gradient from 3 different loss function and which can not be obtained from signle input.If you look closely to the loss function,
we will see it has different input parameter'''
[recx0,recy0,h1] = *CorrNet*( [inpx, inpy])
[recx1,recy1,h1] = *CorrNet*( [inpx, ZeroPadding()(inpy)])
[recx2,recy2,h2] = *CorrNet*( [ZeroPadding()(inpx), inpy ])
H= *concatenate*([h1,h2])
*model* = Model( [inpx,inpy],[recx0,recx1,recx2,recy0,recy1,recy2,H])

現在來為模型寫相關損失函式。

編譯和訓練

現在對模型進行編譯和訓練

model.*compile*(*loss*=[square_loss,square_loss,square_loss, square_loss,square_loss,square_loss,correlationLoss],*optimizer*="adam")

model.*summary*()
'''
Suppose you have already prepared your data and kept one moadlity data in Ia(e.g. Audio) and another in Iv( e.g. Video).To be used by this model Audios and videos must be converted into 1D tensor.
'''
model.*fit*([Ia,Iv],[Ia,Ia,Ia,Iv,Iv,Iv,np.ones((Ia.shape[0],Ia.shape[1]))],nb_epoch=100)
'''
*np.ones((Ia.shape[0],Ia.shape[1]))* is fake tensor that will be passed to *correlationLoss *function but will have no use
using this model we can generate Ia to Iv.For example, from video Iv we can generate corresponding audio Ia
np.zeros(Ia.shape) gives tensors of 0 of dimestions same as output tensor *audio*
'''
*audio*,_,_ = *CorrNet.*predict([np.zeros(Ia.shape),Iv])

經過訓練,模型所學習到的通用表示可以用於不同的預測任務。比如透過 CorrNet 學習到的通用表示可以用於跨語言文件分類或音譯等價檢測。許多研究都表明使用通用表示可以提高效能。

此外,它還可以用於資料生成。比如,某個資料集中包含 10000 個音訊片段及其對應的影片、5000 個丟失對應影片的音訊片段以及 5000 個丟失對應音訊的影片。此時,我們就可以用那 10000 個包含對應影片的音訊片段來訓練一個 CorrNet,並以此來生成資料集中丟失的音訊和影片。

原文連結:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946223/viewspace-2654713/,如需轉載,請註明出處,否則將追究法律責任。

相關文章