线性代数 相关代码解析

import torch
import matplotlib.pyplot as plt #画图的
import random #随机
 
#生成基础数据
def create_data(w,b,data_num):#权重,偏置以及数据条数
    x = torch.normal(0,0.1,(data_num,len(w)))#生成data行,w的长度列,x的列数要和w的长度相同才能做矩阵运算
    y = torch.matmul(x,w)+b #矩阵相乘x与w,再加上偏置
    noise = torch.normal(0,0.1,y.shape)#y要加上噪声,实际上必须要考虑其他因素的影响,这里统一为噪声,因为噪声要和y相加,所以形状一致
    y+=noise
    return x,y
num = 500 #表明要生成500条数据,代替data_num
 
true_w = torch.tensor([6.1,2,2,4])#定义真正的w
true_b = torch.tensor(1.1) #定义真正的b
 
 
X,Y = create_data(true_w,true_b,num)
 
plt.scatter(X[:,0],Y,1)#画图,x要全部行,第一列,y就一个数
plt.show()
 
 
#每次访问这个函数,就能提供一批数据
def data_provider(data,label,batchsize):#x为data,y为label,batchsize为步长
    length = len(label) #提取label长度
    indices = list(range(length))#将这个长度化为一个范围的列表,比如length为4,indices为[0,1,2,3]
    random.shuffle(indices) #把列表中的数字顺序打乱,因为实际不会给出有序的数据
 
    for each in range(0,length,batchsize):#batchsize为步长
        get_indices = indices[each: each+batchsize]#做切片操作
        get_data = data[get_indices]
        get_label = label[get_indices]
 
        yield get_data,get_label #有存档点的return,能存储每一次循环的数据
 
batchsize = 16
 
#求y~
def fun(x,w,b):
    pred_y = torch.matmul(x,w)+b
    return pred_y
#损失函数
def maoLoss(pred_y,y):
    return torch.sum(abs(pred_y-y))/len(y) #对差值求和取平均
#随机梯度下降,更新参数
def sgd(paras,lr):#lr表学习率
    with torch.no_grad(): #属于这句代码的部分,不计算梯度,如果直接计算会出现很多多余的梯度
        for para in paras:
            para -= para.grad*lr  #不能写成 pa=pa-。。。
            para.grad.zero_()   #使用过的梯度归零
lr = 0.05
w_0 = torch.normal(0,0.1,true_w.shape,requires_grad=True) #这个w需要求梯度
b_0 = torch.tensor(0.01,requires_grad=True) #b0直接给数
print(w_0,b_0)
 
#给出训练次数
epochs = 100
 
for epoch in range(epochs):
    data_loss = 0 #初始总损失
    for batch_x,batch_y in data_provider(X,Y,batchsize): # 获取一个小批量的训练数据
        pred_y = fun(batch_x,w_0,b_0)
        loss = maoLoss(pred_y,batch_y)
        loss.backward() # 反向传播,计算梯度
        sgd([w_0,b_0],lr)  # 使用随机梯度下降更新参数
        data_loss+=loss # 累加当前批次的损失
    print("epoch %03d: loss: %.6f"%(epoch,data_loss)) #每一次训练之后打印出当前的损失,损失会越来越小,说明在优化
 
 
print("真实值是:",true_w,true_b)
print("训练值是",w_0,b_0)
 
#画图
idx = 3
#画图前要把下x,w,b从张量网上摘下来
#绘制模型的预测曲线
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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值