テンソルのいくつかの行に softmax 関数を適用しようとしていますが、問題は、行の一部にすべて -inf 値があることです。そのため、これらの行のソフトマックスは NaN を出力し、モデルの後半で問題を引き起こします。
そのため、in がすべて -inf でない限り、softmax を行に適用する関数を作成したいと考えています。その場合、ゼロ ベクトルを出力します。これを行う簡単な方法はありますか?
テンソルのいくつかの行に softmax 関数を適用しようとしていますが、問題は、行の一部にすべて -inf 値があることです。そのため、これらの行のソフトマックスは NaN を出力し、モデルの後半で問題を引き起こします。
そのため、in がすべて -inf でない限り、softmax を行に適用する関数を作成したいと考えています。その場合、ゼロ ベクトルを出力します。これを行う簡単な方法はありますか?
ソフトマックスの後にあるすべて の行をすべてnan
0 に設定したいですか? このようにして、予期しないナンを上書きしないようにします。
import numpy as np
import torch
import torch.nn.functional as F
array = np.arange(25, dtype=np.float32).reshape((5, 5))
array[3, ...] *= -np.inf
# [[ 0. 1. 2. 3. 4.]
# [ 5. 6. 7. 8. 9.]
# [ 10. 11. 12. 13. 14.]
# [-inf -inf -inf -inf -inf]
# [ 20. 21. 22. 23. 24.]]
array = torch.tensor(array)
array = F.softmax(array, dim=1)
mask = array.isnan().all(dim=1)
array[mask, ...] = 0
print(array)
# tensor([[0.0117, 0.0317, 0.0861, 0.2341, 0.6364],
# [0.0117, 0.0317, 0.0861, 0.2341, 0.6364],
# [0.0117, 0.0317, 0.0861, 0.2341, 0.6364],
# [0.0000, 0.0000, 0.0000, 0.0000, 0.0000],
# [0.0117, 0.0317, 0.0861, 0.2341, 0.6364]])