Почему .items () работает для умножения между sequence и `float` - PullRequest
1 голос
/ 07 августа 2020

Я получил два dicts self.theta и self.beta, все значения которых равны fp и значение fp eta, когда я попытался изменить его, как показано ниже:

self.theta[0]=self.theta[0]-eta*self.beta[0]

Он вернул TypeError: can't multiply sequence by non-int of type 'float' . Если я поместил его в for l oop dict, он работал , но я не могу отдельно манипулировать одним ключом, например [0] выше, мне нужно завершить sh модификацию в для l oop в этом случае.

for key, value in self.theta.items(): 
      self.theta[key]=self.theta[key]-eta*self.beta[key]

Интересно, можно ли напрямую изменить self.theta[0] без получения ошибки? Массив numpy кажется обходным решением, но мне нужно сильно изменить код, поэтому я думаю только о методах torch.

ps Я знаю, что список не может умножаться на fp, но почему для l oop повторяет .items() работает? Полные скрипты ниже:

beta = defaultdict(list)
theta = defaultdict(list)
layer = [500,300,100,3]
eta = 0.1
i = 0
for l in layer[0:-1]:
    # print(l)
    theta[l] = (torch.randn(l, layer[i+1]))/math.sqrt(l)
    beta[l] = torch.Tensor(l, layer[i+1])
    i += 1


theta[0] = theta[0] - eta * beta[0]
# TypeError: can't multiply sequence by non-int of type 'float'

for key, value in theta.items():
    theta[key] = theta[key] - eta * beta[key]
    print('theta:', theta[key])
# This is okay
...