深度学习(Python)-- 神经网络入门

本章包括:

  • 神经网络的核心组件
  • 对Keras的介绍
  • 设置深度学习工作站
  • 使用神经网络解决基本分类和回归问题

一、神经网络的剖析

  训练神经网络围绕以下对象:

  1. 图层,组合成网络(或模型)。层是数据处理模块,其将一个或多个张量作为输入并且输出一个或多个张量。存储在形状(样本,特征)的2D张量中的简单矢量数据通常由密集连接的层处理,也称为完全连接或密集层(Keras中的密集类)。存储在形状(样本,时间步长,特征)的3D张量中的序列数据通常由诸如LSTM层的循环层处理。 存储在4D张量中的图像数据通常由2D卷积层(Conv2D)处理。
  2. 输入数据和相应的目标 常见的网络拓扑结构:Two-branch、networks、 Multihead networks、 Inception blocks。通过选择网络拓扑,可以将可能性空间(假设空间)约束到一系列特定的张量,将输入数据映射到输出数据。 接下来将要搜索的是这些张量操作中涉及的权重张量的一组很好的值。
  3. 损失函数,定义用于学习的反馈信号。使其最小化。
  4. 优化器,决定学习的进度。
    在这里插入图片描述

二、 Keras

  目前,三个现有的后端实现是TensorFlow后端,Theano后端和Microsoft Cognitive Toolkit(CNTK)后端。使用Keras编写的任何代码都可以使用任何这些后端运行,而无需更改代码中的任何内容。
  定义模型有两种方法:使用Sequential类(仅用于线性堆栈的层,这是迄今为止最常见的网络架构)或功能API(用于层的有向非循环图,它允许您构建完全任意的体系结构)。

三、建立深度学习工作站—NVIDIA GPU。

四、电影评论分类:二分分类示例

查看GitHub源码

  学习根据评论的文本内容将电影评论分类为正面或负面。
  使用IMDB数据集:来自Internet电影数据库的一组50,000个高度极化的评论。 他们分为25,000条培训评论和25,000条测试评论,每组评估50%为负,50%为正面评价。

1. IMDB数据集

  1)Loading the IMDB dataset
2、准备数据
  1)Encoding the integer sequences into a binary matrix
  因为无法将整数列表提供给神经网络,将列表转换为张量的两种方法:

  • 填充列表,使它们都具有相同的长度,将它们转换为整数张形状(samples,word_indices),然后将网络中的第一层用作处理此类整数张量的层(嵌入层);
  • 对您的列表进行One-hot encode,将其转换为0和1的向量。这里使用的是这个。将整数序列编码为二进制矩阵。

3、构建网络
  输入数据是向量,标签是标量(1和0):这是将遇到的最简单的设置。Dense(16,activation=‘relu’),传递给每个Dense层(16)的参数是该层的隐藏单元的数量。 隐藏单元是图层的表示空间中的维度。
  关于这样一堆Dense图层,有两个关键的架构决策:1)要使用多少层;2)每层选择多少个隐藏单位;这里使用了两个中间层,每个层有16个隐藏单元,第三层将输出关于当前评论情绪的标量预测。中间层将使用relu作为其激活功能,最后一层将使用sigmoid激活以输出可执行性(得分在0和1之间,越靠近1越积极)
  1) The model definition
  2) Compiling the model
  3) Configuring the optimizer
  4) Using custom losses and metrics
4、验证方法
  1)Setting aside a validation set
  2)Training your model
  3)Plotting the training and validation loss
  4)Plotting the training and validation accuracy
  5)Retraining a model from scratch
5、使用经过训练的网络生成对新数据的预测
6、进一步实验
7、总结

  • 通常需要对原始数据进行相当多的预处理,以便能够将其作为张量传送到神经网络中。单词序列可以编码为二进制向量,但也有其他编码选项。
  • 具有relu激活的密集层堆栈可以解决各种问题(包括情感分类),可能经常使用。
  • 在二分分类问题(两个输出类)中,网络应该以一个单元和一个sigmoid激活的Dense层结束:网络的输出应该是0到1之间的标量,编码概率。
  • 在二分分类问题上使用这样的标量sigmoid输出,应该使用的损失函数是binary_crossentropy。
  • 无论遇到什么问题,rmsprop优化器通常都是一个不错的选择。
  • 随着模型的训练数据越来越好,神经网络最终开始过度拟合,并最终获得越来越糟糕的数据,这些数据是模型以前从未见过的。
  • 务必始终监控训练集之外的数据的性能。
    运行结果:
    在这里插入图片描述
    在这里插入图片描述

五、新闻专线分类:多类分类示例

查看GitHub源码

这是一个single-label, multiclass classification的例子
1、 Reuters数据集
  Reuters数据集是一个简单,广泛使用的文本分类数据集。 有46个不同的主题; 某些主题比其他主题更具代表性,但每个主题在训练集中至少有10个示例。
  1) Loading the Reuters dataset
  2) Decoding newswires back to text
2、 准备数据
  1) Encoding the data
  要对标签进行矢量化,有两种方法:可以将标签列表转换为整数张量,也可以使用one-hot encoding(也叫做分类编码,经常使用)。除此外,在Keras中有一种内置的方法。(from keras.utils.np_utils import to_categorical)
3、 构建网络
  1) Model definition
  2) Compiling the model
4、 验证方法
  1) Setting aside a validation set
  2) Training the model
  3) Plotting the training and validation loss
  4) Plotting the training and validation accuracy
  5) Retraining a model from scratch
5、 生成对新数据的预测
  1) Generating predictions for new data
6、 处理标签和损失的不同方式
  处理标签和损失的不同方式,我们之前提到过,编码标签的另一种方法是将它们转换为整数张量,这种方法唯一会改变的是损失函数的选择,从头开始重新训练模型中使用的损失函数是ategorical_crossentropy,期望标签遵循分类编码。但是对于整数标签,应该使用sparse_categorical_crossentropy。
7、 具有足够大的中间层的重要性
  1) 一个具有信息瓶颈的模型的例子,以4维为例
8、 进一步实验
  1)尝试使用更大或更小的层:32个单位,128个单位,依此类推。
  2)尝试使用单个隐藏层或三个隐藏层。
9、总结

  • 如果尝试在N个类别中对数据点进行分类,则网络应以大小为N的Dense层结束。
  • 在单标签,多类别分类问题中,网络应以softmax激活结束,以便在N个输出类别上输出概率分布。
  • Categorical crossentropy几乎总是我们应该用于此类问题的损失函数。它最小化了网络输出的概率分布与目标的真实分布之间的距离。
  • 在多类分类中有两种处理标签的方法:a) 通过分类编码(也称为单热编码)对标签进行编码,并使用categorical_crossentropy作为丢失函数; b) 将标签编码为整数并使用arse_categorical_crossentropy损失函数。
  • 如果需要将数据分类为大量类别,则应避免由于中间层太小而在网络中造成信息瓶颈。
    运行结果:
    显示loss 和 accuracy 曲线:
    在这里插入图片描述
    在这里插入图片描述
    显示准确度和与random baseline的对比:

在这里插入图片描述

六、预测房价:一个回归的例子

查看GitHub源码

  前两个示例被认为是分类问题,其目标是预测输入数据点的单个离散标签。 另一种常见类型的机器学习问题是回归,它包括预测连续值而不是离散标签。
  注意:不要混淆回归和算法逻辑回归。 逻辑回归不是回归算法 - 它是一种分类算法。
1、 波士顿住房价格数据集–Loading the Boston housing dataset
  本次采用的数据集具有相对较少的数据:仅506,在404个训练样本和102个测试样本之间分配。 输入数据中的每个功能(例如,犯罪率)都有不同的比例。目标是自住房屋的中位数,价值数千美元
2、 准备数据—Normalizing the data
  将神经网络输入所有采用不同范围的值都是有问题的,处理此类数据的一种广泛的最佳实践是进行特征标准化:对于输入数据中的每个特征(输入数据矩阵中的一列),减去feature的平均值并除以标准偏差,以便该要素以0为中心并具有单位标准差。 这很容易在Numpy中完成。
  注意,使用训练数据计算用于归一化测试数据的量。 不应该在工作流程中使用在测试数据上计算的任何数量,即使对于像数据规范化这样简单的事情也是如此。
3、 构建网络—Model definition
  拥有的训练数据越少,过度拟合就越差,使用小型网络是缓解过度拟合的一种方法。
  网络以单个单元结束而不激活(它将是线性层)。 这是标量回归的典型设置(尝试预测单个连续值的回归)。应用激活函数会限制输出可以采用的范围, 例如,如果将sigmoid激活函数应用于最后一层,网络只能学习预测0到1之间的值。这里,因为最后一层是纯线性的,所以网络可以自由地学习预测任何范围内的值。
  对于回归问题,广泛使用的损失函数:mse loss函数 - 均方误差编译网络,即预测和目标之间差异的平方。
  在训练期间监控新指标:平均绝对误差(MAE)。 它是预测和目标之间差异的绝对值。 例如,此问题的MAE为0.5意味着您的预测平均减少500美元。
4、 使用K-fold验证来验证我们的方法
  1) K-fold validation
  它包括将可用数据拆分为K个分区(通常为K = 4或5),实例化K个相同模型,并在评估剩余分区时对K-1分区进行训练。所用模型的验证分数是获得的K验证分数的平均值。
  2) Saving the validation logs at each fold
  3) Building the history of successive mean K-fold validation scores
  4) Plotting validation scores
  5) Plotting validation scores, excluding the first 10 data points
  6) Training the final model
5、总结

  • 使用与我们用于分类的不同的损失函数进行回归。 均方误差(MSE)是通常用于回归的损失函数。
  • 用于回归的评估指标与用于分类的评估指标不同; 自然地,准确性的概念不适用于回归。 常见的回归度量是平均绝对误差(MAE)。
  • 当输入数据中的要素具有不同范围的值时,应将每个要素作为预处理步骤单独进行缩放。
  • 当数据很少时,使用K-fold验证是可靠评估模型的好方法。
  • 当可用的训练数据很少时,最好使用一个隐藏层较少的小型网络(通常只有一个或两个),以避免严重的过度拟合。

  运行结果:
  K-fold validation:
在这里插入图片描述
  绘制验证分数:
在这里插入图片描述
  绘制排除前10个数据点的验证分数 :
在这里插入图片描述
  训练最终模型,结果:
在这里插入图片描述
  我们仍然偏离约$ 2,678

本章总结

  1. 目前为止,可以处理矢量数据中最常见的机器学习任务:二分分类,多类分类和标量回归。
  2. 通常需要在将原始数据输入神经网络之前对其进行预处理。
  3. 当数据具有不同范围的要素时,要在预处理过程中单独缩放每个要素。
  4. 随着训练的进行,神经网络最终开始过度拟合并在前所未见的数据上获得更差的结果。
  5. 如果没有太多的训练数据,使用只有一个或两个隐藏层的小型网络,避免严重过度拟合。
  6. 如果数据分为多个类别,如果使中间层太小,可能会导致信息瓶颈。
  7. 回归使用不同的损失函数和不同的评估指标而不是分类。
  8. 当处理少量数据时,K-fold验证可以可靠地评估模型。
发布了64 篇原创文章 · 获赞 7 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Pandade520/article/details/96481854