李沐深度学习-d2lzh_pytorch模块实现

这篇具有很好参考价值的文章主要介绍了李沐深度学习-d2lzh_pytorch模块实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

d2lzh_pytorch 模块

import random
import torch
import matplotlib_inline
from matplotlib import pyplot as plt
import torchvision
import torchvision.transforms as transforms
import torchvision.datasets
import sys
from collections import OrderedDict


# ---------------------------------------------------------------------------------------------
# 图表展示
def use_svg_display():
    # 用矢量图表示
    matplotlib_inline.backend_inline.set_matplotlib_formats('svg')


def set_figsize(figsize=(3.5, 2.5)):
    use_svg_display()
    # 设置图的尺寸
    plt.rcParams['figure.figsize'] = figsize


# ---------------------------------------------------------------------------------------------
# 读取数据
# 获取总的样本数量,然后打乱顺序,用batch-size获取每一部分索引去索引对应样本中的数据,使用yield返回
'''
函数详解:
torch.linspace(start, end, steps, dtype) → Tensor  从start开始到end结束,生成steps个数据点,数据类型为dtype
torch.index_select(input, dim, index)   索引张量中的子集
**
    input:需要进行索引操作的输入张量
    dim:张量维度  0,1
    index:索引号,是张量类型
**
yield: 使用yield的函数返回迭代器对象,每次使用时会保存变量信息,使用next()或者使用for可以循环访问迭代器中的内容
'''


def data_iter(batch_size, features, labels):
    num_examples = len(features)  # features   nxm
    indices = list(range(num_examples))  # 借助range生成索引序列
    random.shuffle(indices)  # 把list列表中的值打乱顺序
    for i in range(0, num_examples, batch_size):
        j = torch.LongTensor(indices[i:min(i + batch_size, num_examples)])  # 这里的i是对标乱序表中的下标索引号
        yield features.index_select(0, j), labels.index_select(0, j)  # 0维度,有1000个样本,j就是他们的下标


# ---------------------------------------------------------------------------------------------

# 定义模型
def linreg(X, w, b):
    return torch.mm(X, w) + b  # 传进来的参数和样本特征都符合矩阵形式 w,b都是列矩阵  X:1000x2  w:2x1  b:1x1
    # 这里使用了广播


# ---------------------------------------------------------------------------------------------

# 定义损失函数
def square_loss(y_hat, y):
    # 保证y_hat和y同型,pytorch中的MSELoss没有除以2的操作
    return (y_hat - y.view(y_hat.size())) ** 2 / 2  # 这里是多个样本的预测值和实际值之间的差值,返回nxm大小的张量


# 这里的得到的也是一个小批量的样本的损失张量

# ---------------------------------------------------------------------------------------------
# 定义优化算法
# 这里使用的是sgd算法,使用小批量梯度和(参数求导后的和:梯度会自动累加,不用自己加和梯度)除以小批量样本个数来求小批量平均值
def sgd(params, lr, batch_size):
    for param in params:
        param.data -= lr * param.grad / batch_size  # 这里更改param时使用的是param.data,这样就不会影响反向梯度
        # 这里的param指的是w1,w2,b


# 这里应该是小批量中的每个loss运行完,得到小批量每个样本的梯度然后pytorch自动进行了梯度累加,之后一个小批量得到一个累加和后的
# 梯度w1,w2,b
# ---------------------------------------------------------------------------------------------

'''
FashionMNIST 数据集
'''


# ----------------------------------------------------------将数值标签转换成文本标签
def get_fashion_mnist_labels(labels):
    text_labels = ['t-shirt', 'trouser', 'pullover', 'dress', 'coat', 'sandal',
                   'shirt', 'sneaker', 'bag', 'ankle boot']
    return [text_labels[int(i)] for i in labels]


# -----------------------------------------------------在一行里画出多张图像和对应标签的函数
def show_fashion_mnist(images, labels):
    use_svg_display()
    # 这里的_表示忽略(不使用)的变量
    _, figs = plt.subplots(1, len(images), figsize=(12, 12))  # 设置一行 len(images)个数量,每个figsize大小的画布
    # figs 返回的是一个画布对象,这个对象有imshow,set_tittle,axes_get_xasis().set_visible,
    # axes.get_yaxis().set_visible()这几种函数调用方式,用来给figs里面添加图像
    for f, img, lbl, in zip(figs, images, labels):  # 这个画布对象循环往里面添加图像信息
        f.imshow(img.view((28, 28)).numpy())  # img承接图像信息,将tensor转化为numpy  这里参数为数组元素
        f.set_title(lbl)
        f.axes.get_xaxis().set_visible(False)
        f.axes.get_yaxis().set_visible(False)
    plt.savefig("路径")


# ----------------------------------------------------------------获取并读取FashionMNIST数据集函数,返回小批量train,test
def load_data_fashion_mnist(batch_size):
    mnist_train = torchvision.datasets.FashionMNIST(root='路径',
                                                    train=True, download=True, transform=transforms.ToTensor())
    mnist_test = torchvision.datasets.FashionMNIST(root='路径',
                                                   train=False, download=True, transform=transforms.ToTensor())
    '''
    上面的mnist_train,mnist_test都是torch.utils.data.Dataset的子类,所以可以使用len()获取数据集的大小
    训练集和测试集中的每个类别的图像数分别是6000,1000,两个数据集分别有10个类别
    '''
    # mnist是torch.utils.data.dataset的子类,因此可以将其传入torch.utils.data.DataLoader来创建一个DataLoader实例来读取数据
    # 在实践中,数据读取一般是训练的性能瓶颈,特别是模型较简单或者计算硬件性能比较高的时候
    # DataLoader一个很有用的功能就是允许多进程来加速读取  使用num_works来设置4个进程读取数据
    if sys.platform.startswith('win'):
        num_workers = 0
    else:
        num_workers = 4
    train_iter = torch.utils.data.DataLoader(mnist_train, batch_size=batch_size, shuffle=True,
                                             num_workers=num_workers)
    test_iter = torch.utils.data.DataLoader(mnist_test, batch_size=batch_size, shuffle=False,
                                            num_workers=num_workers)
    return train_iter, test_iter


# -------------------------------------------------------------查看mnist前10个图像和标签
def check_mnist():
    mnist_train = torchvision.datasets.FashionMNIST(root='路径',
                                                    train=True, download=True, transform=transforms.ToTensor())
    mnist_test = torchvision.datasets.FashionMNIST(root='路径',
                                                   train=False, download=True, transform=transforms.ToTensor())
    X, y = [], []
    for i in range(10):
        X.append(mnist_train[i][0])  # 循环获取图像张量矩阵
        y.append(mnist_train[i][1])  # 循环获取图像对应数值标签
    show_fashion_mnist(X, get_fashion_mnist_labels(y))
    # feature, label = mnist_train[0]
    # print(feature.shape, label)  CxHxW
    # feature对应高和宽均为28像素的图像,因为使用了transforms.ToTensor(),所以每个像素的数值对应于【0.0,1.0】的32位浮点数
    # C 是通道数,RGB,灰色图像,通道数为1,H,W分别为高,宽
    # mnist_train[0] 是一个元祖,它包含两部分,图像数据结构和图像标签值,图像的数据结构是1x28x28结构,是一个浮点数矩阵,代表一个图像


# -------------------------------------------------------------------------评价模型net在数据集data_iter上的准确率
def evaluate_accuracy(test_iter, net):
    acc_sum, n, x = 0.0, 0, 0.0
    for X, y in test_iter:  # 返回一个批量的数据元组迭代对象
        if isinstance(net, torch.nn.Module):
            net.eval()  # 评估模式,这会关闭dropout
            acc_sum += (net(X).argmax(dim=1) == y).float().sum().item()  # 将net模型的预测y与标签y进行了准确率比较
            net.train()  # 改回训练模式
        else:  # 自定义模型
            if ('is_training' in net.__code__.co_varnames):  # 就是说如果net函数的参数中如果有is_training这个参数
                # 将is_training 设置为False
                acc_sum += (net(X, is_training=False).argmax(dim=1) == y).float().sum().item()
            else:
                acc_sum += (net(X).argmax(dim=1) == y).float().sum().item()
        n += y.shape[0]  # 累加获得样本个数
        x = acc_sum / n
    return x


# -------------------------------------------------------------------------训练模型函数
def train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size, params=None, lr=None, optimizer=None):
    for epochs in range(num_epochs):  # 循环周期
        train_l_sum, train_acc_sum, n = 0.0, 0.0, 0  # 预先定义 训练损失,训练精度,批量个数
        for X, y in train_iter:  # 批量更新
            y_hat = net(X)
            l = loss(y_hat, y).sum()  # 损失计算

            # 梯度清零
            if optimizer is not None:
                optimizer.zero_grad()
            elif params is not None and params[0].grad is not None:  # 权重存在并且权重的梯度存在
                for param in params:
                    param.grad.data.zero_()
            l.backward()  # 反向传播
            # 梯度更新操作
            if optimizer is None:
                sgd(params, lr, batch_size)  # 调用sgd进行梯度下降操作
            else:
                optimizer.step()  # softmax回归的简洁实现将要用到

            train_l_sum += l.item()  # 损失累加
            train_acc_sum += (y_hat.argmax(dim=1) == y).sum().item()  # (y_hat.argmax(dim=1) == y)
            # 取出y_hat每一行中最大的概率索引和y比较,结果为tensor,元素值为0/1
            n += y.shape[0]  # 计算一个批量中标签的个数
        test_acc = evaluate_accuracy(test_iter, net)  # 一个循环之后进行测试集的准确度计算
        print(f'epoch %d,loss %.4f,train_acc %.3f,test_acc %.3f'
              % (epochs + 1, train_l_sum / n, train_acc_sum / n, test_acc))


# x = torch.tensor([[0.1, 0.4, 0.2], [1, 0.06, 0.5]])
# print((x.argmax(dim=1)==torch.tensor([[1,1]])).float())

# -------------------------------------------------------------------------x的形状转换功能函数
class FlattenLayer(torch.nn.Module):
    def __init__(self):
        super(FlattenLayer, self).__init__()  # 初始化函数,自动调用forward函数

    def forward(self, x):  # x shape: (batch,*,*,....)
        return x.view(x.shape[0], -1)  # 转换成(batch_size,特征数)形状


# 这样就方便定义模型
net = torch.nn.Sequential(
    # FlattenLayer()
    # torch.nn.Linear(num_inputs,num_outputs)
    OrderedDict([
        ('flatten', FlattenLayer()),
        ('linear', torch.nn.Linear(2, 3))
    ])
)

'''
-------------------------------------------------------------------作图函数
'''


def semilogy(x_vals, y_vals, xlabel, ylabel, label, x2_vals=None, y2_vals=None, legend=None):
    plt.xlabel(xlabel)
    plt.ylabel(ylabel)
    plt.semilogy(x_vals, y_vals)  # y轴使用对数尺度
    if x2_vals and y2_vals:
        plt.semilogy(x2_vals, y2_vals, linestyle=':')
        plt.legend(legend)
        plt.savefig("路径" + label + "模拟.png")

文章来源地址https://www.toymoban.com/news/detail-810750.html

到了这里,关于李沐深度学习-d2lzh_pytorch模块实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【深度学习】动手学深度学习(PyTorch版)李沐 2.4.3 梯度【公式推导】

      我们可以连接一个多元函数对其所有变量的偏导数,以得到该函数的 梯度 (gradient)向量。 具体而言,设函数 f : R n → R f:mathbb{R}^{n}tomathbb{R} f : R n → R 的输入是一个 n n n 维向量 x ⃗ = [ x 1 x 2 ⋅ ⋅ ⋅ x n ] vec x=begin{bmatrix} x_1\\\\x_2\\\\···\\\\x_nend{bmatrix} x = ​ x 1 ​ x 2 ​

    2024年01月17日
    浏览(55)
  • 卷积神经网络——下篇【深度学习】【PyTorch】【d2l】

    5.10.1、理论部分 批量归一化可以解决深层网络中梯度消失和收敛慢的问题,通过固定每个批次的均值和方差来加速收敛,一般不改变模型精度。批量规范化已经被证明是一种不可或缺的方法,它适用于几乎所有图像分类器。 批量规划是一个线性变换 ,把参数的均值方差给拉

    2024年02月12日
    浏览(47)
  • 卷积神经网络——中篇【深度学习】【PyTorch】【d2l】

    5.5.1、理论部分 两个⌈ 卷积块 ⌋ 每个卷积块中的基本单元是一个⌈ 卷积层 ⌋、一个 ⌈ sigmoid激活函数 ⌋和 ⌈ 平均汇聚层 ⌋ 三个⌈ 全连接层密集块 ⌋ 早期神经网络,先使用卷积层学习图片空间信息,然后全连接层转换到类别空间。 5.5.2、代码实现 定义一个 Sequential块

    2024年02月11日
    浏览(56)
  • 卷积神经网络——上篇【深度学习】【PyTorch】【d2l】

    5.1.1、理论部分 全连接层后,卷积层出现的意义? 一个足够充分的照片数据集,输入,全连接层参数,GPU成本,训练时间是巨大的。 (convolutional neural networks,CNN)是机器学习利用自然图像中一些已知结构的创造性方法,需要更少的参数,在处理图像和其他类型的结构化数据

    2024年02月12日
    浏览(47)
  • 线性神经网路——线性回归随笔【深度学习】【PyTorch】【d2l】

    线性回归是显式解,深度学习中绝大多数遇到的都是隐式解。 3.1.1、PyTorch 从零实现线性回归 生成数据集及标签 d2l.plt.scatter(,,) ,使用d2l库中的绘图函数来创建散点图。 这个函数接受三个参数: features[:,1].detach().numpy() 是一个二维张量features的切片操作,选择了所有行的第二

    2024年02月15日
    浏览(61)
  • 动手学深度学习(李沐)的pytorch版本(包含代码和PDF版本)

    目录 网址(特别适合自学) 说明: 代码与PDF版 传送门 界面一览:    github上一个项目将《动手学深度学习》从mxnet改为了pytorch实现。感谢大佬们的工作。    特别说明该电子版网页是通过docsify部署生成的,详细了解点击here,自己有很多文章或者想做电子版本文档的强推

    2024年02月13日
    浏览(47)
  • 16 PyTorch 神经网络基础【李沐动手学深度学习v2】

    在构造自定义块之前,我们先回顾一下多层感知机的代码。 下面的代码生成一个网络,其中包含一个具有256个单元和ReLU激活函数的全连接隐藏层, 然后是一个具有10个隐藏单元且不带激活函数的全连接输出层。 层和块 构造单层神经网咯:线性层+RELU+线性层 生成2x20(2是批量

    2024年03月10日
    浏览(89)
  • 一篇文章搞定《动手学深度学习》-(李沐)PyTorch版本的所有内容

    目录 目录 简介 阅读指南 1. 深度学习简介 2. 预备知识 3. 深度学习基础 4. 深度学习计算 5. 卷积神经网络 6. 循环神经网络 7. 优化算法 8. 计算性能 9. 计算机视觉 10. 自然语言处理 环境 参考(大家可以在这里下载代码) 原书地址(大家可以在这里阅读电子版PDF内容) 引用 阅读

    2023年04月24日
    浏览(49)
  • Mac电脑配置李沐深度学习环境[pytorch版本]使用vscode

    Mac打开终端(Mac电脑如何启动终端?打开启动台,搜索终端即可) 安装包管理工具Homebrew 如果遇到报错 则需要运行一下如下指令,然后再安装Homebrew。原因是被墙,需要配置一下端口。 安装Homebrew成功后,重启终端(Mac电脑如何启动终端?打开启动台,搜索终端即可)直接安

    2024年02月06日
    浏览(54)
  • 深度学习环境配置Anaconda+cuda+cudnn+PyTorch——李沐大神《动手学深度学习》环境配置(巨详细,持续迭代)

    Anaconda+cuda+cudnn+Pytorch(手把手教你安装深度学习环境)——这里是GPU+PyTorch版本 国内AI教学体系发展较晚,很多喜欢AI的同学都得不到系统的学习。当然我们也不否认国内一些优质的AI领域的课程和教学资料,这里我们主要推荐李沐大神推出的《动手学深度学习》,这门课程最初

    2024年02月15日
    浏览(79)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包