CNN卷积神经网络是怎么衔接到全连接dense层的

  • 输入的维度确定
  • 2维卷积中采用和feature maps尺寸一样的卷积核
  • 1维卷积在输入数据维度确定时的一种方法
  • 输入的维度不确定
  • 1维卷积在输入数据时间维度不确定时的一种方法
  • 2维卷积在输入数据时间维度不确定时的一种方法
  • 其他方法
  • GAP方法


输入的维度确定

一般CNN处理图像的时候输入图像的两个维度都是确定的,这是典型的处理方式

2维卷积中采用和feature maps尺寸一样的卷积核

此图文摘自博客,该博客也详细的介绍了卷积神经网络


cnn的输入通道与输出_卷积

1维卷积在输入数据维度确定时的一种方法

该文章介绍来自
https://blog.goodaudience.com/introduction-to-1d-convolutional-neural-networks-in-keras-for-time-sequences-3a7ff801a2cf 该文章也对一维卷积有比较好的诠释,图中最后完成pooling后,数据只剩下一维队列,可以直接与dense层衔接。
cnn的输入通道与输出_cnn的输入通道与输出_02

输入的维度不确定

用CNN处理时间序列的时候,如语音的频谱,feature是确定的,但是time是动态的,这种情况的卷积方式和全连接方式也有不一样的地方。

1维卷积在输入数据时间维度不确定时的一种方法

下图是自己画的示意图,丑了点。输入数据有三个维度,一维是时间维度,一维是batch size,还有一维是feature dimension,语音中经常采用mfcc的39维数据来表征,这里就假设39维。假设只经过一层卷积和池化。为了方便起见,设batch size=1。从图中可以看出经过1维卷积核的处理,数据并没有像2维卷积分层(卷积完仍然是一维),但原来的维度被扩展到卷积核的深度(128)。1维池化也只是在时间轴上对维度产生影响,128维度没有变化。可以在keras的summary看到

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
speechdata (InputLayer)      [(None, None, 39)]        0         
_________________________________________________________________
reshape (Reshape)            (None, None, 39)          0         
_________________________________________________________________
conv1d (Conv1D)              (None, None, 128)         75008     
_________________________________________________________________
batch_normalization (BatchNo (None, None, 128)         512       
_________________________________________________________________
max_pooling1d (MaxPooling1D) (None, None, 128)         0         
_________________________________________________________________

cnn的输入通道与输出_全连接_03


输出到dense层,将每个时刻的128维数据做dense(softmax)生成输出概率。

2维卷积在输入数据时间维度不确定时的一种方法

下图没有 画 pooling,但pooling会影响二位卷积后每层数据的维度,到最后与dense衔接的时候,数据量是 last-cnn-depth * input-dimension/(poolingsize * stride)。最简单的办法是数据整个型,最后平铺的尺寸是feature_dim * feature_num。平铺完毕,就可以做全连接层了。

cnn的输入通道与输出_数据_04

值得注意的是这种卷积是按照时间切片进行的,直接通过reshape方法平铺,然后进行全连接映射,或者再加一层一维卷积,避免平铺带来的feature相关性的局限。但如果进入一维卷积前的feature维度太大,算法引入的参数就会更多,参数量是number of kernel depth 倍的全连接层的参数个数。

其他方法

GAP方法

另外在network· in network还提出了一种叫做Global average Pooling的方法,论文提出了将最后的feature直接平均池化平铺,输出softmax,这样就完全避免了全连接层。

cnn的输入通道与输出_数据_05


在网络又找了一个彩图,更加直观的说明了这种池化和全连接to softmax的过程。

cnn的输入通道与输出_数据_06


在时间序列处理的时候,gap方法可能需要变化一下,将每个feature 一个时间切片(feature number)做一个average pooling,这样就迅速的降低了数据维度,使得平铺层的维度和feature的维度一致了。