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
变量。我希望知道解决这个问题的最佳解决方案。这种训练有素的模型将作为部署服务运送。
答案 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]