我想在Tensorflow中构建一个有条件的CNN模型,但我遇到了一些麻烦。
假设有一个名为 要素 的矩阵,其形状为[64,?,50,1],另一个矩阵为 条件 形状[64,?,1,130]。
fisrt dim是批量大小,第二个dim是指帧号(两个矩阵的这个dim中的值在每个批次中是相同的,但在不同批次中是不同的)。第三个是特征维度,最后一个暗淡是通道号。
我想连接两个矩阵,这意味着我们可以得到一个形状为[64,?,50,131]的矩阵,并在张量流中做 conv2d 。
但问题是由于第三个暗淡的差异,我不能连接这两个矩阵。然后我做了如下:
x_shapes = x.get_shape()
y_shapes = y.get_shape()
return tf.concat(3, [x, y*tf.ones([x_shapes[0], x_shapes[1], x_shapes[2], y_shapes[3]])])
但它不起作用,因为第二个昏暗不知道。
我想知道有没有办法解决这个问题?
由于
答案 0 :(得分:0)
虽然您的问题并不清楚,但在连接之前,您似乎想在第三维上广播第二个张量,其形状为[64, ?, 1, 130]
,即您调用要素维度的张量。请注意,tf.concat
需要匹配所有维度,但您要连接的维度除外。来自tf.concat
的文档:
输入张量的尺寸必须匹配,并且全部 除concat_dim之外的尺寸必须相等。
要沿着要素维度进行广播,使用tf.tile
而不是像你正在做的那样乘以所有的张量要便宜得多。以下是使用tf.tile
:
tf.concat(3, [x, tf.tile(y, [1, 1, x_shapes.as_list()[2], 1])])
在您的情况下,由于y
的第三维是静态已知的,因此上述代码有效。如果情况并非如此,您可以将tf.tile
的第二个参数形成如下:
tf.tile(y, tf.concat(0, [[1], [1], tf.shape(x)[2:3], [1]]))