Tensorflow:在图构建期间,连接两个张量分别为[B,None,feat_dim1]和[B,feat_dim2]的张量

时间:2019-06-28 20:46:26

标签: tensorflow

作为一个张量流新手,我试图在图构建期间将两个张量render() { this.config(); let aEles = this.a; return( <View style={styles.container}> aEles.map(edge => ( <Text>{edge}</Text> )); </View> ) } t1连接在一起。 t2t1具有不同的等级:t2[B, T, feat_dim1]。但是[B, feat_dim2]仅在运行时是已知的,因此在图形构造中,Tt1的形状实际上是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.Tensort1的提示吗?还是在图形构建过程中在给定t2的情况下如何将t2扩展到[B, T, feat2]?非常感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

  1. 为张量t2添加另一个维度:(B, feat_dim2) --> (B, 1, feat_dim2)
  2. 沿着先前添加的第二维数t2 None次,其中None是张量t1的动态第二维。
  3. 沿最后一个维度连接t1t2
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.]]]