Skip to content

基础知识

误差计算与前向传播

通过一个实例具体的体会神经网络的误差计算、误差反向传播和参数更新

前向传播

简单的反向传播网络

第一个隐层中的6表示一种激活函数(sigmoid)。

sigmoidsigmoid(x)=11+ex

w_i_j表示i是前一层第i个节点于本层第j个节点的权重参数

softmaxP(y=j)=exTwjk=1KexTwk

前向传播的计算y_1的输出,在经过softmax激活得到一个有概率分布约束的输出数值。

前向传播过程

O1=ey1ey1+ey2

同理O_2也是这样得到的。

损失计算

分类的损失一般使用交叉熵损失函数。函数中O_i是预测标签的值,O^*_i是真实标签的值。

多分类的交叉熵损失函数:

输入的是softmax函数输出的结果,所有事件的概率和为1,即输出的各个节点的概率是在同一个分布中的。在torch的交叉熵损失代码中已经加入了softmax

H(oi)=ioilog(oi)

二分类的交叉熵损失函数

输入是sigmoid函数输出的结果,输出的各个节点的之间的概率数值是不相关的。

H(oi)=1Ni=1K[oilog(oi)+(1oi)log(1oi)]

对于上面的网络我们的损失计算如下:

Loss(o)=(o1log(o1)+o2log(o2))

反向传播与参数更新

反向传播需要先求梯度,所以我们选择的函数尽量是可导且容易收敛。以更新第二层的w_11为例。

先求梯度: 梯度求解

参数的更新是:

wnew=woldLearnningRatec×grad

优化器

因为内存大小限制,我们不能一次性把train_set的数据用于训练需分batch,这样的话我们求梯度的方向就不一定是全局最优的方向,可以使用优化器解决这个问题。

SGD、Adagrad、RMSProp、Adam

常用知识

基本指标

混淆矩阵: 真实情况 预测结果 正例 反例 正例 TP(真正例) FN(假反例) 反例 FP(假正例) TN(真反例)

P = TP / (TP + FP)

Precision是针对预测结果而言的,含义是在预测结果中,有多少预测框预测正确了。

R = TP / (TP + FN)

Recall是针对原样本而言的,含义是在所有真实目标中,模型预测正确目标的比例。

FP 和 FN

假正例(False Positive,FP)和假反例(False Negative,FN)之间的互补性。

假正例和假反例分别位于不同的位置,且它们的数量之和反映了模型错误预测的总数。

假正例会增加预测为正类的样本数量,但其中实际为正类的比例会降低,因此会降低精确度。 假反例会减少被模型正确预测为正类的实际正类样本数量,因此会降低召回率。

一个假正例(即误诊)可能给患者带来不必要的焦虑和治疗负担。 一个假反例(即漏诊)则可能导致疾病进展和恶化,甚至危及患者生命。

因此在P-R的关系中两者也是互斥的。

pip更换镜像源

清华源

shell
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

安装pytorch

常用的环境 CUDA12.1 + torch2.2

shell
pip install torch==2.2.1 torchvision==0.17.1 torchaudio==2.2.1 --index-url https://download.pytorch.org/whl/cu121

CUDA11.3+torch1.12

shell
pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 torchaudio==0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113

检测Torch和CUDA

shell
import torch
print(torch.cuda.device_count())  # 可用gpu数量
print(torch.cuda.is_available())  # 是否可用gpu

无法指定GPU

该问题在旧版本的v8出现,解决方法如下: 在使用 --nproc_per_node 参数时,如果有四个 GPU,但不想使用 GPU 1,可以使用 CUDA_VISIBLE_DEVICES 环境变量来限制可见的 GPU。

CUDA_VISIBLE_DEVICES=0,2,3 python training.py --nproc_per_node=3

CUDA_VISIBLE_DEVICES=1 python train.py --nproc_per_node=1

在这个例子中,CUDA_VISIBLE_DEVICES 设置了可见的 GPU,排除了 GPU 1。然后,--nproc_per_node=3 指定了每个节点(即每台机器)上使用的 GPU 数量。这样就可以指定gpu训练了

onnxRuntime

可以使用netron查看该框架地计算图。