开启成长之旅!这是我参加「日新方案 12 月更文挑战」的第17天,点击查看活动详情 这个是我个人学习笔记,跟着b站沐神学习,链接: 08 线性回归 + 根底优化算法【动手学深度学习v2】_哔哩哔哩_bilibili
我仅仅对代码进行一些解读,发现有解读不对的当地,欢迎大家来谈论区评论
我将其分为上下两篇来讲解
生成数据集
咱们将从零开端完成整个办法,包括数据流水线、模型、损失函数和小批量随机梯度下降优化器
第一步:导包
import torch
import random
from d2l import torch as d2l
若显示报错,没有d2l这个模块,在jupyter notebook中输入
!pip install -U d2l
第二步:结构函数
def synthetic_data(w,b,num_examples):
'''生成y = wx + b + 噪声。 '''
x = torch.normal(0,1,(num_examples,len(w)))
y = torch.matmul(x,w) + b
y += torch.normal(0,0.01,y.shape)
return x,y.reshape((-1,1))
true_w = torch.tensor([2,-3.4])
true_b = 4.2
features,labels = synthetic_data(true_w,true_b,1000)
print("features:",features[0],"\nlabels:",labels[0])
1)此处b是个一维向量,当matmul的第一个参数是2维向量,第2个参数是一维向量时,返回的是矩阵和向量的乘积,结果是向量,因而,y需求reshape
2)reshape中-1表明主动计算,1表明固定,即列向量为1
3)创立一个形状为(3,4)的张量。 其中的每个元素都从均值为0、规范差为1的规范高斯分布(正态分布)中随机采样。
normal(0, 1, size=(3, 4))
结果
第三步:画图看一下是不是线性相关
d2l.set_figsize()
d2l.plt.scatter(features[:,-1].detach().numpy(),
labels.detach().numpy(),1)
1)detach()分离出数值,不再含有梯度
2)scatter()函数最终的一个1是绘制点直径的巨细,假如改成50会看到一个个点非常粗
3)总的来说 生成第二个特征
features[:,1]
和labels
的散点图, 可以直观观察到两者之间的线性关系
读取数据集
第一步:界说函数
编辑
练习模型时要对数据集进行遍历,每次抽取一小批量样本,并使用它们来更新咱们的模型。 由于这个进程是练习机器学习算法的根底,所以有必要界说一个函数, 该函数能打乱数据集中的样本并以小批量方法获取数据。
鄙人面的代码中,咱们界说一个
data_iter
函数, 该函数接收批量巨细、特征矩阵和标签向量作为输入,生成巨细为batch_size
的小批量。 每个小批量包括一组特征和标签
def data_iter(batch_size,features,labels):
num_examples = len(features)
indices = list(range(num_examples))
#这些样本是随机读取的,没有特定的次序
random.shuffle(indices)
for i in range(0,num_examples,batch_size):
batch_indices = torch.tensor(
indices[i:min(i+batch_size,num_examples)])
yield features[batch_indices],labels[batch_indices]
1)只是indices这个list被打乱了,features和labels都是次序的,用循环才干随机地放进去
2)min的作用 不让拜访越界 list超出会报错,out of index
3)经过 yield,创立生成器 链接:【python】根底知识稳固(一)_heart_6662的博客-CSDN博客
咱们不再需求编写读文件的迭代类,就可以轻松完成文件读取
第二步:感受一下小批量运算
咱们直观感受一下小批量运算:读取第一个小批量数据样本并打印。 每个批量的特征维度显示批量巨细和输入特征数。 同样的,批量的标签形状与batch_size
持平
batch_size = 10
for X, y in data_iter(batch_size, features, labels):
print(X, '\n', y)
break