tf.nn.conv2d_transpose output_shape dynamic batch_size

时间:2017-10-23 08:45:42

标签: tensorflow deconvolution

tf.nn.conv2d_transpose的文档说:

tf.nn.conv2d_transpose(
    value,
    filter,
    output_shape,
    strides,
    padding='SAME',
    data_format='NHWC',
    name=None
)

output_shape参数需要1D张量,指定此op的张量输出的形状。在这里,因为我的conv-net部分完全是在动态batch_length占位符上构建的,所以我似乎无法为此op设置output_shape的静态batch_size要求。

网上有很多关于此的讨论,但是,我找不到任何可靠的解决方案。其中大多数都是hacky,定义了global_batch_size变量。我希望知道解决这个问题的最佳解决方案。这种训练有素的模型将作为部署服务运送。

4 个答案:

答案 0 :(得分:2)

您可以使用参考张量的动态形状,而不是静态形状。

通常,我们使用conv2d_transpose操作,您的"上采样"一个图层,以便在您的网络中获得另一个张量的特定形状。

例如,如果要复制input_tensor张量的形状,可以执行以下操作:

import tensorflow as tf

input_tensor = tf.placeholder(dtype=tf.float32, shape=[None, 16, 16, 3])
# static shape
print(input_tensor.shape)

conv_filter = tf.get_variable(
    'conv_filter', shape=[2, 2, 3, 6], dtype=tf.float32)
conv1 = tf.nn.conv2d(
    input_tensor, conv_filter, strides=[1, 2, 2, 1], padding='SAME')
# static shape
print(conv1.shape)

deconv_filter = tf.get_variable(
    'deconv_filter', shape=[2, 2, 6, 3], dtype=tf.float32)

deconv = tf.nn.conv2d_transpose(
    input_tensor,
    filter=deconv_filter,
    # use tf.shape to get the dynamic shape of the tensor
    # know at RUNTIME
    output_shape=tf.shape(input_tensor),
    strides=[1, 2, 2, 1],
    padding='SAME')
print(deconv.shape)

程序输出:

(?, 16, 16, 3)
(?, 8, 8, 6)
(?, ?, ?, ?)

正如您所看到的,最后一个形状在编译时是完全未知的,因为我使用tf.shape操作的结果设置conv2d_transpose的输出形状,返回并因此返回它的值可以在运行时改变。

答案 1 :(得分:1)

您可以使用以下代码根据该层的输入( input )和输出数量来计算 tf.nn.conv2d_transpose 的输出形状参数来自此层( num_outputs )。当然,您具有过滤器大小,填充,步幅和data_format。

sum_file_contents()

答案 2 :(得分:0)

您可以使用值-1替换batch_size的确切值。考虑下面的例子,我将变量批量大小的输入张量(16,16,3)转换为(32,32,6)。

import tensorflow as tf

input_tensor = tf.placeholder(dtype = tf.float32, shape = [None, 16, 16, 3])
print (input_tensor.shape)

my_filter = tf.get_variable('filter', shape = [2, 2, 6, 3], dtype = tf.float32)
conv = tf.nn.conv2d_transpose(input_tensor,
                              filter = my_filter,
                              output_shape = [-1, 32, 32, 6],
                              strides = [1, 2, 2, 1],
                              padding = 'SAME')
print (conv.shape)

输出你:

(?, 16, 16, 3)
(?, 32, 32, 6)

答案 3 :(得分:0)

当您需要train_batch_size时,只需使用tf.shape(X_batch)[0]