import numpy as np
import torch
from torch.utils import data
from d2l import torch as d2l
true_w=torch.tensor([2,-3.4])
true_b=4.2
features,labels=d2l.synthetic_data(true_w,true_b,1000)
# 调用torch中现有的API
# 随机从样本中选取batch_size的数据,所有样本都会取到。知识对所有样本进行了shuffle
def load_array(data_arrays,batch_size,is_train=True):
# 使用features和labels即X和y构建dataset
# *变量 *data_arrays 变量拆开
dataset=data.TensorDataset(*data_arrays)
# 使用dataLoader对象随机的从dataset中取1小批量的数据
return data.DataLoader(dataset,batch_size,shuffle=is_train)
batch_size=10
data_iter=load_array((features,labels),batch_size)
# 每次调用yield会暂停,使用next()和send()恢复生成器
# next()调用生成器生成1次数据
next(iter(data_iter))
[tensor([[-0.2995, 0.8167],
[-0.7327, 0.2537],
[ 0.1009, -0.5376],
[-1.1368, -0.8702],
[-0.7915, 0.0309],
[-1.3095, -0.3649],
[ 1.3855, -2.0293],
[ 0.9794, -1.5986],
[-0.9072, -0.2279],
[ 0.0075, -0.4216]]),
tensor([[ 0.8310],
[ 1.8819],
[ 6.2155],
[ 4.8751],
[ 2.5102],
[ 2.8166],
[13.8560],
[11.5803],
[ 3.1607],
[ 5.6510]])]
# 使用torch定义好的层
from torch import nn
# linear层 全连接层 2,1 输入维度,输出维度
# Sequential 神经网络层的容器
net=nn.Sequential(nn.Linear(2,1))
# 初始化模型参数
net[0].weight.data.normal_(0,0.01)
net[0].bias.data.fill_(0)
tensor([0.])
# 损失函数 MSE 均方误差
loss=nn.MSELoss()
# 实例化小批量梯度下降SGD
# parameters所有参数包括w和b
# SGD,随机梯度下降
trainer=torch.optim.SGD(net.parameters(),lr=0.03)
# 开始训练
num_epochs=3
for epoch in range(num_epochs):
# 获取小批量样本
for X,y in data_iter:
# net中带有w和b,传入x即可
l=loss(net(X),y)
# 梯度请0
trainer.zero_grad()
# 后向传播,内部torch帮助求sum()了
l.backward()
# 走一步 更新1次w和b
trainer.step()
l=loss(net(features),labels)
# {1:f} 把l用浮点数方式表示
print(f'epoch {epoch+1}, loss {l:f}')
epoch 1, loss 0.000225
epoch 2, loss 0.000103
epoch 3, loss 0.000103
query
怎么找到合适的学习率?
batchsize的合适大小
随机梯度下降的随机是指?
正则
机器学习都采用一阶导算法(梯度下降),不使用二阶导算法(牛顿法)?
收敛判断:
机器学习应用在NP-complete
网络输出会出现NAN?