示例:模型定义与训练

以下示例展示了如何逐步搭建两层神经网络模型,并通过几行Python代码从头开始进行模型训练。

  1. import jittor as jt
  2. import numpy as np
  3. from jittor import nn, Module, init

以下代码定义了我们的模型,该模型是一个两层神经网络。 隐藏层的大小为10,激活函数为relu。

  1. ### model define
  2. class Model(Module):
  3. def __init__(self):
  4. self.layer1 = nn.Linear(1, 10)
  5. self.relu = nn.ReLU()
  6. self.layer2 = nn.Linear(10, 1)
  7. def execute (self,x) :
  8. x = self.layer1(x)
  9. x = self.relu(x)
  10. x = self.layer2(x)
  11. return x

最后,从头开始训练该模型。 优化器使用简单的梯度下降,损失函数为L2距离。 为提高效率训练过程是异步的。 jittor通过统一计算图即时分析器计算梯度,并进行计算图级和算子级的优化。

在该示例中,Jittor使用了多个优化,包括:算子融合,激活函数和损失函数可以融合到第一和第二全连接层中; 矩阵乘法中的三元算子也可以融合。 并行化,它可以提高现代多核CPU和GPU上计算密集型运算的性能。 算子融合是一种计算图级优化,而并行化则同时作用于图形级和算子级的优化。

  1. np.random.seed(0)
  2. jt.set_seed(3)
  3. n = 1000
  4. batch_size = 50
  5. def get_data(n):
  6. for i in range(n):
  7. x = np.random.rand(batch_size, 1)
  8. y = x*x
  9. yield jt.float32(x), jt.float32(y)
  10. model = Model()
  11. learning_rate = 0.1
  12. optim = nn.SGD (model.parameters(), learning_rate)
  13. for i,(x,y) in enumerate(get_data(n)):
  14. pred_y = model(x)
  15. loss = jt.sqr(pred_y - y)
  16. loss_mean = loss.mean()
  17. optim.step (loss_mean)
  18. print(f"step {i}, loss = {loss_mean.data.sum()}")
  19. assert loss_mean.data < 0.005