Tensorflow 如何根据形状为[5,4,3]的张量生成[1,1,1]?

Tensorflow 如何根据形状为[5,4,3]的张量生成[1,1,1]?,tensorflow,shapes,Tensorflow,Shapes,我想应用操作tf.tile,例如tf.tile(A[1,1,b]),其中A具有形状[5,4,3]。如何根据A生成[1,1,1]?然后我将[1,1,1]的第三个元素设置为b,其中b是占位符。 这是我的代码,但它不工作,如何修复它 d = tf.shape(A) for i in range(tf.rank(A)): #wrong, tf.rank(A) as a tensor can't be here d[i] = 1 d[2] = b result = tf.tile(A, d)

我想应用操作tf.tile,例如tf.tile(A[1,1,b]),其中A具有形状[5,4,3]。如何根据A生成[1,1,1]?然后我将[1,1,1]的第三个元素设置为b,其中b是占位符。 这是我的代码,但它不工作,如何修复它

d = tf.shape(A)
for i in range(tf.rank(A)):   #wrong, tf.rank(A) as a tensor can't be here
    d[i] = 1
d[2] = b
result = tf.tile(A, d)

最简单的解决方案可能是使用
tf.one\u hot
直接构建你的
倍数
张量

>>> b = 2
>>> tf.one_hot(indices=[b], depth=tf.rank(A), on_value=b, off_value=1)
<tf.Tensor: shape=(3,), dtype=int32, numpy=array([1, 1, 2], dtype=int32)>
请注意,在tensorflow中,您不能在张量上进行项目分配(例如,
d[2]=b
将不起作用)。要生成张量
[1,1,b]
,可以使用
tf.concat

>>> b = 2
>>> tf.concat([tf.ones_like(tf.shape(A)[:-1]),[b]],axis=0)
<tf.Tensor: shape=(3,), dtype=int32, numpy=array([1, 1, 2], dtype=int32)>
>b=2
>>>concat([tf.one_like(tf.shape(A)[:-1]),[b]],轴=0)

谢谢。实际上,b的位置是任意的,所以我必须将所需的张量[1,1,…,b,…,1]切割成3段,并将其浓缩?你可以这样做,或者你可以使用
tf创建一个掩码。例如,one_hot
。使用one_hot,所需的张量可以创建为tf.one_hot(索引=[b_location],深度=tf.rank(a),on_值=b,off_值=1).说得好,我错过了。让我更新我的答案。参数“index”设置为b的位置,而不是b本身。
>>> b = 2
>>> tf.concat([tf.ones_like(tf.shape(A)[:-1]),[b]],axis=0)
<tf.Tensor: shape=(3,), dtype=int32, numpy=array([1, 1, 2], dtype=int32)>