【问题标题】:ND Blob support caffe: legacy accessors fail for blobs > 4 axesND Blob 支持 caffe:旧版访问器对于 blob > 4 轴失败
【发布时间】:2016-12-02 15:00:01
【问题描述】:

执行.prototxt 时出现错误,我完全不知道为什么会出现错误:

layer {
    name: "conv"
    type: "Convolution"
    bottom: "image"
    top: "conv"
    convolution_param {
        num_output: 2
        kernel_size: 5
        pad: 2
        stride: 1
        weight_filler {
            type: "xavier"
        }
        bias_filler {
            type: "constant"
            value: 0
        }
    }
}

这是错误输出。正如我在最新的caffe-master-branch 中看到的,应该可以使用5D-Blobs

I1202 14:54:58.617269  2393 hdf5_data_layer.cpp:93] Number of HDF5 files: 9
I1202 14:54:58.631134  2393 hdf5.cpp:35] Datatype class: H5T_INTEGER
I1202 14:54:59.159739  2393 net.cpp:150] Setting up train-data
I1202 14:54:59.159760  2393 net.cpp:157] Top shape: 1 1 1 128 128 (16384)
I1202 14:54:59.159765  2393 net.cpp:157] Top shape: 1 1 8 128 128 (131072)
I1202 14:54:59.159766  2393 net.cpp:165] Memory required for data: 589824
I1202 14:54:59.159773  2393 layer_factory.hpp:77] Creating layer down_level_0_conv
I1202 14:54:59.159790  2393 net.cpp:100] Creating Layer down_level_0_conv
I1202 14:54:59.159795  2393 net.cpp:434] down_level_0_conv <- image
I1202 14:54:59.159804  2393 net.cpp:408] down_level_0_conv -> down_level_0_conv
F1202 14:54:59.159915  2393 blob.hpp:140] Check failed: num_axes() <= 4 (5 vs. 4) Cannot use legacy accessors on Blobs with > 4 axes.

我需要去某个分店吗?我刚刚再次从caffe-master-branch 拉出以确保它是最新版本。然后我做了一个 make clean make all 命令,它仍然不起作用。

【问题讨论】:

    标签: machine-learning neural-network deep-learning caffe conv-neural-network


    【解决方案1】:

    AFAIK,此错误来自"Xavier" 填充器:此填充器计算输入和输出通道之间的比率。如果你用不同的填充物替换它,你应该可以使用 ND blob。

    【讨论】:

    • 看来@thigi 可以选择GaussianFiller
    【解决方案2】:

    作为Shai's answer的补充,为了兼容ND ConvolutionInnerProduct层,“Xavier”填充code

    virtual void Fill(Blob<Dtype>* blob) {
    ...
    int fan_in = blob->count() / blob->num();
    int fan_out = blob->count() / blob->channels();
    Dtype n = fan_in;  // default to fan_in
    ...
    Dtype scale = sqrt(Dtype(3) / n);
    caffe_rng_uniform<Dtype>(blob->count(), -scale, scale,
            blob->mutable_cpu_data());
    CHECK_EQ(this->filler_param_.sparse(), -1)
             << "Sparsity not supported by this Filler.";
    }
    

    在caffe中,应该更像这样:

    ...
    int fan_in = blob->count() / blob->shape(0);
    int fan_out = blob->num_axis() == 2 ? blob->shape(0) : blob->count() / blob->shape(1);
    ...//original stuff 
    

    这个小改动也应该能让你的 prototxt 工作。

    【讨论】:

    • @Shai 好的,我试试看。谢谢。
    【解决方案3】:

    当我删除line 140 blob.hpp 中的检查时,它确实有效。这是解决问题的一种方法,但不是最好的方法。

    (但这不是正确的解决方案。还有别的吗?)

    【讨论】:

      猜你喜欢
      • 2016-03-27
      • 2021-06-22
      • 1970-01-01
      • 1970-01-01
      • 2018-10-07
      • 2016-07-07
      • 2014-12-23
      • 1970-01-01
      相关资源
      最近更新 更多