2017-01-13 34 views
2

我想用Tensorflow后端使用Keras的Deconvolution2D。Keras下的解卷积问题

但我有一些问题。 首先,在output_shape,如果我通过无对batch_size时,我得到这个错误:

TypeError: Expected binary or unicode string, got None 

如果我通过我用批量大小没有改变,这里是错误..:

InvalidArgumentError (see above for traceback): Conv2DCustomBackpropInput: input and out_backprop must have the same batch size 
[[Node: conv2d_transpose = Conv2DBackpropInput[T=DT_FLOAT, data_format="NHWC", padding="VALID", strides=[1, 2, 2, 1], use_cudnn_on_gpu=true, _device="/job:localhost/replica:0/task:0/cpu:0"](conv2d_transpose/output_shape, transpose, Reshape_4)]] 

下面是我用的模型:

model = Sequential() 

reg = lambda: l1l2(l1=1e-7, l2=1e-7) 
h = 5 
model.add(Dense(input_dim=100, output_dim=nch * 4 * 4, W_regularizer=reg())) 
model.add(BatchNormalization(mode=0)) 
model.add(Reshape((4, 4, nch))) 
model.add(Deconvolution2D(256, h,h, output_shape=(128,8,8,256), subsample=(2,2), border_mode='same')) 
model.add(BatchNormalization(mode=0, axis=1)) 
model.add(LeakyReLU(0.2)) 
model.add(Deconvolution2D(256, h,h, output_shape=(128,16,16,256), subsample=(2,2), border_mode='same')) 
model.add(BatchNormalization(mode=0, axis=1)) 
model.add(LeakyReLU(0.2)) 
model.add(Deconvolution2D(64, h,h, output_shape=(128,32,32,64), subsample=(2,2), border_mode='same')) 
model.add(BatchNormalization(mode=0, axis=1)) 
model.add(LeakyReLU(0.2)) 
model.add(Convolution2D(3, h, h, border_mode='same', W_regularizer=reg())) 
model.add(Activation('sigmoid')) 
model.summary() 
+0

为什么要将batch_size设置为None? –

+0

@MarcinMożejko: 因为在Keras中,None表示可变批量大小。 (像Tensorflow中的-1) –

回答

1

这是在Keras以前的版本去卷积的烦恼,总是不得不放弃固定批量大小和手工计算output_shape。这也意味着您的数据集大小必须可以被'batch_size'整除,否则会在最后一个(较小)的批处理中产生错误。

幸运的是,这在Keras 2.0中得到了修复。 Deconvolution2D已被Conv2DTranspose所取代,您甚至不必再将output_shape作为参数:

model.add(Conv2DTranspose(filters=256, kernel_size=(h,h), strides=(2,2), padding='same'))