zl程序教程

您现在的位置是:首页 >  后端

当前栏目

利用pytorch构建一个完整的自定义神经网络

PyTorch神经网络 一个 利用 自定义 构建 完整
2023-09-11 14:21:06 时间

一、自定义神经网络

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,:]

tensor([ 1.4095, -0.6204,  0.3325, -0.4508,  0.6825,  0.2807,  1.5006, -1.2011,
         0.9163,  1.5965], grad_fn=<AddBackward0>)
Out[32]:
tensor([ 1.4095, -0.6204,  0.3325, -0.4508,  0.6825,  0.2807,  1.5006, -1.2012,
         0.9163,  1.5965])
结果预测的真是丝毫不差