动手学深度学习v2 学习笔记01线性回归代码实现

手动实现代码

import random

import numpy as np
import torch
import matplotlib.pyplot as plt

def synthetic_data(w,b,num_examples):
    """ y = Xw+b+噪声 本次实际是y = x1*w1 + x2*w2 + b"""
    x = torch.normal(0,1,(num_examples,len(w)))##均值 标准差 num个样本 
    											##len第一维大小即w行数
    y = torch.matmul(x,w) + b ## 矩阵乘
    y +=torch.normal(0,0.01,y.shape) ## +b
    return x,y.reshape((-1,1)) ##-1表示自动推导

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_indics = torch.tensor(indices[i:min(i+batch_size,num_examples)])
        yield features[batch_indics],labels[batch_indics] ##返回迭代器类似于指针,
        												##可以用for in 迭代访问

def linreg(X,w,b):
    return torch.matmul(X,w) + b##X,w矩阵乘 + b

def squared_loss(y_hat,y):
    """均方损失"""
    return (y_hat - y.reshape(y_hat.shape))**2 / 2## (y_hat - y)的平方/2 
    											##reshape为了防止广播
    ##个人理解广播就是两个矩阵不是相同形状时,自动扩展成相同形状再做加减

def sgd(params,lr,batch_size):
    """小批量随机梯度下降"""
    """我们想让它不断的往收敛方向走以找到较优解,而梯度的反方向就是最快的方向
    所以更新参数[w,b]"""
    with torch.no_grad():
        for param in params:
            param -= lr * param.grad / batch_size
            param.grad.zero_()

## 生成数据
true_w = torch.tensor([2,-3.4])
true_b = 4.2
features,labels = synthetic_data(true_w,true_b,1000)


lr = 0.03
num_epochs = 3
batch_size = 10
net = linreg
loss = squared_loss

w = torch.normal(0,0.01,size=(2,1),requires_grad=True)
b = torch.zeros(1,requires_grad=True)

for epoch in range(num_epochs):
    for X,y in data_iter(batch_size,features,labels):
        l = loss(net(X,w,b),y)
        l.sum().backward()
        sgd([w,b],lr,batch_size)
    with torch.no_grad():
        train_l = loss(net(features,w,b),labels)
        print(f'epoch{epoch+1},loss{float(train_l.mean()):f}')

print(f'w的估计误差:{true_w-w.reshape(true_w.shape)}')
print(f'b的估计误差:{true_b-b}')

##tensor转numpy  .detach().numpy()
plt.scatter(features[:,1].detach().numpy(),labels.detach().numpy(),1) ##画散点
x = np.linspace(-5,5,50)
y = x * w[1].detach().numpy() + b.detach().numpy()
plt.plot(x,y,color='green') ##画线
plt.show()
plt.scatter(features[:,0].detach().numpy(),labels.detach().numpy(),1)
y = x * w[0].detach().numpy() + b.detach().numpy()
plt.plot(x,y,color='green')
plt.show()

运行结果

在这里插入图片描述
在这里插入图片描述

pytorch实现代码

import numpy as np
import torch
from torch.utils import data
from torch import nn
import matplotlib.pyplot as plt

def synthetic_data(w,b,num_examples):
    """ y = Xw+b+噪声 本次实际是y = x1*w1 + x2*w2 + b"""
    x = torch.normal(0,1,(num_examples,len(w)))##均值 标准差 num个样本 
    											##len第一维大小即w行数
    y = torch.matmul(x,w) + b ## 矩阵乘
    y +=torch.normal(0,0.01,y.shape) ## +b
    return x,y.reshape((-1,1)) ##-1表示自动推导

def load_array(data_arrays,batch_size,is_train=True):
    """构造torch数据迭代器"""
    dataset = data.TensorDataset(*data_arrays)
    return data.DataLoader(dataset,batch_size,shuffle=is_train)

true_w = torch.tensor([2,-3.4])
true_b = 4.2
features,labels = synthetic_data(true_w,true_b,1000)

batch_size = 10
data_iter = load_array((features,labels),batch_size)##类似于手动实现时的yield返回迭代器

# print(next(iter(data_iter)))

net = nn.Sequential(nn.Linear(2,1))
net[0].weight.data.normal_(0,0.01)
net[0].bias.data.fill_(0)

loss = nn.MSELoss() ## 均方
trainer = torch.optim.SGD(net.parameters(),lr=0.03)##随机梯度下降,相同时间多次更新参数
                                                    ##加速收敛

num_epochs = 3
for epoch in range(num_epochs):
    for X,y in data_iter:
        trainer.zero_grad() ## 清零梯度,pytorch梯度累计而不是替换
                            ##个人觉得这句话也可以写在backward之后,
                            ##只要上次计算的梯度不影响下次就行
        l = loss(net(X),y)
        l.backward() ## 自动计算梯度
        trainer.step() ##根据梯度,使用优化器,更新参数
    l = loss(net(features),labels)## 这里只是看一下现在的loss
                                ## 不需要清梯度,没有backward,没有计算梯度
    print(f'epoch{epoch+1},loss{l:f}')##:f表示以浮点数形式输出,有点类似于c语言

##tensor转numpy  .detach().numpy()
plt.scatter(features[:,1].detach().numpy(),labels.detach().numpy(),1) ##画散点
x = np.linspace(-5,5,50)
y = x * net[0].weight.data[0][1].detach().numpy() + net[0].bias.data.detach().numpy()
plt.plot(x,y,color='green') ##画线
plt.show()
plt.scatter(features[:,0].detach().numpy(),labels.detach().numpy(),1)
y = x * net[0].weight.data[0][0].detach().numpy() + net[0].bias.data.detach().numpy()
plt.plot(x,y,color='green')
plt.show()

运行结果

在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 动手深度学习v2是一本非常好的深度学习教材,是从谷歌机器学习研究员李沐所主持的Gluon团队创作的。它提供了丰富的案例和实际应用,深入浅出地介绍了深度学习的基础理论和实践技能。 下载动手深度学习v2非常简单,可以通过访问官方网站来获取。首先,打开谷歌或百度搜索引擎,搜索"动手深度学习v2下载",就可以找到相关的下载链接。建议选择官网下载,因为官网下载最为安全可靠。 进入官网后,点击首页上的"下载"按钮,然后在目录下找到本书的下载链接,下载适合你的版本即可。此外,动手深度学习v2还有在线阅读的版本,方便学习者随时随地学习。 总的来说,动手深度学习v2是一本非常优秀的深度学习教材,相关下载链接也十分便捷,能够帮助广大学习者更好地掌握深度学习相关的知识和技能。 ### 回答2: 动手深度学习v2是一本非常优秀的深度学习入门书籍,笔者十分推荐。如果您想要下载该书籍,可以使用以下方法: 1.进入动手深度学习v2的官网(https://zh.d2l.ai/),点击右上角的“Github”按钮,进入书籍的Github仓库。 2.在仓库中找到“releases”目录,选择最新的版本号,点击进入。 3.在该版本的页面中,找到“Source code (zip)”或“Source code (tar.gz)”选项,点击下载压缩包。 4.下载完成后,解压缩文件即可得到电子书的文件夹,其中包括PDF和HTML格式的书籍。 除此之外,您也可以在该官网中找到由中文社区翻译的在线电子书版本。在该电子书中,您可以直接在线阅读和学习。值得注意的是,该书籍的在线翻译版本可能会比英文原版稍有滞后。如果您想要阅读最新的内容,请下载英文原版或者在该官网上查看最新的更新。 ### 回答3: 学习深度学习是现在的热门话题之一。而动手深度学习v2是一本非常好的深度学习教材,旨在为做实际项目的学习者提供知识技能和实战经验。为了下载此书,您需要按照以下步骤进行。 首先,您需要访问动手深度学习官方网站,网址为d2l.ai。然后,您需要找到下载页面,这个页面可以通过页面上的“全书下载”按钮或主页面上的一个标签来访问。 在下载页面,您需要选择您所需要的版本,v2版本是最新版本。接着,您需要选择您所需的格式。您可以选择PDF格式或HTML格式,下方还提供了在线阅读链接。 若您选择了PDF格式,则需要点击下载链接,页面会跳到GitHub仓库中。在GitHub页面,您需要选择ZIP文件并下载。下载完成后,您就可以在本地解压并阅读这本书了。 若您选择了HTML格式,则不需下载,只需点击在线阅读链接即可。页面会跳转到包含书籍所有章节、实例代码、作者笔记等信息的HTML页面,您可以任意阅读或者下载章节(在左侧点击对应章节)。 总之,动手深度学习v2是一本亲身实践的深度学习教材,其深入浅出的讲解以及丰富的实战案例,能够帮助初者快速掌握深度学习这一技术,同时也是深度学习领域专业人士的必备读物。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值