CNN
nnet/nnet-convolutional-component.h
假設CNN相關參數如下
###輸入相關參數
num_splice=3 #語音數據的左右context,此處左右一幀
path_stride=5 #一幀特徵的維度
input_dim=path_stride*num_splice=15 #輸入特徵的維度
###濾波器相關參數
num_filters=2 #濾波器個數
patch_dim=2 #濾波器在一幀特徵上面的維度
filter_dim=num_splice*patch_dim=6 #濾波器在3幀特徵上的維度
patch_step=1 #patch移動的步長
###輸出相關參數
num_patch=1 + (patch_stride - patch_dim) / patch_step=4 #每個濾波器在特徵上面做卷積的次數(即輸出個數)
output_dim=num_patch*num_filters=8 #cnn的輸出維度
###多幀並行的參數
frame_num=2 #一次計算特徵的個數
PropagateFnc
首先將特徵按照splice重新組織成vectorized_feature_patches,然後跟對應的filters做卷積
BackpropagateFnc
計算對輸入的梯度(向後繼續傳播)
Update
計算對參數的梯度(用於參數更新)
Max-Pooling
在後向傳遞梯度的時候只在最大值對應的邊傳遞,其他值的梯度爲0.