一、自定义神经网络
import torch import tqdm class TwoLayerNet(torch.nn.Module): def __init__(self, D_in, H, D_out): """ 在构造函数中,我们实例化了两个nn.Linear模块,并将它们作为成员变量。 """ super(TwoLayerNet, self).__init__() self.linear1 = torch.nn.Linear(D_in, H) self.linear2 = torch.nn.Linear(H, D_out) def forward(self, x): #.clamp(input, min, max, out=None) → Tensor表示将结果限定在【min,max】之间 h_relu = self.linear1(x).clamp(min=0) y_pred = self.linear2(h_relu) return y_pred #定义输入输出,构建模型、损失函数、优化器 N, D_in, H, D_out = 64, 1000, 100, 10 # N是批大小; D_in 是输入维度;H 是隐藏层维度; D_out 是输出维度 x = torch.randn(N, D_in) #x.shape=torch.Size([64, 1000]) y = torch.randn(N, D_out)#y.shape=torch.Size([64, 10]) model = TwoLayerNet(D_in, H, D_out) loss_fn = torch.nn.MSELoss(reduction='sum')# 构造损失函数和优化器。 optimizer = torch.optim.SGD(model.parameters(), lr=1e-4)# SGD构造函数中对model.parameters()的调用 #K开始模型训练 for i in tqdm.tqdm(range(500)): y_pred = model(x)# 前向传播:通过向模型传递x计算预测值y loss = loss_fn(y_pred, y)#计算并输出loss if (i+1)%100==0: print(i, loss.item()) optimizer.zero_grad()# 清零梯度,反向传播,更新权重 loss.backward() optimizer.step()
验证一下结果:
model(x[10,:])
y[10,:]
Out[32]: