因为需要使用了带weights的SoftmaxCrossEntropyLoss,就在mindspore提供的nn.SoftmaxCrossEntropyLoss上自定义了一个算子。
在该算子中,我需要遍历一维Tensor。在PYNATIVE模式中,我将Tensor转为numpy数组实现该操作。但是在GRAPH_MODE中无法将Tensor转为numpy或list,请问该如何操作?
【相关代码】
# labels_int: (n,)维Tensor
# self.ignore_label: int
# self.cls_weight: (c, )维Tensor
weights_np = np.ones((labels_int.shape[0]))
labels_np = labels_int.asnumpy()
weights_np[labels_np == self.ignore_label] = 0
cls_weight_np = self.cls_weight.asnumpy()
for idx, v in enumerate(cls_weight_np, 0):
weights_np[labels_np == idx] *= v
你的问题是想在图模式下,遍历一个一维Tensor,当前可以通过两种方式遍历Tensor。
-
第一种获取Tensor第一维的长度,然后通过整数索引遍历,如下:
for i in range(x.shape[0]): x[i]
-
第二种通过enumerate接口,直接遍历,如下:
for i, ele in enumerate(x, 0): ele