《动手学深度学习》学习笔记(三)

本文介绍了深度学习基础,包括线性回归的模型构建、训练过程,以及softmax回归在离散预测中的应用。接着探讨了Fashion-MNIST数据集,并演示了多层感知机和模型选择策略,如权重衰减与丢弃法。

第三章 深度学习基础

一、线性回归

模型:基于输入计算输出的表达式\hat{y} = w_{1}x_{1} + w_{2}x_{2} + b

训练模型:通过数据来寻找特定的模型参数值,使模型在数据上的误差尽可能小的过程。找到表达式的参数w1和w2以及b。

训练数据:真实数据样本(sample)。标签标注(label)。预测标签的两个因素叫做特征(feature)。特征用来表征样本的特点。

损失函数:衡量表达式预测值和真实值之间的误差。最小二乘法。

训练模型就是希望基于训练数据找到一组模型参数,来使训练样本的损失函数最小。

优化算法:当模型和损失函数简单时,可求最小化问题的解析解。当表达式复杂时或许没有解析解,或者无法求出。只能通过优化算法有限次迭代模型参数来尽可能的降低损失函数的值。这类解叫做数值解。在求数值解的优化算法中,小批量随机梯度下降在深度学习中被广泛使用。算法:

  • 先选取一组模型参数的初始值,如随机选取:正态分布。
  • 接下来对参数进行多次迭代,使每次迭代都有可能降低损失函数的值。
    • 在每次迭代中,先随机均匀采样一个由固定数目训练数据样本所组成的小批量(mini-batch)B,
    • 然后求小批量中数据样本的平均损失有关模型参数的导数。
    • 最后用此结果与预先设定的一个正数(步长-学习率)的乘积作为模型参数在本次迭代的减小量。

模型预测:模型训练好后,对新数据进行预测。

采用矢量加法的方式要比向量按元素逐一做标量加法更快速。

线性回归的简洁实现

1、生成数据集:

其中features是训练数据特征,labels是标签。

num_inputs = 2
num_examples = 1000
true_w = [2, -3.4]
true_b = 4.2
features = torch.tensor(np.random.normal(0, 1, (num_examples, num_inputs)), dtype=torch.float)
labels = true_w[0] * features[:, 0] + true_w[1] * features[:, 1] + true_b
labels += torch.tensor(np.random.normal(0, 0.01, size=labels.size()), dtype=torch.float)

2、读取数据:

PyTorch提供了data包来读取数据。

import torch.utils.data as Data

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

3、定义模型:

PyTorch提供了大量预定义的层,这使我们只需关注使用哪些层来构造模型。

导入torch.nn模块。实际上,“nn”是neural networks(神经网络)的缩写。顾名思义,该模块定义了大量神经网络的层。之前我们已经用过了autograd,而nn就是利用autograd来定义模型。nn的核心数据结构是Module,它是一个抽象概念,既可以表示神经网络中的某个层(layer),也可以表示一个包含很多层的神经网络。在实际使用中,最常见的做法是继承nn.Module,撰写自己的网络/层。一个nn.Module实例应该包含一些层以及返回输出的前向传播(forward)方法。

class LinearNet(nn.Module):
    def __init__(self, n_feature):
        super(LinearNet, self).__init__()
        self.linear = nn.Linear(n_feature, 1)
    # forward定义前向传播
    def forward(self, x):
        y = self.linear(x)
        return y

net = LinearNet(num_inputs)
print(net)  # 使用print可以打印出网络的结构。

输出:

LinearNet(
  (linear): Linear(in_features=2, out_features=1, bias=True)
)

事实上我们还可以用nn.Sequential来更加方便地搭建网络,Sequential是一个有序的容器,网络层将按照在传入Sequential的顺序依次被添加到计算图中。

# 写法一
net = nn.Sequential(
    nn.Linear(num_inputs, 1)
    # 此处还可以传入其他层
    )

# 写法二
net = nn.Sequential()
net.add_module('linear', nn.Linear(num_inputs, 1))
# net.add_module ......

# 写法三
from collections import OrderedDict
net = nn.Sequential(OrderedDict([
          ('linear', nn.Linear(num_inputs, 1))
          # ......
        ]))

print(net)
print(net[0])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值