我目前正在查看Theano的API,
theano.tensor.nnet.conv2d(input, filters, input_shape=None, filter_shape=None, border_mode='valid', subsample=(1, 1), filter_flip=True, image_shape=None, **kwargs)
其中filter_shape
是一个元组,格式为(num_filter, num_channel, height, width)
。我对此感到困惑,因为滤波器的数量不是由在图像上滑动滤波器窗口时的步长决定的吗?怎么能像这样直接指定滤波器数量呢?如果是通过步长参数(如果有的话)计算出来,我觉得这才合理。
另外,我对术语“特征图”也感到困惑,它是每一层的神经元吗?批次大小又如何?它们之间是如何关联的?
回答:
滤波器的数量就是神经元的数量,因为每个神经元对层的输入执行不同的卷积操作(更准确地说,神经元的输入权重形成卷积核)。
特征图是应用滤波器的结果(因此,你有多少个滤波器就有多少个特征图),其大小取决于你的滤波器的窗口/核大小和步长。
以下图片是我找到的最能解释这一概念的图片:请注意,2个不同的卷积滤波器被应用到输入图像上,产生了2个不同的特征图(滤波器的输出)。每个特征图的每个像素都是卷积层的输出。
例如,如果你有28×28的输入图像和一个包含20个7×7滤波器且步长为1的卷积层,你将在该层的输出处得到20个22×22的特征图。请注意,这将以宽度=高度=22和深度=通道数=20的体积形式呈现给下一层。你可以使用相同的表示来训练你的CNN处理RGB图像,例如来自CIFAR10数据集的图像,这些图像将是32x32x3的体积(卷积仅应用于2个空间维度)。
编辑:评论中似乎有一些混淆,我希望能澄清一下。首先,没有神经元。神经元只是神经网络中的一个比喻。因此,“卷积层中有多少个神经元”这个问题无法客观回答,而是取决于你对层执行的计算的看法。在我的看法中,一个滤波器是一个单一的神经元,它扫过图像,为每个位置提供不同的激活。在我看来,一个完整的特征图是由单个神经元/滤波器在多个位置产生的。评论者似乎有另一种看法,这种看法与我的看法同样有效。他们将每个滤波器视为卷积操作的一组权重,每个图像中关注的位置都有一个神经元,所有这些神经元共享由滤波器定义的相同权重集。请注意,这两种看法在功能上(甚至在根本上)是相同的,因为它们使用相同的参数、计算,并产生相同的结果。因此,这不是一个问题。