A03ki.qrunch.io読者になる2デコレータでPyTorchのTensorと次元を監視するPythonPyTorch投稿日:2019-08-24最終更新:2019-09-21筆者のブログで記事をみるはじめにPyTorchを使っていると入力が3次元固定であることがよくあります。そのため自作する関数もそれに合わせたりするのですが、使う側としては入力がTensorや3次元ではない時に教えてくれたほうが親切なわけです。作成済み関数に手を加えるのは気が引けるのと、関数が1つや2つならまだしも全ての関数にこの機能を追加するのは大変です。今回はそんなワガママに応えてくれるデコレータの話になります。監視用の関数まず、デコレータ内で使う監視用の関数を作ります。3これはTensorかつ3次元ならTrueが返ってくる関数です。wrapper入力xが3次元のTensorではない時はエラーを出すようにしておきます。関数内部にあるfunctools.wrapsですが、これを使うことで装飾した関数の引数やdocstringが隠れてしまうことを防げます。**kwargs)と表示され、使う側はaxisがあることがわかりません。axis)と正しく表示されるようになります。x_std軸方向で標準化する関数にis_tensor3dを装飾しておきます。Notebookの例はこの関数での話でした。正しく動くかどうか試してみましょう。3D.しっかりと3次元Tensorのみを通していることが確認できました。注意点デコレータのwrapperと装飾した関数の引数を合わせないと問題が起こります。試しにzscoreの引数をxからyに変えたzscore2で実験してみます。キーワード引数xだと実行できるzscore2の引数はyですが、デコレータの方はxなのでyに代入しても実行できません。使う側は装飾してるかは知らないため混乱の元になります。引数名は統一しましょう。最後に今回はPyTorchのTensorとその次元を監視しましたが、ndarrayやlist、intなどにでも転用できそうです。入力時にndarrayからTensorに変えたり、何かを出力時にTensorに戻したりと、よく使う機能を元の関数を変えずに追加できそうですね。Qrunch.netサーバー提供フィードバックを送信する。