3.线性神经网络

文章目录

3.1.线性回归

3.2.线性回归的从零开始实现

  1. 生成数据集迭代器:Python中,yield关键字用于定义一个生成器(generator)函数。生成器函数是一种特殊的函数,它允许你逐个生成值,而不是一次性返回一个完整的列表或集合。这样做的好处是可以节省内存,特别是在处理大量数据时,因为你可以按需生成数据,而不是一次性将所有数据加载到内存中。

    python 复制代码
    import random
    
    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_indices = torch.tensor(
                indices[i: min(i + batch_size, num_examples)])
            yield features[batch_indices], labels[batch_indices]
    
    batch_size = 10
    
    for X, y in data_iter(batch_size, features, labels):
        print(X, '\n', y)
        break

    由于yield的使用,data_iter函数不会一次性执行完毕并返回一个结果,而是每次调用时返回一个批次的数据,并在下次调用时从上次停止的地方继续执行。这使得函数能够按需生成数据批次,非常适合于迭代训练过程。

    使用生成器的好处之一是它们允许你以一种懒加载(lazy loading)的方式处理数据,即只在需要时才生成数据。这对于处理大型数据集或流数据特别有用,因为它可以显著减少内存的使用。

  2. 定义SDG优化算法

python 复制代码
def sgd(params, lr, batch_size):  #@save
    """小批量随机梯度下降"""
    with torch.no_grad():
        for param in params:
            param -= lr * param.grad / batch_size
            param.grad.zero_()

3.3.线性回归的简洁实现

  1. 读取纯数据形式的数据集

    python 复制代码
    import numpy as np
    import torch
    from torch.utils import data
    
    def 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回归的从零开始实现

  1. 实现 softmax 函数:

    python 复制代码
    def softmax(X):
        X_exp = torch.exp(X)
        partition = X_exp.sum(1, keepdim=True)
        return X_exp / partition  # 这里应用了广播机制
  2. 实现交叉熵损失函数:y_hat: (B, C) = (batch_size, class_num), y: (C,) 表示每个样本的真值类别

    python 复制代码
    def cross_entropy(y_hat, y):
        return - torch.log(y_hat[range(len(y_hat)), y])
    
    cross_entropy(y_hat, y)
  3. 计算预测时的分类精度

    python 复制代码
    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) == y
        return 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回归的简洁实现

  1. CrossEntropyLoss:传入 reduction 模式的不同,输出结果也不同(可能是张量,也可能是对张量求和之后的标量)

    python 复制代码
    loss = nn.CrossEntropyLoss(reduction='none')
相关推荐
zhaoshuzhaoshu8 分钟前
人工智能(AI)发展史:详细里程碑
人工智能·职场和发展
Luke~9 分钟前
阿里云计算巢已上架!3分钟部署 Loki AI 事故分析引擎,SRE 复盘时间直接砍掉 80%
人工智能·阿里云·云计算·loki·devops·aiops·sre
weixin_1562415757610 分钟前
基于YOLOv8深度学习花卉识别系统摄像头实时图片文件夹多图片等另有其他的识别系统可二开
大数据·人工智能·python·深度学习·yolo
QQ6765800815 分钟前
AI赋能轨道交通智能巡检 轨道交通故障检测 轨道缺陷断裂检测 轨道裂纹识别 鱼尾板故障识别 轨道巡检缺陷数据集深度学习yolo第10303期
人工智能·深度学习·yolo·智能巡检·轨道交通故障检测·鱼尾板故障识别·轨道缺陷断裂检测
小陈工17 分钟前
2026年4月7日技术资讯洞察:下一代数据库融合、AI基础设施竞赛与异步编程实战
开发语言·前端·数据库·人工智能·python
tq108618 分钟前
组织的本质:从科层制到伴星系统的决断理论
人工智能
科技与数码21 分钟前
互联网保险迎来新篇章,元保方锐分享行业发展前沿洞察
大数据·人工智能
云程笔记26 分钟前
002.计算机视觉与目标检测发展简史:从传统方法到深度学习
深度学习·yolo·目标检测·计算机视觉
汽车仪器仪表相关领域32 分钟前
NHFID-1000型非甲烷总烃分析仪:技术破局,重构固定污染源监测新体验
java·大数据·网络·人工智能·单元测试·可用性测试·安全性测试