深度学习开发入门(二)

1、什么是深度学习框架

1.1  深度学习框架的概念

深度学习框架是一种用于构建、训练和部署深度神经网络模型的工具集合,它提供了丰富的函数和工具,使开发者能够方便地创造、调整和优化神经网络模型。

1.2  常用的深度学习框架

PyTorch、Theano、TensorFlow、Keras、Caffe、MXNet、CNTK、PaddlePaddle

常被应用于计算机视觉、自然语言处理、语音识别、机器学习等多个领域。

1.3  深度学习框架提供的功能

(1)模型定义:提供了一种方式来定义神经网络模型的结构,包括网络层的连接和参数设置。

(2)训练和优化:提供了一种方式来训练和优化神经网络模型,包括定义损失函数、选择优化算法和设置训练参数。

(3)自动求导:能够自动计算神经网络模型的梯度,以便进行反向传播算法进行训练。

(4)并行计算:支持在多个GPU或分布式环境上进行并行计算,以提升训练和推理的效率。

(5)部署和推理:能够将训练好的神经网络模型部署到实际应用中进行推理,包括在移动设备、边缘设备或云端进行推理。

1.4  深度学习框架

深度学习采用 “端到端”的学习模式,在很大程度上减轻负担。框架存在的意义就是屏蔽底层的细节,使研究者可以专注于模型结构。

2、PyTorch的特点和概述

2.1  PyTorch简介

PyTorch具有先进设计理念的框架,其历史可追溯到2002年就诞生于纽约大学的Torch。在2017年,Torch的幕后团队推出了PyTorch。 PyTorch不是简单地封装Lua,Torch提供Python接口,而是对Tensor之上的所有模块进行了重构,并新增了最先进的自动求导系统,成为当下最流行的动态图框架。

2.2  PyTorch的特点

(1)PyTorch 即可以看作为加入了GPU 支持的numpy。TensorFlow 与Caffe 都是命令式的编程语言,而且是静态的,但是PyTorch通过一种反向自动求导的技术,可以让用户零延迟地任意改变神经网络的行为。

(2)PyTorch 的设计思路是线性、直观且易于使用的,当用户的代码出现Bug 的时候,可以快捷地找到出错的代码,不会因为错误的指向或者异步和不透明的引擎浪费太多的时间。

(3)PyTorch 的代码相对于TensorFlow 而言,更加简洁直观,同时对于TensorFlow高度工业化的底层代码,PyTorch 的源代码就要友好得多,也更容易看懂。

3、模型评估与模型参数选择

3.1  损失函数

(1)若对于给定的输入x,若某个模型的输出y ̂=f(x)偏离真实目标值y,那么就说明模型存在误差;y ̂偏离y的程度可以用关于y ̂和y某个函数L(y,y ̂)来表示,作为误差的度量标准:这样的函数L(y,y ̂)称为损失函数。

(2)在某种损失函数度量下,训练集上的平均误差被称为训练误差,测试集上的误差称为泛化误差。泛化误差是衡量一个模型泛化能力的重要标准。

3.2  数据集

数据集分为训练集、验证集、测试集

误差:预测输出y ̂与真实输出y之间的差异。

经验误差、训练误差:在训练集上的误差。

泛化误差:在新样本上的误差。(泛化误差越小越好,经验误差不一定越小越好,可能导致过拟合)

(1)验证集

①验证集可以查看训练好的模型在新数据(验证集和测试集是不同的数据)上的表现如何。同时通过调整超参数,让模型处于最好的状态。

②两个主要作用:

评估模型效果,为了调整超参数而服务;

调整超参数,使得模型在验证集上的效果最好。

③验证集不像训练集和测试集,它是非必需的。如果不需要调整超参数,就可以不使用验证集,直接用测试集来评估效果。

验证集评估出来的效果并非模型的最终效果,主要是用来调整超参数的,模型最终效果以测试集的评估结果为准。

(2)测试集

①调整超参数后,通过测试集做最终评估,看模型效果好不好。

②通过测试集的评估,我们会得到一些最终的评估指标,例如:准确率、精确率、召回率、F1等。

3.3  划分数据集

(1)对于小规模样本集(几万量级),常用的划分比例:

训练集:验证集:测试集=6:2:2

训练集:测试集==8:2、7:3

(2)对于大规模样本集(百万级+),只要验证集和测试集的数量足够即可。

(3)超参数越少,或者超参数很容易调整,那么可以减少验证集的比例,更多的分配给训练集。

3.4  过拟合

(1)过拟合:将训练样本自身的一些特点当作所有样本潜在的泛化特点。

(2)过拟合的表现:在训练集上表现很好,在测试集上表现不好。

(3)过拟合的原因:训练数据太少、模型的复杂度太高、数据不纯。

(4)防止过拟合的方法:

①移除特征,降低模型的复杂度:减少神经元的个数,减少隐藏层的层数;

②训练集增加更多的数据;

③重新清洗数据、数据增强;

④正则化、早停。

3.5  欠拟合

(1)欠拟合:还没训练好。

(2)欠拟合的原因:数据未做归一化处理、神经网络拟合能力不足、数据的特征项不够。

(3)解决欠拟合的方法:

①寻找最优的权重初始化方案;

②增加网络层数、epoch;

③使用适当的激活函数、优化器和学习率;

④减少正则化参数、增加特征。

3.6  数据集划分示例

import os
import random
import shutil

# 原数据集目录(相对目录)
root_dir = 'datasets'
# 划分比例:训练集:测试集=8:1:1
train_ratio = 0.8
valid_radio = 0.1
test_radio = 0.1

# 设置随机种子
random.seed(42)

# 拆分后数据集目录
split_dit = 'datasets/traffic'
os.makedirs(os.path.join(split_dir,'train/images'),exist_ok=True)
os.makedirs(os.path.join(split_dir,'train/labels'),exist_ok=True)
os.makedirs(os.path.join(split_dir,'valid/images'),exist_ok=True)
os.makedirs(os.path.join(split_dir,'valid/labels'),exist_ok=True)
os.makedirs(os.path.join(split_dir,'test/images'),exist_ok=True)
os.makedirs(os.path.join(split_dir,'test/labels'),exist_ok=True)

# 获取图片文件列表
image_files = os.listdir(os.path.join(root_dir,'images'))
label_files = os.listdir(os.path.join(root_dir,'labels'))

# 随机打乱文件列表
combined_files = list(zip(image_files,label_files)) #图片、标签转化为列表
random.shuffle(combined_files) #打乱
image_files_shuffled,label_files_shuffled =zip(*combined_files) #重新获取

# 根据比例计算划分的边界索引
train_bound = int(train_ratio*len(image_files_shuffled)) #图片总数*训练集比例
valid_bound = int((train_radio+vaild_ratio)*len(image_files_shuffled))

# 将图片和标签文件移动到相应的目录
for i,(image_file,label_file) in enumerate(zip(image_files_shuffed,label_files_shuffed)):
    if i<train<bound:
        shutil.copy(os.path.join(root_dir,'imnages',image_file),os.path.join(splity_dir,'train/imnages',image_file))
        shutil.copy(os.path.join(root_dir,'labels',label_file),os.path.join(splity_dir,'train/labels',label_file))
    elif i<valid_bound:
        shutil.copy(os.path.join(root_dir,'imnages',image_file),os.path.join(splity_dir,'train/imnages',image_file))
        shutil.copy(os.path.join(root_dir,'labels',label_file),os.path.join(splity_dir,'train/labels',label_file))
    else:
        shutil.copy(os.path.join(root_dir,'imnages',image_file),os.path.join(splity_dir,'train/imnages',image_file))
        shutil.copy(os.path.join(root_dir,'labels',label_file),os.path.join(splity_dir,'train/labels',label_file))

4、验证

4.1  验证

模型不能过拟合于训练集,否则将不能在测试集上得到最优结果,因此参数的选择(即调参)必须在一个独立于训练集和测试集的数据集上进行,这样的用于模型调参的数据集被称为开发集或验证集。

4.2  交叉验证

三种交叉验证法:留出法、自组法、k 折交叉验证。

(1)留出法:按照固定比例将数据集静态的划分为训练集、验证集、测试集。

(2)自组法:适合于样本数目较少,有放回的取法。

(3)k 折交叉验证:将数据集分为训练集和测试集,将测试集放在一边,将训练集分为 k 份,每次使用 k 份中的 1 份作为验证集,其他全部作为训练集。通过 k 次训练后,我们得到了 k 个不同的模型。评估 k 个模型的效果,从中挑选效果最好的超参数,使用最优的超参数,然后将 k 份数据全部作为训练集重新训练模型,得到最终模型。

5、正则化

5.1  正则化项

(1)在优化目标中加入正则化项:min┬θL(y,y ̂;θ)+λ⋅J(θ)

θ为模型参数,L(y,y ̂;θ)为原来的损失函数,J(θ)是正则化项,λ用于调整正则化项的权重。 正则化项通常为θ的某阶向量范数。

(2)通过限制参数值域空间,显式地 控制了 模型复杂度,从而避免了过拟合。

5.2  L1、L2正则化

(1)L1正则化:使权重的绝对值最小化,且对于异常值是鲁棒的。

(2)L2正则化:使得权重的平方最小化,该模型能够学习复杂的数据模式,但对于异常值不具备鲁棒性。

5.3  Dropout

Dropout :是一种正则化方法,用于随机禁用神经网络单元。

6、无监督学习

6.1  无监督学习的含义

在无监督学习中,数据集{x^(i)}_i=1^N中只有模型的输入,而并不提供正确的输出y^(i)作为监督信号。数据中不含有“目标”的机器学习问题通常被为无监督学习(unsupervised learning)。

6.2  聚类问题

聚类问题,最简单的理解就是提前不知道每个点所属的类别,目标是把相似的东西分到一组,难点就是如何评判这个 "相似",是典型的无监督问题。

左图:已知把数据要分成三类,并已知每个点本身属于哪个类,那就属于分类问题。

右图:事先并不知道每个点具体属于那个类,那么就需要根据聚类问题,把 "相似" 的点聚为一类。

能用分类问题求解,就不要用聚类问题,聚类问题随机性高,主要是针对提前已经数据有限的问题,需要经过大量测试找到合适参数。

6.3  主成分分析问题(PCA)

主成分分析PCA是一种常用的数据分析方法。PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维。

6.4  因果关系和概率图模型

如果想通过物体a去推断物体b,就是将物体a放在这里会增加物体b出现概率的多少,想要找到这样一个确定的促进关系即因果关系 往往会被confounder干扰到,而这个confounder就是物体a与b之间的共因。

6.5  无监督学习衡量指标

(1)直观检测

这是一种非量化的方法。在直观上判断属于同一个类是否具有某个共同的主题,这样的分类是否有明显的共同点。

(2)基于任务的评价

如果聚类得到的模型被用于某个特定的任务,我们可以维持该任务中其他的设定不变,使用不同的聚类模型,通过某种指标度量该任务的最终结果来间接判断聚类模型的优劣。

(3)人工标注测试集

有时候采用非监督学习的原因是人工标注成本过高,导致标注数据缺乏,只能使用无标注数据来训练,这时,可以人工标注少量的数据作为测试集,用于建立量化的评价指标。

7、监督学习

7.1  监督学习

在监督学习中,根据训练集{〈x^(i),y^(i)〉}_i=1^N中的观测样本点来优化模型f(⋅),使得给定测试样例x′作为模型输入,其输出y ̂尽可能接近正确输出y′。 y ̂= f(x)

回归:回归问题的输出是连续值。

分类:分类问题的输出是离散值。

7.2.  监督学习——回归

回归问题其最简单的形式是一个连续函数的拟合。

回归问题中通常使用均方损失函数来作为度量模型效果的指标,最简单的求解例子是最小二乘法。

(1)均方误差损失函数

最常用的回归问题的损失函数。其定义为预测值与真实值之间的平方差的平均值。

该损失函数的值越小,表示模型的预测结果越接近真实值。

(2)简单线性回归

自变量 x 和因变量 y之间存在一条线性关系

(3)多元线性回归

假设自变量 和因变量 y之间存在一条线性关系

(4)线性回归应用的场景:预测房价、预测销售额

7.3  监督学习——分类

将正样本预测正样本(True Positive, TP)

将负类样本预测为正样本(False Positive, FP)

将正样本预测为负样本(False Negative, FN)

将负类样本预测为负样本(True Negative, TN)

分类评估指标

(1)准确率:对于测试集中D个样本,有k个被正确分类,D-k个被错误分类,则准确率为

虽然准确率可以判断总的正确率,但是在样本不平衡 的情况下,并不能作为很好的指标来衡量结果,如果样本不平衡,准确率就会失效。

(2)精确率(查准率)- Precision:所有被预测为正样本中实际为正样本的概率

精准率代表对正样本结果中的预测准确程度。 准确率则代表整体的预测准确程度,既包括正样本,也包括负样本。

(3)召回率(查全率)- Recall:实际为正的样本中被预测为正样本的概率

召回率越高,也代表可以改进的空间越大。

(4)精确率和召回率之间的关系

PR曲线

平衡点(BEP)P=R

AP(Average Precision):PR曲线下的面积。 通常来说一个越好的分类器,AP值越高。

mAP是多个类别AP的平均值。这个mean的意思是对每个类的AP再求平均,得到的就是mAP的值,mAP的大小一定在[0,1]区间,越大越好。该指标是目标检测算法中最重要的一个。

(5)F-度量

F-度量则是在召回率与精确率之间去调和平均数;在实际问题上,如果更看重其中某一个度量,可以给它加上一个权值α,称为F_α-度量:

特殊地,当α=1时:

F1分数(F1-score)是分类问题的一个衡量指标。

7.4  监督学习和非监督学习

监督学习与非监督学习主要针对数据集定义。

如果数据集中样本点只包含了模型的输入𝒙,就需要采用非监督学习的算法。

如果这些样本点以〈𝒙,𝒚〉这样的输入-输出二元组的形式出现(有数据标签),就可以采用监督学习的算法。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值