一、深度学习简介
○ 什么是深度学习
机器学习是实现人工智能的一种途径。
深度学习是机器学习的一个子集,也就是说深度学习是实现机器学习的一种方法。
深度学习是机器学习中一种基于对数据进行特征学习的算法。
深度学习是基于人工神经网络,深度是指网络中使用多层,每层都通过非线性变换处理数据,并逐渐提取出更复杂、更抽象的特征。
传统机器学习算法依赖人工设计特征,并进行特征提取;而深度学习方法不需要人工,而是依赖算法自动提取特征。
深度学习通过模仿人脑的神经网络来处理和分析复杂的数据,从大量数据中自动提取复杂特征。这也是深度学习被看做黑盒子,可解释性差的原因。
深度学习尤其擅长处理高维数据,如图像、语音和文本。
○ 深度学习特点
**① 多层非线性变换:**深度学习模型由多个层次组成,每一层都应用非线性激活函数对输入数据进行变换。较低的层级通常捕捉到简单的特征(如边缘、颜色等),而更高的层级则可以识别更复杂的模式(如物体或面部识别)。
**② 自动特征提取:**与传统机器学习算法不同,深度学习能够自动从原始数据中学习到有用的特征,而不需要人工特征工程。这使得深度学习在许多领域中表现出色。
**③ 大数据和计算能力:**深度学习模型通常需要大量的标注数据和强大的计算资源(如GPU)来进行训练。大数据和高性能计算使得深度学习在图像识别、自然语言处理等领域取得了显著突破。
**④ 可解释性差:**深度学习模型内部的运作机制相对不透明,被称为"黑箱",这意味着理解模型为什么做出特定决策可能会比较困难。这对某些应用场景来说是一个挑战。
○ 常见的深度学习模型
线性归回→ANN人工神经网络→RNN→Transformer→大模型
● 卷积神经网络 (Convolutional Neural Networks,CNN)
● 循环神经网络(Recurrent Neural Networks,RNN)
● 自编码器(Autoencoders)
● 生成对抗网络 (Generative Adversarial Networks,GAN)
● Transformer
● 深度强化学习 (Deep Reinforcement Learning,DRL)
● 图神经网络(GNN,Graph Neural Network)
○ 应用场景
● 计算机视觉
● 自然语言处理
● 自动驾驶
● 推荐系统
● 医疗健康
● 工业与制造业
● 语音与音频处理
● ...
二、PyTorch框架使用
1.PyTorch框架简介
PyTorch一个基于Python语言的深度学习框架,它将数据封装成张量(Tensor)来进行处理。
PyTorch提供了灵活且高效的工具,用于构建、训练和部署机器学习和深度学习模型。
PyTorch广泛应用于学术研究和工业界,特别是在计算机视觉、自然语言处理、强化学习等领域。
PyTorch的安装:pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple
(Anaconda开发环境自带的有,不用执行命令)
PyTorch特点● 类似于NumPy的张量计算
● 自动微分系统
● 深度学习库
● 动态计算图
● GPU加速(CUDA支持)
● 支持多种应用场景
● 跨平台支持
● ...
2.张量创建
○ 什么是张量
PyTorch中的张量就是元素为同一种数据类型的多维矩阵。在PyTorch中,张量以"类"的形式封装起来,对张量的些运算、处理的方法被封装在类中。
PyTorch张量与NumPy数组类似,但PyTorch的张量具有GPU加速的能力(通过CUDA),这使得深度学习模型能够高效地在GPU上运行。
PyTorch提供了对张量的强大支持,可以进行高效的数值计算、矩阵操作、自动求导等。张量是PyTorch 中的核心数据抽象,PyTorch支持各种张量子类型。通常地,一维张量称为向量/矢量(vector),二维张量称为矩阵(matrix)。
掌握:什么是张量
torch.tensor
torch.rand
torch.randint
torch.manual_seedtorch.zeros
torch.ones
○ 张量的基本创建方式
● torch.tensor 根据指定数据创建张量
● torch.Tensor 根据形状创建张量,其也可用来创建指定数据的张量
● torch.IntTensor、torch.FloatTensor、torch.DoubleTensor 创建指定类型的张量
○ 创建线性和随机张量
● torch.arange() 和 torch. linspace() 创建线性张量
● torch.random.initial_seed() 和 torch.random.manual_seed() 随机种子设置
● torch.rand/randn() 创建随机浮点类型张量
● torch.randint(low,high,size=()) 创建随机整数类型张量
○ 创建0、1、指定值张量
● torch.ones 和 torch.ones_like 创建全1张量
● torch.zeros 和 torch.zeros_like 创建全0张量● torch.full 和 torch.full_like 创建全为指定值张量
○ 张量元素类型转换
● data.type(torch.DoubleTensor)
● data.half/double/float/short/int/long()
○ 掌握
基本创建 torch.tensor(数据)
线性张量 torch.arange(start,end,step)
torch.linspace(low,high,steps)
随机张量 rand、randn、randint
manual_seed()
指定值张量 ones、ones_like、full、full_like
修改张量【中】元素数据类型 张量对象.type(类型)
3.张量类型转换
○ 张量转换为NumPy数组
● 使用 Tensor.numpy 函数可以将张量转换为 ndarray 数组,但是共享内存,可以使用 copy 函数避免共享。
● 使用 torch.tensor 可以将 ndarray 数组转换为 Tensor,默认不共享内存。
张量对象.numpy()。默认是共享内存,可以在numpy()加上copy()实现不共享内存
○ NumPy数组转换为张量
● 使用 from_numpy 可以将 ndarray 数组转换为 Tensor,默认共享内存,使用 copy 函数避免共享。
● 使用 torch.tensor 可以将 ndarray 数组转换为 Tensor,默认不共享内存。
不共享内存:torch.tensor(ndarray)
共享内存:torch.from_numpy(ndarray)
○ 标量张量和数字转换
● 对于只有一个元素的张量,使用item(函数将该值从张量中提取出来
#当张量只包含一个元素时,可以通过item()函数提取出该值
pythonimport torch import numpy as np # 1 ------------- 张量转成Numpy ------------- t1 = torch.tensor([1, 2, 3]) print(t1) # 默认共享内存 arr1 = t1.numpy() # ndarray print(type(arr1)) print(arr1) # 使用copy,不共享内存。就是一个深拷贝 arr1 = t1.numpy().copy() t1[1] = 999 print(f"张量:{t1}") # 张量:tensor([ 1, 999, 3]) print(f"Numpy:{arr1}") # Numpy:[1 2 3] # 2 ------------- Numpy转成张量 ------------- arr2 = np.array([112, 2, 33]) print(type(arr2)) # form_numpy会共享内存 t2 = torch.from_numpy(arr2) print(t2) arr2[1] = 999 print(f"Numpy:{arr2}") print(f"张量:{t2}") print('---------------------------------') # torch.tensor(Numpy)不会共享内存 t3 = torch.from_numpy(arr2) print(t3) arr2[1] = 666 print(f"Numpy:{arr2}") print(f"张量:{t3}") # 3 ------------- 标量转成张量 ------------- t4 = torch.tensor(data=999) print(t4) # 4 ------------- 张量转成标量 ------------- t5 = torch.tensor(data=999) print(type(t5)) result = t5.item() print(type(result)) print(result) # 注意事项: t6 = torch.tensor(data=[11, 22]) result_2 = t6.item() print(result_2)
○ 提取标量张量的数值
○ 掌握
torch.tensor
张量对象.item()
4.张量数值计算
● 张量的基本运算
加减乘除取负号:
- * / *-1
add、sub、mul、div、neg
add_、sub_、mul_、div_、neg_(其中带下划线的版本会修改原数据)
● 点乘运算
点乘(Hadamard)的是相同形状的张量对应位置的元素相乘,使用mull和运算符*实现。
● 矩阵乘法运算
矩阵乘法运算要求第一个矩阵shape:(n,m),第二个矩阵shape:(m,p),两个矩阵点积运算shape为:(n,p)。
1.运算符@用于进行两个矩阵的乘积运算
2.torch.matmul对进行乘积运算的两矩阵形状没有限定。对于输入的shape不同的张量,对应的最后几个维度必符合矩阵运算规则
python
import torch
import numpy as np
# 设置随机数种子
torch.manual_seed(129)
# 1------------ 算术运算 ------------
t1 = torch.randint(low=-3, high=5, size=(3, 4)) # 创建3行4列的二位张量
print(t1)
# 【掌握】+-*/
t2 = t1 + 10
t3 = t1 * 10
print(f"加法:{t2}")
print(f"乘法:{t3}")
# 函数
t4 = t1.add(20)
t5 = t1.mul(20) # mul → multi乘法
t6 = t1.neg() # 正数变负数,负数变正书
print(f"加法:{t4}")
print(f"乘法:{t5}")
print(f"取负数:{t6}")
# 带下划线的函数,原始数据会收到影响
# t1.add_(20) # 推荐的写法
t7 = t1.add_(20)
print(f"t1 → {t1}")
print(f"t7 → {t7}")
# 2------------ 张量点乘 ------------
"""
点乘总结:
1- 两个张量对应位置的元素进行乘法运算
2- 注意:两个张量的形状必须完全相同
"""
A = torch.tensor(data=[[1, 2], [3, 4]])
B = torch.tensor(data=[[5, 6], [7, 8]])
# 下面的形状与A的不同,因此会报错
# B = torch.tensor(data=[[5, 6], [7, 8], [9, 10]]) # 3行2列
# result = A * B # 推荐掌握
result = A.mul(B)
print(result)
# 3------------ 张量的矩阵乘法 ------------
torch.manual_seed(129)
A = torch.randint(low=1, high=5, size=(2, 3)) # 2行3列
B = torch.randint(low=1, high=5, size=(3, 4)) # 3行4列
print(f"A→{A}")
print(f"B→{B}")
result_2 = A @ B
print(f"结果:{result_2}")
5.张量运算函数
掌握:
sum()
dim=0按第0维(也就是行)计算,dim=1按第1维(也就是列)计算
● tensor.mean(dim=):平均值● tensor.sum(dim=):求和、掌握
● tensor.min/max(dim=):最小值/最大值
● tensor.pow(exponent=):幂次方xⁿ
● tensor.sqrt:平方根
● tensor.exp():指数e^x
● tensor.log():对数以e为底
● dim=0按第0维(也就是行)计算,dim=1按第1维(也就是列)计算
python
import torch
t1 = torch.tensor([[1, 2, 3], [4, 5, 6]], dtype=torch.float)
print(t1)
# sum求和。【掌握】
s_1 = t1.sum() # 将张量中所有的元素值进行求和
s_2 = t1.sum(dim=0) # 按第一个维度进行计算
s_3 = t1.sum(dim=1) # 按第二个维度进行计算
s_4 = t1.sum(dim=-1) # 按最后一个维度进行计算,常用
print(s_1)
print(s_2)
print(s_3)
print(s_4)
# 其他计算函数
t2 = torch.tensor([[1, 2, 3], [4, 5, 6]], dtype=torch.float)
print(t2)
mean_result = t2.mean() # 算均值=21/6
print(mean_result)
min_result = t2.min()
print(min_result)
sqrt = t2.sqrt()
print(sqrt)
log2_result = t2.log2()
print(log2_result)