代码之家  ›  专栏  ›  技术社区  ›  Brian

Tensorflow-按批次索引对占位符进行分组

  •  1
  • Brian  · 技术社区  · 7 年前

    给定一个具有两个或多个不同维度占位符的网络,例如:。

    x1 = tf.placeholder(tf.int32, [None, seq_len])
    x2 = tf.placeholder(tf.int32, [None, seq_len])
    xn = tf.placeholder(tf.int32, [None, None, seq_len]
    

    每个占位符中的第一个维度对应于小批量大小。 seq_len 是输入的长度。第二个维度就像我需要一起处理的输入列表 x1 x2 对于minibatch中的每个索引。如何将这些张量分组,以按批量索引对其进行操作?

    例如

    x1 = [[1, 2, 3], [4, 5, 6]]
    x2 = [[7, 8, 9], [8, 7, 6]]
    xn = [[[1, 5, 2], [7, 2, 8], [3, 2, 5]], [[8, 9, 8]]]
    

    我需要保持 x1[0] i.e. [1, 2, 3] , x2[0] i.e. [7, 8, 9] xn[0] i.e. [[1, 5, 2], [7, 2, 8], [3, 2, 5]] 因为我需要在 x1[i] 以及 xn[i] 对于所有人 i .

    请注意 xn 参差不齐的

    1 回复  |  直到 7 年前
        1
  •  2
  •   greeness user1775765    7 年前

    还是不确定我是否理解你的问题。如果我理解正确,你的挑战来自 xn . 我有下面的方法来“展开”批次索引。结果是一个大小为batch\u size的数组;数组中的每个元素都是张量。当然,在评估之前,可以对所有这些张量执行其他操作。

    我必须使用 tf.scan 对每个元素执行操作 xn[i] 因为它的第一维度是动态的。不过,可能存在更好的解决方案。

    x1 = np.array([[1, 2, 3]])
    xn = np.array([[[1, 5, 2], [7, 2, 8], [3, 2, 5]]])
    
    batch_size = x1.shape[0]
    
    result = []
    for batch_idx in range(batch_size):
      x1_i = x1[batch_idx]
      xn_i = xn[batch_idx]
      result.append(tf.scan(fn=lambda a, x: x * x1_i, elems=xn_i, initializer=x1_i))
    with tf.Session() as sess:
      print sess.run([result[0]])
    
    # result, this is x1[0] multiply each element in xn[0] for all i (element-wise). 
    # free free to plug in your own matrix operations in the `fn` arg of `tf.scan`.
      [array([[ 1,  10, 6],
              [ 7,  4, 24],
              [ 3,  4, 15]])]