导图社区 机器学习,深度学习,pytorch入门,注意有两页
参考吴恩达机器学习教程,参考pytorch官方文档和B站Pytorch入门教程,内部机器学习基本知识,pytorch函数,神经网络搭建方法等
编辑于2022-03-03 23:23:37参考吴恩达机器学习教程,参考pytorch官方文档和B站Pytorch入门教程,内部机器学习基本知识,pytorch函数,神经网络搭建方法等
这是一篇关于23计算机操作系统的思维导图。该思维导图从计算机系统概述、进程管理、内存管理、文件管理、i/o设备等几个方面进行归纳总结,适用于考研。
这是一篇关于23考研计算机网络原理的思维导图。计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信路线连接起来,在网络操作系统、网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
社区模板帮助中心,点此进入>>
参考吴恩达机器学习教程,参考pytorch官方文档和B站Pytorch入门教程,内部机器学习基本知识,pytorch函数,神经网络搭建方法等
这是一篇关于23计算机操作系统的思维导图。该思维导图从计算机系统概述、进程管理、内存管理、文件管理、i/o设备等几个方面进行归纳总结,适用于考研。
这是一篇关于23考研计算机网络原理的思维导图。计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信路线连接起来,在网络操作系统、网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
机器学习
def
机器学习:对能通过经验自动改进的计算机算法的研究
监督学习:输入数据中有导师信号,以概率函数、代数函数或人工神经网络为基函数模型,采用迭代计算方法,学习结果为函数。
无监督学习:输入数据中无导师信号,采用聚类方法,学习结果为类别。典型的无导师学习有发现学习、聚类、竞争学习等
basic
代价函数
有时被称为平方误差函数或者损失函数,将随机事件或其有关随机变量的取值映射为非负实数以表示该随机事件的“风险”或“损失”的函数。
步骤
假设函数:
参数:theta0和theta1
代价函数:
目标:
假如有多参数,函数设法类似
梯度下降
迭代法的一种,机器学习很常用的算法,例如可用于最小化代价函数
典型的梯度下降函数。(α告诉我们将以多大幅度去改变theta)
"Batch"梯度下降,每次都会遍历整个训练集,如:
特征缩放
特征收敛指将特征值尺度都缩放到接近的值( 如[-1,1] ) 假如两个参数之间相差太大,可能要辗转通过很多次计算才能收敛,使用特征缩放可以加快梯度下降收敛速度
学习率
学习率过大可能会无法正常收敛,过小会导致收敛速度很慢
多项式
正规方程
将m行n+1个特征值列为m*n+1矩阵X,正确值为列向量y,正则方程:
优点:不需要选择学习速率α,不需要迭代很多次 缺点:需要计算(XTX)-1,n很大时(如10^6)计算起来很慢
PS:使用正规方程不需要特征缩放。 PS:pinv函数能正确计算,即使矩阵不可逆
分类问题
分类问题指观测值是一组离散的值,如肿瘤是良性或恶性的;往往用0/1就能代表两个离散值
逻辑回归
logistic回归能使值固定落入[0,1],方程:
logistic回归代价函数:用于模拟做出这种假设所付出的代价,假设越接近真实值代价越小
一对多分类
转化为一对其余,也就成了二元分类问题
决策边界:就是能够把样本正确分类的一条边界,主要有线性决策边界(linear decision boundaries)和非线性决策边界(non-linear decision boundaries)
过拟合(Overfitting):假设多项式参数很多,拟合几乎整个训练集,没有更多的数据去约束它,遇到新样例就不能很好拟合。 解决方法:选择合适的假设多项式(减少参数theta)、减少特征值(会减少信息)
正规化
正则化(regulation):用于应对过拟合问题,正规化参数λ可理解为对参数的惩罚力度,如果过大可能会导致得到一条直线(仅θ0的系数不为0)
梯度下降
向量表示
逻辑回归
Advaced
神经网络
包括输入层,隐藏层,输出层
反向传播算法
卷积神经网络
卷积层(Convolutional layer),卷积神经网络中每层卷积层由若干卷积单元组成,每个卷积单元的参数都是通过反向传播算法最佳化得到的。卷积运算的目的是提取输入的不同特征,第一层卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网路能从低级特征中迭代提取更复杂的特征。
卷积 convolution
what:根据特征值对整张图片进行卷积运算,得出特征图
池化 pooling
what:用更小的图片尺寸代替原有图片,在可接受范围内减少数据量
常用-最大池化(max pooling):取区域最大值作为池化结果
平均池化(average pooling):取区域平均值作为池化结果
规范化 Normalization
what:通过稍微调整每一个值来防止数学崩溃
修正线性单元(Rectified Liner Units):将所有负值变为0
全连接层
全连接层整合卷积层或者池化层中具有类别区分性的特征,需要连接前一 层所有的神经元。在整个卷积神经网络中起到分类器的作用,全连接层的个数 不定,有些卷积神经网络会取简单的一个全连接层结构,有些卷积神经网络为 了提高网络的模型的表达能力会连接着多个全连接层.
ReLU函数
超参数 Hyperparameters
卷积神经网络的初始参数
卷积层特征数量/尺寸,池化层大小/步长(stride),全连接层神经元数量
神经网络能处理:视频,图像,文本等 神经网络不能处理:如果数据中两列互换,数据依然可用于神经网络,则不可用于神经网络
数据集
image-net用于视觉对象识别软件研究的大型可视化数据库
deepfashion
paddle
data文件夹用来放数据,重启项目后,非训练数据zip会消失
在线安装的库,重新进入项目后得重新安装
paddleDection
提供py文件: !python 文件绝对路径
-c +配置文件 用于设置配置文件
--eval 评估训练效果
iou
/PaddleDection/ppdet optimizer.py可查看如学习率/梯度下降/正则率的源码
PaddleDetection/ppdet/data/transform/operators.py 可查看模块
步骤
预准备
!git clone https://gitee.com/paddlepaddle/PaddleDetection.git -b release/2.3
%cd /home/aistudio/PaddleDetection
!pip install -r /home/aistudio/PaddleDetection/requirements.txt
1.想好用哪个网络,并在configs去找到相应的配置文件
描述文档:https://paddledetection.readthedocs.io/index.html
2.更改batch_size等配置信息
infer.py用于测试训练效果
octive
语法
不等于为~=
一行后加分号则不会打印
矩阵如:A=[1 0 0; 0 1 0; 0 0 1]为二阶单位阵
A(3,2) 表3行2列的元素 A(3,: )表第3行所有元素( : 表整行/列) A([1 3], : )表第1行和第3行的所有元素
load 文件名 或 load('文件名')来加载文件
clear 文件名 用来去加载文件
who 用来查看当前变量;whos用来查看更详细的变量信息
len 用来计算向量大小,size用来计算矩阵大小
运算
* 用于矩阵相乘
.* 和 ./ 用于矩阵元素相乘
A' 求矩阵A的转置
逻辑
A < 3 实质上是对A中各个元素和3比较
for i=1:10,语句;end; 可进行十次循环
i=1; while i<=5,语句;end; 可进行五次循环
if 条件, 语句; elseif 条件, 语句; else 语句; end;
函数
log() 和 exp()指e为底对数和幂运算
abs()为取绝对值
ones(4,5)/zeros(4,5)返回全为0/1的4*5矩阵
magic(3)返回3*3的幻方(每行列加起来都是同一个数)
find
max(A, [] , 2) 求矩阵A每一行的最大值 max(A) 求矩阵A每一列的最大值
sum(A) 返回每一列的和向量
eye(k) 返回k阶单位阵
pinv(A)求逆(即使不可逆也能求逆)
定义函数 使用函数
函数定义:function 函数返回类型 函数名 (参数)
ps:执行函数会自动在当前目录文件下找有无此函数
可视化
plot(x,y) x,y分别代表xy轴
hold on;用于保留旧图形,新的图像将建立在原图形之上
xlabel('x')/ylabel('y')用于标识x/y轴
legend('sin','cos')用于标识图线
title('my plot') 用于更改图像标题
print -dpng 'name.png'用于将图片保存为png
figure(1);plot(x,y);会生成名为figure(1)的图像
subplot(k,l,m) 将plot生成k*l格子,使用第m个格子
Deep Learning
python
python文件
py控制台
显示每个变量,但不利于阅读
jupyter
利于代码阅读及修改,但是需要配置环境
帮助函数
dir(pytouch.A) : 打开pytouch中A工具
help(pytouch.X) : 查看帮助文档
常见函数
type()
查看类型
len()
获取长度
方法
str.format()
pytouch
数据集
Dataset 数据集
提供一种方式去获取数据及其label
如何获取数据及label?
总共多少数据?
库
使用
继承于Dataset
1.重写__init__
重写__getitem__
重写__len__
使用
Tensorboard
一个可视化工具,它可以用来展示网络图、张量的指标变化、张量的分布情况等。特别是在训练网络的时候,我们可以设置不同的参数(比如:权重W、偏置B、卷积层数、全连接层数等),使用TensorBoader可以很直观的帮我们进行参数的选择。
包:from torch.utils.tensorboard import SummaryWriter
安装
在Pycharm-Terminal中输入pip install tensorbard
使用
添加坐标轴
实例:y=2x PS:tensor.item()用于返回张量中存储的值
添加图片
PS:gloabal_step用于标识图片处于网页image同标题下哪个位置 PS:OpenCV使用cv2.imread(img_path)读的是numpy型/tensor PS:如果从batch中读取图片,要使用add_images
添加网络
展示:在Pycharm-Terminal中输入: tensorboard --logdir=logs [--port=端口号]:
torchvision
transforms
常用的图像预处理方法,提高泛化能力
from torchvision import transforms
使用
关注:类的输入、输出和作用
tensor_trans 为 创建的具体工具(类的实例化) 将PIL或者numpy数据转为tensoor
Normalize:归一化图像处理,如:像素值k在[0,1],操作:[k-0.5]/0.5
Resize:拉伸修改图片
Compose:组合操作
RandomCrop:用于随机裁剪
Tensor数据类型
CIFAR10
用于管理数据集,可上网下载
Dataloader
用于加载数据集
部分参数
torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=False, sampler=None, batch_sampler=None, num_workers=0, collate_fn=None, pin_memory=False, drop_last=False, timeout=0, worker_init_fn=None, multiprocessing_context=None, generator=None, *, prefetch_factor=2, persistent_workers=False)
batch_size (int, optional):一次抓取多少张图片进行训练
shuffle (bool, optional):是否打乱数据训练,一般为True
num_workers (int, optional):是否采用多进程进行加载,默认为0(采用主进程加载)
drop_last (bool, optional) :数据集根据batch_size取余,剩余的余数图片是否丢弃
神经网络 基本介绍 torch.nn
Containers 容器
Module
为所有神经网络提供的一个基类
必写函数
__init__
forward
前向传输,需要返回一个输出 例:卷积conv1-非线性-卷积conv2-非线性-输出
使用
红框解释:父类nn.Module里面定义了__call__方法。一个类如果定义了__call__方法,则该类的实例就可以作为一个方法那样直接使用。
Sequential
练习:手写cifar-10数据集正向传播网络
Convolution 卷积层
Conv2d
进行一个2D的卷积操作
torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros', device=None, dtype=None)
in_channel和out_channel:输入/输出的channel数
kernel_size (int or tuple):卷积核的尺寸
stride (int or tuple, optional):卷积步长,默认为1
padding (int, tuple or str, optional):向四周补0的圈数,默认为0
padding_mode (string, optional):默认为zeros(补0)
dilation (int or tuple, optional):卷积核各元素间距,默认为1 也叫空洞/扩张卷积,不常用
groups (int, optional) :输入通道到输出通道的阻塞连接数,默认为1 也叫分组卷积,设置组数,用于减少参数
bias (bool, optional) :为真则添加偏置,默认为True
变量: weight(tensor) - 卷积的权重,大小是(out_channels, in_channels,kernel_size) bias(tensor) - 卷积的偏置系数,大小是(out_channel)
torch.reshape(object, (int, int, int, int)):用于转换尺寸,依次为batch_size, channel, height, weight,设置一项为-1以自动生成
Pooling 池化
MaxPool2d
torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
kernel_size:取最大值操作的一个窗口大小
return_indices:用的非常少,可以不作了解
ceil_mode:True时取ceil(向上取整),默认为False 用于决定边缘情况
Non-Linear Activations 非线性激活
非线性激活主要引入非线性特征,只有非线性特征越多,才能训练处符合各种曲线的模型(泛化会更好)
ReLU
第一,采用sigmoid等函数,算激活函数时候(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法,计算量相当大,而采用Relu激活函数,整个过程的计算量节省很多 第二,对于深层网络,sigmoid函数反向传播时,很容易就出现梯度消失的情况(在sigmoid函数接近饱和区时,变换太缓慢,导数趋于0,这种情况会造成信息丢失),从而无法完成深层网络的训练 第三,Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生
ReLU(input, inplace=True) : inplace为True会修改原始数据
Sigmoid
Normalization 正则化层
用的比较少,不难
Recurrent 修正层
用的不多
Transform层
用的不多
Linear 线性层
Linear
torch.nn.Linear(in_features, out_features, bias=True, device=None, dtype=None)
子主题
Dropout层
Loss Functions 损失函数
nn.L1Loss
预测值和目标之间差值的均值
nn.MSELoss
求均方差
nn.CrossEntropyLoss
PS:反向传播用于求梯度,配合优化器实现梯度下降
PS:要关注输入输出(比如是否需要dtype=torch.float32,是否需要reshape)
torch.optim optimizer 优化器
SGD
'lr':学习率,通常很小(如1e-3)
'params': classifier参数,model.classifier.parameters()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
step()
优化器使用optimizer去更新参数
优化器可用于读取参数以保存,也可用于加载参数
神经网络 常用模型 torchvision .models
vgg16
torchvision.models.vgg16_bn(pretrained: bool = False, progress: bool = True, **kwargs: Any)
pretrained (bool):为True则参数为别人在ImageNet上训练过的
progress (bool):为True则会生成下载进度条
# vgg16支持1000种分类,下列操作可以添加一个线性层 vgg16.add_module('cifar10_layer', nn.Linear(1000,10))
# 下列操作可修改一个层 vgg16.classifier[6] = nn.Linear(4096, 10)
vgg16 = torchvision.models.vgg16(pretrained=True, progress=True)
模型保存/加载
# 方法1:保存了网络模型结构和模型中的参数 torch.save(vgg16, "vgg16_method1.pth")
# 方法1:加载模型与参数 model = torch.load("vgg16_method1.pth")
PS:方法1需要有模型类的定义,但不需要实例化
# 方法2:仅保存模型参数,更小,将参数保存为字典(官方推荐) torch.save(vgg16.state_dict(), "vgg16_method2.pth")
# 方法2:仅加载参数(官方推荐) vgg16 = torchvision.models.vgg16() model.load_state_dict(torch.load("model_cifar10.pth"))
使用建议
1.model单独放置在一个.py文件
2.在模型文件内测试模型正确性
3.引入模型 from tesst_cifar10_model import *
模型使用步骤
1.准备模型及数据集,dataloader
2.创建模型实体
3.定义损失函数及优化器
4.设置训练网络的参数
5.记录训练次数、测试次数,设置训练轮数
6.开始训练 model.train() for imgs, targets in train_loader: output = model(imgs) loss = loss_fn(output, targets) # use optimizer optimizes model optimizer.zero_grad() # clear grad loss.backward() # back Propagation optimizer.step() # update parameters
6.开始训练 model.train() # call it before train for imgs, targets in train_loader: output = model(imgs) loss = loss_fn(output, targets) # use optimizer optimizes model optimizer.zero_grad() # clear grad loss.backward() # back Propagation optimizer.step() # update parameters
7.开始测试 model.eval() # call before test with torch.no_grad(): # test won't change parameter for imgs, targets in test_loader: output = model(imgs) loss = loss_fn(output, targets)
8.保存参数
PS:model.train()写在训练前;model.eval()写在测试前。在特定的model里有用
正确率衡量
output输出为i*k矩阵,用于衡量i步中k个类的几率
torch. tensor. argmax()
torch.argmax(input, dim, keepdim=False)
input (Tensor) :输入的张量
dim (int):计算的维度,默认None 如果None,则会先faltten再返回 如果为1,则会返回每个1D list的最大值
keepdim (bool):输出是否维持,默认False
PS:可直接对返回的张量调用argmax(dim=None, keepdim=False)
使用argmax()返回值和target作比较,就可以计算正确率
pred = output.argmax(1) accuracy = (pred == target).sum()/len(pred)
使用GPU训练
PS:在转移前判断cuda是否可用
if(torch.cuda.is_avaliable()):
方法1
1.网络模型转移到cuda
model = model.cuda()
2.损失函数转到cuda
loss_fn = loss_fn.cuda()
3.改变img和target
imgs = imgs.cuda() targets = targets.cuda()
方法2
1.定义训练设备
device = torch.device("cuda")
PS:多显卡为"cuda:0"
2.转移
model.to(device) loss_fn.to(device) imgs.to(device) targets.to(device)
计时
import time
start_time = time.time() print("time cost:{}".format(time.time()-start_time))
paddle
基础
查看配置
!nvidia-smi