首页/文章/ 详情

线性神经网络2-线性回归的从零开始实现

3月前浏览61






















































































import randomimport torch
# 1. 生成数据集def syntheticData(w:torch.Tensor, b:float, numExaples:int)->tuple[torch.Tensor]:  '''  生成y=Xw+b+噪声  '''  X:torch.Tensor = torch.normal(01, (numExaples, len(w)))  y:torch.Tensor = torch.matmul(X, w) + b  y += torch.normal(00.01, y.shape) # 添加噪声数据  return X, y.reshape((-11))trueW:torch.Tensor = torch.tensor([2.0, -3.4])trueB:float = 4.2features, labels = syntheticData(trueW, trueB, 1000)
# 2. 读取数据集def dataIter(batchSize:int, features:torch.Tensor, labels:torch.Tensor):  numExamples:int = len(features)  indices:list[int] = list(range(numExamples))  # 样本随机读取无特定的顺序  random.shuffle(indices)    for idx in range(0, numExamples, batchSize):    batchIndices:torch.Tensor = torch.tensor(      indices[idx:min(idx+batchSize, numExamples)])    yield features[batchIndices], labels[batchIndices]
# 3. 初始化模型参数initW:torch.Tensor = torch.normal(0.00.01, size=(21), requires_grad=True)initB:torch.Tensor = torch.zeros(1, requires_grad=True)
# 4. 定义模型def linearRegModel(X:torch.Tensor, w:torch.Tensor, b:torch.Tensor)->torch.Tensor:  '''  线性回归模型  '''  return torch.matmul(X, w) + b
# 5. 定义损失函数def squaredLoss(PreY:torch.Tensor, TrueY:torch.Tensor)->torch.Tensor:  '''  均方损失函数  '''  return (PreY-TrueY.reshape(PreY.shape))**2/2.0
# 6. 定义优化算法def SGD(params:list[torch.Tensor], lr: float, batchSize:int):  '''  小批量随机梯度下降法  params: 模型参数集 合  lr: 学习率,确定每一步更新的大小  batchSize: 批量样本大小  '''  with torch.no_grad():    for param in params:      param -= lr*param.grad/batchSize      param.grad.zero_()
# 7. 训练lr:float = 0.03 # 学习率numEporchs:int = 3 # 循环次数batchSize: int = 10 # 小批量样本数net = linearRegModelloss = squaredLossfor epoch in range(numEporchs):  for X, y in dataIter(batchSize, features, labels):    # a. 计算损失    l = loss(net(X, initW, initB), y) # X和y的小批量损失        # b. 反向传播求导    # 因为l形状是(batchSize, 1),而不是一个标量。l中的所有元素被加到一起,    # 并以此计算关于[w,b]的梯度    l.sum().backward()        # c. 更新参数    SGD([initW,initB], lr, batchSize) # 使用参数的梯度更新参数    # 每一次循环后计算全局损失的平均值  with torch.no_grad():    train_l = loss(net(features, initW, initB), labels)    print(f'epoch {epoch+1}, loss {float(train_l.mean()):f}')
# 完成模型训练后显示训练参数和真实参数间的误差print(f'w的估计误差: {trueW - initW.reshape(trueW.shape)}')print(f'b的估计误差: {trueB - initB}')


来源:檐苔
UM
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2025-08-26
最近编辑:3月前
青瓦松
硕士 签名征集中
获赞 42粉丝 2文章 48课程 0
点赞
收藏
作者推荐

ANSA二次开发:视角函数GetViewAngles 的定义及使用

ANSA的视觉可以通过函数GetViewAngles获取,但是该函数获取的是绕原始坐标系的旋转角度向量(α,β,θ),在实际使用过程中,我们更希望获取视角向量以计算相关向量夹角。下面对视角向量进行推导。6、实现代码:importmathimporttypingdefgetViewVector()->typing.Tuple[float]:#获取视角转动角angles:typing.List[float]=base.GetViewAngles()angleRad=map(math.radians,angles)rotateSin:typing.List[float]=list(map(sin,angleRad))rotateCos:typing.List[float]=list(map(cos,angleRad))#计算视角向量三分量temp:float=rotateCos[0]*rotateSin[1]x:float=temp*rotateCos[2]+rotateSin[0]*rotateSin[2]y:float=temp*rotateSin[2]-rotateSin[0]*rotateCos[2]z:float=rotateCos[0]*rotateCos[1]return(x,y,z)来源:檐苔

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈