一、常用概念
1.有监督学习与无监督学习:
有监督学习的训练集要求包括输入和输出,即特征和标签,包括回归、分类、支持向量机(SVM)、决策树、随机森林、人工神经网络等。无监督学习的样本数据类型未知,输入数据未被标记,在训练集中寻找规律,从而学到或建立模型,包括:聚类、主成分分析法(PCA)
2. TorchMetrics
TorchMetrics是一个开源的PyTorch原生的函数和度量模块的集合,用于简单的性能评估。目前支持超过25个指标,并不断增加更多的通用任务和特定领域的标准(目标检测,NLP等)
3.方法重写
方法的重写,不能发生在同类中,只能发生在子类中。
若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。
4. 激活函数:
① logistic:f(x)=1 / (1+e^(-x))
② softmax(Xi) = exp(Xi) / sum(exp(Xi))
nn.Softmax(dim)
若输入为二维,dim = 0为使列数据和为0;dim=1为使行数据为0
③ relu(X) = max(0, X)
5.损失函数
① 二元交叉熵损失函数:nn.BCELoss() >>使用nn.BCELoss需要在该层前面加上Sigmoid函数
from torch import nn
loss = nn.BCELoss()
l = loss(y_hat, y) # 预测值与标签输入顺序不能颠倒
② 交叉熵损失函数: nn.CrossEntropyLoss() ##softmax函数和交叉熵损失函数合并
③ 均方损失函数: nn.MSELoss() (y_hat - y) ** 2 / batch_size >> loss.mean()
# 1
torch.nn.MSELoss(y_hat, y, reduce, size_average)
## 默认reduce = True,返回标量形式的loss
## reduce = False,返回向量形式的los
## 默认size_average = True,返回loss.mean()
## size_average = False,返回loss.sum()
# 2
import torch.nn.functional as F
loss = F.mse_loss(y_hat, target)
6.解决过拟合
过拟合问题具体变现为:模型在train_data上训练情况良好,损失函数低,预测准确度高,而在test_data表现较差,损失函数比较大,预测精度很低。
二、函数
1. register_buffer()
register_buffer(name, tensor)
'''Adds a persistent buffer to the module''' # 向模型中加入持续缓冲区
# name(string) -缓冲区的名称
self.register_buffer("matrix", torch.tensor([0.233, 0.456, 0.174]))
我们在训练模型时,通过backward反向传播实现weight等参数的更新,但在某些情况下,我需要有些参数从训练开始到结束一直保持不变,不会被更新,则此时会用到register_buffer()。
2. __init__() >>带参数的初始化,初始化新创建对象的状态
“__”开头的函数声明该函数为私有,无法在类的外部使用或访问。
3. tensor生成
① torch.normal(means, std) >> 从给定参数的正态分布中返回随机数
np.random.normal(means, std, size) >> 从正态(高斯)分布中抽取随机样本
random.random(*size) >>返回一个介于左闭右开[0.0, 1.0)区间的浮点数
② torch.ones(*size) 返回输入size的全为1的tensor; torch.zeros(*size, dtpe = torch.float32)全为0
torch.zeros_like(X) 返回X.shape的全0 tensor
③ torch.range(1, 6) >> tensor[1., 2., 3., 4., 5., 6.] 结果包含end, 新版本中将被删除
④ torch.arange(1, 6) >>tensor[1., 2., 3., 4., 5.]
⑤ torch.rand(*size) >> 0-1的均匀分布
torch.randn(*size) >>标准正态分布(mean=0, std=1)
4. tensor合并
① torch.cat((A,B), dim) >>按照dim维度合并tensorA,B,除dim维度,其他维度数值必须一致; dim列合并,即合并完成后只有dim数值增大
6. 数据提取
① torch.index_select(input, dim, index) == input.index_select(dim, index)
>> input为索引查找的对象, dim为查找的维度, index为索引序列tensor(须为整型)
② torch.gather(tensor, dim, index)
>>沿着指定的dim从tonsor中提取索引index位置的元素,index对应dim,即dim若为行,index为行索引
② torch.where(condition, a, b) >>满足condition则输出a,否则则输出b
③ torch.squeeze() >> 压缩数据维度,去掉维数为1的维度
7. 运算与处理
① torch.pow(X, y) >> X^y
② torch.max(input, other) >>两tensor比较,返回最大值
torch.max(input, dim) >>返回最大值和最大值索引,若shape为[2,3],dim=0,返回shape为[3]
③ torch.mm(A, B) >>矩阵A,B相乘,只适用于二维矩阵
torch.matmal(A, B) >>矩阵A,B相乘,适用于高维矩阵
torch.mul(A, B) >>矩阵A,B对应位置相乘,等同于 A * B
④ torch.log(x) >>以自然数e为底的对数函数 ln(x)
⑤ torch.sqrt(tensor) >>逐一元素计算平方根
⑥ torch.lt(input, other) >>元素比较 input < other 返回True (less than)
torch.gt(input, other) >>元素比较 input > other 返回True (greater than)
⑦ str.join(item) >>用str将item中的元素连接起来
>>括号内只允许有一个成员,可以为列表、元组、字典
str.upper() >> 字符串中的小写字母转为大写字母
⑦ vars() >>对象object的属性和属性值的字典对象
⑧ sort(list) >>list 排序
sorted(iterable) >>对所有可迭代的对象进行排序操作
⑨ lambda param : expression >> param参数执行expression表达式
8. 绘图
plt.scatter(x, y, c, marker, s) >>散点图绘制: c为颜色, marker为标记的样式, s为点的大小
plt.plot(x, y, label=' ',"格式控制字符串") >>绘制点图和线图, xy可传入set,list,array,dataframe
plt.legend() >> 显示label内容
9. 读取数据集
import torch.utils.data as Data
dataset = Data.TensorDataset(features, labels) # 合并特征值和标签
Data.DataLoader(dataset, batch_size, shuffle=)
10. 优化器
(1) torch.optim.SGD(parameters(), lr= , momentum= ) # 参数,学习率,权重衰减
optimizer = torch.optim.SGD(function.paramaters, lr) # 定义优化器
# 训练模型
optimizer.zero_grad()
l.backward()
optimizer.step()
11.模块与包
(1)torchvision
import torchvision
import torchvision.transforms
torch.transforms.ToTensor() #把PIL.Image或ndarray从(H x W x C)形状转换为(C x H x W)的tensor
# torchvision.datasets: 一些加载数据的函数及常用的数据集接口;
# torchvision.models:包含常用的模型结构(含预训练模型), 例如AlexNet、VGG、ResNet等;
# torchvision.transforms: 常用的图片变换,例如裁剪、旋转等;
① transforms.ToTensor()函数的作用是将【原始的PILImage格式或者numpy.array格式的数据】格式化为【可被pytorch快速处理的张量类型】
##(𝐶 × 𝐻 × 𝑊) C:chennel通道数;H:图像高度; W:图像宽度
② transforms.Compose():将transforms组合在一起;而每一个transforms都有自己的功能。
③ transforms.Resize(size)::对载入的图片数据按照需要进行缩放,传递给这个类的size可以是一个整型数据,也可以是一个类似于 (h,w) 的序列。
④ transforms.normalize(mean, std):数据标准化,逐channel的对图像进行标准化(均值变为mean,标准差变为std),可以加快模型的收敛。
(2) torch.nn
① nn.Sequential()
>>一个有序容器, 用于搭建模型,神经网络模块将按照传入构造器的顺序被添加到计算图中执行,模型前向传播时调用forward()方法
② nn.Linear(input_num, output_num, bias)
>> (输入的神经元个数, 输出神经元个数, [bias=True]是否包含偏置)
③ nn.Flatten(start_dim = 1 **default**, end_dim)
>>将连续的维度范围展平为张量,用于Sequential;将输入"压平",;一般写在某个神经网络模型之后,用于对神经网络模型的输出进行处理,得到tensor类型的数据
>> 128张图片(1* 28 * 28) 输入shape为[128, 1, 28, 28],展平每张图片后得到[128, 728]
(3) random
① random.shuffle(list) >>将列表中元素顺序打乱,不会生成新的列表
(4) numpy
① range(0, 5, 1) >> 生成整数序列, (start, end, step) 各个参数为整数
numpy.arange(0.1, 0.5, 0.1) >>生成小数序列
② numpy.e >> 数e
numpy.inf >> 正无穷大
③ numpy.exp(X) == X.exp() >> e^X
④ numpy.sum(X, axis, keepdim = True)
>> keepdim决定保持结果dim与原array维度一致;
>>keepdim = False, axis = 0时, (2,3,4)==> (3, 4)
>>keepdim = True, axis = 0时, (2,3,4)==> (1, 3, 4)
⑤ numpy.argmax(array, axis)
若array 的维度为(2, 3, 4),
当axis = 0时,返回shape(3,4);axis = 1时,返回shape(2,4)
⑥ numpy.linespace(start, end, num=num_points) >>生成等差序列,num为序列点数
(5) os及os.path
① os.path.join()
连接两个或更多的路径名组件:
1.如果各组件名首字母不包含’/’,则函数会自动加上
2.如果有一个组件是一个绝对路径,则在它之前的所有组件均会被舍弃
3.如果最后一个组件为空,则生成的路径以一个’/’分隔符结尾
② os.listdir(path) >>返回指定的文件夹包含的文件或文件夹的名字的列表
③ os.path.isdir() >>判断某一路径(绝对路径)是否为目录
os.path.isfile() >>用于判断某一对象(绝对路径)是否为文件
④ os.path.exists() >>返回路径是否存在的布尔值
⑤ os.sep >>文件路径分隔符 "\" 或 "/"
(6)Image模块(from PIL import Image)
① Image.open(path) >> 默认彩色图像读取通道的顺序为RGB,得到的img数据类型呢是Image对象,不是普通的数组
②Image.convert() >>实现不同图像格式的转换,接受一个 mode 参数,用以指定一种色彩模式,其中PIL的九种不同模式:1,L,P,RGB,RGBA,CMYK,YCbCr,I,F。
12. 初始化
① nn.init.normal_(tensor, mean, std) >>给定均值和标准差的正态分布
② nn.init.constant_(tensor, val) >>常量
13. return与yield区别
return为函数返回值,执行return后续代码不再执行;
yield创造迭代器,可用来for循环,不输出,不返回
14. exit()函数
无论exit(num)函数出现在程序中的何处,只要程序在执行过程中调用到exit()函数,程序立即终止运行。exit()函数常用在程序错误时退出结束或调试代码,num控制exit code,若异常处理时exit()括号内不设置,则程序终止时显示: Process finished with exit code 0,而0表示程序的正常运行完成终止
try:
1/0
except:
traceback.print_exc()
exit(-1)
输出:
Process finished with exit code -1