我从here读到卷积神经网络。然后我开始玩火炬7。我对CNN的卷积层感到困惑。
从教程
开始 The neurons in a layer will only be connected to a small region of the layer before it, instead of all of the neurons in a fully-connected manner.
For example, suppose that the input volume has size [32x32x3], (e.g. an RGB CIFAR-10 image). If the receptive field is of size 5x5, then each neuron in the Conv Layer will have weights to a [5x5x3] region in the input volume, for a total of 5*5*3 = 75 weights.
如果输入图层是[32x32x3],CONV layer will compute the output of neurons that are connected to local regions in the input, each computing a dot product between their weights and the region they are connected to in the input volume. This may result in volume such as [32x32x12].
我开始玩CONV图层可能会对图像做什么。我在火炬7中做到了。这是我的实现,
require 'image'
require 'nn'
i = image.lena()
model = nn.Sequential()
model:add(nn.SpatialConvolutionMM(3, 10, 5, 5)) --depth = 3, #output layer = 10, filter = 5x5
res = model:forward(i)
itorch.image(res)
print(#i)
print(#res)
3
512
512
[torch.LongStorage of size 3]
10
508
508
[torch.LongStorage of size 3]
现在让我们看看CNN的结构
所以,我的问题是,
卷积是这样完成的 - 让我们说我们拍摄一张32x32x3的图像。并且有5x5过滤器。然后5x5滤镜将通过整个32x32图像并产生复杂的图像?好吧,所以在整个图像上滑动5x5滤镜,我们得到一个图像,如果有10个输出图层,我们得到10个图像(从输出中看到)。我们如何得到这些? (如果需要,请参见图片澄清)
转化层中的神经元数量是多少?是输出层数吗?在上面的代码I model:add(nn.SpatialConvolutionMM(3, 10, 5, 5))
中。是10吗? (输出层数量?)
如果是这样,第2点没有任何意义。根据那个If the receptive field is of size 5x5, then each neuron in the Conv Layer will have weights to a [5x5x3] region in the input volume, for a total of 5*5*3 = 75 weights.
那么这里的重量是多少?我对此非常困惑。在火炬中定义的模型中,没有重量。那么重量如何在这里发挥作用呢?
有人可以解释发生了什么吗?
答案 0 :(得分:9)
卷积是这样完成的 - 让我们说我们拍摄一张32x32x3的图像。并且有5x5过滤器。那么5x5滤镜将通过整个32x32图像并产生复杂的图像?
对于32x32x3输入图像,5x5滤波器将迭代每个像素,并且对于每个像素,查看5x5邻域。该邻域包含5 * 5 * 3 = 75个值。下面是单个输入通道上3x3滤波器的示例图像,即一个邻域为3 * 3 * 1值(source)的滤波器。
对于每个单独的邻居,过滤器将具有一个参数(也称为重量),因此具有75个参数。然后计算一个单个输出值(像素x,y处的值),它读取这些邻居值,将每个值与相应的参数/权重相乘,并在最后将它们相加(参见discrete convolution)。在训练期间必须学习最佳权重。
因此,一个滤镜将迭代图像并逐个像素地生成新输出。如果您有多个过滤器(即SpatialConvolutionMM
中的第二个参数是> 1),您将获得多个输出("飞机"在火炬中)。
好的,所以在整个图像上滑动5x5滤镜,我们得到一个图像,如果有10个输出图层,我们得到10个图像(从输出中看到)。我们如何得到这些? (如果需要,请参见图片澄清)
每个输出平面都由其自己的过滤器生成。每个过滤器都有自己的参数(在您的示例中为5 * 5 * 3个参数)。多个过滤器的过程与一个过滤器完全相同。
转化层中的神经元数量是多少?是输出层数吗?在上面的代码I中,模型:add(nn.SpatialConvolutionMM(3,10,5,5))。是10吗? (输出层数量?)
你应该称它们为权重或参数,"神经元"并不适合卷积层。如上所述,参数的数量在您的示例中为每个过滤器5 * 5 * 3 = 75。由于您有10个过滤器("输出平面"),您总共有750个参数。如果您使用model:add(nn.SpatialConvolutionMM(10, 10, 5, 5))
向网络添加第二层,则每个过滤器将额外增加5 * 5 * 10 = 250个参数,总计250 * 10 = 2500。请注意该数字如何快速增长(在256个输入平面上运行的一个层中的512个滤波器/输出平面并不罕见)。
如需进一步阅读,请查看http://neuralnetworksanddeeplearning.com/chap6.html。向下滚动到章节"介绍卷积网络"。在"本地接受领域"有可视化可能会帮助您了解过滤器的作用(上面显示了一个)。
答案 1 :(得分:1)
声明: 我在下面提供的信息主要摘自以下文件: Cats Visual Cortex中的信息处理 基于梯度的学习在文献识别中的应用 Neocortigan Cat的视觉皮层中的接收字段
卷积是这样完成的 - 让我们说我们拍摄一张32x32x3的图像。并且有5x5过滤器。那么5x5滤镜将通过整个32x32图像并产生复杂的图像?
是的,5x5滤镜将通过整个图像,创建一个28x28 RGB图像。所谓的"特征图中的每个单元"接收连接到输入图像中5x5区域的5x5x3输入(此5x5邻域称为单元' s"本地接收字段")。特征映射中的相邻(相邻)单元的接收字段以前一层中的相邻(相邻)单元为中心。
好的,所以在整个图像上滑动5x5滤镜,我们得到一个图像,如果有10个输出图层,我们得到10个图像(从输出中看到)。我们如何得到这些? (如果需要,请参见图片澄清)
请注意,要素图层上的单位共享同一组权重,并对图像的不同部分执行相同的操作。(即如果移动原始图像,则要素图上的输出也会移动相同的量)。也就是说,对于每个特征映射,您将每个单元的权重集约束为相同;你只有5x5x3未知权重。
由于这种约束,并且由于我们想要从图像中提取尽可能多的信息,我们添加更多图层,特征图:具有多个特征图帮助我们在每个像素处提取多个特征。
不幸的是我对Torch7并不熟悉。