Классификация Caffe с несколькими этикетками для двух классов с hdf5

У меня есть следующая структура в файле .txt:

/path/to/image x y
/path/to/image x y

где х и у - целые числа.

Что я хочу сделать сейчас: создать файл hdf5 для использования в Caffe ('train.prototxt')

Мой код Python выглядит так:

import h5py, os
import caffe
import numpy as np

SIZE = 256
with open( 'train.txt', 'r' ) as T :
    lines = T.readlines()


count_files = 0
split_after = 1000
count = -1

# If you do not have enough memory split data into
# multiple batches and generate multiple separate h5 files
X = np.zeros( (split_after, 3, SIZE, SIZE), dtype='f4' )
y1 = np.zeros( (split_after, 1), dtype='f4' )
y2 = np.zeros( (split_after, 1), dtype='f4' )

for i,l in enumerate(lines):
    count += 1
    sp = l.split(' ')
    img = caffe.io.load_image( sp[0] )
    img = caffe.io.resize( img, (3, SIZE, SIZE) )

    X[count] = img
    y1[count] = float(sp[1])
    y2[count] = float(sp[2])

    if (count+1) == split_after:
        with h5py.File('train_' + str(count_files) +  '.h5','w') as H:
            H.create_dataset( 'X', data=X ) # note the name X given to the dataset!
            H.create_dataset( 'y1', data=y1 )
            H.create_dataset( 'y2', data=y2 )

            X = np.zeros( (split_after, 3, SIZE, SIZE), dtype='f4' )
            y1 = np.zeros( (split_after, 1), dtype='f4' )
            y2 = np.zeros( (split_after, 1), dtype='f4' )
        with open('train_h5_list.txt','a') as L:
            L.write( 'train_' + str(count_files) + '.h5') # list all h5 files you are going to use
        count_files += 1
        count = 0

На самом деле я хочу оценить углы. Это означает, что у меня есть два класса: один для вертикальных углов, другой для горизонтальных углов. Первый класс колеблется от 0 до 10 градусов, второй от 10 до 20 и так далее (как для горизонтальных, так и для вертикальных углов).

Как будет выглядеть .prototxt? Вот мои последние слои

layer {
  name: "fc8"
  type: "InnerProduct"
  bottom: "fc7"
  top: "fc8"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  inner_product_param {
    num_output: 36
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0
    }
  }
}

layer {
  name: "loss"
  type: "SoftmaxWithLoss"
  bottom: "fc8"
  bottom: "y"
  top: "loss"
}

person Community    schedule 25.10.2016    source источник
comment
вы пишете train или val файлы? это немного сбивает с толку, что вы делаете...   -  person Shai    schedule 25.10.2016
comment
В этом случае я пытаюсь сделать и то, и другое. Это должно быть легко с включением? Но я думал, что для обоих случаев последние слои похожи?   -  person    schedule 25.10.2016
comment
Я имел в виду первую часть: код Python для создания файлов h5.   -  person Shai    schedule 25.10.2016
comment
О, я делаю и то, и другое! Я просто изменю имена файлов и проделаю те же операции!   -  person    schedule 25.10.2016


Ответы (1)


Вам также нужно изменить входной слой: теперь у вас есть три top:

layer {
  type: "HDF5Data"
  name: "data"
  top: "X"
  top: "y1"
  top: "y2"
  # ... params and phase
}

Теперь top вашего fc7 служит «высокоуровневым дескриптором» ваших данных, из которых вы хотите предсказать y1 и y2. Таким образом, после слоя fc7 у вас должно получиться:

layer {
  type: "InnerProduct"
  name: "class_y1" 
  bottom: "fc7"
  top: "class_y1"
  #... params num_output: 36 
}
layer {
  type: "SoftmaxWithLoss" # to be replaced with "Softmax" in deploy
  name: "loss_y1"
  bottom: "class_y1"
  bottom: "y1"
  top: "loss_y1"
  # optionally, loss_weight
}

А также:

layer {
  type: "InnerProduct"
  name: "class_y2" 
  bottom: "fc7"
  top: "class_y2"
  #... params num_output: 36 
}
layer {
  type: "SoftmaxWithLoss" # to be replaced with "Softmax" in deploy
  name: "loss_y2"
  bottom: "class_y2"
  bottom: "y2"
  top: "loss_y2"
  # optionally, loss_weight
}
person Shai    schedule 25.10.2016
comment
Спасибо! Как вы называете такую ​​задачу классификации? Это многоуровневая классификация или многоклассовая классификация? - person ; 25.10.2016
comment
@thigi это имеет значение? что еще более важно, вы можете заставить его работать? - person Shai; 25.10.2016
comment
Да, я пытаюсь. Проблема в том, что мои файлы hdf5 слишком велики. - person ; 25.10.2016
comment
@тиги. нет проблем. у вас может быть много .h5 файлов, перечислите все их пути в val_h5_list.txt или train_h5_list.txt и caffe прочитает их все один за другим. - person Shai; 25.10.2016
comment
Проблема в том, как мне разделить файлы? Как видите, у меня есть только один большой файл hdf5. Я знаю, что можно перечислить многие из них, но вопрос в том, как их разделить? - person ; 25.10.2016
comment
@thigi в коде Python. после N итераций запишите в h5 и начните сначала, чтобы заполнить X, y1 и y2. - person Shai; 25.10.2016
comment
Разве проблема не в том, что мне придется изменить размеры? Потому что я должен очистить X, y1 и y2? Или я могу просто оставить их как есть? - person ; 25.10.2016
comment
Давайте продолжим обсуждение в чате. - person ; 25.10.2016
comment
@thigi это общая идея. вам следует рассмотреть случай, когда у вас меньше split_after примеров для последнего файла. - person Shai; 25.10.2016
comment
Вы бы порекомендовали добавить слой точности? - person ; 25.10.2016