【问题标题】:Caffe::net reshapeCaffe::net 重塑
【发布时间】:2017-07-26 19:52:01
【问题描述】:

我正在尝试在C++caffe 中实现deepdream(我想在android 中运行它)。 googlenet 需要输入形状 224*224*3。在deepdream 的 ipython 笔记本中显示src.reshape(1,3,h,w)。这是否意味着只有输入 blob 被重塑或通过网络传播?我尝试在C++ 中调用net.Reshape(),结果是:

F0307 01:27:24.529654 31857 inner_product_layer.cpp:64] Check failed: K_ == new_K 
(1024 vs. 319488) Input size incompatible with inner product parameters.

网络不也应该重塑吗?如果不是,那么仅仅重塑输入 blob 意味着什么?我是深度学习的新手。如果这看起来微不足道,请原谅我。

【问题讨论】:

    标签: c++ neural-network deep-learning caffe deep-dream


    【解决方案1】:

    改变输入的形状需要重塑整个网络。唉,有些图层类型不喜欢被重塑。具体来说,“内积”层:内积层的可训练参数数量取决于精确输入形状和输出形状。因此,具有“InnerProduct”层的网络无法重塑。

    您可以使用"net surgery" 示例中描述的方法将内积层转换为等效的卷积层(可以重塑)。

    【讨论】:

    • 我应该只将重塑传播到相关层吗?在googlenet 中,只有最后一层是内部产品层,出于深度梦想的目的,我只需要通过一些初始层。
    • 我看到Net<Dtype>::Reshape()的源代码,它只是循环遍历所有层。出于 deepdream 的目的,我只向前到特定层并从该层向后。所以对我来说这似乎是合理的。你能详细说明为什么不吗?
    • @lnman 你不能重塑网络的一部分,因为改变输入形状会影响所有网络。如果有些层您不打算使用,只需将它们移除:留下它们并且不重塑它们是没有意义的。