質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1237閲覧

pythonでの機械学習時のエラー

_mini

総合スコア15

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/07/06 13:56

編集2020/07/07 03:26

【Python】Pytorchのモデル保存・読み込みをもっと簡単にしたい!
PyTorchで訓練されたモデルを保存するための最良の方法は?
上記のサイトを参考にpytorchのモデルの保存・読み込みのコードを書いて実行し、保存した重みを使って読み込みをしようとしたところ下記のようなエラーが出て実行できません。対処法を教えていただきたいです。

(base) xxxxxxx python % /opt/anaconda3/bin/python /Users/xxxxxx/Downloads/python/pytourch_study/weights/sumple_cnn.py test Traceback (most recent call last): File "/Users/xxxxxx/Downloads/python/pytourch_study/weights/sumple_cnn.py", line 98, in <module> model.load_state_dict(torch.load("weights/weights_2.pth")) File "/opt/anaconda3/lib/python3.7/site-packages/torch/serialization.py", line 584, in load with _open_file_like(f, 'rb') as opened_file: File "/opt/anaconda3/lib/python3.7/site-packages/torch/serialization.py", line 234, in _open_file_like return _open_file(name_or_buffer, mode) File "/opt/anaconda3/lib/python3.7/site-packages/torch/serialization.py", line 215, in __init__ super(_open_file, self).__init__(open(name, mode)) FileNotFoundError: [Errno 2] No such file or directory: 'weights/weights_2.pth'

階層は下記です。
イメージ説明
書いたコードは下記に示してあります。重みを使用する際にはtrainのところをコメントアウトして実行を試そうと思っているのですが、うまくいきません。

環境は
vs code
python3.7.6
tensorflow1.14.0
です。

import torch from torchvision.datasets import MNIST from torchvision import transforms from torch.utils.data import DataLoader from torch import nn import cloudpickle class cnn(nn.Module): def __init__(self): super().__init__() self.layers = nn.Sequential( nn.Conv2d(1, 6, kernel_size=5, padding=2), nn.ReLU(inplace=True), nn.MaxPool2d(2), nn.Conv2d(6, 16, kernel_size=5), nn.ReLU(inplace=True), nn.MaxPool2d(2), nn.Flatten(), nn.Linear(16*5*5, 120), nn.ReLU(inplace=True), nn.Linear(120, 84), nn.ReLU(inplace=True), nn.Linear(84, 10), nn.Softmax(dim=1), ) # weight init for m in self.layers.children(): if isinstance(m, nn.Conv2d): nn.init.kaiming_normal_(m.weight) if isinstance(m, nn.Linear): nn.init.kaiming_normal_(m.weight) def forward(self, x): return self.layers(x) if __name__ == '__main__': # GPU or CPUの自動判別 device = 'cuda' if torch.cuda.is_available() else 'cpu' # modelの定義 model = cnn().to(device) opt = torch.optim.Adam(model.parameters()) # datasetの読み出し bs = 128 # batch size transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))]) trainset = MNIST(root='./data', train=True, download=True, transform=transform) trainloader = DataLoader(trainset, batch_size=bs, shuffle=True) testset = MNIST(root='./data', train=False, download=True, transform=transform) testloader = DataLoader(testset, batch_size=bs, shuffle=False) # training print('train') model = model.train() for iepoch in range(3): for iiter, (x, y) in enumerate(trainloader, 0): # toGPU (CPUの場合はtoCPU) x = x.to(device) y = torch.eye(10)[y].to(device) # 推定 y_ = model.forward(x) # y_.shape = (bs, 84) # loss: cross-entropy eps = 1e-7 loss = -torch.mean(y*torch.log(y_+eps)) opt.zero_grad() # 勾配初期化 loss.backward() # backward (勾配計算) opt.step() # パラメータの微小移動 # 100回に1回進捗を表示(なくてもよい) if iiter % 100 == 0: print('%03d epoch, %05d, loss=%.5f' % (iepoch, iiter, loss.item())) if iepoch % 2 == 0: torch.save(model.state_dict(), "weights_{}.pth".format(iepoch)) torch.save(model.state_dict(), PATH) # test print('test') total, tp = 0, 0 model.load_state_dict(torch.load("weights/weights_2.pth")) model.eval() # the_model = TheModelClass(*args, **kwargs) # model.load_state_dict(torch.load(PATH)) for (x, label) in testloader: # to GPU x = x.to(device) # 推定 y_ = model.forward(x) label_ = y_.argmax(1).to('cpu') # 結果集計 total += label.shape[0] tp += (label_ == label).sum().item() acc = tp/total print('test accuracy = %.3f' % acc)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2020/07/06 14:17

提示コードのどの行でエラーが発生したか分かるようにエラーは全文(Traceback)を提示ください。
_mini

2020/07/06 14:20

エラー文全文を編集いたしました。
guest

回答1

0

ベストアンサー

保存しているパスが "weights_{}.pth" で、読み込もうとしているパスが "weights/weights_2.pth" なので、保存先と読み込み先のパスが合致していません。

投稿2020/07/06 16:03

tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

_mini

2020/07/07 00:25

weights_{}.pthで重みを保存したあとにweightsというフォルダに移動させたのですが、その場合もweights/はいらないのでしょうか? weights_2.pthとしてもweights_{}.pthとしても同じエラーが出てしまいます。
tiitoi

2020/07/07 01:44 編集

> あとにweightsというフォルダに移動させたのですが だとしたら、移動させた場所が間違っているのではないでしょうか? 以下のコードで相対パスが指している場所を確認してください import os print(os.path.abspath("weights/weights_2.pth")) # 絶対パス print(os.path.isfile("weights/weights_2.pth")) # ファイルが存在するかどうか
_mini

2020/07/07 02:01

Falesと表示されたのでうまく移動できていないのかもしれません
tiitoi

2020/07/07 02:04 編集

False と出たのであれば、そこにファイルが存在してないということです。 考えられる可能性としては 1. 移動できていなかった 2. 移動した先が相対パスが指す先と違った print(os.path.abspath("weights/weights_2.pth")) で相対パスが指す先の絶対パスが表示されたと思うので、PC 上のその場所にファイルがあるかどうか確認する 相対パスではなく、ファイルがある場所の絶対パスで指定するのがてっとり早いとは思いますが、、
_mini

2020/07/07 02:06

weightsを移動させる前の場所に戻したらうまく表示されました。 if iepoch % 2の時 torch save(model.state_dict()"./weights/weights_{}.pth".format()iepoch) としweightsのフォルダの中に重みを保存させようとしたのですが、うまくいかず、コードと同じディレクトリに保存されてしまうのにはなにか理由があるのでしょうか?
tiitoi

2020/07/07 02:12 編集

保存する段階で weights フォルダが存在していますか? 存在していれば保存できるとは思います。 相対パスを指定する場合は、os.path.abspath() でその相対パスが指している場所を確認してデバッグしましょう。
_mini

2020/07/07 03:28

画像を追加しました。 weightsフォルダは作っているのですが、そこに保存しようとするとエラーが出るのでコードなどが存在するディレクトリと同じ階層に保存しています。 そして保存されたものを手動でweightsフォルダに移動したのですが、うまく移動できていないようです。
tiitoi

2020/07/07 03:34

実際にフォルダの中を見ればわかると思いますが、手動で移動はできたのですか?
_mini

2020/07/07 06:15

手動でweightsの中に入れることはできます。 移動するとどんなコードを書いてもエラーが出てしまい、画像のような状態にしたときのみうまく実行できます。
tiitoi

2020/07/07 07:00

つまり、weights 以下にコードで保存できなかったけど、あとから weights 以下に手動で移動させて、 print(os.path.abspath("weights/weights_2.pth")) で表示される絶対パスの場所に weights_2.pth というファイルがあるということでよろしいでしょうか? それなのに print(os.path.isfile("weights/weights_2.pth")) が False なのだとしたら、すみませんが、こちらではちょっとわからないです。 Mac だとパーミッションもあるので、ls で読み込み可能なパーミッションになっているかも念のため確認ください。
_mini

2020/07/07 07:48

間違いないです。 lsで確認したところ data pytest.py pytourch_study sumple_cnn.py weights_0.pth weights_2.pth と表示されました。
tiitoi

2020/07/07 09:12

ls の結果に weights ディレクトリはないように見えますが、消したのですか?
tiitoi

2020/07/07 09:15

画像をよくみたら、pytourch_study ディレクトリの中に weights ディレクトリがあるように見えますが、sumple_cnn.py などがある1つ上の階層にあるべきではないですか?
_mini

2020/07/07 09:29

完全にweightsのディレクトリの作成場所が間違っていました。ひとつ上に移動させ一から学習とその重みを使用して読み込みまで行ったところ無事に成功することができました。 結果として初歩的なミスではありましたが、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問