2016-11-15 7 views
0

У меня есть fully connected layer с слоем SoftmaxWithLoss. Я пытаюсь получить данные в форме 3D, а не 1D. Мое входное ground_truth изображения 3x128x128 и мои последние слои выглядят следующим образом:caffe: преобразование полностью подключенного уровня к 3D данным

layer { 
    name: "fc1" 
    type: "InnerProduct" 
    bottom: "conv" 
    top: "fc1" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    inner_product_param { 
    num_output: 49152 # 128 x 128 x 3 
    ... 
    } 
} 

layer { 
    name: "result" 
    type: "SoftmaxWithLoss" 
    bottom: "fc1" 
    bottom: "label" 
    top: "result" 
} 

И вот я получаю следующее сообщение об ошибке:

softmax_loss_layer.cpp:47] Check failed: outer_num_ * inner_num_ == bottom[1]->count() (1 vs. 49152) Number of labels must match number of predictions; e.g., if softmax axis == 1 and prediction shape is (N, C, H, W), label count (number of labels) must be NHW, with integer values in {0, 1, ..., C-1}.

Что здесь не так? У меня есть мой ярлык, который равен 3x128x128, а мой output_num - 49152 = 3 x 128 x128 ??

Моя следить за вопрос будет, как преобразовать эти данные в 1D 3D данных:

Я использую Python API для CAFFE. Я знаю, что мне просто нужно изменить вектор 1D на 3D-вектор. Но откуда я могу узнать, где «изменить форму», когда местоположение в 1D-векторе соответствует местоположению в 3D-векторе. Может кто-нибудь мне помочь?

Заранее благодарен!

ответ

2

Поскольку вы ищете классификацию по пикселям, а ярлык - это изображение истины на земле, было бы лучше использовать слой Eucledian loss вместо Softmax with loss. Softmax обычно используется для классификации многоклассов. Возможно также использовать softmax в вашем случае, но с изменением формата ярлыков и т. Д.

При выполнении потери евклида кофе рассмотрит метки как 1D-массив, который также применяется к прогнозируемому выходу , Конвертация 3D в 1D будет иметь формат Width-major, а затем - Height, а затем Channels.

Ваша модель научится прогнозировать выход в формате, подобном ярлыкам. т. е. если каналы на этикетках инвертированы, модель закончит изучение перевернутой формы. Это связано с тем, что предыдущий слой является слоем fully connected.

Вы можете узнать больше о Softmax here.

Аналогичный ответ, который может помочь вам с подробным объяснением, here.

+0

Благодарим вас за ответ. Причина, по которой я ответил на этот вопрос, заключается в том, что я не смог получить достаточно хорошие результаты с заданием регрессии, как описано [link] (http://stackoverflow.com/questions/40588551/caffe-how-to-convert-network от-пиксель-мудрый-сегментация-к-пиксель-мудрый-регресс? noredirect = 1 # comment68451095_40588551) здесь. В будущем мне нужно иметь 3D-выход, т. Е. По меньшей мере 2 канала x height x width. Не могли бы вы взглянуть на этот вопрос? Это было бы очень полезно – thigi

+0

Что я не понимаю, это то, что вы подразумеваете под изменением формата ярлыков? Это будет то же самое для регрессии и softmax, где у меня есть изображение со значениями от [0, 255], что бы изменилось? – thigi

+0

Какая разница между использованием слоя свертки как последнего слоя, а не 'innerProduct'. Потому что, когда я использую «сверточный» слой, я получу 2D-выход, который является идеальным, поскольку мне не нужно его изменять. – thigi