在卷积神经网络(CNN)中,如果输出是一个一维向量(例如,预对数几率层),如何仅使用卷积将其维度降低到指定大小?
如何推导出过滤器尺寸/感受野来完成这一任务?
我知道可以通过在网络末端堆叠一个全连接层来实现这一点,但这看起来并不那么优雅。
回答:
使用最初在全卷积网络论文中提出的想法,后来在Inception网络中广泛使用,即应用卷积进行维度降低。
诀窍是使用较少数量的过滤器进行单位filter
的卷积(对于2-D卷积是1x1
,对于3-D卷积是1x1x1
,依此类推)。如今,这个技巧在非常深的卷积网络中被广泛应用以节省计算,因此你也可以在卷积层之前使用它。在你的问题中,输出张量是一维的(除了批次大小),所以使用1
的内核大小进行1-D卷积。
以下是tensorflow中的代码,将张量长度从64减少到32:
# `x` shape: [batch, length] = [?, 64]
layer = tf.expand_dims(x, 2) # reshape to: [batch, channels, 1] = [?, 64, 1]
output = tf.layers.conv1d(layer, filters=32, kernel_size=1, strides=1, padding='valid', data_format='channels_first') # new shape: [batch, filters, 1] = [?, 32, 1]
output = tf.squeeze(output) # reshape to: [batch, length] = [?, 32]