动手学习深度学习 3-1 Linear-regression

Linear-regression

1. 线性回归

线性回归模型尽量写成矩阵形式进行计算。

为什么矩阵计算比循环快很多?
【知乎】因为通常的数学库,矩阵运算都是用BLAS、ATLAS之类的库。这些库中,矩阵运算都是优化过的(也就是说通常不会用两层循环来计算矩阵乘法,具体的计算方法请参考源代码)。
当然,还有更厉害的,就是底层调用CPU级别的运算指令。例如intel的MKL就是一个做高速浮点运算的库,比直接编译C语言还要快(10000x10000维的矩阵分解速度可以从10s级加速到0.1s级)。Windows下的Matlab和自己编译的numpy都可以调用MKL,所以矩阵运算速度快得发指。

2. Linear-regression-scratch

生成数据集

num_inputs = 2
num_examples = 1000
true_w = [2, -3.4]
true_b = 4.2
features = nd.random.normal(scale=1, shape=(num_examples, num_inputs))
labels = true_w[0] * features[:, 0] + true_w[1] * features[:, 1] + true_b
labels += nd.random.normal(scale=0.01, shape=labels.shape)

定义模型

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):
        j = nd.array(indices[i: min(i + batch_size, num_examples)])
        yield features.take(j), labels.take(j)  # take函数根据索引返回对应元素

def linreg(X, w, b):  # 计算模型
    return nd.dot(X, w) + b

def squared_loss(y_hat, y):  # 损失函数
    return (y_hat - y.reshape(y_hat.shape)) ** 2 / 2

def sgd(params, lr, batch_size):  # 优化算法
    for param in params:
        param[:] = param - lr * param.grad / batch_size

训练模型

w = nd.random.normal(scale=0.01, shape=(num_inputs, 1))
b = nd.zeros(shape=(1,))
w.attach_grad()
b.attach_grad()

lr = 0.005
num_epochs = 3
net = linreg
loss = squared_loss

for epoch in range(num_epochs):  # 训练模型一共需要num_epochs个迭代周期
    # 在每一个迭代周期中,会使用训练数据集中所有样本一次(假设样本数能够被批量大小整除)。X
    # 和y分别是小批量样本的特征和标签
    for X, y in data_iter(batch_size, features, labels):
        with autograd.record():
            l = loss(net(X, w, b), y)  # l是有关小批量X和y的损失
        l.backward()  # 小批量的损失对模型参数求梯度
        sgd([w, b], lr, batch_size)  # 使用小批量随机梯度下降迭代模型参数
    train_l = loss(net(features, w, b), labels)
    print('epoch %d, loss %f' % (epoch + 1, train_l.mean().asnumpy()))

输出

epoch 1, loss 6.080254
epoch 2, loss 2.208225
epoch 3, loss 0.802806

3. Linear-regression-gluon

from mxnet import autograd, nd
from mxnet.gluon import data as gdata

# 生成数据集
num_inputs = 2
num_examples = 1000
true_w = [2, -3.4]
true_b = 4.2
features = nd.random.normal(scale=1, shape=(num_examples, num_inputs))
labels = true_w[0] * features[:, 0] + true_w[1] * features[:, 1] + true_b
labels += nd.random.normal(scale=0.01, shape=labels.shape)

# 读取数据
batch_size = 10
# 将训练数据的特征和标签组合
dataset = gdata.ArrayDataset(features, labels)
# 随机读取小批量
data_iter = gdata.DataLoader(dataset, batch_size, shuffle=True)

# 定义模型
# 神经网络模型
from mxnet.gluon import nn
net = nn.Sequential()  # 串联各层的容器
net.add(nn.Dense(1))  # 增加一个全连接层
# 初始化模型参数
from mxnet import init
net.initialize(init.Normal(sigma=0.01))
# 定义损失函数
from mxnet.gluon import loss as gloss
loss = gloss.L2Loss()  # 平方损失又称L2范数损失
# 定义优化算法
from mxnet import gluon
trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': 0.03})

# 训练模型
num_epochs = 3
for epoch in range(1, num_epochs + 1):
    for X, y in data_iter:
        with autograd.record():
            l = loss(net(X), y)
        l.backward()
        trainer.step(batch_size)  # 对比之前的 sgd
    l = loss(net(features), labels)
    print('epoch %d, loss: %f' % (epoch, l.mean().asnumpy()))

# 训练结果
dense = net[0]  # 从net获取需要的层
dense.weight.data()  # 学习到的权重
dense.bias.data()  # 学习到的偏差

原文地址:https://www.cnblogs.com/haricotvert/p/12258924.html

时间: 2024-07-29 15:08:51

动手学习深度学习 3-1 Linear-regression的相关文章

小白学习之pytorch框架(2)-动手学深度学习(begin)

在这向大家推荐一本书-花书-动手学深度学习pytorch版,原书用的深度学习框架是MXNet,这个框架经过Gluon重新再封装,使用风格非常接近pytorch,但是由于pytorch越来越火,个人又比较执着,想学pytorch,好,有个大神来了,把<动手学深度学习>整本书用pytorch代码重现了,其GitHub网址为:https://github.com/ShusenTang/Dive-into-DL-PyTorch   原书GitHub网址为:https://github.com/d2l-

DataWhale 动手学深度学习PyTorch版-task3+4+5:文本预处理;语言模型;循环神经网络基础

课程引用自伯禹平台:https://www.boyuai.com/elites/course/cZu18YmweLv10OeV <动手学深度学习>官方网址:http://zh.gluon.ai/ ——面向中文读者的能运行.可讨论的深度学习教科书. 第二次打卡: Task03: 过拟合.欠拟合及其解决方案:梯度消失.梯度爆炸:循环神经网络进阶 Task04:机器翻译及相关技术:注意力机制与Seq2seq模型:Transformer Task05:卷积神经网络基础:leNet:卷积神经网络进阶 有

分享《动手学深度学习》高清PDF+视频教程-李沐著

下载:https://pan.baidu.com/s/10EKdEe-vjp9i97xP1FWuGA 更多资料学习:http://blog.51cto.com/14087171 由 MXNet 创始人李沐大神.Aston Zhang 等人所著的交互式书籍<动手学深度学习>推出了在线预览版,面向在校学生.工程师和研究人员,旨在帮助读者从入门到深入.动手学习深度学习,即使是零基础的读者也完全适用. 在本书上线之前,李沐等人还推出了<动手学深度学习>系列视频,这门课程的第一季已经于今年

分享《动手学深度学习(李沐等著)》PDF+源代码+《神经网络与深度学习(吴岸城)著》PDF

下载:https://pan.baidu.com/s/11O2m_uxSWJGbkXHF2Zh94w 更多资料:https://pan.baidu.com/s/1g4hv05UZ_w92uh9NNNkCaA <动手学深度学习(李沐等著)> 中文PDF,530页,带书签目录,文字可以复制粘贴.配套源代码. <神经网络与深度学习 (吴岸城)著>中文PDF,233页,带书签目录. 如图: 原文地址:https://www.cnblogs.com/limujun/p/10054478.ht

对比《动手学深度学习》 PDF代码+《神经网络与深度学习 》PDF

随着AlphaGo与李世石大战的落幕,人工智能成为话题焦点.AlphaGo背后的工作原理"深度学习"也跳入大众的视野.什么是深度学习,什么是神经网络,为何一段程序在精密的围棋大赛中可以大获全胜?人工智终将会取代人类智慧吗? <神经网络与深度学习>是一本介绍神经网络和深度学习算法基本原理及相关实例的书籍,它不是教科书,作者已尽量把公式减少到最少,以适应绝大部分人的阅读基础和知识储备.<神经网络与深度学习>涵盖了神经网络的研究历史.基础原理.深度学习中的自编码器.深

【动手学深度学习】Jupyter notebook中 import mxnet出错

问题描述 打开d2l-zh目录,使用jupyter notebook打开文件运行,import mxnet 出现无法导入mxnet模块的问题, 但是命令行运行是可以导入mxnet模块的. 原因: 激活环境是能够运行代码的前提. 解决方法: 在d2l-zh目录运行conda activate gluon命令,然后再打开jupyter notebook,则可以正常导入mxnet模块. 参考 1. d2l-zh-doc; 2. [动手学深度学习]中Jupyter notebook中 import mx

使用腾讯云 GPU 学习深度学习系列之二:Tensorflow 简明原理【转】

转自:https://www.qcloud.com/community/article/598765?fromSource=gwzcw.117333.117333.117333 这是<使用腾讯云 GPU 学习深度学习>系列文章的第二篇,主要介绍了 Tensorflow 的原理,以及如何用最简单的Python代码进行功能实现.本系列文章主要介绍如何使用 腾讯云GPU服务器 进行深度学习运算,前面主要介绍原理部分,后期则以实践为主. 往期内容: 使用腾讯云 GPU 学习深度学习系列之一:传统机器学

学习深度学习网址

1.从零开始学习深度学习的网址,包括全连接神经网络.卷积神经网络.循环神经网络等等: https://www.zybuluo.com/hanbingtao/note/485480 2.python 2学习的网址: https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 原文地址:https://www.cnblogs.com/zzm1/p/10445176.html

动手学深度学习 4 Deep-learning-computation

4. deep-learning-computaion 4.1 模型构造 4.1.1 继承Block来构造模型 Block类是nn模块里提供的一个模型构造类,我们可以继承它来定义我们想要的模型也可以继承它来构造层. 事实上,Sequential类继承自Block类.当模型的前向计算为简单串联各个层的计算时,可以通过更加简单的方式定义模型.这正是Sequential类的目的:它提供add函数来逐一添加串联的Block子类实例,而模型的前向计算就是将这些实例按添加的顺序逐一计算,且无需定义forwa

动手学深度学习第一课:从上手到多类分类-Autograd

使用autograd来自动求导 在机器学习中,我们通常使用梯度下降来更新模型参数从而求解.损失函数关于模型参数的梯度指向一个可以降低损失函数值的方向,我们不断地沿着梯度的方向更新模型从而最小化损失函数.虽然梯度计算比较直观,但对于复杂的模型,例如多达数十层的神经网络,手动计算梯度非常困难. 为此MXNet提供autograd包来自动化求导过程.虽然大部分的深度学习框架要求编译计算图来自动求导,mxnet.autograd可以对正常的命令式程序进行求导,它每次在后端实时创建计算图从而可以立即得到梯