一、PyTorch
1.torch.tensor
在PyTorch中,torch.Tensor是存储和变换数据的主要工具。
Tensor与Numpy的多维数组非常相似。
Tensor还提供了GPU计算和自动求梯度等更多功能,这些使Tensor更适合深度学习。
2.创建Tensor
2.1 直接创建一个2*4的未初始化的Tensor:
x = torch.empty(2,4)
2.2 其余tensor的构造函数
Tensor(*sizes) 基础构造函数
ones(*sizes) 全1Tensor
zeros(*sizes) 全0Tensor
eye(*sizes) 对角线为1,其他为0
arange(s,e,step) 从s到e,步长为step
linespace(s,e,steps) 从s到e,均匀切分成steps份
normal(mean,std)/uniform(from,to) 正态分布/均匀分布
randperm(m) 随机排列
2.3 Tensor的索引操作:
我们还可以使用类似Numpy的索引操作来访问Tensor的一部分。需要注意的是:索引出来的结果与原数据共享内存,也即修改一个,另一个也会跟着修改。
2.4 torch.squeeze() 和torch.unsqueeze()——对数据的维度进行压缩或者解压
torch.unsqueeze(input, dim)
——在tensor的某个维度上添加一个维数为1的维度
这个函数主要对数据的维度进行压缩,去掉维数为1的的维度。比如:是一行或者一列这种,一个一行三列(1,3)的数去掉第一个维数为一的维度之后就变成(3)行。b=torch.squeeze(a,N) 就是将a中所有为1的维度删掉,不为1的维度没有影响。
2.5 Transpose-交换两个特定的维度
2.6 Cat-连接多重张量
2.7 Broadcasting semantics -当对两个形状不同的Tensor按元素运算时,可能会触发广播机制(broadcasting)机制:先适当复制元素使这两个Tensor形状相同后再按元素运算。
3.Computational graph
4.automatic differentiation(torch.autograd)
```python
import torch # 导入PyTorch库
import numpy as np # 导入NumPy库,命名为np
import matplotlib.pyplot as plt # 导入matplotlib库中的pyplot模块用于数据可视化
# 定义真实的线性关系参数和添加的噪声
a_ref = -1.5
b_ref = 8
noise = 0.2 * np.random.randn(50)
# 生成x的50个数据点
x = np.linspace(1, 4, 50)
# 创建带有真实线性关系和噪声的y值
y = a_ref * x + b_ref + noise
# 定义均方误差(MSE)损失函数
def MSE_loss(prediction, target):
return (prediction - target).pow(2).mean()
# 转换数据为PyTorch张量
xx = torch.tensor(x, dtype=torch.float32)
yy = torch.tensor(y, dtype=torch.float32)
a = torch.tensor(0, requires_grad=True, dtype=torch.float32) # 初始化a为可训练参数
b = torch.tensor(5, requires_grad=True, dtype=torch.float32) # 初始化b为可训练参数
number_of_epochs = 1000 # 训练迭代次数
learning_rate = 0.01 # 学习率
# 进行迭代训练
for iteration in range(number_of_epochs):
y_pred = a * xx + b # 模型预测
loss = MSE_loss(y_pred, yy) # 计算损失
loss.backward() # 反向传播计算梯度
with torch.no_grad():
a = a - learning_rate * a.grad # 更新参数a
b = b - learning_rate * b.grad # 更新参数b
a.requires_grad = True # 设置a参数需要梯度计算
b.requires_grad = True # 设置b参数需要梯度计算
print(a) # 打印训练后的a参数
print(b) # 打印训练后的b参数
a1 = a.detach().cpu().numpy() # 转换a参数为NumPy数组
b1 = b.detach().cpu().numpy() # 转换b参数为NumPy数组
x_est = x # 设置估计的x值
y_est = a1 * x_est + b1 # 使用训练得到的参数估计y值
plt.scatter(x, y, s=10) # 绘制原始数据点
plt.plot(x_est, y_est, 'r') # 绘制估计的线性回归线
plt.show() # 显示图形
```
5.Data loading and preprocessing(torch.utils)
-
Dataset:
- Dataset类用于表示数据集,其中包含训练数据的样本和对应的标签。您可以根据自己的数据格式创建自定义的Dataset,也可以使用PyTorch提供的内置Dataset(如TensorDataset、ImageFolder等)。
- 您需要编写自定义的Dataset类来加载数据,并实现
__len__
和__getitem__
方法,其中__len__
返回数据集的大小,__getitem__
根据索引返回样本和标签。
-
DataLoader:
- DataLoader类用于批量加载数据,它允许您指定批量大小、是否打乱数据等参数。DataLoader接收一个Dataset实例作为输入,按批次提供数据,使训练过程更加有效。
- 使用DataLoader可以方便地对数据进行迭代,同时在训练过程中自动进行数据批处理、打乱数据和多进程加载等操作。
数据增强(Data augmentation)指的是在训练模型之前对原始数据进行变换、扭曲或改变,以生成更多样本、扩大数据集规模,从而提高模型的泛化能力。数据增强是在深度学习任务中非常常见的技术,特别是在计算机视觉领域,可以有效地帮助模型处理各种变体和噪声,减少过拟合,提高模型的鲁棒性。
常见的数据增强操作包括但不限于:
- 随机裁剪(Random cropping)
- 随机旋转(Random rotation)
- 随机翻转(Random flipping)
- 随机缩放(Random scaling)
- 色彩变换(Color jittering)
- 噪声添加(Noise injection)
- 平移(Translation)
- 旋转、缩放、剪切(Affine transformation)
6.Regression