作为一个张量流新手,我试图在图构建期间将两个张量render() {
this.config();
let aEles = this.a;
return(
<View style={styles.container}>
aEles.map(edge => (
<Text>{edge}</Text>
));
</View>
)
}
和t1
连接在一起。 t2
,t1
具有不同的等级:t2
和[B, T, feat_dim1]
。但是[B, feat_dim2]
仅在运行时是已知的,因此在图形构造中,T
,t1
的形状实际上是t2
和[B, None, feat_dim1]
。我想要的是将[B, feat_dim2]
附加到t2
上以得到形状为t1
的张量。
我首先想到的是使用[B, None, feat1+feat2]
来扩大等级,但是由于tf.stack([t2, t2, ...], axis=1)
在图形构建期间,我无法为T=None
建立列表。我还检查了tf.stack()
是否与tf.while_loop
对象一起建立了列表,但无法获得使用函数的要旨。
当前我正在处理的代码不支持eager模式,因此有人可以给我一些有关如何串联tf.Tensor
和t1
的提示吗?还是在图形构建过程中在给定t2
的情况下如何将t2
扩展到[B, T, feat2]
?非常感谢您的任何建议。
答案 0 :(得分:0)
t2
添加另一个维度:(B, feat_dim2) --> (B, 1, feat_dim2)
。t2
None
次,其中None
是张量t1
的动态第二维。t1
和t2
。import tensorflow as tf
import numpy as np
B = 5
feat_dim1 = 3
feat_dim2 = 4
t1 = tf.placeholder(tf.float32, shape=(B, None, feat_dim1)) # [5, None, 3]
t2 = 2.*tf.ones(shape=(B, feat_dim2)) # [5, 4]
def concat_tensors(t1, t2):
t2 = t2[:, None, :] # 1. `t1`: [5, 4]` --> `[5, 1, 4]`
tiled = tf.tile(t2, [1, tf.shape(t1)[1], 1]) # 2. `[5, 1, 4]` --> `[5, None, 4]`
res = tf.concat([t1, tiled], axis=-1) # 3. concatenate `t1`, `t2` --> `[5, None, 7]`
return res
res = concat_tensors(t1, t2)
with tf.Session() as sess:
print(res.eval({t1: np.ones((B, 2, feat_dim1))}))
# [[[1. 1. 1. 2. 2. 2. 2.]
# [1. 1. 1. 2. 2. 2. 2.]]
#
# [[1. 1. 1. 2. 2. 2. 2.]
# [1. 1. 1. 2. 2. 2. 2.]]
#
# [[1. 1. 1. 2. 2. 2. 2.]
# [1. 1. 1. 2. 2. 2. 2.]]
#
# [[1. 1. 1. 2. 2. 2. 2.]
# [1. 1. 1. 2. 2. 2. 2.]]
#
# [[1. 1. 1. 2. 2. 2. 2.]
# [1. 1. 1. 2. 2. 2. 2.]]]