В основном, поскольку этот поток обсуждает здесь , вы не можете использовать список python для обертывания ваших подмодулей (например, ваших слоев); в противном случае Pytorch не собирается обновлять параметры субмодулей внутри списка. Вместо этого вы должны использовать nn.ModuleList
, чтобы обернуть ваши подмодули, чтобы убедиться, что их параметры будут обновлены. Теперь я также видел такие коды, как следующие, где автор использует список python для расчета потерь, а затем делает loss.backward()
для обновления (в алгоритме подкрепления RL). Вот код:
policy_loss = []
for log_prob in self.controller.log_probability_slected_action_list:
policy_loss.append(- log_prob * (average_reward - b))
self.optimizer.zero_grad()
final_policy_loss = (torch.cat(policy_loss).sum()) * gamma
final_policy_loss.backward()
self.optimizer.step()
Почему использование списка в этом формате работает для обновления параметров модулей, но первый случай не работает? Я очень смущен сейчас. Если я изменяю в предыдущем коде policy_loss = nn.ModuleList([])
, выдается исключение, говорящее, что тензорное плавание не является субмодулем.