深度学习入门

一、认识人工智能

大国的游戏,政府全力支持,AI 的发展是大势所趋,未来的关键!🚀

1. 人工智能是什么

先来一个官方点的定义——

AI(Artificial Intelligence),也就是人工智能,是一门研究如何让机器像人一样“聪明”的技术。目标是让它能自己学习、推理、理解、决策,甚至解决问题!

想象一下它能干啥👇:

  • 会说话、听你说话 —— 自然语言处理(NLP)
  • 能看图识物 —— 计算机视觉(CV)
  • 能自己开车 —— 自动驾驶
  • 会动还能干活 —— 机器人
  • 万能大脑 —— 大模型

那 AI 的本质到底是啥?

其实说白了,它就是用数学公式+强大计算能力做“智能”的事情:

  1. 本质是数学计算:各种公式、模型、函数叠起来就是智能。
  2. 数学是理论基础:没有数学,就没有算法。
  3. 计算机负责实现:也就是算力,没它跑不动。
  4. 算法越牛逼,算力要求越高:想变聪明就得多“烧钱”。

2. 人工智能是怎么跑起来的?

AI 想要聪明,需要“三大法宝”:

✨ 数据
✨ 网络(模型)
✨ 算力

整个流程其实就三步,听起来简单但门道可多了:

搭网络:先想好一个合适的“神经网络”,也就是把数学公式搭起来。

训模型:把收集好的数据喂进去,让模型慢慢学,学到能“理解”数据。

用起来:训练完了就能推理新数据,比如给它一张猫的照片,它能说出“这是只猫”。

3. 看图说话:术语关系图来啦!

有时候一个图胜过千言万语,人工智能的一堆术语看不懂?来张图你就秒懂啦👇:

在这里插入图片描述

4. AI 产业大生态长啥样?

AI 不是一个人在战斗,它背后有一整套庞大的产业链,简单说分几层:

  • 底层硬件:芯片、传感器、网络设备(比如 GPU 啊,没它们跑不动 AI)
  • 中间算法:各种深度学习、图神经网络……
  • 平台工具:像 TensorFlow、PyTorch、各种 AI 开发平台
  • 上层应用:用在金融、医疗、教育、交通等等领域的智能解决方案

看看这个图你就更清楚啦👇:

在这里插入图片描述


二、初识Torch

如果你只打算掌握一个深度学习框架,那就选 PyTorch(简称Torch) 吧,闭着眼选都不亏!它是当下最火、最经典的深度学习工具之一,既适合入门,也能打比赛、发论文、上生产!

在这里插入图片描述

图中这句话翻译过来就是:用 Torch 做深度学习!

学完本章之后,你就能熟练使用 PyTorch,为后面的搭建网络、训练模型打下坚实的基础,真正迈进 AI 世界的大门!

1. 生涩的简介(其实也不难)

咱们先来点“官方介绍”:

PyTorch 是一个基于 Python 的深度学习框架,由 Facebook AI 团队开发,灵活高效、易于上手,用它可以很方便地构建和训练神经网络模型。

它常被用在这些热门领域👇:

  • 计算机视觉(CV)
  • 自然语言处理(NLP)
  • 语音识别
  • 各种学术研究 or 工业落地项目

它有啥厉害的地方?

  • Tensor(张量) 表示数据,能轻松处理大批量数据
  • 支持 GPU 加速,跑得快!
  • 自带 自动微分、自动求导 功能,训练模型时完全不用自己手动算导数(省事还安全)

简单说就是:好用、强大、聪明、效率高。

2. 多彩的江湖(不仅只有它)

虽然 PyTorch 很牛,但它可不是“江湖唯一”,深度学习的世界百花齐放,还有很多厉害的框架,来看看它们的“名片”👇:

  1. TensorFlow
    出自 Google,学术界、工业界通吃,功能全面、能训练、能部署、还能搞分布式,地位很高。

  2. Keras
    是一个更“傻瓜式”的神经网络 API,写法简洁,已经整合进 TensorFlow 里啦,适合入门。

  3. PaddlePaddle(飞桨)
    百度出品,支持中文文档,对国内开发者很友好,也是一个功能完整的开源平台。

  4. MXNet
    亚马逊支持,主打高效分布式和灵活编程,还曾是 AWS 的首选框架。

  5. Caffe
    经典中的经典!主要用于图像分类、CNN 网络的训练,速度快、上手快,不过现在更新慢了。

  6. CNTK
    微软家的产品,支持多语言(Python、C++、C#),效率也不错,但热度较低。

  7. Chainer
    日本团队开发,特点是“动态计算图”,后来的 PyTorch 也学了它这招。

三、Tensor 概述

在 PyTorch 里,数据的主角是谁?张量(Tensor)

不管你是喂模型的输入,还是训练出来的权重参数,统统都会被封装成 Tensor,才能让 PyTorch 帮你“动手干活”。

一句话:Tensor 就是 PyTorch 的“灵魂容器”!

张量是啥?通俗点说,它就是一个元素类型相同的多维数组,而且它能在 GPU 上“开挂”,跑得飞快!

1. 概念:张量是啥?

张量(Tensor)听起来高大上,其实是标量、向量、矩阵这些概念的升级版

咱们来一点点拆开看👇:

  • 标量(0 维):就是一个普通数字
    👉 例子:a = torch.tensor(5)
  • 向量(1 维):一排数字,线性代数里的“列”或“行”
    👉 例子:b = torch.tensor([1, 2, 3])
  • 矩阵(2 维):二维数组
    👉 例子:c = torch.tensor([[1, 2], [3, 4]])
  • 更高维的张量(3D、4D…):比如图像是 3D 的,视频是 4D 的,这种结构在深度学习里很常见~

2. 张量有啥本事?(PyTorch专属Buff)

🌟 动态计算图

PyTorch 支持动态图机制,也就是每次你运行的时候,它才临时搭建“计算图”。
这个特性让你写代码更灵活,调试更方便!

⚡ GPU 加速

一句 .to('cuda'),张量就飞奔进显卡怀抱,速度起飞 🚀!

a = torch.tensor([1.0, 2.0])
a = a.to('cuda')  # 就这么简单

🎯 自动微分

PyTorch 的 autograd 模块支持自动求导,也就是说你不用手动算导数,训练模型时它自动帮你处理反向传播中的梯度计算,非常贴心!

x = torch.tensor(2.0, requires_grad=True)
y = x ** 2
y.backward()
print(x.grad)  # 输出 4.0,因为 dy/dx = 2x = 4

3. 张量的数据类型有哪些?

在 PyTorch 中,张量的数据类型主要分三类:

  • 浮点型
  • 整型
  • 布尔型

其中,浮点数和整数又分为不同位数的版本:

类型位数
整型8位、16位、32位、64位
浮点型16位、32位、64位
布尔型只有一种

❓ 为什么要搞这么多位数?

其实就是为了解决不同场景下的速度 vs 精度问题:

  • 有些设备(比如手机、嵌入式)对精度没那么敏感,更看重速度,就用低位(比如 int8float16
  • 做科学计算、训练大型模型时,需要高精度,那就用 float32float64 啦~

四、Tensor的创建

在 PyTorch 里,万物皆张量(Tensor)!它就像是打工人手里的工具,干啥都离不开它。

官方文档链接戳这里 👉 PyTorch Tensor 文档

我们先来看看张量的各种创建方式,放心,不枯燥,代码实打实的清晰!

1. 基本创建方式

以下这些创建张量的函数里,有两个很常见的参数:

  • dtype:数据类型
  • device:计算设备(比如 CPU、GPU)

可以通过 .dtype.device 属性查看张量的类型和所处位置~

1.1 torch.tensor():小写的那位老兄

这是最常见的方式,拿数据就能造张量。

import torch
import numpy as np

def test001():
    # 1. 用标量创建张量
    tensor = torch.tensor(5)
    print(tensor.shape)

    # 2. 使用 numpy 数组创建张量
    tensor = torch.tensor(np.random.randn(3, 5))
    print(tensor)
    print(tensor.shape)

    # 3. 用列表创建张量
    tensor = torch.tensor([[1, 2, 3], [4, 5, 6]])
    print(tensor)
    print(tensor.shape)
    print(tensor.dtype)

if __name__ == '__main__':
    test001()

常见报错注意⚠️

如果报出这个警告:

UserWarning: Failed to initialize NumPy: _ARRAY_API not found

说明你的 numpytorch 版本打架了,降一下 numpy 版本即可:

conda activate 你的虚拟环境名
pip uninstall numpy
pip install numpy==1.26.0

1.2 torch.Tensor():首字母大写的同胞

这个方式可以直接给出形状来创建张量,也能用数据直接造。

import torch

def test002():
    tensor1 = torch.Tensor(2, 3)  # 仅给形状,值随机
    print(tensor1)

    tensor2 = torch.Tensor([[1, 2, 3], [4, 5, 6]])  # 直接给值
    print(tensor2, tensor2.shape, tensor2.dtype)

    # 指定不同的数据类型
    print(torch.Tensor([1, 2, 3]).short())  # int16
    print(torch.Tensor([1, 2, 3]).int())    # int32
    print(torch.Tensor([1, 2, 3]).float())  # float32
    print(torch.Tensor([1, 2, 3]).double()) # float64

if __name__ == "__main__":
    test002()
torch.Tensortorch.tensor 的区别一览表:
特性torch.Tensor()torch.tensor()
类型推断默认 float32根据输入自动推断
支持指定 dtype
支持指定 device
输入是张量时创建副本默认共享数据
推荐用途快速造浮点张量精细控制类型 & 设备

1.3 torch.IntTensor() 等指定类型张量

还可以直接用指定类型类名创建,比如:

import torch

def test003():
    tt1 = torch.IntTensor(2, 3)
    print(tt1)

    tt2 = torch.FloatTensor(3, 3)
    print(tt2, tt2.dtype)

    tt3 = torch.DoubleTensor(3, 3)
    print(tt3, tt3.dtype)

    tt4 = torch.LongTensor(3, 3)
    print(tt4, tt4.dtype)

    tt5 = torch.ShortTensor(3, 3)
    print(tt5, tt5.dtype)

if __name__ == "__main__":
    test003()

2. 创建线性 & 随机张量

有时候我们不想手动给数据,想让它自动生成一串规律的值,比如线性增长、随机分布。

2.1 创建线性张量:arange & linspace

import torch

torch.set_printoptions(sci_mode=False)  # 关闭科学计数法

def test004():
    r1 = torch.arange(0, 10, 2)  # 步长为2
    print(r1)

    r2 = torch.linspace(3, 10, 10)  # 在 3~10 之间平均取 10 个点
    print(r2)

    r3 = torch.linspace(3, 10000000, 10)
    print(r3)

if __name__ == "__main__":
    test004()

2.2 随机张量:rand, randn, normal

随机种子(让结果可复现)
import torch

def test001():
    torch.manual_seed(123)
    print(torch.initial_seed())

if __name__ == "__main__":
    test001()
随机张量的创建
import torch

def test001():
    torch.manual_seed(123)
    print(torch.rand(2, 3))  # 均匀分布
    print(torch.randn(2, 3)) # 标准正态分布
    print(torch.normal(mean=2, std=3, size=(1, 4)))  # 自定义正态分布

if __name__ == "__main__":
    test001()

没设种子的话,每次生成的张量都不一样哟~

3. 创建 0 和 1 的张量

有时候我们想要干净、整齐的全 0 或全 1 张量,也很简单!

3.1 全 0 张量:zeros, zeros_like

import torch
import numpy as np

def test001():
    data = torch.zeros(2, 3)
    print(data, data.dtype)

    mask = np.random.randn(3, 4)
    data = torch.zeros_like(torch.tensor(mask))
    print(data)

if __name__ == "__main__":
    test001()

3.2 全 1 张量:ones, ones_like

import torch
import numpy as np

def test001():
    data = torch.ones(2, 3)
    print(data, data.dtype)

    mask = np.zeros((3, 4))
    data = torch.ones_like(torch.tensor(mask))
    print(data)

if __name__ == "__main__":
    test001()

4. 创建指定值张量:full, full_like

import torch
import numpy as np

def test001():
    data = torch.full((2, 3), 666.0)
    print(data, data.dtype)

    mask = np.zeros((3, 4))
    data = torch.full_like(torch.tensor(mask), 999)
    print(data)

if __name__ == "__main__":
    test001()

5. 创建单位矩阵:eye

想要一个主对角线全是1的单位矩阵?来一个 eye()

import torch

def test002():
    data = torch.eye(4)
    print(data)

if __name__ == "__main__":
    test002()

五、Tensor常见属性

张量是 PyTorch 的灵魂,那些 devicedtypeshape 等属性就像它的身份证信息,掌握它们,才能玩得更溜!

1. 获取属性

调试是了解张量的第一步,想知道它是啥、在哪、长啥样,看属性就对了:

import torch

def test001():
    data = torch.tensor([1, 2, 3])
    print(data.dtype, data.device, data.shape)

if __name__ == "__main__":
    test001()

2. 切换设备(CPU/GPU)

默认情况下,张量是在 CPU 上的,但 GPU 是加速神器,学会切换设备是 PyTorch 入门必备技能!

⚠️ 注意:不同设备上的张量不能直接进行计算,否则会报错!


✅ 自动判断是否有 GPU,然后迁移张量

import torch

def test001():
    data = torch.tensor([1, 2, 3])
    print(data.dtype, data.device, data.shape)

    # 把数据切换到 GPU 进行运算
    device = "cuda" if torch.cuda.is_available() else "cpu"
    data = data.to(device)
    print(data.device)

if __name__ == "__main__":
    test001()

🚀 或者直接用 .cuda():

data = data.cuda()

🌟 还能直接在 GPU 上创建:

data = torch.tensor([1, 2, 3], device='cuda')
print(data.device)

3. 类型转换(dtype)

在模型训练和推理中,张量类型转换是非常常见的操作,比如将 float32 转成 float16,可以 节省显存、提高效率。


✨ 示例代码:

import torch

def test001():
    data = torch.tensor([1, 2, 3])
    print(data.dtype)  # torch.int64

    # 1. 使用 type() 方法进行转换
    data = data.type(torch.float32)
    print(data.dtype)  # float32
    data = data.type(torch.float16)
    print(data.dtype)  # float16

    # 2. 使用类型方法转换
    data = data.float()
    print(data.dtype)  # float32

    data = data.half()
    print(data.dtype)  # float16

    data = data.double()
    print(data.dtype)  # float64

    data = data.long()
    print(data.dtype)  # int64

    data = data.int()
    print(data.dtype)  # int32

    # 3. 创建张量时就指定 dtype
    data = torch.tensor([1, 2, 3], dtype=torch.half)
    print(data.dtype)

if __name__ == "__main__":
    test001()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值