#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
для классификации по нескольким меткам? Вам лучше использовать множественные потери для каждой метки.