У меня есть два вектора формы (batch, dim)
, которые я пытаюсь вычесть друг из друга.В настоящее время я использую простой цикл для вычитания определенной записи в векторе (т.е. error
) на основе второго вектора (т.е. label
) из 1:
per_ts_loss=0
for 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
Так что я застрял здесь!