线性pytorch模型初始化有问题
Having problems with linear pytorch model initialization
我想弄清楚我的神经网络模型初始化有什么问题。我已经设置了一个 pdb 跟踪来查看定义神经网络部分是错误的来源。另外,我在定义神经网络代码上得到了黄色标记,因为模块应该被 returned 但如果我 return 模块,它会导致递归错误。它是一个线性模型,必须具有批量大小 * 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()
根据您的评论,您的代码中的其他地方有类似的内容:
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
我想弄清楚我的神经网络模型初始化有什么问题。我已经设置了一个 pdb 跟踪来查看定义神经网络部分是错误的来源。另外,我在定义神经网络代码上得到了黄色标记,因为模块应该被 returned 但如果我 return 模块,它会导致递归错误。它是一个线性模型,必须具有批量大小 * 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()
根据您的评论,您的代码中的其他地方有类似的内容:
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