Нарезка слоя входных данных в caffe - неизвестный вход BLOB-объекта - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь провести пиксельную классификацию с помощью caffe, поэтому необходимо предоставить базовое истинное изображение размером с входное изображение.Есть несколько способов сделать это, и я решил настроить свой вход как 4-канальная LMDB (согласно 2-му пункту этого ответа ).Это требует, чтобы я добавил слой Slice после ввода, что также указано в тот же ответ .

Я продолжаю получать Unknown blob input data_lmdb to layer 0 как сообщение об ошибке (data_lmdbдолжен быть моим самым нижним входным слоем).Я обнаружил, что ошибка unknown blob (будь то верхняя или нижняя) в основном вызвана тем, что вы забыли определить что-то на одном из этапов TRAIN / TEST при определении этого на другом (например, этот вопрос или этот ).Но я использую комбинацию файлов train.prototxt, inference.prototxt и solver.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 голосов
/ 31 января 2019

Сообщение Unknown blob input указывает на несуществующий BLOB-объект, который некоторый слой хочет иметь в качестве входных данных.Ваш слой slice_input указал data_lmdb в качестве входного большого двоичного объекта, но такого объекта в вашей сети нет.Вместо этого у вас есть слой с таким именем.Имена 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  
  }
}
...