0x 0学习目录
- python语法
- 数据操作
- 线性代数
- 线性回归
- Softmax回归+损失函数+图片分类
后续学习可能需要补充的知识
- 矩阵论
0x 1 Python语法
with关键字
-
Python 中的 with 语句用于异常处理,封装了 try…except…finally 编码范式,提高了易用性。
-
with 语句使代码更清晰、更具可读性, 它简化了文件流等公共资源的管理。
backward()函数的理解
(25条消息) pytorch中backward()函数详解_backward函数_Camlin_Z的博客-CSDN博客
yield关键字的理解
(25条消息) python中yield的用法详解——最简单,最清晰的解释_python yield_冯爽朗的博客-CSDN博客
张量索引
features = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
labels = [0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
batch_indices = torch.tensor([1, 3, 5])
selected_features = features[batch_indices] # tensor([1, 3, 5])
selected_labels = labels[batch_indices] # tensor([1, 1, 1])
*的含义
Q
def load_array(data_arrays,batch_size,is_train=True):
"""构造一个PyTorch的数据迭代器"""
dataset = data.TensorDataset(*data_arrays)
return data.DataLoader(dataset,batch_size,shuffle=is_train)
其中,*data_arrays是什么意思
A
data_arrays
是一个由多个张量组成的元组,这些张量包含了数据集中的特征和标签数据。在Python中,*被称为可变位置参数,它可以将一个元组或列表展开成独立的位置参数。在这里,*data_arrays将元组中的每个张量作为单独的参数传递给了TensorDataset
构造函数。
举个例子,如果我们有以下张量:
features = torch.tensor([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])
labels = torch.tensor([1.0, 2.0, 3.0])
那么调用TensorDataset(*data_arrays)
就相当于调用TensorDataset(features, labels)
。这样,我们就可以使用PyTorch提供的数据集和数据迭代器来高效地读取和处理大规模数据集。
在load_array
函数中,我们首先通过TensorDataset
将特征和标签数据组合成一个dataset
对象。然后,我们使用DataLoader
来创建一个迭代器,每次迭代时可以返回一个大小为batch_size
的小批次数据。如果is_train
为True,则打乱数据集顺序以增加随机性(即使特征和标签依然是匹配的)。这里的返回结果就是一个PyTorch数据迭代器,可以用于训练和测试深度学习模型。
以下的两种写法是一样的
- 写法1:
file = open('./test_runoob.txt', 'w')
try:
file.write('hello world')
finally:
file.close()
- 写法2:
with open('./test_runoob.txt', 'w') as file:
file.write('hello world !')
torchvision库
pytorch对计算机视觉实现的库
y_hat[[0, 1], y] 一种简写
y = torch.tensor([0, 2])
y_hat = torch.tensor([[0.1, 0.3, 0.6], [0.3, 0.2, 0.5]])
y_hat[[0, 1], y] # 输出的解释: 第0个组的第0号元素,第1个组的2号元素
output:
tensor([0.1000, 0.5000])
广播机制
code:
import numpy as np
# 创建两个不同形状的ndarray数组
a = np.array([1, 2, 3])
b = np.array([[4], [5], [6]])
# 使用广播机制进行加法运算
c = a + b
print(c)
output:
array([[5, 6, 7],
[6, 7, 8],
[7, 8, 9]])
数组a自动广播为一个(3, 3)的数组,其中的每一行都是原始数组a。数组b也被广播为一个(3, 3)的数组,其中的每一列都是原始数组b。然后我们对这两个数组进行了加法运算,得到了一个最终的(3, 3)的输出数组。这就是广播机制的工作方式,它使得我们可以对不同形状和大小的数组执行相同的数学运算操作
0x 2数据操作
N维数组
- [1:3,1:]的意思是
- 从第1行到第2行
- 从第1列到最后一列
- [::3,::2]的意思是
- 从第0行到最后一行,步长为3 行定位
- 从第0列到最后一列,步长为2列定位
仓库里面还有jupyter notebook可以看代码的讲解。
0x 2线性代数-下面只记录 不太清楚/忘记/有别名 的概念
范数
暂且理解下面的不等式 类比勾股定理
置换矩阵
哈达玛积
其中,A、B都张这样:
讲矩阵导数时遇到的一些奇奇怪怪的东西:
- 不可导点处,假装它可导
- 梯度/对向量求导(零基础入门系列当中也有讲过)
- 链导法
- 计算图(方便计算机来做求导运算)
上面的是显式构造,下面的是隐式构造
线性回归
盘代码逻辑
Softmax回归+损失函数+图片分类
它能解决什么问题?e.g.
softmax回归
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g7ZFKshU-1688113711187)(https://zh.d2l.ai/_images/softmaxreg.svg)]
损失函数
Softmax代码的实现步骤
- 拿到测试集、训练集 by d2l.load_data_fasion_mnist
- 将3d(channel、length、height)的图片(1*28*28)拉成一个向量784*1,使用softmax回归
- 定义权重 W、b
- 定义Softmax操作(其实和线性回归没啥区别,softmax输出是个vector但是linear输出是一个scalar)
- 实现交叉熵损失函数
- 预测正确的数量统计 (没懂)
- 评价精度 (6与7之间的关系是什么?)
- 整合
交叉熵
what
-
比较两个模型之间的差异
-
两个模型
- 都是高斯分布 => 可以直接比较
- 一个高斯分布,另一个泊松分布 =>没法直接比较
#todo继续学习交叉熵视频
多层感知机
- 解决单层感知机的若干问题,例如无法解决XOR问题
模型选择 + 过拟合和欠拟合
为什么那个地方是最优的?
- 泛化误差尽量小
- 两根曲线的差距也要尽量小
权重衰退
前置知识-L1、L2正则化
What?
- 处理过拟合的方法
How?
-
硬性限制
-
柔性限制
-
参数更新