2017-02-07 10 views
4

Применяется к неправильному использованию технических терминов. Я работаю над проектом семантической сегментации через CNN; пытаясь реализовать архитектуру типа Encoder-Decoder, поэтому выход имеет тот же размер, что и вход.Семантическая сегментация с энкодером-декодером CNN

Как вы проектируете этикетки? Какую функцию потерь следует применять? Особенно в ситуации тяжелого классового дисбаланса (но соотношение между классами варьируется от изображения к изображению).

Проблема связана с двумя классами (объекты интереса и фона). Я использую Keras с бэкэндом tensorflow.

До сих пор я планирую, что ожидаемые выходы будут такими же размерами, как и входные изображения, применяя пиксельную маркировку. Конечный слой модели имеет либо активацию softmax (для 2 классов), либо сигмоидную активацию (чтобы выразить вероятность того, что пиксели принадлежат классу объектов). У меня возникли проблемы с разработкой подходящей целевой функции для выполнения такой задачи, типа:

функцию (y_pred, y_true),

по согласованию с Keras.

Пожалуйста, постарайтесь уточнить размеры используемых тензоров (ввод/вывод модели). Любые мысли и предложения очень ценятся. Спасибо !

+0

Рекомендовать переместить этот вопрос в http: // stats.stackexchange.com/ –

+0

Рекомендую переместить этот вопрос на [datascience.stackexchange.com] (http://datascience.stackexchange.com/) –

ответ

1

На самом деле, когда вы используете TensorFlow бэкенд вы можете просто применить предопределенный Keras цели в следующем порядке:

output = Convolution2D(number_of_classes, # 1 for binary case 
         filter_height, 
         filter_width, 
         activation = "softmax")(input_to_output) # or "sigmoid" for binary 
... 
model.compile(loss = "categorical_crossentropy", ...) # or "binary_crossentropy" for binary 

А потом кормить либо в один горячий закодированную карте функции или матрицу формы (image_height, image_width) с целой закодированным классов (помните, что в этом случае вы должны использовать sparse_categorical_crossentropy как потерю).

Чтобы справиться с классом InBalance (я предполагаю, что это в: Из- класса Справочный) Я настоятельно рекомендую вам внимательно прочитать ответы на этот Stack Overflow question.

+1

, когда я использую 'sparse_categorical_crossentropy'. Я получаю ошибку формы:' ожидается conv2d_19 иметь форму (None , 4, 64, 1), но получил массив с формой (634, 4, 64, 64) '---, но когда я использую« категориальную_коссентропую »модельные поезда (хотя потеря, похоже, не меняется) - любые идеи ? – pepe

1

Предлагаю начать с базовой архитектуры, используемой на практике, подобной этой в нервной сегментации: https://github.com/EdwardTyantov/ultrasound-nerve-segmentation. Здесь dice_loss используется как функция потерь. Это очень хорошо работает для проблемы двух классов, как показано в литературе: https://arxiv.org/pdf/1608.04117.pdf.

Другая функция потерь, которая широко используется, является кросс-энтропией для такой проблемы. Для таких проблем, как ваши, чаще всего используются длинные и короткие пропущенные соединения для стабилизации обучения, как указано в вышеприведенной статье.

1

два способа:

  1. Вы можете попробовать 'уплощение':

    model.add(Reshape(NUM_CLASSES,HEIGHT*WIDTH)) #shape : HEIGHT x WIDTH x NUM_CLASSES 
    model.add(Permute(2,1)) # now itll be NUM_CLASSES x HEIGHT x WIDTH 
    #Use some activation here- model.activation() 
    #You can use Global averaging or Softmax 
    
  2. Жаркого кодирование каждый пиксель:

    В этом случае ваш последний слой должен повышающий дискретизация/Unpool/Деконвертироваться в HEIGHT x WIDTH x CLASSES. Таким образом, ваш выход по существу имеет форму: (HEIGHT, WIDTH, NUM_CLASSES).