如何在一个未知维度的tensorflow占位符上进行数学运算



我需要在tensorflow占位符上做数学,或者传递给它的数据,形状为(None, 128, 128, 3)。我需要添加一个过滤器形状(None, 5, 5, 3)到这个占位符,在位置[:, i:i+5, j:j+5, 3]。我该怎么做呢?

在使用长度为None的数据之前,我会使用

outs = tf.tensor_scatter_nd_add(outs, [[[i + k, j + l] for k in range(5)] for l in
                                                                            range(5)], self.b[h])

嵌套在两个for循环中,其中outs是占位符self。b[h]为过滤器,ij索引来自一个循环。

创建Keras layer:

class BatchAdd(keras.layers.Layer):
    def __init__(self, i, j):
        super(BatchAdd, self).__init__()
        self.i = i
        self.j = j
        self.add_filter = add_filter
    def call(self, outs, b):
        output = tf.vectorized_map(add_filter,
                                   elems=[outs, b, tf.repeat(self.i, tf.shape(b)[0]), tf.repeat(self.j, tf.shape(b)[0])])
        return output

创建模型

outs = keras.Input(shape=(128, 128, 3))
b = keras.Input(shape=(5, 5, 3))
output = BatchAdd(i,j)(outs, b)
model = keras.Model(inputs=(outs, b), outputs=output)

检查任何批大小:

batch_size = 3
model((tf.random.normal((batch_size, 128, 128, 3)),tf.random.normal((batch_size, 5, 5, 3))))
#output shape: 
   shape=(3, 128, 128, 3)

您可以使用tf.vectorized_map

i = 5 
j = 9
def add_filter(x):
    return tf.tensor_scatter_nd_add(x[0], [[[x[2] + k, x[3] + l] for k in range(5)] for l in
                                                                            range(5)], x[1])
output = tf.vectorized_map(
    add_filter,
    elems=[outs, b, tf.repeat(i, tf.shape(b)[0]), tf.repeat(j, tf.shape(b)[0])])

相关内容

  • 没有找到相关文章

最新更新