我在 C++ 中从头开始实现神经网络框架作为学习练习。有一个概念我在任何地方都没有清楚地解释:如何从最后一个“3 维”的卷积/池化/某个层到网络中的第一个全连接层?
许多消息来源说,您应该展平数据。这是否意味着您应该只创建一个大小为的向量(是最后一次转化。层的大小,和是该层中激活图的数量)并以任意顺序将数字一一放入其中?
如果是这种情况,我了解如何进一步传播,但是反向传播如何在这里工作?只是将值以相反的顺序放入激活图中?
我还读到,您可以将这种“展平”作为张量收缩进行。这究竟是如何工作的?
我在 C++ 中从头开始实现神经网络框架作为学习练习。有一个概念我在任何地方都没有清楚地解释:如何从最后一个“3 维”的卷积/池化/某个层到网络中的第一个全连接层?
许多消息来源说,您应该展平数据。这是否意味着您应该只创建一个大小为的向量(是最后一次转化。层的大小,和是该层中激活图的数量)并以任意顺序将数字一一放入其中?
如果是这种情况,我了解如何进一步传播,但是反向传播如何在这里工作?只是将值以相反的顺序放入激活图中?
我还读到,您可以将这种“展平”作为张量收缩进行。这究竟是如何工作的?
是的,你是对的(我认为它很容易在 C++ 中用指针实现)。但是要保持任意顺序,因为完全连接的神经网络是“平移不变的”,即您必须确保像素正在提供给节点或被索引为作为要输入到全连接神经网络的单个数据点,然后从那时起它必须被修复(不能说像素在节点.
反向传播的工作方式和往常一样,很难给出口头解释,所以我给你这张图:
因此,基本上,如果您像这样进行可视化,您就会明白您必须进行微分传播,“扁平化”只是重塑值查找表,它不会改变值影响最终损失的方式,所以如果你对每个值取梯度,然后将其转换回以与以前相同的方式映射,然后像在之前的图层中那样传播渐变。