【问题标题】:Convolutional layer to fully connected layer in MatconvnetMatconvnet 中的卷积层到全连接层
【发布时间】:2018-07-13 21:54:04
【问题描述】:

我试图了解 Matconvnet 中的 MNIST 示例是如何设计的。看起来他们使用的是 LeNet 变体,但由于我之前没有使用过 Matconvnet,所以我很难建立最后一个卷积层和第一个全连接层之间的连接:

net.layers = {} ;
net.layers{end+1} = struct('type', 'conv', ...
                       'weights', {{f*randn(5,5,1,20, 'single'), zeros(1, 20, 'single')}}, ...
                       'stride', 1, ...
                       'pad', 0) ;
net.layers{end+1} = struct('type', 'pool', ...
                       'method', 'max', ...
                       'pool', [2 2], ...
                       'stride', 2, ...
                       'pad', 0) ;
net.layers{end+1} = struct('type', 'conv', ...
                       'weights', {{f*randn(5,5,20,50, 'single'),zeros(1,50,'single')}}, ...
                       'stride', 1, ...
                       'pad', 0) ;
net.layers{end+1} = struct('type', 'pool', ...
                       'method', 'max', ...
                       'pool', [2 2], ...
                       'stride', 2, ...
                       'pad', 0) ;
net.layers{end+1} = struct('type', 'conv', ...
                       'weights', {{f*randn(4,4,50,500, 'single'),  zeros(1,500,'single')}}, ...
                       'stride', 1, ...
                       'pad', 0) ;
net.layers{end+1} = struct('type', 'relu') ;
net.layers{end+1} = struct('type', 'conv', ...
                       'weights', {{f*randn(1,1,500,10, 'single'), zeros(1,10,'single')}}, ...
                       'stride', 1, ...
                       'pad', 0) ;
net.layers{end+1} = struct('type', 'softmaxloss') ;

通常,在 Tensorflow 和 MxNet 等库中,最后一个卷积层会被展平,然后连接到全连接层。在这里,据我了解,他们解释了第一个全连接层,权重{{f*randn(4,4,50,500, 'single'), zeros(1,500,'single')}} 作为全连接层,但该层仍然给出了一个三维激活图作为其结果。我看不出这里的“扁平化”是如何发生的。我需要关于如何在这里建立卷积层全连接层连接的帮助。

【问题讨论】:

    标签: matlab neural-network deep-learning matconvnet


    【解决方案1】:

    据我所知,您应该只用卷积层替换全连接层,该卷积层的过滤器的宽度和高度等于输入的宽度和高度。事实上,在 Matconvnet 中的全连接层之前,您不需要对数据进行扁平化(扁平数据具有1x1xDxN 形状)。在您的情况下,使用与输入空间大小相同的内核,即4x4,将作为 FC 层运行,其输出将为 1 x 1 x 500 x B。(B 代表输入中的第四维)

    更新: 网络架构及其输出可视化here 以理解操作流程。

    【讨论】:

    • 那么,{{f*randn(4,4,50,500, 'single'), zeros(1,500,'single')}} 的含义就有些混乱了。上面的代码处理 MNIST 图像,这些图像大小为 28x28 像素。据我了解,第一层采用 28x28 图像,用 20 个 5x5 内核对其进行过滤。输出是 20 个 28x28 大小的响应图。然后应用 2x2 内核和 2 步幅的最大池化。我们现在有 20 个 14x14 大小的响应图。然后第二个 conv 层将 50 个 5x5 内核应用于其 20 个输入。我们有 50 个 14x14 的响应图。同样是一个最大池,然后我们有 50 个 7x7 响应图。
    • (续){{f*randn(4,4,50,500, 'single'), zeros(1,500,'single')}} 应用于最后一层。 50 个 7x7 输入中的每一个都与 500 个 4x4 内核进行卷积。由于没有应用池化,因此响应维度不会改变,我们有 500 个 7x7 输入用于下一层。然后对于每个输入,它应用 10 个 1x1 过滤器,我们现在剩下 10 个 7x7 输出。我无法想象如何应用 softmax到 7x7 输入。但是我不知道层结构中的这些元组是如何在 matconvnet 中解释的,因为它的文档非常可怕。如果正确的流程不是这样,请纠正我。
    • 你实际上在第一个卷积层犯了一个错误。让我们可视化 U 的网络。
    • 感谢网络图片的澄清。为什么在每个卷积层之后响应图的大小会减少 2?我更习惯于 MxNet 和 Tensorflow 类型的 Conv 层,没想到会有这样的行为。
    • 如你所知,conv 层的空间输出计算为(W-F+2P)/S+1,例如,对于padding=0stride=1 的第一层,我们的输出为:(28-5+0)/1+1=24 ,那么每个池化层的行为方式相同,但配置不同。例如,padding=0stride=2 的第一个池充当:(24-2)/2+1=12
    猜你喜欢
    • 2021-11-17
    • 2017-07-30
    • 1970-01-01
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    相关资源
    最近更新 更多