【问题标题】:caffe: fully connected layer transform to 3D datacaffe:全连接层转换为 3D 数据
【发布时间】:2017-03-29 04:13:06
【问题描述】:

我有一个fully connected layer 和一个SoftmaxWithLoss 层。我想要做的是以3D 而不是1D 的形式检索数据。 我的输入 ground_truth 图像是 3x128x128,我的最后一层看起来像这样:

layer {
  name: "fc1"
  type: "InnerProduct"
  bottom: "conv"
  top: "fc1"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  inner_product_param {
    num_output: 49152 # 128 x 128 x 3
     ...
  }
}

layer {
  name: "result"
  type: "SoftmaxWithLoss"
  bottom: "fc1"
  bottom: "label"
  top: "result"
}

在这里我收到以下错误:

softmax_loss_layer.cpp:47] 检查失败:outer_num_ * inner_num_ == bottom[1]->count() (1 vs. 49152) 标签数必须与 预测;例如,如果 softmax 轴 == 1 且预测形状为 (N, C, H, W),标签计数(标签数量)必须为NHW,带整数 {0, 1, ..., C-1} 中的值。

这里有什么问题?我的标签是 3x128x128,我的 output_num 是 49152 = 3 x 128 x128??

我的后续问题是如何将这些 1D 数据转换为 3D 数据:

我正在为 caffe 使用 python API。我知道我“只是”必须将 1D 矢量重塑为 3D 矢量。但是我怎么知道在哪里“重塑”,因为 1D 矢量中的哪个位置对应于 3D 矢量中的位置。谁能帮我?

提前致谢!

【问题讨论】:

    标签: python deep-learning caffe pycaffe


    【解决方案1】:

    由于您正在寻找逐像素分类,并且标签是地面实况图像,因此最好使用Eucledian loss 层而不是Softmax with loss。 Softmax 通常用于多类分类。在您的情况下也可以使用 softmax,但要更改标签的格式等。

    在执行 Eucledian 损失时,caffe 会将标签视为一维数组,同样适用于预测输出。 3D 到 1D 的转换将具有 Width-major 格式,然后是 Height,然后是 Channels。

    您的模型将学习预测格式类似于标签的输出。即,如果标签中的通道是倒置的,则模型最终将学习倒置的形式。这是因为上一层是fully connected 层。

    您可以阅读有关 Softmax 的更多信息here

    类似的答案可以帮助您进行详细说明,here

    【讨论】:

    • 感谢您的回答。我回答这个问题的原因是因为我无法通过link 描述的回归任务产生足够好的结果。将来我需要一个 3D 输出,即至少 2 个通道 x 高 x 宽。你能看看那个问题吗?那将不胜感激
    • 我不明白你的意思是改变标签的格式?回归和 softmax 是相同的,其中我的图像具有 [0, 255] 的值,会有什么不同?
    • 使用convolutional 层作为最后一层而不是innerProduct 有什么区别。因为当我使用convolutional 层时,我将得到一个完美的 2D 输出,因为我不必重新塑造它。
    猜你喜欢
    • 1970-01-01
    • 2018-08-18
    • 2017-10-07
    • 1970-01-01
    • 2015-08-20
    • 2016-11-24
    • 2021-09-01
    • 2017-12-14
    • 1970-01-01
    相关资源
    最近更新 更多