Python 损失函数中的张量流切片

Python 损失函数中的张量流切片,python,tensorflow,Python,Tensorflow,我目前正在Tensorflow中实现一个函数,它对给定张量的128D向量进行随机采样 因此,我采样n=400个值: x1 = tf.random.uniform((n,), minval=border, maxval=W-border) 然后,我复制了的值,以便在张量中有400*Batch_size(B)值: x1a = x1[None,:] #(1, 400) x1b = tf.broadcast_to(x1a,(B,n)) #(4,400) x1 = tf.reshape(x1b, [-1

我目前正在Tensorflow中实现一个函数,它对给定张量的128D向量进行随机采样

因此,我采样n=400个值:

x1 = tf.random.uniform((n,), minval=border, maxval=W-border)
然后,我复制了的值,以便在张量中有400*Batch_size(B)值:

x1a = x1[None,:] #(1, 400)
x1b = tf.broadcast_to(x1a,(B,n)) #(4,400)
x1 = tf.reshape(x1b, [-1]) # (1600)
我对y坐标重复这一步,然后对批量大小应用类似的函数:

b1 = tf.range(B)
b1 = b1[:,None]
b1 = tf.broadcast_to(b1,(B,n))
b1 = tf.reshape(b1, [-1])
最后,我将张量转换为int32:

b1 = tf.cast(b1, tf.int32)
x1 = tf.cast(x1, tf.int32)
y1 = tf.cast(y1, tf.int32)
现在,我想从我的损失函数中的网络输出((None,512,512,128))中提取这些“随机”128D:

feat1 = feat1[b1, x1, y1, :]
但是,这会向我抛出以下错误消息:

TypeError: Only integers, slices (`:`), ellipsis (`...`), tf.newaxis (`None`) and scalar tf.int32/tf.int64 tensors are valid indices, got <tf.Tensor 'loss_30/ap_loss_concat_loss/Reshape_10:0' shape=(1600,) dtype=int32>
TypeError:只有整数、切片(`:`)、省略号(`…`)、tf.newaxis(`None`)和标量tf.int32/tf.int64张量是有效的索引,明白了吗
好吧,这种张量切片在numpy中是可能的,但我不确定在Tensorflow中是否也可能,我的搜索显示tf.gather\n可以用于这些事情


有谁能告诉我如何正确地执行此操作吗?

您几乎完全正确,只需执行以下操作:

feat1=tf.gather\u nd(feat1,tf.stack([b1,x1,y1],轴=-1))
如果要将结果作为具有形状的张量
[B,400,128]
,可以在之后对其进行形状调整,但也可以对以下参数的
索引进行形状调整:

idx=tf.重塑(tf.堆栈([b1,x1,y1],轴=-1),[B,n,3])
feat1=tf.gather\u nd(feat1,idx)

作为旁注,请注意,您可以将
dtype=tf.int32
传递给直接生成整数随机值。

您几乎正确,只需执行以下操作:

feat1=tf.gather\u nd(feat1,tf.stack([b1,x1,y1],轴=-1))
如果要将结果作为具有形状的张量
[B,400,128]
,可以在之后对其进行形状调整,但也可以对以下参数的
索引进行形状调整:

idx=tf.重塑(tf.堆栈([b1,x1,y1],轴=-1),[B,n,3])
feat1=tf.gather\u nd(feat1,idx)
作为旁注,请注意,您可以将
dtype=tf.int32
传递给直接生成整数随机值