tf.map_fn是否支持python的原生地图功能(下面提供的示例)支持多个张量?
a = [1,2,3,4]
b = [17,12,11,10]
print(map(lambda x,y:x+y, a,b)) # ==> [18, 14, 14, 14]
答案 0 :(得分:12)
就像今天一样,我看到map_fn被增强为采用两个张量,因为文档说 - “elems:一个张量或(可能是嵌套的)张量序列,每个张量都将沿着它们的第一维解压缩。结果切片的序列将应用于fn。“ 这个例子(虽然以numpy形式给出)也表明它可以采用两个张量。我在这里复制它。
elems = (np.array([1, 2, 3]), np.array([-1, 1, -1]))
alternate = map_fn(lambda x: x[0] * x[1], elems, dtype=tf.int64)
# alternate == [-1, 2, -3]
答案 1 :(得分:4)
不是原生的,但这是一个实现它的快速功能:
<body onload="initialize()">
答案 2 :(得分:1)
如果张量具有相同的形状(大多数情况下),则将张量堆叠在第一维中并将其滑动到map函数中:
import tensorflow as tf
# declare variables
a = tf.constant([1, 2, 3, 4])
b = tf.constant([17, 12, 11, 10])
# NOTE: use stack because map_tf only takes one input tensor
ab = tf.stack([a, b], 1)
def map_operation(value_ab):
# iterates each value_ab
value_a = value_ab[0]
value_b = value_ab[1]
return value_a+value_b
# print(map(lambda x,y:x+y, a,b)) # ==> [18, 14, 14, 14]
# iterates each value_ab at map_operation()
map_result = tf.map_fn(map_operation, ab, dtype=tf.int32)
with tf.Session() as sess:
tf.initialize_all_variables().run()
print(sess.run(map_result)) # [18 14 14 14]
参考LINK
答案 3 :(得分:0)
源代码显示此函数只需要一个elems张量:
def map_fn(fn, elems, dtype=None, parallel_iterations=10, back_prop=True,
swap_memory=False, name=None):
我没有看到任何*和**参数。
答案 4 :(得分:0)
您可以结合使用本页中描述的方法来传递调用函数时要考虑的多个张量和参数,例如-
import tensorflow as tf
cnn = tf.keras.layers.Conv1D(name, filters=64, kernel_size=4, padding='same')
pool = tf.keras.layers.GlobalAveragePooling1D()
def stack_inputs(inp1, inp2, axis=1):
return tf.stack([inp1, inp2], axis)
def attention_op(q, p, cnn):
q_encoded = pool(cnn(q))
q_v_att = pool(tf.keras.layers.Attention()([cnn(q), cnn(p)]))
return tf.keras.layers.Concatenate()([q_encoded, q_v_att])
cnn1 = cnn('cnn_layer_1')
stacked_inputs = stack_inputs(inp1, inp2)
map_result = tf.keras.backend.map_fn(lambda x: attention_op(x[0], x[1], cnn1), stacked_inputs, dtype=tf.float32)