文章目录 线性回归的简洁实现 1. 生成数据集 2. 调用框架现有api来读取数据 3. 使用框架预定义好的层 4. 初始化模型参数 5. 均方误差 6. 实例化SGD实例(优化算法) 7. 训练
线性回归的简洁实现
上一节 张量:数据存储、线性代数;自动微分:计算梯度 开源框架,可自动化基于梯度的学习算法中重复性的工作 数据迭代器、损失函数、优化器、神经网络层
使用深度学习框架简洁实现 线性回归模型 生成数据集
1. 生成数据集
import numpy as np
import torch
from torch. utils import data
from d2l import torch as d2ltrue_w = torch. tensor( [ 2 , - 3.4 ] )
true_b = 4.2
features, labels = d2l. synthetic_data( true_w, true_b, 1000 )
2. 调用框架现有api来读取数据
def load_array ( data_arrays, batch_size, is_train= True ) : dataset = data. TensorDataset( * data_arrays) return data. DataLoader( dataset, batch_size, shuffle= is_train)
batch_size= 10
data_iter= load_array( ( features, labels) , batch_size)
next ( iter ( data_iter) )
3. 使用框架预定义好的层
标准深度学习模型,使用框架预定义好的层 关注用哪些层来构造模型,不必关注层的实现细节 Sequential类将多个层串联在一起,(标准的流水线) 当给定输入数据时,Sequential实例将数据传入到第一层, 然后将第一层输出作为第二层输入,以此类推
from torch import nn
net= nn. Sequential( nn. Linear( 2 , 1 ) )
4. 初始化模型参数
net[ 0 ] . weight. data. normal_( 0 , 0.01 )
net[ 0 ] . bias. data. fill_( 0 )
5. 均方误差
MSELoss类 平方范数(L2范数) 默认返回所有样本损失的平均值
loss= nnLMSELoss( )
6. 实例化SGD实例(优化算法)
trainer = torch. optim. SGD( net. parameters( ) , lr= 0.03 )
7. 训练
不必单独分配参数;不必定义损失函数;不必手动实现小批量随机梯度下降 复杂模型,有所有基本组件 每个迭代周期 完整遍历一次数据集 (从中获取一个小批量输入和相应的标签) 调用net(x)生成预测并计算损失1(前向传播) 通过反向传播计算梯度 通过调用优化器来更新模型参数 计算每个迭代周期后的损失,并打印它来监控训练过程
num_epochs = 3
for epoch in range ( num_epochs) : for X, y in data_iter: l = loss( net( X) , y) trainer. zero_grad( ) l. backward( ) trainer. step( ) l = loss( net( features) , labels) print ( f'epoch { epoch + 1 } , loss { l: f } ' )
比较生成数据集的真实参数和通过有限数据集训练获得的模型参数
w = net[ 0 ] . weight. data
print ( 'w的估计误差:' , true_w - w. reshape( true_w. shape) )
b = net[ 0 ] . bias. data
print ( 'b的估计误差:' , true_b - b)