Как обучить модели семантической сегментации для нескольких классов - PullRequest
0 голосов
/ 09 сентября 2018

Я использую архитектуру U-Net для обучения модели сегментации. У меня есть изображения в градациях серого в качестве входных данных и изображения в двоичной маске для соответствующих меток, которые сохраняются в виде пустых массивов.

Они оба имеют форму (total_imgs, rows, cols, 1)

Так же, как в архитектуре согласно этой статье https://arxiv.org/abs/1505.04597 Я хочу, чтобы было два выходных класса - один для переднего плана и один для фона. Кажется, что бумага делает это, чтобы изменить последний конвойный слой модели, чтобы он имел форму (нет, строки, столбцы, 2).

Я пытался сделать это в моей модели. Моя модель архитектуры выглядит так:

input_1 (InputLayer) (None, 256, 256, 1) 0
_______________________________________________________________________________
conv2d_21 (Conv2D) (None, 256, 256, 64) 73792 concatenate_4[0][0]
_______________________________________________________________________________
conv2d_22 (Conv2D) (None, 256, 256, 64) 36928 conv2d_21[0][0]
_______________________________________________________________________________
conv2d_23 (Conv2D) (None, 256, 256, 2) 130 conv2d_22[0][0]
==================================================================
Total params: 31,034,498 
Trainable params: 31,032,578 
Non-trainable params: 1,920

Однако, поскольку мои входные данные являются оттенками серого, я получаю эту ошибку

Error when checking target expected conv2d_23 to have shape (256, 256, 2) but got array with shape (256, 256, 1)

Как я могу изменить свои входные данные, чтобы удовлетворить это требование и, следовательно, обучаться в два класса?

Я попытался изменить свои входы, чтобы маски имели 2 канала, чтобы соответствовать количеству выходных классов.

imgdatas = np.ndarray((len(imgs), 256, 256 ,1), dtype=np.uint8) #grascale
imglabels = np.ndarray((len(imgs), 256, 256, 2), dtype=np.uint8) #if I change channels to 2 the model runs

Но, хотя это позволяет модели работать, я все еще сталкиваюсь с проблемами:

  • Результаты не те, которые я ожидаю - кривые «точность / потери по сравнению с эпохой» очень плавные, и у них нет шаткого колебательного поведения, которое вы наблюдаете при обучении в нескольких классах.
  • Я получаю еще одну ошибку при сохранении результатов после запуска модели поверх моих тестовых данных, поскольку, конечно, 2 канала не являются допустимым числом каналов для формата изображения.
...