您好,我是TensorFlow的新手,我想将2D张量连接到3D张量。我不知道如何通过利用TensorFlow函数来做到这一点。
tensor_3d = [[[1,2], [3,4]], [[5,6], [7,8]]] # shape (2, 2, 2)
tensor_2d = [[10,11], [12,13]] # shape (2, 2)
out: [[[1,2,10,11], [3,4,10,11]], [[5,6,12,13], [7,8,12,13]]] # shape (2, 2, 4)
我将通过使用循环和新的numpy数组使其工作,但是那样我就不会使用TensorFlow转换。关于如何使其成为可能的任何建议?我看不到像tf.expand_dims
或tf.reshape
这样的转换在这里可能有帮助...
感谢您分享知识。
答案 0 :(得分:1)
这应该可以解决问题:
import tensorflow as tf
a = tf.constant([[[1,2], [3,4]], [[5,6], [7,8]]])
b = tf.constant([[10,11], [12,13]])
c = tf.expand_dims(b, axis=1) # Add dimension
d = tf.tile(c, multiples=[1,2,1]) # Duplicate in this dimension
e = tf.concat([a,d], axis=-1) # Concatenate on innermost dimension
with tf.Session() as sess:
print(e.eval())
礼物:
[[[ 1 2 10 11]
[ 3 4 10 11]]
[[ 5 6 12 13]
[ 7 8 12 13]]]
答案 1 :(得分:1)
实际上有一个不同的技巧,有时会在诸如OpenAI基准之类的代码库中使用。
假设您的高斯策略有两个张量。 mu
和std
。对于批次大小1,标准偏差的形状与mu
相同,但是由于对所有操作都使用相同的参数化标准偏差,因此当批次大小大于1时,两者将有所不同:
mu : Size<batch_size, feat_n>
std: Size<1, feat_n>
在这种情况下,要做的一件简单的事情(就像OpenAI基线所做的那样):
params = tf.concat([mu, mu * 0 + std])
零乘法将std
转换为与mu
相同的等级。
享受,祝你好运!
ps:numpy
和tensorflow
的{{1}}运算符不会自动应用广播,因为根据维护者的说法,当两个张量的形状不匹配时,通常是编程错误的结果。在numpy中这没什么大不了的,因为计算很热心。但是使用tensorflow,这意味着您必须使用concat
运算符来手动广播较低级别(或形状为[1,* _]的级别)。