基於Keras的關聯神經網路CorrNet綜合指南
選自TowardsDataScience
作者:Md Ashiqur Rahman機器之心編譯參與:胡曦月、一鳴
利用多模態資料提升機器學習表現是一個值得關注的問題。本教程介紹了一種可同時影像和音訊資料表徵的網路——CorrNet,並提供了相應的實現程式碼。
人與動物都有這五種共同的感官:視覺、聽覺、味覺、嗅覺和觸覺。除此之外我們還有其它諸如平衡感、加速感和時間感等等。人類大腦無時不刻的在處理所有來自這些感官源的資訊,這些感官中的每一個都會影響我們的決策過程。
任何對話中,脣部運動、面部表情和聲帶發聲同時有助於充分理解說話者所說的詞彙的意義。我們甚至可以在無聲狀況下單憑觀察脣部運動來理解詞彙,此時這一視覺資訊不僅僅是補充資訊,而更加是一種必要資訊了。
這一現象在「麥格克效應(McGurk effect)」的一個例子中首次提出:當一個視覺可見的音節/ga/在配音時發作了/ba/,多數人聽到的音節是卻是/da/。想要使機器學習模型達到人類這樣的效能,就需要利用各種資料來源來進行訓練。
在機器學習中,這些來自不同異構源的資料型別稱為多模態資料,如語音識別中的音訊和視覺資訊。由於多模態資料可能由不同維度和型別的資料構成,往往難以在訓練中直接使用。因此許多研究致力於解決多模態資料的通用表示。
學習多檢視資料的通用表示有助於若干下游應用,如對視訊及其對應的音訊的通用表示進行學習,相比於單純使用音訊而言可以生成更加精確的字幕。那麼,怎樣學習這種通用表示呢?
關聯神經網路(CorrNet)
CorrNet 示意圖。嘗試學習兩種資料檢視的共同表示,並且從該編碼表示重構兩種檢視。 相關神經網路(CorrNet)是學習通用表示的一種方法。它的架構與傳統的單檢視深度自動編碼器幾乎相同。但它為每種資料模態都構建了編解碼對。
模型架構 考慮一個雙檢視輸入,Z = [Ia, Iv],其中,Ia 和 Iv 分別是兩種不同的資料檢視,如音訊和視訊。下圖所示是在該資料輸入時 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 之間的相關性。
最終得到的損失函式為:
此處,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,並以此來生成資料集中丟失的音訊和視訊。
原文連結:https://towardsdatascience.com/a-comprehensive-guide-to-correlational-neural-network-with-keras-3f7886028e4a
https://www.toutiao.com/i6724468759366468100/
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946223/viewspace-2654713/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 清華、上交等聯合發表:關於“分片線性神經網路”最新綜述!神經網路
- keras構建神經網路Keras神經網路
- 關於神經網路的討論神經網路
- Keras結合Keras後端搭建個性化神經網路模型(不用原生Tensorflow)Keras後端神經網路模型
- 【Python】keras神經網路識別mnistPythonKeras神經網路
- TF2.keras 實現基於卷積神經網路的影象分類模型TF2Keras卷積神經網路模型
- TF2.keras 實現基於卷積神經網路的影像分類模型TF2Keras卷積神經網路模型
- 基於神經網路的OCR識別神經網路
- RNN神經網路模型綜述RNN神經網路模型
- 想入門設計卷積神經網路?這是一份綜合設計指南卷積神經網路
- 基於numpy的前饋神經網路(feedforwardneuralnetwork)神經網路Forward
- 【Python】keras卷積神經網路識別mnistPythonKeras卷積神經網路
- Keras上實現卷積神經網路CNNKeras卷積神經網路CNN
- Tensorflow系列專題(四):神經網路篇之前饋神經網路綜述神經網路
- 基於深度神經網路的人臉識別相關問題神經網路
- Python TensorFlow深度神經網路迴歸:keras.SequentialPython神經網路Keras
- [譯] 使用 Python 和 Keras 實現卷積神經網路PythonKeras卷積神經網路
- [譯] Keras 速查表:使用 Python 構建神經網路KerasPython神經網路
- 圖神經網路綜述:模型與應用神經網路模型
- 關於神經網路:你需要知道這些神經網路
- 基於圖神經網路的動態物化檢視管理神經網路
- 使用圖神經網路做基於會話的推薦神經網路會話
- 論文解讀 | 基於神經網路的知識推理神經網路
- 基於神經網路的Alpha Fold改變了生物世界神經網路
- 3、基於Python建立任意層數的深度神經網路Python神經網路
- EAS:基於網路轉換的神經網路結構搜尋 | AAAI 2018神經網路AI
- 神經網路基礎及Keras入門神經網路Keras
- 用Keras框架構建一個簡單的卷積神經網路!Keras框架架構卷積神經網路
- Keras深度神經框架Keras框架
- 關於 RNN 迴圈神經網路的反向傳播求導RNN神經網路反向傳播求導
- 基於BP神經網路的金融序列預測matlab模擬神經網路Matlab
- 神經網路中的Heloo,World,基於MINST資料集的LeNet神經網路
- NeurIPS 2024 | 標籤噪聲下圖神經網路有了首個綜合基準庫,還開源神經網路
- 教你使用Keras on Google Colab(免費GPU)微調深度神經網路KerasGoGPU神經網路
- NLP任務中可參考的神經網路架構(Keras+TensorFlow)神經網路架構Keras
- 神經網路:numpy實現神經網路框架神經網路框架
- 卷積神經網路表徵視覺化研究綜述卷積神經網路視覺化
- 神經網路 | 基於MATLAB 深度學習工具實現簡單的數字分類問題(卷積神經網路)神經網路Matlab深度學習卷積