深度学习技巧和窍门
本页描述了提高深度学习网络准确性的各种训练选项和技术。
选择网络体系结构
合适的网络架构取决于任务和可用的数据。在决定使用哪种体系结构以及是使用预训练的网络还是从头开始训练时,请考虑这些建议。
数据 | 任务的描述 | 了解更多 |
---|---|---|
图片 | 自然图像分类 | 尝试不同的预训练网络。有关预训练深度学习网络的列表,请参见预先训练的深度神经网络。 要了解如何使用深度网络设计器为迁移学习交互式准备网络,请参见与深度网络设计器的迁移学习。 |
自然图像回归 | 尝试不同的预训练网络。关于如何将预训练的分类网络转换为回归网络的例子,请参见将分类网络转换为回归网络。 | |
非自然图像(例如微小图像和声谱图)的分类和回归 | 关于如何对微小图像进行分类的例子,请参见训练残差网络进行图像分类。 展示如何对谱图进行分类的例子,请参见利用深度学习训练语音指令识别模型。 |
|
语义分割 | Computer Vision Toolbox™为语义分割提供了创建深度学习网络的工具。更多信息,请参见从使用深度学习的语义分割开始(计算机视觉工具箱)。 | |
序列、时间序列和信号 | Sequence-to-label分类 | 示例请参见序列分类使用深度学习。 |
序列对序列的分类和回归 | 要了解更多,请参见使用深度学习的序列对序列分类和使用深度学习的序列对序列回归。 | |
Sequence-to-one回归 | 示例请参见使用深度学习的序列到一回归。 | |
时间序列预测 | 示例请参见使用深度学习的时间序列预测。 | |
文本 | 分类和回归 | 文本分析工具箱™提供了为文本数据创建深度学习网络的工具。示例请参见使用深度学习对文本数据进行分类。 |
文本生成 | 示例请参见使用深度学习生成文本。 | |
音频 | 音频分类与回归 | 尝试不同的预训练网络。有关预训练深度学习网络的列表,请参见Pretrained模型(音频工具箱)。 要了解如何以编程方式为迁移学习准备一个网络,请参见使用预训练音频网络进行转移学习(音频工具箱)。要了解如何使用深度网络设计器为迁移学习交互式准备网络,请参见在深度网络设计器中使用预先训练的音频网络进行迁移学习。 关于如何使用深度学习对声音进行分类的例子,请参见使用深度学习分类声音(音频工具箱)。 |
选择培训选项
的trainingOptions
函数提供了多种选项来训练你的深度学习网络。
提示 | 更多的信息 |
---|---|
监控培训进展 | 要打开训练进度图,设置“阴谋” 选项trainingOptions 来“训练进步” 。 |
使用验证数据 | 指定验证数据,请使用 请注意 如果您的验证数据集太小,不能充分表示数据,那么报告的指标可能对您没有帮助。使用过大的验证数据集会导致训练速度变慢。 |
对于迁移学习,加速新层的学习,减慢迁移层的学习 | 为新层指定更高的学习率因子,例如使用 的方法降低初始学习率 当转移学习时,你不需要训练那么多课时。减少使用的课时数 要了解如何使用深度网络设计器为迁移学习交互式准备网络,请参见与深度网络设计器的迁移学习。 |
每一个时代洗牌你的数据 | 要在每个时代(数据的一次完整传递)洗牌数据,请设置 请注意 对于序列数据,变换会对准确性产生负面影响,因为它会增加填充或截断数据的数量。如果你有序列数据,那么根据序列长度对数据进行排序会有所帮助。要了解更多,请参见序列填充,截断和分裂。 |
尝试不同的优化 | 要指定不同的优化器,请使用 |
更多信息,请参见设置参数,训练卷积神经网络。
提高训练精度
如果你在培训过程中注意到问题,那么考虑一下这些可能的解决方案。
问题 | 可能的解决方案 |
---|---|
NaNs或损失的大峰值 | 的方法降低初始学习率 如果降低学习率没有帮助,那么尝试使用梯度裁剪。要设置渐变阈值,请使用 |
训练结束时,损失仍在减少 | 通过增加使用的时代的数量来训练更长时间“MaxEpochs” 选项trainingOptions 。 |
损失高原 | 如果损失在一个出乎意料的高值处停滞,那么在这个高原处降低学习率。要更改学习率时间表,请使用 如果降低学习率没有帮助,那么模型可能是欠拟合的。可以尝试增加参数或层的数量。你可以通过监控验证损失来检查模型是否欠拟合。 |
验证损失比训练损失要高得多 | 为了防止过拟合,请尝试以下一种或多种方法:
|
损失下降非常缓慢 | 增加初始学习速率使用 对于图像数据,尝试在网络中包含批处理规范化层。更多信息,请参见 |
更多信息,请参见设置参数,训练卷积神经网络。
修复训练中的错误
如果你的网络根本没有训练,那么考虑一下可能的解决方案。
错误 | 描述 | 可能的解决方案 |
---|---|---|
训练时内存不足错误 | 可用的硬件无法存储当前的小批、网络权重和计算的激活。 | 尝试减少小批处理大小使用 如果减少迷你批处理的大小不起作用,那么尝试使用更小的网络,减少层数,或者减少层中的参数或过滤器的数量。 |
自定义层的错误 | 自定义层的实现可能有问题。 | 检查自定义层的有效性,并发现潜在的问题使用 如果测试失败,当你使用 |
训练抛出错误“CUDA_ERROR_UNKNOWN” |
有时候,GPU在被用于操作系统的计算和显示请求时抛出这个错误。 | 尝试减少小批处理大小使用 如果减少小批大小不奏效,那么在Windows®,尝试调整TDR (Timeout Detection and Recovery)设置。例如,修改 |
你可以分析你的深度学习网络使用analyzeNetwork
。的analyzeNetwork
函数显示网络架构的交互式可视化,检测网络的错误和问题,并提供关于网络层的详细信息。使用网络分析器可视化和理解网络体系结构,检查您是否正确定义了体系结构,并在训练前检测问题。的问题,analyzeNetwork
检测包括丢失或断开的层,不匹配或不正确的层输入大小,错误的层输入数量,无效的图结构。
准备和预处理数据
你可以通过对数据进行预处理来提高精确度。
体重或平衡类
理想情况下,所有类都有相同数量的观察值。然而,对于某些任务,类可能是不平衡的。例如,街道场景的汽车数据集往往比行人和骑自行车的像素拥有更多的天空、建筑和道路像素,因为天空、建筑和道路覆盖了更多的图像区域。如果处理不当,这种不平衡可能对学习过程有害,因为学习偏向于优势类。
对于分类任务,可以使用“ClassWeights”
选择classificationLayer
。示例请参见使用带不平衡类的数据的训练序列分类网络。对于语义分割任务,可以使用ClassWeights
(计算机视觉工具箱)的属性pixelClassificationLayer
(计算机视觉工具箱)。
或者,你可以通过做以下一项或多项来平衡课程:
从最不频繁的类中添加新的观察值。
从最频繁的类中删除观察值。
组相似的类。例如,将类“car”和“truck”归为单个类“vehicle”。
图像数据进行预处理
有关预处理图像数据的更多信息,请参见用于深度学习的预处理图像。
任务 | 更多的信息 |
---|---|
调整图像 | 要使用预训练的网络,必须将图像的大小调整为网络的输入大小。要调整图像的大小,使用 auimds = augmentedImageDatastore (inputSize, imd); 提示 使用 请勿使用 |
图像增强 | 为了避免过拟合,使用图像变换。要了解更多,请参见训练网络与增强图像。 |
回归正常化的目标 | 将预测器归一化后再输入网络。如果在训练前对响应进行归一化,那么必须对训练过的网络的预测进行变换,以获得原始响应的预测。 更多信息,请参见训练卷积神经网络用于回归。 |
预处理序列数据
有关使用LSTM网络的更多信息,请参见长短期记忆网络。
任务 | 更多的信息 |
---|---|
标准化序列数据 | 为了规范化序列数据,首先计算每个特征的平均值和所有序列的标准差。然后,对于每个训练观察,减去平均值,再除以标准差。 要了解更多,请参见标准化序列数据。 |
减少序列填充和截断 | 为了减少填充或截断序列时填充或丢弃的数据量,请尝试按序列长度对数据进行排序。 要了解更多,请参见序列填充,截断和分裂。 |
为预测指定小批量大小和填充选项 | 当您使用不同长度的序列进行预测时,小批大小可能会影响添加到输入数据中的填充量,这可能会导致不同的预测值。尝试使用不同的值,看看哪一个最适合您的网络。 要指定小批大小和填充选项,请使用 |
使用可用的硬件
要指定执行环境,请使用“ExecutionEnvironment”
选项trainingOptions
。
问题 | 更多的信息 |
---|---|
CPU上的训练很慢 | 如果在单个CPU上训练太慢,可以尝试使用预训练的深度学习网络作为特征提取器,训练一个机器学习模型。示例请参见使用预训练网络提取图像特征。 |
在GPU上训练LSTM比较慢 | CPU更适合使用小批量的短序列训练LSTM网络。要使用CPU,请设置 |
软件并不使用所有可用的gpu | 如果你可以访问一台有多个gpu的机器,只需设置“ExecutionEnvironment” 选项trainingOptions 来“multi-gpu” 。更多信息,请参见基于MATLAB的多gpu深度学习。 |
更多信息,请参见Scale Up Deep Learning in Parallel, on gpu, in Cloud。
修复从MAT-Files加载时的错误
如果你无法从mat文件加载层或网络,并得到窗体的警告
警告:无法将类layerType的实例加载到异构数组中。layerType的定义可能缺失或包含错误。默认对象将被替换。警告:当加载类'SeriesNetwork'的对象时:在nnet.cnn.layer.MissingLayer中使用'forward'错误。该函数抛出了一个错误,无法执行。
该文件包含一个不在路径上的自定义层-要加载包含自定义层的网络,将自定义层文件添加到MATLAB中®路径。
该文件包含来自支持包的自定义层-要使用支持包中的层加载网络,请在命令行中使用相应的函数(例如,
resnet18
)或使用Add-On Explorer。该文件包含一个来自文档示例的自定义层,该自定义层不在路径上-要从文档示例加载包含自定义层的网络,请将示例作为实时脚本打开,并将该层从示例文件夹复制到您的工作目录。
该文件包含未安装的工具箱中的一层-要从其他工具箱访问层,例如,计算机视觉工具箱或文本分析工具箱,请安装相应的工具箱。
在尝试了建议的解决方案后,重新加载mat文件。
另请参阅
trainingOptions
|checkLayer
|analyzeNetwork
|深层网络设计师