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)
回答2件
あなたの回答
tips
プレビュー