msdd’s blog

deep learning勉強中。プログラム関連のこと書きます。

PyTorchでOne Hotに変換する

はじめに

PyTorchでOneHotに変換する方法がわからなかったので調べた。

変換方法

One Hotに変換するには、torch.nn.functionalにあるone_hot()という 関数を使うことで変換できる。 PyTorchのバージョンは、v1.1.0以降が必要。 引数に、入力に変換前のtensorと、num_classesにクラス数を 入る。

torch.nn.functional.one_hot(tensor, num_classes=-1)

ドキュメントをここです。

使い方サンプル

まず、必要なモジュールをインポートと、バージョンを確認しておく。

import torch
import torch.nn.functional as F

print(torch.__version__) 

バージョンが表示され、1.4.0であった。 1.1.0以降なので、使える。

one_hotを使ってみる。 入力として、labelを用意した。 これは、値が3のみ入っているtensorである。この3をone hot表現へと変換してみる。 この入力のlabelとクラス数(今回は、10クラスとしてみる)を one_hot関数の引数として入れることで、結果としてone hot表現が得られる。

label=torch.tensor(3)
print("label:",label)

one_hot=F.one_hot(label,num_classes=10)
print("one hot:",one_hot)

結果は下のようになった。 元の3が、変換後は[0,0 ...0]と10クラス分の0が並んだものをindexが3の部分のみ1にした ものへと変換できている。

label: tensor(3)
one hot: tensor([0, 0, 0, 1, 0, 0, 0, 0, 0, 0])

このone_hot関数は、引数のnum_classesを省略することもできる。 省略した時の挙動を見てみる。 先ほどと同じく、labelを設定。 それを、次は、num_classesの引数を省いたone_hot関数に入れてみる。

label=torch.tensor(3)
print("label:",label)

one_hot=F.one_hot(label)
print("one hot:",one_hot)

出力は下のようになった。 こちらも、ラベルの3からone hotへと変換できている。 しかし、num_classesを指定した時とは違って、 出力されたtensorのサイズが4になっている。 これは、one_hot関数の引数のnum_classesに何も指定しないと入力の中で一番大きい値からクラス数が決定されるためである。 今回は、最大が3なので0から始めて3番目が1になるように、クラス数は4となり、one hotでは4つの値となっている。

label: tensor(3)
one hot: tensor([0, 0, 0, 1])

このone_hot関数は、複数の値にも対応している。 先ほどまでの、labelの値は3という1つの値のみだったが、 今回は、0,1,2,0,4という6つの値に適用してみる。 変更したのは、入力のtensorを複数に変更しただけである。

label=torch.tensor([0,1,2,0,4])
print("label:",label)

one_hot=F.one_hot(label,num_classes=5)
print("one hot:",one_hot)

結果は、下のようになった。 出力も複数出力されていて、それぞれのone hot表現を取得できている。

label: tensor([0, 1, 2, 0, 4])
one hot: tensor([[1, 0, 0, 0, 0],
        [0, 1, 0, 0, 0],
        [0, 0, 1, 0, 0],
        [1, 0, 0, 0, 0],
        [0, 0, 0, 0, 1]])

まとめ

PyTorchでOne Hotに変換する方法を調べた。 すでに、PyTorchで用意されていて、torch.nn.functionalを使うことで、 変換できる。使う時には、きちんと、引数にクラス数を指定しないと 入力の内容から自動でクラス数が推定されて結果がおかしくなると思うので 注意が必要。