在Caffe中切片输入数据层-未知的Blob输入

时间:2019-01-30 19:23:02

标签: deep-learning caffe

我正在尝试对caffe进行像素分类,因此需要提供输入图像大小的地面真实图像。有几种方法可以完成此操作,因此我决定将输入设置为 4通道LMDB (根据this answer的第二点)。这要求我在输入之后添加一个Slice层,这在same answer中也有概述。

我不断收到Unknown blob input data_lmdb to layer 0作为错误消息(data_lmdb应该是我最底层的输入层)。我发现unknown blob(位于顶部还是底部)错误主要是由于忘记在一个训练/测试阶段之一中定义某个内容而在另一个阶段(例如,this question或{{3 }})。但是,我使用的是之前使用过的train.prototxtinference.prototxtsolver.prototxt文件的组合,只是将输入层从HD5替换为LMDB(需要一些实践),所以一切都应该定义。

有人可以看到我为什么收到Unknown blob input data_lmdb to layer 0错误的信息吗?从火车日志文件中,我可以看到它在读取train.prototxt文件后便崩溃了(甚至没有到达Creating layer部分)。

我的prototxt文件如下:

solver.prototxt

net: "train.prototxt"       # Change this to the absolute path to your model file
test_initialization: false
test_iter: 1
test_interval: 1000000
base_lr: 0.01
lr_policy: "fixed"
gamma: 1.0
stepsize: 2000
display: 20
momentum: 0.9
max_iter: 10000
weight_decay: 0.0005
snapshot: 100
snapshot_prefix: "set_snapshot_name"    # Absolute path to output solver snapshots
solver_mode: GPU

train.prototxt(仅前两层;其后是LNR规范化层,然后是Convolution层):

name: "my_net"
layer {
  name: "data_lmdb"
  type: "Data"
  top: "slice_input"
  data_param {
    source: "data/train"
    batch_size: 4
    backend: LMDB
  }
}
layer{
  name: "slice_input"
  type: "Slice"
  bottom: "data_lmdb" # 4-channels = rgb+truth
  top: "data"
  top: "label"
  slice_param {
    axis: 1
    slice_point: 3  
  }
}

inference.prototxt中的前几层定义与train.prototxt 相同(无论如何都没关系,因为它没有在训练中使用),除了以下内容:

  • data_lmdb中,源路径不同(data/test
  • data_lmdb层中使用batch_size: 1

请告知我是否需要添加更多信息或图层。我试图保持简短,但最终并没有真​​正解决。

1 个答案:

答案 0 :(得分:1)

消息Unknown blob input指向某层希望作为输入的不存在的Blob。您的slice_input层将data_lmdb指定为输入Blob,但是您的网络中没有这样的Blob。取而代之的是具有这样名称的 layer 。 Blob名称由top字段定义,本例中为slice_input

您应该在top: "slice_input"层中将top: "data_lmdb"更改为data_lmdb,或使用bottom: "slice_input" # 4-channels = rgb+truth

但是,为了更清楚地命名,我将为您提供以下内容:

name: "my_net"
layer {
  name: "data"
  type: "Data"
  top: "data_and_label"
  data_param {
    source: "data/train"
    batch_size: 4
    backend: LMDB
  }
}
layer{
  name: "slice_input"
  type: "Slice"
  bottom: "data_and_label" # 4-channels = rgb+truth
  top: "data"
  top: "label"
  slice_param {
    axis: 1
    slice_point: 3  
  }
}