torchとnumpyの演算子の相互変換
torchとnumpyの演算子の相互変換方法について解説します。
概要
torchとnumpyの変換
Pytorchで学習した機械学習モデルをONNXにエクスポートして使用する場合、Pytorchで記述された後処理をnumpyに置き換える必要があります。Pytorchの演算とnumpyの演算は似ているAPIが多いものの、微妙に仕様が異なります。本記事では、置き換えの際のAPIの対応関係をまとめます。

torchについて
PytorchはFacebookの開発しているAIフレームワークです。AIのレイヤーに加えて、numpyに相当するtensorの演算をサポートしています。
numpyについて
numpyは機械学習で広く使用されている数値演算ライブラリです。バックエンドはCで実装されており、Pythonで高速な数値演算が可能です。
相互運用
torchからnumpyへの変換
torchのTensorからnumpyのArrayを取得します。
numpy_tensor = torch_tensor.numpy()
numpyからtorchへの変換
numpyのArrayからtorchのTensorに変換します。
torch_tensor = torch.from_numpy(numpy_tensor)
APIの対応関係
新しいテンソルの確保
指定したshapeの新しいテンソルを確保します。
y = torch.FloatTensor(a.shape)
y = np.zeros(a.shape)
要素ごとの最大と最小
2つのテンソルの要素ごとの最大値と最小値を計算します。
y = torch.max(a,b)
y = torch.min(a,b)
y = np.maximum(a,b)
y = np.minimum(a,b)
最大値の計算
テンソルの最大値と最大要素のインデックスを計算します。torchでは1つのAPIで同時に計算しますが、numpyでは2つのAPIに分解する必要があります。
y_value, y_idx= torch.max(a, 1, keepdim=True)
y_value = np.max(a, axis=1, keepdims=True)
y_idx = np.argmax(a.numpy(), axis=1)
y_idx = y_idx.reshape((y_idx.shape[0],1))
並べ替え
テンソルの並べ替えとインデックスを計算します。torchでは1つのAPIで同時に計算しますが、numpyでは2つのAPIに分解する必要があります。
y_value, y_idx = torch.sort(a, descending=True)
y_value = np.sort(a)
y_value = y_value[::-1]
y_idx = np.argsort(a)
y_idx = y_idx[::-1]
クリップ
テンソルの値をクリップします。Noneを使用することで片方向のみClipすることができます。
y = torch.clamp(a,min=b)
y = np.clip(a,n,None)
サイズ変更
要素数に-1を指定することで、特定の次元のサイズを自動計算することができます。
y = a.view(1,-1,1)
y = a.reshape(1,-1,1)
テンソルの結合
2つのテンソルを結合します。
y = torch.cat(a,b)
y = np.concatenate(a,b)
ユニークな要素の抽出
テンソルからユニークな要素を抽出します。
y = a.unique()
y = np.unique(a)
次元の追加
テンソルの次元を拡張します。
y = a.unsqueeze(0)
y = np.expand_dims(a,0)
Softmax
ソフトマックスを実行します。
y = torch.softmax(x)
def softmax(x):
s= np.sum(np.exp(x))
return np.exp(x)/s
y = softmax(x)
アイリア株式会社はAIを実用化する会社として、クロスプラットフォームでGPUを使用した高速な推論を行うことができるailia SDKを開発しています。アイリア株式会社ではコンサルティングからモデル作成、SDKの提供、AIを利用したアプリ・システム開発、サポートまで、 AIに関するトータルソリューションを提供していますのでお気軽にお問い合わせください。
ailia Tech BLOG