我有两个 shape 向量,(batch, dim)我试图将它们相减。目前,我正在使用一个简单的循环从 1 中减去error基于第二个向量(即label)的向量(即)中的特定条目:per_ts_loss=0for i, idx in enumerate(np.argmax(label, axis=1)): error[i, idx] -=1 per_ts_loss += error[i, idx]我怎样才能矢量化这个?例如,错误和标签可能如下所示:error :array([[ 0.5488135 0.71518937 0.60276338 0.54488318 0.4236548 ] [ 0.64589411 0.43758721 0.891773 0.96366276 0.38344152]])label: array([[0, 0, 0, 1, 0 ], [0, 1, 0, 0, 0]])对于此示例,运行以下代码会产生以下结果:for i, idx in enumerate(np.argmax(label,axis=1)): error[i,idx] -=1 ls_loss += error[i,idx]结果 :error: [[ 0.5488135 0.71518937 0.60276338 0.54488318 0.4236548 ] [ 0.64589411 0.43758721 0.891773 0.96366276 0.38344152]]label: [[ 0. 0. 0. 1. 0.] [ 0. 1. 0. 0. 0.]]error(indexes 3 and 1 are changed): [[ 0.5488135 0.71518937 0.60276338 -0.45511682 0.4236548 ] [ 0.64589411 -0.56241279 0.891773 0.96366276 0.38344152]]per_ts_loss: -1.01752960574这是代码本身:https : //ideone.com/e1k8ra我被困在如何使用 的结果上np.argmax,因为结果是一个新的索引向量,它不能简单地像这样使用: error[:, np.argmax(label, axis=1)] -=1所以我被困在这里了!
2 回答
慕婉清6462132
TA贡献1804条经验 获得超2个赞
代替:
error[:, np.argmax(label, axis=1)] -=1
和:
error[np.arange(error.shape[0]), np.argmax(label, axis=1)] -=1
而且当然
loss = error[np.arange(error.shape[0]), np.argmax(label, axis=1)].sum()
在您的示例中,您正在更改、求和、error[0,3]
和error[1,1]
,或简而言之error[[0,1],[3,1]]
。
慕雪6442864
TA贡献1812条经验 获得超5个赞
也许这个:
import numpy as np
error = np.array([[0.32783139, 0.29204386, 0.0572163 , 0.96162543, 0.8343454 ],
[0.67308787, 0.27715222, 0.11738748, 0.091061 , 0.51806117]])
label= np.array([[0, 0, 0, 1, 0 ],
[0, 1, 0, 0, 0]])
def f(error, label):
per_ts_loss=0
t=np.zeros(error.shape)
argma=np.argmax(label, axis=1)
t[[i for i in range(error.shape[0])],argma]=-1
print(t)
error+=t
per_ts_loss += error[[i for i in range(error.shape[0])],argma]
f(error, label)
输出:
[[ 0. 0. 0. -1. 0.]
[ 0. -1. 0. 0. 0.]]
添加回答
举报
0/150
提交
取消