tensorflow 如何填充所有Tensor以适应所有尺寸

ws51t4hk  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(149)

如何填充两个形状相同的Tensor,使它们具有相同的大小?我当前收到以下代码的错误(我不能在图形模式下使用for循环):

def match_size(self, x, y):
    d = tf.maximum(tf.subtract(y.shape, x.shape), 0)
    x = tf.pad(x, [[0, i] for i in d])
    d = tf.maximum(tf.subtract(x.shape, y.shape), 0)
    y = tf.pad(y, [[0, i] for i in d])
    return x, y

此代码将在Keras模型的call方法中运行,因为xyTensor在不同执行阶段的特征大小(形状(batch, horizon, feature)中的最后一个尺寸)不同(即,我无法在build期间提前决定大小/形状)。
以下是预期的输入/输出示例:
x = (10, 4, 4), y = (10, 4, 2) ~〉x = (10, 4, 4), y = (10, 4, 4)
x = (10, 4, 2), y = (10, 4, 4) ~〉x = (10, 4, 4), y = (10, 4, 4)
......它还应适用于所有维度:
x = (10, 3, 2), y = (10, 4, 1) ~〉x = (10, 4, 2), y = (10, 4, 2)

yiytaume

yiytaume1#

使用ragged.stack

def match_size(x, y):
   new_axis = tf.argsort(tf.abs(tf.constant(x.shape) - tf.constant(y.shape)), direction='DESCENDING')
   x_y = tf.ragged.stack([tf.transpose(x, new_axis),tf.transpose(y, new_axis)])
   x,y = x_y.to_tensor(0.)
   return tf.transpose(x, tf.argsort(new_axis)), tf.transpose(y, tf.argsort(new_axis))

相关问题