深度学习第三章,线性表示

张开发
2026/4/9 14:27:01 15 分钟阅读

分享文章

深度学习第三章,线性表示
#模型就是函数 #李哥样例我的分部解析 import torch import matplotlib.pyplot as plt # 画图的包 import random #随机 def create_data(w, b, data_num): #生成数据 x torch.normal(0, 1, (data_num, len(w))) # torch.normal 函数用于正态分布 y torch.matmul(x, w) b #matmul表示矩阵相乘 noise torch.normal(0, 0.01, y.shape) #噪声要加到y上 y noise #设置噪声 return x, y num 500 true_w torch.tensor([8.1,2,2,4]) #创建张量 true_b torch.tensor(1.1) #创建张量的好处PyTorch中的张量支持多种操作包括转置、索引、切片、数学运算、线性代数和随机数生成等。这些操作使得张量成为处理和变换数据的强大工具 X, Y create_data(true_w, true_b, num) #X通过正态分布Y通过线性组合 plt.scatter(X[:, 3], Y, 1)#绘图 plt.show() def data_provider(data, label, batchsize): #每次访问这个函数 就能提供一批数据 length len(label) indices list(range(length))#创建一张从 0到 length - 1的连续整数列表 #我不能按顺序取 把数据打乱 random.shuffle(indices)#打乱顺序 for each in range(0, length, batchsize): get_indices indices[each: eachbatchsize] get_data data[get_indices] get_label label[get_indices] yield get_data,get_label #有存档点的return batchsize 16 # for batch_x, batch_y in data_provider(X, Y, batchsize): # print(batch_x, batch_y) # break def fun(x, w, b): #实现简单的线性变换基于输入的张量x\权重w和偏置b计算预测值 pred_y torch.matmul(x, w) b return pred_y def maeLoss(pre_y, y): #损失函数 return torch.sum(abs(pre_y-y))/len(y) def sgd(paras, lr): #随机梯度下降更新参数 with torch.no_grad(): #属于这句代码的部分不计算梯度 for para in paras: para - para.grad * lr #不能写成 para para - para.grad*lr para.grad.zero_() #使用过的梯度归0 lr 0.03 w_0 torch.normal(0, 0.01, true_w.shape, requires_gradTrue) #这个w需要计算梯度参数1均值参数2标准差参数3张量形状参数4是否启动微分机制 b_0 torch.tensor(0.01, requires_gradTrue) print(w_0, b_0) epochs 50 for epoch in range(epochs): #机器学习训练循环 epochs是训练的总轮数 data_loss 0##初始化一个变量 data_loss用于累积当前 epoch 中所 有批次batch的损失值。目的是计算整个 epoch 的平均或总损失用于评估训练效果。 for batch_x, batch_y in data_provider(X, Y, batchsize): #内层循环从 data_provider 函数获取训练数据的批次mini-batch。data_provider 是一个自定义的数据迭代器或生成器每次返回一个批次的输入数据 batch_x 和对应标签 batch_y。X, Y 是完整的训练数据和标签。 batchsize 是批次大小比如 32 或 64表示每次训练多少条数据。 pred_y fun(batch_x,w_0, b_0)#调用模型函数 fun进行前向计算 loss maeLoss(pred_y, batch_y)#计算预测值 pred_y 和真实标签 batch_y 之间的损失。 loss.backward()#执行反向传播自动计算损失函数相对于模型参数的梯度 sgd([w_0, b_0], lr)#调用自定义的随机梯度下降SGD优化函数利用计算好的梯度更新模型参数 data_loss loss print(epoch %03d: loss: %.6f%(epoch, data_loss))#格式化 print(真实的函数值是, true_w, true_b) print(训练得到的参数值是, w_0, b_0) idx 3 plt.plot(X[:, idx].detach().numpy(), X[:, idx].detach().numpy()*w_0[idx].detach().numpy()b_0.detach().numpy()) plt.scatter(X[:, idx], Y, 1) plt.show() #一定注意维度一般维度不错就不会错同学们尽量理解该部分每一行代码过段时间进行知识回顾训练后的结果

更多文章