前言
BP(back propagation)神经网络是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照误差反向传播算法训练的多层前馈神经网络,是应用最广泛的传统神经网络模型之一。
帮助:
神经网络算法
深度学习笔记
Deeplizard《Pytorch神经网络高效入门教程》中文字幕版
Deep Learning(深度学习)学习笔记整理系列之(三)
概念介绍
多层前馈神经网络(multilayer feedforward neural network)
多层前馈(multilayer feed-forward)神经网络也叫多层感知机(multilayer perceptron,MLP),采用一种单向多层结构,由一个输入层、一个或多个隐藏层和一个输出层组成,每一层都全连接到下一层,每个神经元只接收前一层的神经元的输出,并输出给下一层,各层间没有反馈。由于多层前馈网络的训练经常采用误差反向传播算法,人们也常将多层前馈网络直接称为BP(Back Propagation)网。
损失函数
损失函数(loss function)或代价函数(cost function)是将随机事件或其有关随机变量的取值映射为非负实数以表示该随机事件的“风险”或“损失”的函数。损失函数通常作为学习准则与优化问题相联系,即需要通过最小化损失函数求解和评估模型。
这里我们一般认为是用来量化对比神经网络预测结果和期待结果之间的差异或损失,学习的过程就是使得学习的结果不断逼近损失最小值的过程。
分类问题所对应的损失函数为0-1损失。0-1损失函数是一个不连续的分段函数,不利于求解其最小化问题,因此在应用可构造其代理损失(surrogate loss)
后向传播
后向传播算法是将输出层的误差向后进行传播来实现权重的调整,使得网络输出的样本标签与实际标签相靠拢。后向传播算法就是以网络误差平方为目标函数、采用梯度下降法来计算损失函数的最小值。
论文原文:
repeatedly adjusts the weights of the connections in the network so as to minimize a measure of the difference between the actual output vector of the net and the desired output vector.
BP算法存在的问题:
- 梯度越来越稀疏:从顶层越往下,误差校正信号越来越小;
- 容易收敛到局部最小值:尤其是从远离最优区域开始的时候(随机值初始化会导致这种情况的发生);
- 一般只能用有标签的数据来训练,也就是监督学习。
复杂的神经网络难以用反向传播算法来训练,对于一个 deep network(7层以上),残差传播到最前面的层已经变得太小,出现所谓的 gradient diffusion(梯度扩散),所以深度学习一般不用它。
梯度下降法
梯度下降法的基本思想可以类比为一个下山的过程。
假设:一个人在山顶,需要从山上下到最低处。但下山的路径无法确定,需要利用自己周围的信息去找到下山的路径。
这时,以当前所处的位置为基准,寻找四周最陡峭的地方,然后朝最陡峭的地方走,每走一段距离,就再次寻找最陡峭的地方,继续朝最陡峭的地方走,如此反复,最后就能快速的下到山底。
对于一个代表误差的函数,需要快速减小误差,使得误差最小,那么使用梯度下降法,不断朝着下降最剧烈的方向移动,最后能够到达一个函数图像局部最低点。
参考:通俗易懂讲解梯度下降法
激活函数
激活函数负责将神经元的输入映射到输出端。前一层的输入传播到一个神经元,神经元对输入按不同权重计算后,再用激活函数再次计算以输出到下一层。
引入激活函数是为了增加神经网络模型的非线性。没有激活函数的每层都相当于矩阵相乘。
激活函数有多种,如:Sigmoid函数、Tanh函数、ReLU(The Rectified Linear Unit)函数
深度学习的几种方法
卷积神经网络 - CNN
参考:卷积神经网络 – Convolutional Neural Network | CNN
循环神经网络 – RNN
参考:循环神经网络 – Recurrent Neural Network | RNN
生成对抗网络 – GANs
参考:生成对抗网络 – Generative Adversarial Networks | GAN
强化学习
参考:
强化学习-Reinforcement learning | RL
什么是增强学习(Reinforcement Learning)
pytorch 的使用
谷歌的 Tensorflow 与 Facebook 的 PyTorch 是颇受欢迎的两种深度学习框架。Tensorflow 的学习曲线比 PyTorch 更难一点,但学习资源可能相对更多。如果为了入门和快速上手,建议使用 pytorch 进行学习。
帮助:
PyTorch从入门到放弃(目录)
Deeplizard《Pytorch神经网络高效入门教程》中文字幕版
安装
进入官网,在表格中选择你电脑配置对应的 “Your OS、Package、Compute Platform” 等,随后底下会列出相应环境安装所需要使用的命令。
如选择
- | 选项 |
---|---|
PyTorch Build | Stable (1.10) |
Your OS | Windows |
Package | Pip |
Language | Python |
Compute Platform | CPU |
Run this Command: | pip3 install torch torchvision torchaudio |
那么在终端输入给出的命令即可,建议拆开来分别下载,那样一个出问题不容易影响到别的,如下。
1 | pip3 install torch |
其中 torchvision 用于处理图像视频,torchvideo 处理音频,还有处理自然语言的 torchtext 等,根据需要斟酌选择。需要保证 torch 库和其他库的版本对应
下载可能会很慢,可以直接换源下载,如:
1 | pip3 install torch -i https://mirrors.cloud.tencent.com/pypi/simple |
torch 用原来的源下载很慢,但其他包如 torchvision 等不换源下载的速度似乎快的多。
而如果给出的命令里有一个下载链接,也可以点开链接,找到要下载的内容安装包,点击下载,在下载到本地后再次使用命令安装本地包。
如上述选择的 Compute Platform 改成 CUDA 后, 给出的命令里会有个链接:https://download.pytorch.org/whl/cu113/torch_stable.html
在里面搜索你需要的内容,如果不知道要哪个安装包,终端直接输入官网原来给出的命令,下载提示里会有相应的包名。
比如下载了 torch-1.10.0-cp37-cp37m-win_amd64.whl,那么本地安装时进入到相应目录,输入
1 | pip3 install torch-1.10.0-cp37-cp37m-win_amd64.whl |
注1:如果在云服务器上安装时报错,如报错:
PermissionError: [Errno 13] Permission denied: ‘/usr/local/lib/python3.6/site-packages/xxx.py’
这是由于用户权限的问题,可以增加参数 –user:
1 | pip3 install --user xxxPackage |
注2:如果 python 在 pip 安装 pytorch 时失败,并显示 killed ,这是缓存不足的原因,可以加上 –no-cache-dir 试试:
1 | pip3 install torch --no-cache-dir |
注3:如果安装 torchvision 等时提示 pillow,jpeg,Python.h 等关键词并失败,那么可能需要安装一些依赖包,参考:The headers or library files could not be found for jpeg,如:
1 | pip3 install --user Pillow |
使用教程
待修改······
使用教程和基础概念参考:PyTorch 中文教程 & 文档
PyTorch 和 Numpy 有一些关联,可以先适当了解一下 Numpy ,参考 NumPy 官方中文文档
前置设置
想运行别人的代码但没有 CPU 并因此报错:
Pytorch/Torch:电脑无 cuda 情况下,使用 CPU 运行
使用多 GPU 训练:
Pytorch多GPU计算之torch.nn.DataParallel()
Pytorch 多卡训练原理与实现
第一张 GPU 会负责输出,所以一部分工作量会集中在第一张 GPU 卡上。
读取数据集
参考:
Pytorch 加载图像数据(ImageFolder和Dataloader)
PyTorch之torchvision.transforms详解[原理+代码实现]
保存数据集
参考:【Pytorch】torchvision.utils.save_image直接保存 tensor 为图片
加载和保存训练的模型
案例
待补充······
获取数据集:
首先要有数据集用于训练,如果想自己生成数据集,或许可以使用 精灵标注助手 自行进行对图片、文本、视频的位置标注,可以导出成 XML、JSON、MongoDB。
参考:pytorch 图片标注和 yolov3 目标检测教程
图像风格转换:
pytorch官网 —— NEURAL TRANSFER USING PYTORCH
图像风格迁移——pytorch实现(同上)
基于深度学习的图像风格转换
【深度学习】A neural algorithm of artistic style算法详解图像识别:
听说有个 yolo 框架
- AI 换脸:
deepfake 自然最出名。
Oldpan / Faceswap-Deepfake-Pytorch —— Github
注意:里头的训练好的 300M 模型链接是 百度网盘 密码 z4wa
通用深度隐写术在隐写术和水印等的应用:
UDH: Universal Deep Hiding for Steganography, Watermarking, and Light Field Messaging大姿态下人脸快速对齐人脸生成模型方案:
3DDFA —— Github
服务器
通常建议使用服务器进行训练,这样可以少占用自己的计算机资源。
如果没有服务器,也可以考虑百度的 paddle 平台,不过需要重新学习它的框架,有学习成本:
开源深度学习平台飞桨
可以通过答题获得试用算力:
飞桨AI Studio - 人工智能学习实训社区
也可以购买云服务器。
比如腾讯新用户或购买新产品有时有抢购优惠,2核 4G 80GB 1兆带宽 轻量应用服务器 74元/年,阿里云什么的也有类似的活动。
云产品首单秒杀_云服务器秒杀_云数据库秒杀- 腾讯云
尽管便宜的服务器性能训练起来速度很慢,不过在别的地方服务器也能发挥作用,我打算出一篇关于云服务器的运用文章,待补······
另外,建议下载一些别人训练好的模型参数,并以此作为训练模型的初始参数,这样训练会快些。
基本操作
使用 top 命令查看 cpu 等使用情况,参考:Linux top指令交互界面常用操作
Linux 下让进程后台执行并实时刷新输出到文件中:nohup unbuffer command > file.out 2>&1 &
其中 unbuffer 需要额外安装 expect-devel,以实时刷新。
参考:
Linux 后台运行
Linux实时将所有输出重定向到文件
将 print 输出的内容保存到文件中,可以参考:
python 将 print输出的内容保存到txt文件中
python3 将print打印的内容保存到日志
Linux 下也可以使用标准输出(STDOUT)重定向,如 server.py >python.log
课外阅读
样本量极少如何机器学习?:通过将有限的监督信息(小样本)与先验知识(无标记或弱标记样本、其他数据集和标签、其他模型等)结合,使得模型可以有效的学习小样本中的信息。