Matrix 仅乘以tensorflow数组的某些列

Matrix 仅乘以tensorflow数组的某些列,matrix,tensorflow,slice,Matrix,Tensorflow,Slice,我目前正在修改我的一个目标检测神经网络的损失函数。我基本上有两个数组 是真的:预测的标签。形状(x,y,z)的tf张量 y_pred:预测值。tf形状张量(x,y,z)-x维度是批量大小,y维度是图像中预测对象的数量,z维度包含类的一个热编码以及所述类的边界框 现在是真正的问题:我想做的基本上是将y_pred中的前5个z值与y_true中的前5个z值相乘。所有其他值应保持不受影响。在努比,它非常直截了当 y_pred[:,:,:5] *= y_true[:,:,:5] 我发现在tensorfl

我目前正在修改我的一个目标检测神经网络的损失函数。我基本上有两个数组

是真的:预测的标签。形状(x,y,z)的tf张量 y_pred:预测值。tf形状张量(x,y,z)-x维度是批量大小,y维度是图像中预测对象的数量,z维度包含类的一个热编码以及所述类的边界框

现在是真正的问题:我想做的基本上是将y_pred中的前5个z值与y_true中的前5个z值相乘。所有其他值应保持不受影响。在努比,它非常直截了当

y_pred[:,:,:5] *= y_true[:,:,:5]

我发现在tensorflow中很难做到这一点,因为我不能给原始的张量赋值,我想保持所有其他值不变。如何在tensorflow中实现这一点?

自1.1版以来,tensorflow涵盖了类似Numpy的索引,请参阅

将tensorflow导入为tf
使用tf.Session()作为sess:
y_pred=tf.常数([[1,2,3,4,5,6,7,8,9,10],[10,20,30,40,50,60,70,80,90100]]
y_true=tf.常数([[1,2,3,4,5,6,7,8,9,10],[10,20,30,40,50,60,70,80,90100]]
打印((y_pred[:,:,:5]*y_true[:,:,:5]).eval())
# [[[   1    4    9   16   25]
#   [ 100  400  900 1600 2500]]]
评论后编辑:

现在,问题是“*=”部分,即项目分配。在Tensorflow中,这不是一个简单的操作。但是,在您的情况下,可以使用或(+可用于更复杂的情况)轻松解决此问题

下面是前两个解决方案的快速实现

使用Tensor.getitem和tf.concat的解决方案:

将tensorflow导入为tf
使用tf.Session()作为sess:
y_pred=tf.常数([[1,2,3,4,5,6,7,8,9,10]]
y_true=tf.常数([[1,2,3,4,5,6,7,8,9,10]]
#tf.where不能将条件应用于任何轴(参见文档)。
#在您的情况下(第二轴上的情况),我们需要手动广播
#条件张量,或转置目标张量。
#下面是第二个解决方案的快速演示:
y_pred_edit=y_pred[:,:,:5]*y_true[:,:,:5]
y_pred_rest=y_pred[:,:,4:]
y_pred=tf.concat((y_pred_edit,y_pred_rest),轴=2)
打印(y_pred.eval())
# [[[ 1  4  9 16 25  6  7  8  9 10]]]
使用tf的解决方案。其中:

将tensorflow导入为tf
def选择第一个索引(n,批次大小):
“”“返回长度为“批大小”且前n个元素为True的列表
其余为假,即[*[[True]*n],*[[False]*(批次大小-n)]。
"""
n_one=tf.one((n))
剩余零=tf.zeros((批量大小-n))
索引=tf.cast(tf.concat((n个1,其余0),轴=0,数据类型=tf.bool)
回报指数
使用tf.Session()作为sess:
y_pred=tf.常数([[1,2,3,4,5,6,7,8,9,10]]
y_true=tf.常数([[1,2,3,4,5,6,7,8,9,10]]
#tf.where不能将条件应用于任何轴(参见文档)。
#在您的情况下(第二轴上的情况),我们需要手动广播
#条件张量,或转置目标张量。
#下面是第二个解决方案的快速演示:
y_pred_transposed=tf.转置(y_pred,[2,0,1])
y_-true_-transposed=tf.transpose(y_-true[2,0,1])
编辑索引=选择第一个索引(5,tf.shape(y\u pred\u transposed)[0])
y_pred_transposed=tf.其中(条件=编辑索引,
x=y_pred_transposed*y_true_transposed,y=y_pred_transposed)
#调回:
y_pred=tf.transpose(y_pred_transposed,[1,2,0])
打印(y_pred.eval())
# [[[ 1  4  9 16 25  6  7  8  9 10]]]

好吧,很酷,但是如何保留其他值?我仍然想要形状的数组(x,y,z),这会给我一个(x,y,5)的数组吗?如何将(x,y,5)赋值回y_pred,这样我就有了相乘的列和未相乘的边界框?是的,我的错,我注意到后来我只回答了你一半的问题。我编辑了一个更完整的解决方案。