(二)开启深度学习动手之旅:先筑牢预备知识根基

1 数据操作

数据操作是深度学习的基础,包括数据的创建、索引、切片、运算等操作。这些操作是后续复杂模型构建和训练的前提。

  • 入门 :理解如何使用NumPy创建数组,这是深度学习中数据存储的基本形式。掌握数组的属性(如数据类型dtype和形状shape)对后续操作至关重要。
  • 运算符 :学会对数组进行基本运算,这是数据变换和特征工程的基础。理解广播机制能让你更灵活地处理形状不同的数组运算。
  • 索引和切片 :精准提取数据的能力在数据预处理和分析中非常关键,例如提取特定样本或特征。
  • 节省内存 :理解内存共享机制能帮助你更高效地处理大数据集,避免不必要的内存占用。
  • 转换为其他Python对象 :有时需要将数组转换为列表等其他形式以便于与其他Python库或函数配合使用。
1.1 入门

数据操作是深度学习的基础,通常使用NumPy库来创建和操作数组。使用NumPy创建和操作数组:

import numpy as np

# 创建数组
data = np.array([[1, 2, 3], [4, 5, 6]])

# 打印数据
print("数据类型:", data.dtype)
print("数据形状:", data.shape)
print("数据内容:\n", data)
1.2 运算符

对数组进行基本的数学运算,包括加法、减法、乘法、除法等。

# 基本运算
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

print("加法:", a + b)
print("减法:", a - b)
print("乘法:", a * b)
print("除法:", a / b)
1.3 广播机制

广播机制允许形状不同的数组进行运算,较小的数组会在较大的数组上广播。

# 广播机制
a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([1, 2, 3])

print("广播加法:\n", a + b)
1.4 索引和切片

索引和切片操作用于提取数组中的特定元素或子数组。对数组进行索引和切片操作:

# 索引和切片
data = np.array([[1, 2, 3], [4, 5, 6]])

print("第一行:", data[0, :])
print("第一列:", data[:, 0])
1.5 节省内存

通过共享内存的方式节省内存,避免数据的复制:

# 节省内存
data = np.array([[1, 2, 3], [4, 5, 6]])
data_view = data[:2, :2]

print("原数据:\n", data)
print("视图:\n", data_view)
1.6 转换为其他Python对象

将数组转换为其他Python对象,如列表:

# 转换为其他Python对象
data = np.array([1, 2, 3])
data_list = data.tolist()

print("列表:", data_list)

2 数据预处理

数据预处理是深度学习中的重要步骤,包括读取数据集、处理缺失值、转换为张量等。数据预处理的目的是将原始数据转化为适合模型训练的形式,提高模型的性能和泛化能力。

  • 读取数据集 :这是数据预处理的第一步,正确读取和加载数据是后续所有操作的基础。
  • 处理缺失值 :缺失值会影响模型训练,学会合理处理(如删除或填充)是保证数据质量的关键。
  • 转换为张量 :深度学习框架中的张量是模型训练的基本数据形式,掌握这一转换过程是使用深度学习框架的前提。
2.1 读取数据集

读取数据集是数据预处理的第一步,通常使用Pandas库来读取CSV文件:

import pandas as pd

# 读取CSV文件
data = pd.read_csv('data.csv')

# 查看数据
print(data.head())
2.2 处理缺失值

处理缺失值是数据预处理的重要步骤,可以删除缺失值或用特定值填充:

# 处理缺失值
data = data.dropna()  # 删除缺失值
data = data.fillna(0)  # 填充缺失值为0
2.3 转换为张量

将数据转换为深度学习框架中的张量,以便进行后续的训练和推理:

import torch

# 转换为张量
data_array = data.values
data_tensor = torch.from_numpy(data_array)

print("张量:\n", data_tensor)

3 线性代数

线性代数是深度学习的数学基础,包括标量、向量、矩阵、张量等概念。线性代数提供了深度学习中数据表示和操作的数学工具,是理解模型结构和算法的基础。

  • 标量、向量、矩阵、张量 :这些是线性代数的基本元素,它们构成了深度学习中数据的各种表示形式,理解它们的维度和结构对于后续学习至关重要。
  • 张量算法的基本性质 :掌握张量的基本操作(如加法、点积、矩阵乘法等)是理解模型内部计算逻辑的基础。
  • 降维 :在处理高维数据时,降维操作有助于减少计算复杂度并去除冗余信息。
  • 范数 :范数提供了衡量向量或矩阵大小的工具,常用于损失函数和正则化项中。
3.1 标量

标量是一个单独的数值,是0维张量:

# 标量
scalar = np.array(5)
print("标量:", scalar)
3.2 向量

向量是一维数组,是1维张量:

# 向量
vector = np.array([1, 2, 3])
print("向量:", vector)
3.3 矩阵

矩阵是二维数组,是2维张量:

# 矩阵
matrix = np.array([[1, 2, 3], [4, 5, 6]])
print("矩阵:\n", matrix)
3.4 张量

张量是多维数组,可以表示任意维度的数据:

# 张量
tensor = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
print("张量:\n", tensor)
3.5 张量算法的基本性质

张量算法包括加法、点积、矩阵乘法等基本操作:

# 张量操作
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

print("加法:", a + b)
print("点积:", np.dot(a, b))
3.6 降维

降维操作用于减少张量的维度,通常用于数据简化:

# 降维
data = np.array([[1, 2, 3], [4, 5, 6]])
print("降维后的数据:", np.sum(data, axis=1))
3.7 点积

点积是两个向量的内积,结果是一个标量:

# 点积
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

print("点积:", np.dot(a, b))
3.8 矩阵-向量积

矩阵-向量积是矩阵和向量的乘积,结果是一个向量:

# 矩阵-向量积
matrix = np.array([[1, 2, 3], [4, 5, 6]])
vector = np.array([1, 2, 3])

print("矩阵-向量积:", np.dot(matrix, vector))
3.9 矩阵-矩阵乘法

矩阵-矩阵乘法是两个矩阵的乘积,结果是一个矩阵:

# 矩阵-矩阵乘法
matrix1 = np.array([[1, 2], [3, 4]])
matrix2 = np.array([[5, 6], [7, 8]])

print("矩阵-矩阵乘法:\n", np.dot(matrix1, matrix2))
3.10 范数

范数是衡量张量大小的指标,常见的有L1范数和L2范数:

# 范数
data = np.array([1, 2, 3])

print("L1范数:", np.linalg.norm(data, ord=1))
print("L2范数:", np.linalg.norm(data, ord=2))

4 微积分

微积分是深度学习中优化算法的数学基础。微积分是优化算法的理论基础,帮助我们理解模型训练过程中参数如何更新以最小化损失函数。

  • 导数和微分 :导数描述了函数在某一点的变化率,是优化算法中计算梯度的基础。
  • 偏导数和梯度 :在多变量函数中,偏导数和梯度指导我们如何调整多个参数以优化目标函数。
  • 链式法则 :这是计算复合函数导数的关键法则,在神经网络的反向传播算法中发挥着核心作用。
4.1 导数和微分

导数是函数在某一点的瞬时变化率,微分是导数的另一种表达方式:

import sympy as sp

# 定义变量和函数
x = sp.symbols('x')
f = x**2 + 3*x + 2

# 计算导数
df = sp.diff(f, x)

print("导数:", df)
4.2 偏导数

偏导数是多元函数对某一变量的导数,其他变量视为常数:

# 偏导数
x, y = sp.symbols('x y')
f = x**2 + y**2

df_dx = sp.diff(f, x)
df_dy = sp.diff(f, y)

print("偏导数对x:", df_dx)
print("偏导数对y:", df_dy)
4.3 梯度

梯度是多元函数在某一点的导数向量,指向函数增长最快的方向:

# 梯度
x, y = sp.symbols('x y')
f = x**2 + y**2

gradient = [sp.diff(f, var) for var in (x, y)]

print("梯度:", gradient)
4.4 链式法则

链式法则是计算复合函数导数的法则,常用于神经网络的反向传播:

# 链式法则
x = sp.symbols('x')
f = sp.sin(x**2)

df = sp.diff(f, x)

print("导数:", df)

5 自动微分

自动微分是深度学习框架中用于计算梯度的关键技术。也是深度学习框架自动计算梯度的技术,极大地简化了模型训练过程中的梯度计算。

  • 自动微分机制 :理解自动微分如何通过记录操作并应用链式法则计算梯度,有助于更高效地训练复杂模型。
  • 分离计算 :在训练过程中合理分离计算,避免梯度累积,是正确更新模型参数的重要步骤。
5.1 一个简单的例子

自动微分通过跟踪操作记录自动计算梯度,使用PyTorch计算梯度:

# 自动微分
import torch

x = torch.tensor(2.0, requires_grad=True)
y = x**2 + 3*x + 2

y.backward()
print("梯度:", x.grad)
5.2 非标量变量的反向传播

非标量变量的反向传播需要计算梯度的总和,计算非标量变量的梯度:

# 非标量变量的反向传播
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
y = x**2

y.sum().backward()
print("梯度:", x.grad)
5.3 分离计算

分离计算用于避免梯度累积,通常在训练循环中使用,分离计算以避免梯度累积:

# 分离计算
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
y = x**2

y.sum().backward()
print("梯度:", x.grad)

x.grad.zero_()  # 清空梯度

y = x**2
y.sum().backward()
print("梯度:", x.grad)
5.4 Python控制流的梯度计算

在控制流中计算梯度需要考虑条件分支和循环的影响,在控制流中计算梯度:

# Python控制流的梯度计算
def function(x):
    if x.sum() > 0:
        return x**2
    else:
        return x

x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
y = function(x)
y.sum().backward()
print("梯度:", x.grad)

6 概率

概率是深度学习中处理不确定性的数学工具。在深度学习中用于建模数据分布和不确定性。

  • 基本概率论 :理解概率分布、期望和方差等概念,有助于分析模型的输出和不确定性。
  • 处理多个随机变量 :掌握联合概率和条件概率,对于理解数据中变量之间的关系至关重要。
6.1 基本概率论

概率论研究随机现象的统计规律,包括概率分布、期望、方差等。计算概率分布:

import numpy as np

# 概率分布
probabilities = np.array([0.1, 0.2, 0.3, 0.4])
print("概率和:", np.sum(probabilities))
6.2 处理多个随机变量

多个随机变量的联合概率和条件概率用于描述变量之间的关系。计算联合概率和条件概率:

# 联合概率
joint_prob = np.array([[0.1, 0.2], [0.3, 0.4]])
print("联合概率和:", np.sum(joint_prob))

# 条件概率
cond_prob = joint_prob[0, :] / np.sum(joint_prob[0, :])
print("条件概率:", cond_prob)
6.3 期望和方差

期望是随机变量的平均值,方差是随机变量的离散程度。计算期望和方差:

# 期望和方差
data = np.array([1, 2, 3, 4, 5])
mean = np.mean(data)
variance = np.var(data)

print("期望:", mean)
print("方差:", variance)

7 查阅文档

查阅深度学习框架的文档以获取更多信息。能够高效地查阅深度学习框架的文档是自主学习和解决问题的关键技能。

7.1 查找模块中的所有函数和类

通过Python的 dir() 函数可以查看模块中的所有函数和类。查找模块中的所有函数和类:

import numpy as np

# 查找模块中的所有函数和类
print(dir(np))
7.2 查找特定函数和类的用法

通过Python的 help() 函数可以查看特定函数和类的用法。查找特定函数和类的用法:

# 查找特定函数和类的用法
help(np.array)

通过对这些概念的深入理解,你可以更系统地掌握深度学习的预备知识,并为后续学习深度学习模型和算法打下坚实的基础。这些概念和技能将贯穿于深度学习的各个环节,帮助你更好地理解和应用相关技术。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值