我试图了解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')}}
作为完全连接的层,但是这个层仍然给出了三维激活图作为其结果。我不知道这里会发生“扁平化”。我需要有关如何在此处建立卷积层完全连接层连接的帮助。
答案 0 :(得分:1)
据我所知,您应该只使用卷积层替换完全连接的层,卷积层的宽度和高度等于输入的宽度和高度。事实上,您不需要在Matconvnet中完全连接的图层之前展平数据(平面数据的形状为1x1xDxN
)。在您的情况下,使用具有相同空间大小的内核(即4x4
)的内核将作为FC层运行,其输出将为1 x 1 x 500 x B.(B代表第四个维度输入)
<强>更新强> 网络的体系结构及其输出可视化here以理解操作流程。