我从here读到了卷积神经网络 . 然后我开始玩火炬7 . 我对CNN的卷积层感到困惑 .
从教程中,
1
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.
2
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.
3
如果输入层是[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)
output
3
512
512
[torch.LongStorage of size 3]
10
508
508
[torch.LongStorage of size 3]
现在让我们看看CNN的结构
所以,我的问题是,
问题1
卷积是这样完成的 - 让我们说我们拍摄一张32x32x3的图像 . 并且有5x5过滤器 . 然后5x5滤镜将通过整个32x32图像并产生复杂的图像?好的,所以在整个图像上滑动5x5滤镜,我们得到一个图像,如果有10个输出图层,我们得到10个图像(从输出中看到) . 我们如何得到这些? (如果需要,请参见图片以获得澄清)
问题2
conv层中神经元的数量是多少?是输出层数吗?在我上面写的代码中, 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.
那么这里的重量是多少?我对此非常困惑 . 在火炬中定义的模型中,没有重量 . 那么重量如何在这里发挥作用?
有人可以解释发生了什么吗?
2 回答
对于32x32x3输入图像,5x5滤波器将迭代每个像素,并且对于每个像素,查看5x5邻域 . 该邻域包含5 * 5 * 3 = 75个值 . 下面是单个输入通道上3x3滤波器的示例图像,即一个具有3 * 3 * 1值邻域(source)的滤波器 .
对于每个单独的邻居,过滤器将具有一个参数(也称为重量),因此具有75个参数 . 然后,为了计算单个输出值(像素x,y处的值),它读取这些邻居值,将每个值与相应的参数/权重相乘,并在最后将这些值相加(参见discrete convolution) . 在训练期间必须学习最佳权重 .
因此,一个滤镜将迭代图像并逐个像素地生成新输出 . 如果您有多个过滤器(即
SpatialConvolutionMM
中的第二个参数> 1),您将获得多个输出(火炬中的"planes") .每个输出平面由其自己的过滤器生成 . 每个过滤器都有自己的参数(在您的示例中为5 * 5 * 3个参数) . 多个过滤器的过程与一个过滤器的过程完全相同 .
你应该称它们为权重或参数,"neurons"不适合卷积层 . 如上所述,参数的数量在您的示例中为每个过滤器5 * 5 * 3 = 75 . 由于您有10个过滤器("output planes"),因此总共有750个参数 . 如果使用
model:add(nn.SpatialConvolutionMM(10, 10, 5, 5))
向网络添加第二层,则每个过滤器将额外添加5 * 5 * 10 = 250个参数,总计250 * 10 = 2500 . 注意这个数字如何快速增长(在256个输入平面上运行的一个层中的512个滤波器/输出平面并不罕见) .如需进一步阅读,请查看http://neuralnetworksanddeeplearning.com/chap6.html . 向下滚动到"Introducing convolutional networks"章节 . 在"Local receptive fields"下,有可视化可能会帮助您了解过滤器的作用(上面显示了一个) .
免责声明:我在下面提供的信息大多是从以下论文中提取的:Cats中的信息处理基于视觉皮层的基于梯度的学习应用于文档识别猫的视觉皮层中的Neocortigan接收领域
是的,5x5滤镜将通过整个图像,创建一个28x28 RGB图像 . 每个单位所谓的“特征映射”接收连接到输入图像中5x5区域的5x5x3输入(这个5x5邻域称为单元的“本地接收场”) . 特征映射中的相邻(相邻)单元的接收字段以前一层中的相邻(相邻)单元为中心 .
请注意,要素图层上的单位共享同一组权重,并对图像的不同部分执行相同的操作 . (即如果移动原始图像,则要素图上的输出也将移动相同的量) . 也就是说,对于每个特征映射,您将每个单元的权重集约束为相同;你只有5x5x3未知权重 .
由于这种约束,并且由于我们想要从图像中提取尽可能多的信息,我们添加更多图层,特征图:具有多个特征图帮助我们在每个像素处提取多个特征 .
不幸的是我对Torch7并不熟悉 .