我正在尝试将CRF图层应用于我的网络以进行二进制分割,但这会导致错误ValueError: Shapes (?, 1, 1) and (?, 336, 1) are not compatible
。
我想输出形状为(batch_size, 224, 336, 1)
的张量。根据错误,一旦引入CRF,img_height似乎已经丢失。
下面是一些描述模型的示例代码。最后没有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添加到我的细分网络的正确方法是什么?
答案 0 :(得分:0)
事实证明,keras_contrib.layers.CRF仅适用于顺序数据,而不适用于空间数据。对于使用空间数据,densecrf library有效。看来它不能在训练期间使用,只能用于后处理。我使用了一个教程来实现它,可以在这里找到:http://warmspringwinds.github.io/tensorflow/tf-slim/2016/12/18/image-segmentation-with-tensorflow-using-cnns-and-conditional-random-fields/