动手学深度学习2025.1.23

server/2025/1/24 8:33:49/

一、预备知识

1.数据操作

(1)数据访问:

一个元素:[1,2] //行下标为1,列下标为2的元素

一行元素:[1,:] //行下标为1的所有元素

一列元素:[:,1] //列下标为1的所有元素

子区域:[1:3,1:] //行下标为[1,3),列下标为[1,+无穷)的所有元素

子区域:[::3,::2] //行下标跨度为3,列下标跨度为2的元素

(2)张量(tensor):

理解Tensorflow中的张量:从零维到四维-CSDN博客

一种多维数组,可以用来表示各种物理量和几何量。

张量连结:是一种将多个张量沿着某一维度合并的操作。

torch.cat()

torch.cat() 是 PyTorch 中用于张量拼接的主要函数,其语法如下:

torch.cat(tensors, dim=0)
  • tensors:一个包含多个张量的序列,这些张量需要在指定维度上具有相同的形状。

  • dim:指定拼接的维度。

  1. 一维张量拼接

    tensor_a = torch.tensor([1, 2, 3])
    tensor_b = torch.tensor([4, 5, 6])
    concatenated = torch.cat((tensor_a, tensor_b), dim=0)  # 结果为 [1, 2, 3, 4, 5, 6]

    输出形状为 (6,)

  2. 二维张量拼接

    tensor_1 = torch.tensor([[1, 2], [3, 4]])
    tensor_2 = torch.tensor([[5, 6], [7, 8]])
    concatenated_dim0 = torch.cat((tensor_1, tensor_2), dim=0)  # 沿第0维拼接
    concatenated_dim1 = torch.cat((tensor_1, tensor_2), dim=1)  # 沿第1维拼接

    输出形状分别为 (4, 2)(2, 4)

  3. 高维张量拼接

    tensor_3d_1 = torch.randn(2, 3, 4)
    tensor_3d_2 = torch.randn(2, 3, 4)
    concatenated_dim2 = torch.cat((tensor_3d_1, tensor_3d_2), dim=2)  # 沿第2维拼接

    输出形状为 (2, 3, 8)

    =>张量的初始形状和内容

    tensor_5 = torch.tensor([[[2, 3, 5]], [[9, 0, 2]]])
    tensor_6 = torch.tensor([[[4, 5, 9]], [[3, 6, 4]]])
    • 形状tensor_5tensor_6 的形状都是 (2, 1, 3)

    • 内容

      • tensor_5 包含两个矩阵:

        [[[2, 3, 5]],[[9, 0, 2]]]
      • tensor_6 包含两个矩阵:

        [[[4, 5, 9]],[[3, 6, 4]]]

    =>在不同维度上拼接的结果

    1. 沿 dim=2 拼接

    dim2 = torch.cat((tensor_5, tensor_6), dim=2)
    • 拼接维度dim=2 是每个矩阵的列方向(最内层的维度)。

    • 拼接过程

      • 第一个矩阵的第0行:

        • tensor_5[2, 3, 5]tensor_6[4, 5, 9] 拼接为 [2, 3, 5, 4, 5, 9]

      • 第二个矩阵的第0行:

        • tensor_5[9, 0, 2]tensor_6[3, 6, 4] 拼接为 [9, 0, 2, 3, 6, 4]

    • 结果

      tensor([[[2, 3, 5, 4, 5, 9]],
      ​[[9, 0, 2, 3, 6, 4]]])
    • 形状(2, 1, 6)

      • 第0维(矩阵数量):2。

      • 第1维(行数):1。

      • 第2维(列数):6(拼接后的列数)。

    1. 沿 dim=0 拼接

    dim0 = torch.cat((tensor_5, tensor_6), dim=0)
    • 拼接维度dim=0 是最外层的维度,表示矩阵的数量。

    • 拼接过程

      • tensor_5 的两个矩阵和 tensor_6 的两个矩阵依次排列。

    • 结果

      tensor([[[2, 3, 5]],
      ​[[9, 0, 2]],
      ​[[4, 5, 9]],
      ​[[3, 6, 4]]])
    • 形状(4, 1, 3)

      • 第0维(矩阵数量):4(拼接后的矩阵数量)。

      • 第1维(行数):1。

      • 第2维(列数):3。

    1. 沿 dim=1 拼接

    dim1 = torch.cat((tensor_5, tensor_6), dim=1)
    • 拼接维度dim=1 是每个矩阵的行方向。

    • 拼接过程

      • 第一个矩阵:

        • tensor_5 的第0行 [2, 3, 5]tensor_6 的第0行 [4, 5, 9] 拼接为:

          [[2, 3, 5],[4, 5, 9]]
      • 第二个矩阵:

        • tensor_5 的第0行 [9, 0, 2]tensor_6 的第0行 [3, 6, 4] 拼接为:

          [[9, 0, 2],[3, 6, 4]]
    • 结果

      tensor([[[2, 3, 5],[4, 5, 9]],
      ​[[9, 0, 2],[3, 6, 4]]])
    • 形状(2, 2, 3)

      • 第0维(矩阵数量):2。

      • 第1维(行数):2(拼接后的行数)。

      • 第2维(列数):3。

    =>多维拼接总结

    1. 拼接维度dim 参数决定了拼接的方向。

    2. 张量的形状:拼接时,除了拼接维度外,其他维度的大小必须一致。

    • dim=0:沿着最外层维度拼接,增加矩阵的数量。

    • dim=1:沿着行方向拼接,增加行数。

    • dim=2:沿着列方向拼接,增加列数。

    (3)节省内存

    尽量进行原地操作,节省内存开销

    before = id(X)
    X += Y
    id(X) == before
    1. id(X) 的含义

    id(X) 返回变量 X 所指向的对象的内存地址。如果 X 的内容被修改,但变量 X 仍然指向同一个对象,那么 id(X) 的值不会改变。

    2. 原地操作(In-place Operations)

    在 Python 中,某些操作会直接修改对象的内容,而不是创建一个新的对象。例如:

    • X += Y 是一个原地操作,它会直接修改 X 的内容,而不是创建一个新的对象。

    1. 原地操作X += Y 是原地操作,它直接修改了 X 的内容,而不是创建新的对象。

    2. id() 的稳定性:由于 X 的内存地址没有改变,id(X) 的值在操作前后保持一致。

    3. Python 的内存管理:Python 的内存管理机制允许某些操作直接修改对象的内容,而不是创建新的对象,这有助于节省内存和提高效率。

    如果使用非原地操作(例如 X = X + y),结果会有所不同:

    Python复制

    before = id(X)
    X = X + Y
    id(X) == before  # 这将返回 False

    在这种情况下, X = X + Y 会创建新的对象,并将 X 指向这个新对象。因此,id(X) 的值会发生变化。

    (3)Numpy数组

    NumPy(Numerical Python)数组是 Python 中用于高效数值计算的核心数据结构。它是 NumPy 库的基础,提供了多维数组对象(ndarray)和一系列操作这些数组的工具。

    A = X.numpy()
    B = torch.tensor(A)
    type(A), type(B)

2.数据预处理

将工作目录改为D盘的目录

os.getcwd()

'C:\Users\aospr'

target_dir = r"D:\深度学习\数据demo"

os.chdir(target_dir)

os.getcwd()

'D:\深度学习\数据demo'

解决将NaN填充成平均值的bug:

inputs = inputs.fillna(inputs.mean(numeric_only=True)) # 计算均值,只对数值列生效


http://www.ppmy.cn/server/160979.html

相关文章

面试-二维数组

应用 快递业务有N个站点&#xff0c;1<N<10000&#xff1b;站点0、站点1可达&#xff0c;记作0-1&#xff1b;如果0-1、1-2&#xff0c;则站点0、站点2可达&#xff0c;记作0-2&#xff1b;s[i][j]1表示i-j可达&#xff0c;反之s[i][j]0表示i-j不可达&#xff1b;s[i][j…

代码随想录算法训练营Day30

第八章 贪心算法 part04 今天的三道题目&#xff0c;都算是 重叠区间 问题&#xff0c;大家可以好好感受一下。 都属于那种看起来好复杂&#xff0c;但一看贪心解法&#xff0c;惊呼&#xff1a;这么巧妙&#xff01; 这种题还是属于那种&#xff0c;做过了也就会了&#xff0…

insight在线需求分析系统概要介绍

&#x1f680; 提升项目效率和产品质量&#xff0c;从需求分析开始 —— Insight 需求分析工具&#xff0c;让产品规划从未如此简单&#xff01; 在当今快节奏的商业环境中&#xff0c;项目管理的成功与否往往取决于需求分析的精准度和管理的高效性。无论是软件开发、产品设计…

文献阅读 250123-Accelerated dryland expansion under climate change

Accelerated dryland expansion under climate change 来自 <Accelerated dryland expansion under climate change | Nature Climate Change> 气候变化下旱地加速扩张 来自 <Accelerated dryland expansion under climate change | Nature Climate Change> ## Int…

Linux 主流桌面环境及其默认应用大横评

Linux 提供了多种桌面环境&#xff0c;它们各有特色&#xff0c;适应不同的用户需求。以下将从环境介绍和默认应用两个方面详细解析几种常见的桌面环境&#xff0c;帮助用户选择最适合的系统环境。 1. GNOME 环境介绍 GNOME 是目前最流行的桌面环境之一&#xff0c;以其现代化…

实战演示:利用ChatGPT高效撰写论文

在当今学术界&#xff0c;撰写论文是一项必不可少的技能。然而&#xff0c;许多研究人员和学生在写作过程中常常感到困惑和压力。幸运的是&#xff0c;人工智能的快速发展为我们提供了新的工具&#xff0c;其中ChatGPT便是一个优秀的选择。本文将通过易创AI创作平台&#xff0c…

Django 日志配置实战指南

日志是 Django 项目中不可或缺的一部分,它帮助我们记录应用程序的运行状态、调试信息、错误信息等。通过合理配置日志,我们可以更好地监控和调试应用程序。本文将详细介绍如何在 Django 项目中实现日志文件分割、日志级别控制以及多环境日志配置,并结合最佳实践和代码示例,…

solidity基础 -- 存储类型

在Solidity智能合约开发中&#xff0c;存储类型是一个至关重要的概念。它不仅影响合约的性能&#xff0c;还决定了数据的存储位置和生命周期。Solidity提供了三种主要的存储类型&#xff1a;storage、memory和calldata。本文将结合给定的代码示例&#xff0c;并通过更多实例详细…