w_init = tf.random_normal_initializer(stddev=0.02)
b_init = None
g_init = tf.random_normal_initializer(1., 0.02)
def deconv2d(layer, out_channels=128, filter_size=3, out_size=(256,256), strides=(1, 2, 2, 1), act=tf.identity, W_init=w_init, b_init=b_init, name='deconv2d'):
"""
shape - shape of filter : [height, width, out_channels, in_channels]
output_shape - shape of outputs
"""
batch, h, w, in_channels = layer.outputs.get_shape().as_list()
filter_shape = (filter_size, filter_size, out_channels, in_channels)
output_shape = (batch, out_size[0], out_size[1], out_channels)
return tl.layers.DeConv2dLayer(layer, act=act, shape=filter_shape, output_shape=output_shape, strides=strides, padding='SAME', W_init=W_init, b_init=b_init, W_init_args=None, b_init_args=None, name=name)
TensorLayer的Deconv2dLayer是对tf.nn.conv2d_transpose()的封装。
在自定义网络中使用:
batch, w, h, in_channels = lf_extra.shape
n = deconv2d(n, out_channels=channels_interp, filter_size=3, out_size=(h, w), name = 'interp/deconv%d' % i)
运行时出现错误:
TypeError: Failed to convert object of type to Tensor. Contents: (16, Dimension(16), Dimension(16), 128). Consider casting elements to a supported type.
根据错误提示,Deconv2dLayer的output_shape实参从传入的h,w变成了Dimension(16):
(16, Dimension(16), Dimension(16), 128)
在deconv2d中将out_size强制类型转换为int, 则运行成功。
output_shape = (batch, out_size[0], out_size[1], out_channels)
============================================================================
查看TensorLayer的simplified Layer, 其中有对Deonv2dLayer的封装:DeConv2d,对out_size同样进行了强制类型转换:
output_shape=(batch_size, int(out_size[0]), int(out_size[1]), n_filter)
但是对filter_size和strides却没有。
原因没有找到。