Caffe выдает отрицательные значения потерь (классификация по нескольким меткам с помощью lmdb)

#classification #deep-learning #caffe #lmdb #cross-entropy

#классификация #глубокое обучение #caffe #lmdb #перекрестная энтропия

Вопрос:

Я пытаюсь выполнить классификацию по нескольким меткам на основе базы данных lmdb. Я создаю две разные базы данных. Одно для самих изображений и одно для меток. Мое намерение состоит в том, чтобы иметь 2 разные метки для углов в горизонтальном и вертикальном направлениях. Это означает label1 [0-360] label2 [0-360].

Для этого мой код следующий:

 data_name = "val"
data = data_name   '.txt'
lmdb_data_name = data_name   '_images_lmdb'
lmdb_label_name = data_name   '_labels_lmdb'

images = []
labels = []

for line in fileinput.input(data):
    entries = re.split(' ', line.strip())
    # append image
    images.append(entries[0])
    labels.append(entries[1:])

images_db = lmdb.open(lmdb_data_name, map_size=int(1e12))
labels_db = lmdb.open(lmdb_label_name, map_size=int(1e12))

images_txn = images_db.begin(write=True)
labels_txn = labels_db.begin(write=True)

inputs = zip(images, labels)
for in_idx, (image, label) in enumerate(inputs):
    im = cv2.imread(image)
    im = im[:,:,::-1]
    im = im.transpose((2,0,1))

    im_dat = caffe.io.array_to_datum(im)

    images_txn.put('{:0>10d}'.format(in_idx), im_dat.SerializeToString())

    label = np.array(label).astype(int).reshape(1, 1, len(label))
    label_dat = caffe.io.array_to_datum(label)
    labels_txn.put('{:0>10d}'.format(in_idx),label_dat.SerializeToString())

images_txn.commit()
labels_txn.commit()

images_db.close()
labels_db.close()
  

Мой train.txt выглядит следующим образом: /path/to/image label1 label2 где label1 и label2 являются целыми числами.

Мой train_val.prototxt выглядит следующим образом:

 layer {
  name: "data"
  type: "Data"
  top: "images"
  include {
    phase: TRAIN
  }
  transform_param {
    mirror: true
    crop_size: 256
    mean_file: "/path/mean_train.binaryproto"
  }
  data_param {
    source: "/path/train_images_lmdb"
    batch_size: 10
    backend: LMDB
  }
}
layer {
  name: "data_label"
  type: "Data"
  top: "labels"
  include {
    phase: TRAIN
  }
  data_param {
    source: "/train_labels_lmdb"
    batch_size: 10
    backend: LMDB
  }
}
  

Часть для фазы ТЕСТИРОВАНИЯ идентична

Мой уровень потерь выглядит следующим образом:

 layer {
  name: "loss"
  type: "SigmoidCrossEntropyLoss"
  bottom: "fc8"
  bottom: "labels"
  top: "loss"
}
  

Комментарии:

1. Вы должны убедиться, что fc8 значения находятся в диапазоне [0, 1]. Для этого вам лучше использовать sigmoid функцию активации или softmax раньше fc8 .

2. Да, я исправил эту проблему. Но проблема в том, что метки не созданы должным образом для lmdb. Можете ли вы помочь мне с этим? Я думал, у вас может быть метка типа [label1, label2] ->[40, 90], но я чувствую, что у вас должно быть что-то вроде [0, 0, 0, 0, 0, 1, 0, ] —> длина этого = количество меток @DaleSong

3. Я имею в виду, что значения меток должны быть в диапазоне от 0 до 1, а не 0 или 1. Можете ли вы изменить свои вопросы, чтобы предоставить больше информации о вашей новой проблеме?

4. Да, только что отредактировал это. Проблема, с которой я сталкиваюсь, заключается в том, как выполнить классификацию по нескольким меткам. Можем ли мы поговорить наедине? @DaleSong

5. Почему вы используете SigmoidCrossEntropyLoss для классификации по нескольким меткам? Вам лучше использовать множественные потери для каждой метки.