文章目录
- 3.1.线性回归
- 3.2.线性回归的从零开始实现
- 3.3.线性回归的简洁实现
- 3.4.softmax回归
- 3.5.图像分类数据集
- 3.6.softmax回归的从零开始实现
- 3.7.softmax回归的简洁实现
3.1.线性回归
3.2.线性回归的从零开始实现
-
生成数据集迭代器:Python中,yield关键字用于定义一个生成器(generator)函数。生成器函数是一种特殊的函数,它允许你逐个生成值,而不是一次性返回一个完整的列表或集合。这样做的好处是可以节省内存,特别是在处理大量数据时,因为你可以按需生成数据,而不是一次性将所有数据加载到内存中。
import randomdef 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_indices = torch.tensor(indices[i: min(i + batch_size, num_examples)])yield features[batch_indices], labels[batch_indices]batch_size = 10for X, y in data_iter(batch_size, features, labels):print(X, '\n', y)break
由于yield的使用,data_iter函数不会一次性执行完毕并返回一个结果,而是每次调用时返回一个批次的数据,并在下次调用时从上次停止的地方继续执行。这使得函数能够按需生成数据批次,非常适合于迭代训练过程。
使用生成器的好处之一是它们允许你以一种懒加载(lazy loading)的方式处理数据,即只在需要时才生成数据。这对于处理大型数据集或流数据特别有用,因为它可以显著减少内存的使用。
-
定义SDG优化算法
def sgd(params, lr, batch_size): #@save"""小批量随机梯度下降"""with torch.no_grad():for param in params:param -= lr * param.grad / batch_sizeparam.grad.zero_()
3.3.线性回归的简洁实现
- 读取纯数据形式的数据集
import numpy as np import torch from torch.utils import datadef load_array(data_arrays, batch_size, is_train=True): #@save"""构造一个PyTorch数据迭代器"""dataset = data.TensorDataset(*data_arrays)return data.DataLoader(dataset, batch_size, shuffle=is_train)batch_size = 10 data_iter = load_array((features, labels), batch_size)# 使用iter构造Python迭代器,并使用next从迭代器中获取第一项 next(iter(data_iter))
3.4.softmax回归
3.5.图像分类数据集
3.6.softmax回归的从零开始实现
- 实现 softmax 函数:
def softmax(X):X_exp = torch.exp(X)partition = X_exp.sum(1, keepdim=True)return X_exp / partition # 这里应用了广播机制
- 实现交叉熵损失函数:y_hat: (B, C) = (batch_size, class_num), y: (C,) 表示每个样本的真值类别
def cross_entropy(y_hat, y):return - torch.log(y_hat[range(len(y_hat)), y])cross_entropy(y_hat, y)
- 计算预测时的分类精度
def accuracy(y_hat, y): #@save"""计算预测正确的数量"""if len(y_hat.shape) > 1 and y_hat.shape[1] > 1:y_hat = y_hat.argmax(axis=1)cmp = y_hat.type(y.dtype) == yreturn float(cmp.type(y.dtype).sum())def evaluate_accuracy(net, data_iter): #@save"""计算在指定数据集上模型的精度"""if isinstance(net, torch.nn.Module):net.eval() # 将模型设置为评估模式metric = Accumulator(2) # 正确预测数、预测总数with torch.no_grad():for X, y in data_iter:metric.add(accuracy(net(X), y), y.numel())return metric[0] / metric[1]
3.7.softmax回归的简洁实现
- CrossEntropyLoss:传入 reduction 模式的不同,输出结果也不同(可能是张量,也可能是对张量求和之后的标量)
loss = nn.CrossEntropyLoss(reduction='none')