在keras

时间:2018-05-24 14:56:15

标签: python tensorflow keras keras-layer

我正在尝试将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添加到我的细分网络的正确方法是什么?

1 个答案:

答案 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/