Ошибка формы при использовании CRF для двоичной сегментации в керасе - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь применить уровень CRF к моей сети для двоичной сегментации, но это приводит к ошибке ValueError: Shapes (?, 1, 1) and (?, 336, 1) are not compatible.

Я хочу вывести тензор с формой (batch_size, 224, 336, 1).Судя по ошибке, img_height, похоже, была потеряна после введения CRF.

Ниже приведен пример кода, описывающего модель.Без CRF в конце все работает хорошо.

import keras
from keras.layers import UpSampling2D, Conv2D, Activation, MaxPooling2D
from keras_contrib.layers import CRF

img_width, img_height = 336, 224
kernel_size = 7

input=keras.engine.topology.Input(shape=(img_height, img_width, 3))

e=Conv2D(32,(kernel_size,kernel_size),padding='same')(input)
e1=Activation('relu')(e)
e=MaxPooling2D(pool_size=(2, 2))(e1)

e=Conv2D(64,(kernel_size,kernel_size),padding='same')(e)
e2=Activation('relu')(e)
e=MaxPooling2D(pool_size=(2, 2))(e2)

#Decoder layers
d=UpSampling2D()(e)
d=Conv2D(64,(kernel_size,kernel_size),padding='same')(d)
d=Activation('relu')(d)

d=UpSampling2D()(d)
d=Conv2D(32,(kernel_size,kernel_size),padding='same')(d)
d=Activation('relu')(d)

d=Conv2D(1,(1,1),padding='valid')(d)
d=Activation('sigmoid')(d)

out=CRF(1, sparse_target=True)(d) 

autoencoder = Model(inputs=input, outputs=out)

Как правильно добавить CRF в мою сеть сегментации?

1 Ответ

0 голосов
/ 17 декабря 2018

Оказывается, что keras_contrib.layers.CRF предназначен только для последовательных данных, а не пространственных данных.Для использования пространственных данных работает библиотека densecrf .Похоже, что его нельзя использовать во время обучения, только для последующей обработки.Я использовал учебник для реализации этого, который можно найти здесь: http://warmspringwinds.github.io/tensorflow/tf-slim/2016/12/18/image-segmentation-with-tensorflow-using-cnns-and-conditional-random-fields/

...