tmori’s blog

公開メモ帳くらいの感覚で書いています。技術系多め。日常少なめ。

【Python】オフラインでfine-tuningのpretrainedを使用する方法【PyTorch】

ネットワーク環境にないGPU計算機でfine-tuningのpretrainedをする方法についてまとめます。 今回はresnet18を使用するケースを考えていますが、同じ手順で他のモデルも同様にオフライン実行できると思います。

目次

環境

fine-tuningのpretrainedとは

pytorchでfine-tuningするときmodels.nameでモデルの型を参照し、pretrained=Trueでパラメータを付与する処理になっています。

 model_ft = models.resnet18(pretrained=True)

このパラメータが保存されているオブジェクトファイルはライブラリが所持しているものではなく、オンラインからダウンロードする処理になっています。

因みにpretrained=Falseにすればオフライン実行できますが、パラメータは1からの学習になりfine-tuningの強みをあまり活かせません。

pytorch.org

torchvision.modelsのオンライン参照箇所

model_urls = {
    'resnet18': 'https://download.pytorch.org/models/resnet18-5c106cde.pth',
    'resnet34': 'https://download.pytorch.org/models/resnet34-333f7ec4.pth',
    'resnet50': 'https://download.pytorch.org/models/resnet50-19c8e357.pth',
    'resnet101': 'https://download.pytorch.org/models/resnet101-5d3b4d8f.pth',
    'resnet152': 'https://download.pytorch.org/models/resnet152-b121ed2d.pth',
    'resnext50_32x4d': 'https://download.pytorch.org/models/resnext50_32x4d-7cdf4587.pth',
    'resnext101_32x8d': 'https://download.pytorch.org/models/resnext101_32x8d-8ba56ff5.pth',
    'wide_resnet50_2': 'https://download.pytorch.org/models/wide_resnet50_2-95faca4d.pth',
    'wide_resnet101_2': 'https://download.pytorch.org/models/wide_resnet101_2-32ee1156.pth',
}

def _resnet(arch, block, layers, pretrained, progress, **kwargs):
    model = ResNet(block, layers, **kwargs)
    if pretrained:
        state_dict = load_state_dict_from_url(model_urls[arch],
                                              progress=progress)
        model.load_state_dict(state_dict)
    return model

変更する処理

1. 使用するモデルの学習済みモデルをダウンロードし、ローカルに保存する

ダウンロード先は上のmodel_urlsに書いてあります。 例えば、resnet18を使用したい場合は https://download.pytorch.org/models/resnet18-5c106cde.pth からダウンロードします。

2. pretrained=Falseでモデルの型のみ取得する

model_ft = models.resnet18(pretrained=False)

3. 上で定義したモデルに保存した学習済みモデルをloadする

ここでは保存先フォルダを model_pretrained にしています。

 model_ft.load_state_dict(torch.load('model_pretrained/resnet18-5c106cde.pth'))

pytorch.org

最後に

本来はライブラリ関数のオーバーライドとかで綺麗に実装したかったんですけど、色々やって断念しました。

もしオーバーライドで出来た方がいればコメントで教えてもらえると助かります🙏

【Python】[Errno 32] Broken pipe【PyTroch】

pytorchで [Errno 32] Broken pipe の解消方法について

実行環境

エラー発生原因

このエラーはwindows+torch.utils.data.DataLoaderのnum_workers>1 + IPythonの書き方で発生してるようです。

同じコードをcentosで実行すると正常に動作するのでwindows動作でのバグか仕様みたいです。 dataloaderのnum_workersを複数にしてマルチスレッドで処理するときにエラーが発生してるみたいです。

pytorch.org

解消方法

def main(): の中に処理を記述すれば正常に動作します。

def main():
    # ここにpytorchのコードを記述
    

if __name__ == "__main__":
    main()

僕の場合.ipynbで書いたものを無理やり.pyで実行したら案の定エラーが発生。

結論

良い子のみんなはmain関数をちゃんと作ろうね!!

Python 「if __name__ == ‘__main__’:」の意味 - Qiita

【Python】 str型からOrderedDict型に変換する方法

str型からOrderedDict型*1への変換についてまとめました。

1. JSONDecoderを使う場合

from collections import OrderedDict
import json

decoder = json.JSONDecoder(object_pairs_hook=OrderedDict)
json_string = '{"info":{"name":"牛タン", "price":380}}'
print(decoder.decode(json_string))

2. 文字列から直接デコードする場合

from collections import OrderedDict
import json

json_string = '{"info":{"name":"牛タン", "price":380}}'
od = json.loads(json_string, object_pairs_hook=OrderedDict)
print(od)

参考: python - Converting string to ordered dictionary? - Stack Overflow

*1:python 3.7からdict型が順序を保持するようになったらしいです。使い分けるべきなのかなぁ・・

参考: 普通の辞書とOrderedDictは何が違うのか?【Python 3.7】 | シラベルノート

FUNProCon -2019夏- に参加してきました!

2019/10/5に行われた学内プログラミングコンテストであるログイン - Google アカウントに参加してきました。

その感想とかを書きたいと思います。

ログイン - Google アカウント とは

はこだて未来大生を対象としたプロコン。

使用言語は C, C++, Java, Python3, Rubyなどから使用したいものを選択。

以下の3部門で、各部門のランキング上位者に賞品が当たる。

  • 部門1 :1年生対象
  • 部門2 :2年生対象
  • 部門3+ :3年生以上対象

表彰状のほか、Amazonギフト券などを予定。

主催: 情報教育IRプロジェクト(未来大特別研究費 重点領域・戦略研究)

協賛: 公立はこだて未来大学高度ICTコース

FUNProConは、444株式会社の支援を受けて開催いたします。

結果は....
続きを読む