Python Tensorflow conv2d_转置输出_形状
我想实现一个不固定输入大小的生成性对抗网络(GAN),比如Python Tensorflow conv2d_转置输出_形状,python,tensorflow,conv-neural-network,convolution,deconvolution,Python,Tensorflow,Conv Neural Network,Convolution,Deconvolution,我想实现一个不固定输入大小的生成性对抗网络(GAN),比如4d张量(Batch\u size,None,None,3) 但是当我使用conv2d_转置时,有一个参数output_shape,这个参数在反褶积运算后必须通过真实大小 例如,如果批次img的大小是(64,32,32,128),那么w是重量,后面是(3,3,64,128) deconv=tf.nn.conv2d\u转置(批处理\u img,w,输出\u形状=[64,64,64,64],步幅=[1,2,2,1],填充=[SAME]) 因
4d张量(Batch\u size,None,None,3)
但是当我使用conv2d_转置时,有一个参数output_shape
,这个参数在反褶积运算后必须通过真实大小
例如,如果批次img的大小是(64,32,32,128),那么w是重量,后面是(3,3,64,128)
deconv=tf.nn.conv2d\u转置(批处理\u img,w,输出\u形状=[64,64,64,64],步幅=[1,2,2,1],填充=[SAME])
因此,我用大小(64,64,64,64,64)
得到deconv
,如果我传递输出形状的真实大小就可以了
但是,我想使用非固定输入大小(64,无,无,128)
,并使用(64,无,无,64)
获取deconv
但是,它会产生如下错误
TypeError:无法将类型的对象转换为张量…
那么,我能做些什么来避免deconv中的这个参数呢?还是有其他方法实现非固定GAN?
- 输出形状列表不接受列表中包含None,因为None对象无法转换为张量对象
- None仅允许在
tf.占位符的形状中使用
- 对于不同大小的输出形状而不是None请尝试-1例如,您想要大小
(64,None,None,128)
所以请尝试[64,-1,-1,128]
。。。我不确定这是否有效。。。我的第一个参数不是固定大小,因此我使用了-1
- 然而,对于转置卷积
tf.layers.conv2d\u transpose()
- 我确信高级api
tf.layers.conv2d\u transpose()
将适合您,因为它需要不同输入的张量
- 您甚至不需要指定
输出形状
,只需要指定要使用的输出通道
和内核
- 有关更多详细信息:。。。我希望这有帮助
我也遇到了这个问题。正如在这里的另一个答案中所建议的那样,使用-1是行不通的。相反,您必须抓住传入张量的形状并构造
output\u size
参数。这是我写的一个测试的摘录。在这种情况下,它是未知的第一维度,但它应该适用于已知和未知参数的任何组合
output_shape = [8, 8, 4] # width, height, channels-out. Handle batch size later
xin = tf.placeholder(dtype=tf.float32, shape = (None, 4, 4, 2), name='input')
filt = tf.placeholder(dtype=tf.float32, shape = filter_shape, name='filter')
## Find the batch size of the input tensor and add it to the front
## of output_shape
dimxin = tf.shape(xin)
ncase = dimxin[0:1]
oshp = tf.concat([ncase,output_shape], axis=0)
z1 = tf.nn.conv2d_transpose(xin, filt, oshp, strides=[1,2,2,1], name='xpose_conv')
我找到了一个解决方案,将tf.shape用于未指定的形状,并将_shape()用于指定的形状
def get_deconv_lens(H, k, d):
return tf.multiply(H, d) + k - 1
def deconv2d(x, output_shape, k_h=2, k_w=2, d_h=2, d_w=2, stddev=0.02, name='deconv2d'):
# output_shape: the output_shape of deconv op
shape = tf.shape(x)
H, W = shape[1], shape[2]
N, _, _, C = x.get_shape().as_list()
H1 = get_deconv_lens(H, k_h, d_h)
W1 = get_deconv_lens(W, k_w, d_w)
with tf.variable_scope(name):
w = tf.get_variable('weights', [k_h, k_w, C, x.get_shape()[-1]], initializer=tf.random_normal_initializer(stddev=stddev))
biases = tf.get_variable('biases', shape=[C], initializer=tf.zeros_initializer())
deconv = tf.nn.conv2d_transpose(x, w, output_shape=[N, H1, W1, C], strides=[1, d_h, d_w, 1], padding='VALID')
deconv = tf.nn.bias_add(deconv, biases)
return deconv