Caffe产生负损耗值(使用lmdb进行多标签分类)

时间:2016-10-24 09:31:36

标签: classification deep-learning caffe lmdb cross-entropy

我正在尝试基于lmdb数据库进行多标签分类。我创建两个不同的数据库。一个用于图像本身,一个用于标签。我的目的是在水平和垂直方向上有两个不同的角度标签。这意味着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其中label1label2是整数。

我的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
  }
}

TEST阶段的部分是相同的

我的损失层看起来像这样:

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

0 个答案:

没有答案