我需要在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]为过滤器,i
和j
索引来自一个循环。
创建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])])