#python #deep-learning #neural-network #pytorch #initialization
Вопрос:
Я пытаюсь понять, что не так с моей инициализацией модели нейронной сети. Я уже настроил трассировку pdb, чтобы убедиться, что определяющая часть нейронной сети является источником ошибки. Кроме того, я получаю желтые метки на определяющем коде нейронной сети, потому что ожидается, что модуль будет возвращен, но если я верну модуль, это вызовет ошибку рекурсии. Это линейная модель, которая должна иметь входной размер размером партии * 81 и выходной размер размером партии * 1. Я относительно новичок в pytorch и определении глубоких нейронных сетей, так что это может быть не очень хороший вопрос. Мой синтаксис также может быть очень плохим. Любая помощь будет признательна. Приведенный ниже код является определением нейронной сети и обучением модели pytorch.
def get_nnet_model(module_list=nn.ModuleList(), input_dim: int = 8100, layer_dim: int = 100) -> nn.Module:
""" Get the neural network model
@return: neural network model
"""
device = torch.device('cpu')
module_list.append(nn.Linear(input_dim, layer_dim))
module_list[-1].weight.data.normal_(0, 0.1)
module_list[-1].bias.data.zero_()
def train_nnet(nnet: nn.Module, states_nnet: np.ndarray, outputs: np.ndarray, batch_size: int = 100, num_itrs: int = 10000, train_itr: int = 10000, device: torch.device, lr=0.01, lr_d=1):
nnet.train()
criterion = nn.MSELoss()
optimizer = optim.Adam(nnet.parameters(), lr=lr)
while train_itr < num_itrs:
optimizer.zero_grad()
lr_itr = lr (lr_d ** train_itr)
for param_group in optimizer.param_groups:
param_group['lr'] = lr_itr
data = pickle.load(open("data/data.pkl", "rb"))
nnet_inputs_np, nnet_targets_np = data
nnet_inputs_np = nnet_inputs_np.astype(np.float32)
nnet_inputs = torch.tensor(nnet_inputs_np, device=device)
nnet_targets = torch.tensor(nnet_targets_np, device=device)
nnet_inputs = nnet_inputs.float()
nnet_outputs = nnet(nnet_inputs)
loss = criterion(nnet_outputs, nnet_targets)
loss.backward()
optimizer.step()
Комментарии:
1. В чем именно заключается проблема? Есть сообщение об ошибке? Если это так, обновите с полной обратной связью.
2. Я завершил трассировку, и проблема заключается в определении get_nnet_model. Я не уверен, что конкретно вызывает проблему, но где-то в этой части не работает. Когда я запускаю код, используя nnet.train() в main, в нем говорится, что существует «Ошибка атрибута: объект ‘NoneType’ не имеет атрибута ‘train'».
Ответ №1:
Основываясь на вашем комментарии, где-то еще в вашем коде у вас есть что-то вроде:
nnet = get_nnet_model(...)
Однако get_nnet_model(...)
ничего не возвращает. Измените def get_nnet_model
на:
def get_nnet_model(module_list=nn.ModuleList(), input_dim: int = 8100, layer_dim: int = 100) -> nn.Module:
""" Get the neural network model
@return: neural network model
"""
device = torch.device('cpu')
module_list.append(nn.Linear(input_dim, layer_dim))
module_list[-1].weight.data.normal_(0, 0.1)
module_list[-1].bias.data.zero_()
return module_list # add this one
Комментарии:
1. О, ты определенно права. Я совершенно забыл добавить это возвращение в конце. Глупая ошибка, моя вина. Спасибо за помощь.
2. Не волнуйся @growt, это случается со всеми 🙂 В следующем вопросе старайтесь всегда указывать сообщение об ошибке вместе с обратной связью. Это помогает людям, которые пытаются помочь вам.