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

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

新規登録して質問してみよう
ただいま回答率
85.53%
PyTorch

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

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

Q&A

解決済

2回答

377閲覧

pythonで動的に決めた変数名でfor処理をしたい

taichi1602

総合スコア25

PyTorch

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

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

0グッド

0クリップ

投稿2023/12/04 13:46

pythonのクラス内でexec関数で動的に決めた変数名A1~A9で縮約計算をする際に下記のプログラムで、
einsumするときに、self.A2~self.A8を指定するときに、再度exec関数を指定でできませんでした。
こういった、動的に変数を決めたプログラムで再度変数名に数字があるfor loopで呼び出せますか?

python

1import torch 2import torch.nn as nn 3import numpy as np 4import torch.optim as optim 5 6class function(nn.Module): 7 def __init__(self): 8 super().__init__() 9 rnd = np.random.randn 10 #A1 11 exec("self.A" + str(1) + "= nn.Parameter(torch.Tensor(rnd(2, 5)))") 12 for i in range(2,9):# A2~A8 13 exec("self.A" + str(i) + "= nn.Parameter(torch.Tensor(rnd(5,2, 5)))") 14 # A9 15 exec("self.A" + str(9) + "= nn.Parameter(torch.Tensor(rnd(5,2)))") 16 17 self.optimizer = optim.AdamW(self.parameters(), lr=0.1) 18 19 def func(self, x): 20 I0 = torch.tensor([[1, 0]], dtype=torch.float32) 21 I1 = torch.tensor([[0, 1]], dtype=torch.float32) 22 23 I = torch.where((x[:, 0] == 0)[:, None], I0, I1) 24 p = torch.einsum("ia,xi->xa",self.A1,I) 25 for i in range(2,9): 26 I = torch.where((x[:, i] == 0)[:, None], I0, I1) 27 p = torch.einsum("xa,aib,xi->xb",p,self.A2,I) # A2ではなくA2~A8をfor loopしたい 28 I = torch.where((x[:, 8] == 0)[:, None], I0, I1) 29 p = torch.einsum("xa,ai,xi->x",p,self.A9,I) 30 31 return p 32 33data = torch.tensor([[1,0,1,0,1,0,1,0,1],[0,1,0,1,0,1,0,1,0]]) 34model = function() 35y=model.func(data) 36print(y)

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

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

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

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

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

TakaiY

2023/12/04 13:52

本質的でないことかもしれませんが、A1~8をリストにしないのには何か理由があるのでしょうか?
taichi1602

2023/12/04 13:57

ありがとうございます。リストにすれば同じことができるのでしょうか?もし差し支えなければ例をいただけると助かります
melian

2023/12/04 14:29 編集

こんな感じでしょうか。func 内では self.A1 は self.A[0] に置き換えます。(self.A2 なども同様) ※ コメント欄なので全角スペースでインデントを付けています。 def __init__(self):   super().__init__()   rnd = np.random.randn   self.A = []   self.A.append(nn.Parameter(torch.Tensor(rnd(2, 5))))   for _ in range(2,9):     self.A.append(nn.Parameter(torch.Tensor(rnd(5, 2, 5))))   self.A.append(nn.Parameter(torch.Tensor(rnd(5, 2))))   self.optimizer = optim.AdamW(self.A, lr=0.1)
taichi1602

2023/12/04 14:37

リストの仕方ありがとうございます。 def func(self, x): I0 = torch.tensor([[1, 0]], dtype=torch.float32) I1 = torch.tensor([[0, 1]], dtype=torch.float32) I = torch.where((x[:, 0] == 0)[:, None], I0, I1) p = torch.einsum("ia,xi->xa",self.A[0],I) for i in range(2,9): I = torch.where((x[:, i] == 0)[:, None], I0, I1) p = torch.einsum("xa,aib,xi->xb",p,self.A[i],I) # A2ではなくA2~A8をfor loopしたい I = torch.where((x[:, 8] == 0)[:, None], I0, I1) p = torch.einsum("xa,ai,xi->x",p,self.A[8],I) return p の箇所でエラー出てしまいましたが、調べてみます。ありがとうございます。
melian

2023/12/04 14:41

p = torch.einsum("xa,aib,xi->xb",p,self.A[i],I) の部分は、 p = torch.einsum("xa,aib,xi->xb",p,self.A[i-1],I) とします。(1-base index を 0-base index に置き換えるので)
taichi1602

2023/12/04 14:43

ありがとうございます。エラー解消できました
taichi1602

2023/12/04 14:56

また別の質問になってしまうのですが、 def __init__(self, x_num=9, b=20, lr=0.01): super().__init__() self.x_num= x_num self.b = b self.lr=lr rnd = np.random.randn # setting parameters self.A = [] self.A.append(nn.Parameter(torch.Tensor(rnd(2, b)))) for _ in range(1,8): self.A.append(nn.Parameter(torch.Tensor(rnd(b, 2, b)))) self.A.append(nn.Parameter(torch.Tensor(rnd(b, 2)))) self.optimizer = optim.AdamW(self.parameters(), lr=lr) とオプティマイザーを指定すると怒られてしまいます。 リスト変数でもNNパラメータ扱いにできますか?
melian

2023/12/04 15:24

コメント欄に書き切れなくなったので回答として書いてみました。後は適当にいじくってみてください。
guest

回答2

0

ベストアンサー

〜とオプティマイザーを指定すると怒られてしまいます。リスト変数でもNNパラメータ扱いにできますか?

register_parameter()get_parameter() を使うとよいかと。

python

1import torch 2import torch.nn as nn 3import numpy as np 4import torch.optim as optim 5 6class function(nn.Module): 7 def __init__(self): 8 super().__init__() 9 rnd = np.random.randn 10 self.register_parameter(name='A1', param=nn.Parameter(torch.Tensor(rnd(2, 5)))) 11 for i in range(2,9): 12 self.register_parameter(name=f'A{i}', param=nn.Parameter(torch.Tensor(rnd(5, 2, 5)))) 13 self.register_parameter(name='A9', param=nn.Parameter(torch.Tensor(rnd(5, 2)))) 14 print([*self.parameters()]) 15 self.optimizer = optim.AdamW(self.parameters(), lr=0.1) 16 17 def func(self, x): 18 I0 = torch.tensor([[1, 0]], dtype=torch.float32) 19 I1 = torch.tensor([[0, 1]], dtype=torch.float32) 20 21 I = torch.where((x[:, 0] == 0)[:, None], I0, I1) 22 p = torch.einsum("ia,xi->xa",self.get_parameter('A1'),I) 23 for i in range(2,9): 24 I = torch.where((x[:, i] == 0)[:, None], I0, I1) 25 p = torch.einsum("xa,aib,xi->xb",p,self.get_parameter(f'A{i}'),I) # A2ではなくA2~A8をfor loopしたい 26 I = torch.where((x[:, 8] == 0)[:, None], I0, I1) 27 p = torch.einsum("xa,ai,xi->x",p,self.get_parameter('A9'),I) 28 29 return p 30 31data = torch.tensor([[1,0,1,0,1,0,1,0,1],[0,1,0,1,0,1,0,1,0]]) 32model = function() 33y=model.func(data) 34print(y)

投稿2023/12/04 15:23

melian

総合スコア19479

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

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

taichi1602

2023/12/04 15:40

何から何までありがとうございます。無事パラメータ設定できました
guest

0

eval('self.A'+str(i))
とすればできました。

投稿2023/12/04 14:01

taichi1602

総合スコア25

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

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

y_waiwai

2023/12/04 14:17

まあ、それでできるのかもしれませんが、それではだめですねー
taichi1602

2023/12/04 14:19

ありがとうございます。良い方法教えていただけますか?
y_waiwai

2023/12/04 14:26 編集

配列なりリストを使いましょう self.A[data]
taichi1602

2023/12/04 14:53

ありがとうございます。上でも回答いただきましたがリストにする方が良いのですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.53%

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

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

質問する

関連した質問