Machine Learning Mastery Keras 深度学习教程(二)
如何用 Keras 构建多层感知机神经网络模型
原文:
machinelearningmastery.com/build-multi-layer-perceptron-neural-network-models-keras/
用于深度学习的 Keras Python 库专门用于构建一系列层的模型。
在这篇文章中,您将了解用来创建神经网络的简单组件和使用 Keras 的简单深度学习模型。
您可以通过我新书中的一些代码了解如何为一系列预测性建模问题开发深度学习模型,书中包含 18 个分步教程和 9 个项目。
让我们开始吧。
- 2017 年 3 月更新:更新了 Keras 2.0.2,TensorFlow 1.0.1 和 Theano 0.9.0 的示例。
如何用 Keras 建立多层感知机神经网络模型 照片由 George Rex ,保留一些权利。
Keras 中的神经网络模型
Keras 库的重点是模型。
最简单的模型用 Sequential 类定义,它是一个层的线性栈。
您可以创建一个 Sequential 模型类然后定义模型中的所有层,例如:
from keras.models import Sequential
model = Sequential(...)
更有用的书写方式是创建一个 Sequential 模型然后按照您希望执行的计算顺序添加层,例如:
from keras.models import Sequential
model = Sequential()
model.add(...)
model.add(...)
model.add(...)
模型输入
模型中的第一层必须指定输入的形状。
这是输入属性的数量,由 input_dim 参数定义。这个参数需要是一个整数。
例如,您可以按照 Dense 类型层的 8 个输入定义输入,如下所示:
Dense(16, input_dim=8)
模型层
不同类型的层是一些共同的属性,特别是它们的初始化权重和激活函数。
权重初始化
用于层的初始化类型在 init 参数中指定。
一些常见的层初始化类型包括:
- “_ uniform _”:将权重初始化为 0 到 0.05 之间的小的均匀随机值。
- “_ normal _”:将权重初始化为小高斯随机值(均值为 0,标准差 0.05)。
- “_ zero _”:所有权重都设置为零。
您可以在初始化用法页面上看到完整的初始化方法列表。
激活功能
Keras 支持一系列标准神经元激活功能,例如:softmax,rectifier,tanh 和 sigmoid。
您通常会通过激活参数指定每层使用的激活函数的类型,该函数采用字符串值。
您可以在激活用法页面上查看 Keras 支持的完整激活方式列表。
有趣的是,您还可以创建一个 Activation 对象,并在层之后将其直接添加到模型中,以将该激活应用于层的输出。
层类型
标准神经网络有大量的核心层类型。
您可以选择的一些常见且有用的层类型是:
- ** Dense**:完全连接的层和多层感知机模型上使用的最常见的层。
- Dropout :将 dropout 应用于模型,将输入的一小部分设置为零,以减少过拟合。
- ** Merge**:将多个模型的输入组合到一个模型中。
您可以在核心层页面上了解核心 Keras 层的完整列表
模型编译
一旦定义了模型,就需要编译它。
这将创建底层后端(Theano 或 TensorFlow)使用的有效结构,以便在训练期间有效地执行您的模型。
您可以使用 compile()函数编译模型,它需要定义三个重要属性:
- 模型优化器。
- 损失函数。
- 指标。
model.compile(optimizer=, loss=, metrics=)
1.模型优化器
优化程序是用于更新模型中权重的搜索技术。
您可以创建优化器对象并通过优化器参数将其传递给编译函数。这允许您使用自己的参数(例如学习率)配置优化过程。例如:
sgd = SGD(...)
model.compile(optimizer=sgd)
您还可以通过为优化程序参数指定优化程序的名称来使用优化程序的默认参数。例如:
model.compile(optimizer='sgd')
您可能想要选择的一些流行的梯度下降优化器包括:
- SGD :随机梯度下降,支持动量。
- RMSprop :Geoff Hinton 提出的自适应学习率优化方法。
- Adam :自适应力矩估计(Adam),也使用自适应学习率。
您可以在 Usage of optimizers 页面上了解 Keras 支持的所有优化器。
您可以在 Sebastian Ruder 的帖子梯度下降优化算法部分上了解有关不同梯度下降方法的更多信息。梯度下降优化算法概述。
2.模型损失函数
损失函数,也称为目标函数,由用于导航权重空间的优化器来评估模型。
您可以通过 loss 参数指定要用于编译函数的 loss 函数的名称。一些常见的例子包括:
- '
mse':表示均方误差。 - '
binary_crossentropy':用于二进制对数损失(logloss)。 - '
categorical_crossentropy':用于多类对数损失(logloss)。
您可以在目标用途页面上了解更多关于 Keras 支持的损失函数。
3.模型指标
在训练期间,模型评估度量标准。
目前仅支持一个指标即准确率。
模特训练
使用 fit()函数在 NumPy 数组上训练模型,例如
model.fit(X, y, epochs=, batch_size=)
训练都指定了训练的次数和训练数据的批量大小。
- Epochs(nb_epoch)是模型指定给训练数据集的次数。
- Batch Size(batch_size)是在执行权重更新之前向模型显示的训练实例的数量。
拟合函数还允许在训练期间对模型进行一些基本评估。您可以设置 validation_split 值以返回每次训练的训练数据集的一小部分以便评估验证,或提供要评估的数据的(X,y)的 validation_data 元组。
拟合模型返回历史对象,其中包含为每个时期的模型计算的详细信息和指标。这可用于绘制模型表现。
模型预测
训练完模型后,可以使用它来预测测试数据或新数据。
您可以从训练模型中计算出许多不同的输出类型,每种输出类型都是使用模型对象上的不同函数调用计算的。例如:
- model.evaluate():计算输入数据的损失值。
- model.predict():为输入数据生成网络输出。
- model.predict_classes():为输入数据生成类输出。
- model.predict_proba():为输入数据生成类概率。
例如,在分类问题上,您将使用 predict_classes()函数对测试数据或新数据实例做出预测。
总结模型
一旦您对您的模型感到满意,说明您已经完成了模型。
您可能希望输出模型的摘要。例如,您可以通过调用摘要函数来显示模型的摘要,例如:
model.summary()
您还可以使用 get_config()函数检索模型配置的摘要,例如:
model.get_config()
最后,您可以直接创建模型结构的图像。例如:
from keras.utils.vis_utils import plot_model
plot(model, to_file='model.png')
资源
您可以使用以下资源了解有关如何在 Keras 中创建简单神经网络和深度学习模型的更多信息:
总结
在这篇文章中,您已经了解了可用于创建人工神经网络和深度学习模型的 Keras API。
具体来说,您了解了 Keras 模型的生命周期,包括:
- 构建模型。
- 创建和添加层,及对层进行初始化权重和激活函数的设置。
- 编译模型,包括优化方法,损失函数和度量。
- 训练模型,包括训练迭代次数和训练数据批量的大小
- 模型预测。
- 总结模型。
如果您对 Keras for Deep Learning 或本文有任何疑问,请在评论中提问,我会尽力回答。
如何在 Keras 中检查深度学习模型
原文:
machinelearningmastery.com/check-point-deep-learning-models-keras/
深度学习模型在训练时可能需要花费数小时,数天甚至数周。
如果意外停止运行,则可能会丢失大量成果。
在这篇文章中,您将了解如何使用 Python 中的 keras 库在模型训练期间检查您的深度学习模型。
让我们开始吧。
- 2017 年 3 月更新:更新了 Keras 2.0.2,TensorFlow 1.0.1 和 Theano 0.9.0 的示例。
- 更新 March / 2018 :添加了备用链接以下载数据集,因为原始图像已被删除。
照片由 saragoldsmith 提供,并保留其所属权利。
检验点神经网络模型
应用程序检查点是一种容错技术,适用于长时间运行的进程。
这是一种在系统出现故障时采用系统状态快照的方法,如果出现问题,任务并非全部丢失,检查点可以直接使用,或者从中断处开始,用作程序重新运行的起点。
在训练深度学习模型时,检查点是模型的权重参数,这些权重可用于按原样做出预测,或用作持续训练的基础。
Keras 库通过回调 API 提供检查点功能。
ModelCheckpoint 回调类允许您定义检查模型权重的位置,文件应如何命名以及在何种情况下创建模型的检查点。
API 允许您指定要监控的度量标准,例如训练或验证数据集的损失或准确率,您可以指定是否在最大化或最小化分数时寻求改进,最后,用于存储权重的文件名可以包含诸如迭代数量或度量的变量。
然后,在模型上调用fit()函数时,可以将 ModelCheckpoint 传递给训练过程。
注意,您可能需要安装 h5py 库以输出 HDF5 格式的网络权重。
检查点神经网络模型改进
检查点的良好用途是每次在训练期间观察到表现提升时输出模型权重参数。
下面的例子为皮马印第安人糖尿病二分类问题创建了一个小型神经网络。该示例假设 pima-indians-diabetes.csv 文件位于您的工作目录中。
您可以从此处下载数据集:
该示例使用 33%的数据作为验证集。
只有在验证数据集(monitor ='val_acc'和 mode ='max')的分类准确率有所提高时,才会设置检验点以保存网络权重参数。权重参数存储在一个文件中,该.hdf5 文件的文件名为当前精度值(格式化输出为:权重改进 - {val_acc = .2f} .hdf5)。
# 当验证集的精度有所提高时,需要保存当前的权重参数
from keras.models import Sequential
from keras.layers import Dense
from keras.callbacks import ModelCheckpoint
import matplotlib.pyplot as plt
import numpy
# 固定随机种子再现性
seed = 7
numpy.random.seed(seed)
# 加载数据集
dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# 将数据集划分为输入变量 X 和输出变量 Y
X = dataset[:,0:8]
Y = dataset[:,8]
# 创建模型
model = Sequential()
model.add(Dense(12, input_dim=8, kernel_initializer='uniform', activation='relu'))
model.add(Dense(8, kernel_initializer='uniform', activation='relu'))
model.add(Dense(1, kernel_initializer='uniform', activation='sigmoid'))
# 编译模型
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# 检查点
filepath="weights-improvement-{epoch:02d}-{val_acc:.2f}.hdf5"
checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=True, mode='max')
callbacks_list = [checkpoint]
# 拟合模型
model.fit(X, Y, validation_split=0.33, epochs=150, batch_size=10, callbacks=callbacks_list, verbose=0)
运行该示例将生成以下输出(为简洁表示,只显示其一部分结果):
...
Epoch 00134: val_acc did not improve
Epoch 00135: val_acc did not improve
Epoch 00136: val_acc did not improve
Epoch 00137: val_acc did not improve
Epoch 00138: val_acc did not improve
Epoch 00139: val_acc did not improve
Epoch 00140: val_acc improved from 0.83465 to 0.83858, saving model to weights-improvement-140-0.84.hdf5
Epoch 00141: val_acc did not improve
Epoch 00142: val_acc did not improve
Epoch 00143: val_acc did not improve
Epoch 00144: val_acc did not improve
Epoch 00145: val_acc did not improve
Epoch 00146: val_acc improved from 0.83858 to 0.84252, saving model to weights-improvement-146-0.84.hdf5
Epoch 00147: val_acc did not improve
Epoch 00148: val_acc improved from 0.84252 to 0.84252, saving model to weights-improvement-148-0.84.hdf5
Epoch 00149: val_acc did not improve
您将在工作目录中看到许多文件,其中包含 HDF5 格式的网络权重。例如:
...
weights-improvement-53-0.76.hdf5
weights-improvement-71-0.76.hdf5
weights-improvement-77-0.78.hdf5
weights-improvement-99-0.78.hdf5
这是一个非常简单的检查点策略,如果验证准确度在训练时期上下移动,则可能会创建大量不必要的检查点文件,然而,它将确保您发现模型运行期间的最佳快照。
仅限检查点最佳神经网络模型
更简单的检查点策略是当且仅当验证准确度提高时将模型权重保存到同一文件中。
这可以使用上面相同的代码轻松完成,并将输出文件名更改为固定的字符串(不包括分数或迭代信息)。
在这种情况下,只有当验证数据集上模型的分类精度提高到当前最佳时,模型权重才会被写入文件weights.best.hdf5.
#当验证模型准确率最高时,保存权重
from keras.models import Sequential
from keras.layers import Dense
from keras.callbacks import ModelCheckpoint
import matplotlib.pyplot as plt
import numpy
#固定随机种子再现性
seed = 7
numpy.random.seed(seed)
# 加载数据集
dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# 将数据集划分为输入变量和输出变量
X = dataset[:,0:8]
Y = dataset[:,8]
# 创建模型
model = Sequential()
model.add(Dense(12, input_dim=8, kernel_initializer='uniform', activation='relu'))
model.add(Dense(8, kernel_initializer='uniform', activation='relu'))
model.add(Dense(1, kernel_initializer='uniform', activation='sigmoid'))
# 编译模型
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# 检查点
filepath="weights.best.hdf5"
checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=True, mode='max')
callbacks_list = [checkpoint]
# 拟合模型
model.fit(X, Y, validation_split=0.33, epochs=150, batch_size=10, callbacks=callbacks_list, verbose=0)
运行此示例提供以下输出(为简洁表示,只显示其一部分结果):
...
Epoch 00139: val_acc improved from 0.79134 to 0.79134, saving model to weights.best.hdf5
Epoch 00140: val_acc did not improve
Epoch 00141: val_acc did not improve
Epoch 00142: val_acc did not improve
Epoch 00143: val_acc did not improve
Epoch 00144: val_acc improved from 0.79134 to 0.79528, saving model to weights.best.hdf5
Epoch 00145: val_acc improved from 0.79528 to 0.79528, saving model to weights.best.hdf5
Epoch 00146: val_acc did not improve
Epoch 00147: val_acc did not improve
Epoch 00148: val_acc did not improve
Epoch 00149: val_acc did not improve
您应该可以在本地目录中看到权重文件。
weights.best.hdf5
这是在您的实验中能够始终使用的一个方便的检查点策略,它将确保为运行保存最佳模型,以便您以后使用,这个策略避免了您在训练时需要包含代码以手动跟踪和序列化最佳模型。
加载一个检查点的神经网络模型
现在您已经了解了如何在训练期间检查您的深度学习模型,您现在需要了解如何加载和使用检查点模型。
检查点仅包括模型权重,假设您了解网络结构,这些模型权重也可以序列化为 JSON 或 YAML 格式的文件。
在下面的示例中,模型结构是已知的,最佳权重从上一个实验加载,存储在 weights.best.hdf5 文件的工作目录中。
然后使用该模型对整个数据集做出预测。
# 怎样从一个检查点加载和使用权重参数
from keras.models import Sequential
from keras.layers import Dense
from keras.callbacks import ModelCheckpoint
import matplotlib.pyplot as plt
import numpy
# 固定随机种子再现性
numpy.random.seed(seed)
# 创建模型
model = Sequential()
model.add(Dense(12, input_dim=8, kernel_initializer='uniform', activation='relu'))
model.add(Dense(8, kernel_initializer='uniform', activation='relu'))
model.add(Dense(1, kernel_initializer='uniform', activation='sigmoid'))
# 加载权重参数
model.load_weights("weights.best.hdf5")
# 编译模型(需要做出预测)
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
print("Created model and loaded weights from file")
# 加载数据集
dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# 将数据集划分为输入变量和输出变量
X = dataset[:,0:8]
Y = dataset[:,8]
# 在整个数据集上使用加载的权重参数评估模型表现
scores = model.evaluate(X, Y, verbose=0)
print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
运行该示例将生成以下输出:
Created model and loaded weights from file
acc: 77.73%
摘要
在这篇文章中,您已经了解了检查点在深度学习模型中长时间训练中的重要性。
您学习了两个检查点策略,您可以在下一个深度学习项目中使用它们:
- 检查点模型改进。
- 唯一的检查点最佳模型。
您还学习了如何加载检查点模型并做出预测。
如果您对深度学习模型检查点或此篇文章有任何疑问,在评论中提出您的问题,我会尽力回答。
如何选择深度学习的激活函数
最后更新于 2021 年 1 月 22 日
激活函数是神经网络设计的关键部分。
隐藏层中激活函数的选择将控制网络模型学习训练数据集的程度。输出层激活函数的选择将定义模型可以做出的预测类型。
因此,必须为每个深度学习神经网络项目仔细选择激活函数。
在本教程中,您将发现如何为神经网络模型选择激活函数。
完成本教程后,您将知道:
- 激活函数是神经网络设计的关键部分。
- 隐藏层的现代默认激活函数是 ReLU 功能。
- 输出层的激活函数取决于预测问题的类型。
我们开始吧。
如何选择深度学习的激活函数 图片由彼得·道利提供,版权所有。
教程概述
本教程分为三个部分;它们是:
- 激活函数
- 隐藏层的激活
- 输出层的激活
激活函数
神经网络中的激活函数定义了如何将输入的加权和转换为网络层中一个或多个节点的输出。
有时激活函数被称为“传递函数”如果激活函数的输出范围有限,则可称为“挤压功能”许多激活函数是非线性的,在层或网络设计中可能被称为“非线性”。
激活函数的选择对神经网络的能力和表现有很大的影响,不同的激活函数可以用于模型的不同部分。
从技术上讲,激活函数在网络中每个节点的内部处理内部或之后使用,尽管网络被设计为对一层中的所有节点使用相同的激活函数。
一个网络可以有三种类型的层:从域中获取原始输入的输入层、从另一个层获取输入并将输出传递到另一个层的隐藏层、进行预测的输出层。
所有隐藏层通常使用相同的激活函数。输出层通常使用不同于隐藏层的激活函数,并且取决于模型所需的预测类型。
激活函数通常也是可微的,这意味着可以为给定的输入值计算一阶导数。这是必需的,因为神经网络通常使用误差反向传播算法来训练,该算法需要预测误差的导数,以便更新模型的权重。
神经网络中使用了许多不同类型的激活函数,尽管实际上可能只有少量函数用于隐藏层和输出层。
让我们依次看看每种类型的层所使用的激活函数。
隐藏层的激活
神经网络中的隐藏层是从另一层(例如另一隐藏层或输入层)接收输入并向另一层(例如另一隐藏层或输出层)提供输出的层。
至少在一般情况下,隐藏层不会直接接触输入数据或为模型生成输出。
神经网络可以有零个或多个隐藏层。
典型地,在神经网络的隐藏层中使用可微分的非线性激活函数。这允许模型学习比使用线性激活函数训练的网络更复杂的函数。
为了获得更丰富的假设空间,从深度表示中获益,你需要一个非线性,或者说激活函数。
—第 72 页,Python 深度学习,2017。
可能有三个激活函数,您可能想考虑在隐藏层中使用;它们是:
- 整流线性激活( ReLU )
- 物流( Sigmoid )
- 双曲线正切( Tanh )
这不是用于隐藏层的激活函数的详尽列表,但它们是最常用的。
让我们依次仔细看看每一个。
ReLU 隐藏层激活函数
整流线性激活函数,或 ReLU 激活函数,可能是用于隐藏层的最常见功能。
它之所以常见,是因为它既易于实现,又能有效克服其他以前流行的激活函数(如 Sigmoid 和 Tanh)的限制。具体来说,它不太容易受到阻止深度模型被训练的消失梯度的影响,尽管它可能会遇到其他问题,如饱和或“死亡”单位。
ReLU 函数计算如下:
- 最大值(0.0,x)
这意味着如果输入值(x)为负,则返回值 0.0,否则返回值。
您可以在本教程中了解更多关于 ReLU 激活函数的细节:
我们可以通过下面的例子得到这个函数形状的直觉。
# example plot for the relu activation function
from matplotlib import pyplot
# rectified linear function
def rectified(x):
return max(0.0, x)
# define input data
inputs = [x for x in range(-10, 10)]
# calculate outputs
outputs = [rectified(x) for x in inputs]
# plot inputs vs outputs
pyplot.plot(inputs, outputs)
pyplot.show()
运行该示例计算一系列值的输出,并创建输入与输出的关系图。
我们可以看到熟悉的 ReLU 激活函数的扭结形状。
ReLU 激活函数的输入与输出图。
对隐藏图层使用 ReLU 函数时,最好在训练前使用“ He Normal ”或“ He Uniform ”进行权重初始化,并将输入数据缩放到 0-1(Normal)的范围。
Sigmoid 隐藏层激活函数
sigmoid 激活函数也称为逻辑函数。
它与逻辑回归分类算法中使用的函数相同。
该函数将任何实数值作为输入,并输出 0 到 1 范围内的值。输入越大(越正),输出值越接近 1.0,而输入越小(越负),输出越接近 0.0。
sigmoid 激活函数计算如下:
- 1.0 / (1.0 + e^-x)
其中 e 是数学常数,是自然对数的底数。
我们可以通过下面的例子得到这个函数形状的直觉。
# example plot for the sigmoid activation function
from math import exp
from matplotlib import pyplot
# sigmoid activation function
def sigmoid(x):
return 1.0 / (1.0 + exp(-x))
# define input data
inputs = [x for x in range(-10, 10)]
# calculate outputs
outputs = [sigmoid(x) for x in inputs]
# plot inputs vs outputs
pyplot.plot(inputs, outputs)
pyplot.show()
运行该示例计算一系列值的输出,并创建输入与输出的关系图。
我们可以看到熟悉的 S 形的 Sigmoid 激活函数。
Sigmoid 激活函数的输入与输出图。
对隐藏层使用 Sigmoid 函数时,最好在训练前使用“ Xavier Normal ”或“ Xavier Uniform ”权重初始化(也称为 Glorot 初始化,以 Xavier Glorot 命名)并将输入数据缩放到 0-1 的范围(例如激活函数的范围)。
隐藏层激活函数
双曲正切激活函数也简称为 Tanh(也是“ tanh ”和“ TanH ”)函数。
它与 Sigmoid 激活函数非常相似,甚至具有相同的 S 形。
该函数将任何实数值作为输入,并输出-1 到 1 范围内的值。输入越大(越正),输出值越接近 1.0,而输入越小(越负),输出越接近-1.0。
Tanh 激活函数计算如下:
- (e^x-e^-x)/(e^x+e^-x)
其中 e 是数学常数,是自然对数的底数。
我们可以通过下面的例子得到这个函数形状的直觉。
# example plot for the tanh activation function
from math import exp
from matplotlib import pyplot
# tanh activation function
def tanh(x):
return (exp(x) - exp(-x)) / (exp(x) + exp(-x))
# define input data
inputs = [x for x in range(-10, 10)]
# calculate outputs
outputs = [tanh(x) for x in inputs]
# plot inputs vs outputs
pyplot.plot(inputs, outputs)
pyplot.show()
运行该示例计算一系列值的输出,并创建输入与输出的关系图。
我们可以看到我们熟悉的 Tanh 激活函数的 S 形。
Tanh 激活函数的输入与输出图。
当对隐藏层使用 TanH 函数时,最好在训练前使用“泽维尔正常”或“泽维尔均匀”权重初始化(也称为格洛罗初始化,以泽维尔格洛罗命名),并将输入数据缩放到-1 到 1 的范围(例如激活函数的范围)。
如何选择隐藏层激活函数
神经网络在所有隐藏层中几乎总是具有相同的激活函数。
通过网络模型改变激活函数是非常不寻常的。
传统上,sigmoid 激活函数是 20 世纪 90 年代的默认激活函数。也许在 20 世纪 90 年代中后期到 2010 年代,Tanh 功能是隐藏层的默认激活函数。
…双曲正切激活函数的表现通常优于逻辑 sigmoid。
—第 195 页,深度学习,2016。
sigmoid 和 Tanh 函数都可以通过所谓的消失梯度问题,使模型在训练过程中更容易出现问题。
您可以在本教程中了解有关此问题的更多信息:
隐藏层中使用的激活函数通常是基于神经网络体系结构的类型来选择的。
具有通用架构的现代神经网络模型,如 MLP 和美国有线电视新闻网,将利用 ReLU 激活函数或扩展。
在现代神经网络中,默认的建议是使用校正后的线性单元或 ReLU …
—第 174 页,深度学习,2016。
递归网络仍然普遍使用 Tanh 或 sigmoid 激活函数,甚至两者都使用。例如,LSTM 通常使用 Sigmoid 激活进行循环连接,使用 Tanh 激活进行输出。
- 多层感知机(MLP) : ReLU 激活函数。
- 卷积神经网络(CNN) : ReLU 激活函数。
- 递归神经网络 : Tanh 和/或 Sigmoid 激活函数。
如果您不确定要为您的网络使用哪种激活函数,请尝试一些并比较结果。
下图总结了如何为神经网络模型的隐藏层选择激活函数。
如何选择隐藏层激活函数
输出层的激活
输出层是神经网络模型中直接输出预测的层。
所有前馈神经网络模型都有一个输出层。
在输出层中,您可能需要考虑使用三个激活函数;它们是:
- 线性的
- 物流(西格蒙德)
- Softmax(软件最大值)
这不是用于输出层的激活函数的详尽列表,但它们是最常用的。
让我们依次仔细看看每一个。
线性输出激活函数
线性激活函数也称为“身份”(乘以 1.0)或“无激活”
这是因为线性激活函数不会以任何方式改变输入的加权和,而是直接返回值。
我们可以通过下面的例子得到这个函数形状的直觉。
# example plot for the linear activation function
from matplotlib import pyplot
# linear activation function
def linear(x):
return x
# define input data
inputs = [x for x in range(-10, 10)]
# calculate outputs
outputs = [linear(x) for x in inputs]
# plot inputs vs outputs
pyplot.plot(inputs, outputs)
pyplot.show()
运行该示例计算一系列值的输出,并创建输入与输出的关系图。
我们可以看到一个对角线形状,其中输入相对于相同的输出进行绘制。
线性激活函数的输入与输出图
用于训练输出层中具有线性激活函数的模型的目标值通常在使用标准化或标准化变换建模之前进行缩放。
Sigmoid 输出激活函数
逻辑激活函数的 sigmoid 在前一节中已经描述过了。
然而,为了增加一些对称性,我们可以用下面的例子来检查这个函数的形状。
# example plot for the sigmoid activation function
from math import exp
from matplotlib import pyplot
# sigmoid activation function
def sigmoid(x):
return 1.0 / (1.0 + exp(-x))
# define input data
inputs = [x for x in range(-10, 10)]
# calculate outputs
outputs = [sigmoid(x) for x in inputs]
# plot inputs vs outputs
pyplot.plot(inputs, outputs)
pyplot.show()
运行该示例计算一系列值的输出,并创建输入与输出的关系图。
我们可以看到熟悉的 S 形的 Sigmoid 激活函数。
Sigmoid 激活函数的输入与输出图。
用于训练输出层中具有 sigmoid 激活函数的模型的目标标签将具有值 0 或 1。
软最大输出激活函数
softmax 函数输出一个总和为 1.0 的值向量,该向量可以解释为类成员的概率。
它与 argmax 功能相关,该功能为所有选项输出 0,为所选选项输出 1。Softmax 是 argmax 的“更软的版本,允许赢家通吃功能的概率输出。
因此,该函数的输入是一个实值向量,输出是一个长度相同的向量,其值的和为 1.0,类似于概率。
softmax 函数计算如下:
- e^x / sum(e^x)
其中 x 是输出向量, e 是数学常数,是自然对数的底数。
您可以在本教程中了解更多关于 Softmax 功能的详细信息:
我们无法绘制 softmax 函数,但我们可以用 Python 给出一个计算它的例子。
from numpy import exp
# softmax activation function
def softmax(x):
return exp(x) / exp(x).sum()
# define input data
inputs = [1.0, 3.0, 2.0]
# calculate outputs
outputs = softmax(inputs)
# report the probabilities
print(outputs)
# report the sum of the probabilities
print(outputs.sum())
运行该示例计算输入向量的 softmax 输出。
然后,我们确认 softmax 输出的总和确实等于值 1.0。
[0.09003057 0.66524096 0.24472847]
1.0
用于在输出层使用 softmax 激活函数训练模型的目标标签将是向量,目标类为 1,所有其他类为 0。
如何选择输出激活函数
您必须根据正在解决的预测问题的类型为输出图层选择激活函数。
具体来说,被预测的变量的类型。
例如,您可以将预测问题分为两大类,预测类别变量(分类)和预测数值变量(回归)。
如果你的问题是一个回归问题,你应该使用线性激活函数。
- 回归:一个节点,线性激活。
如果你的问题是分类问题,那么有三种主要的分类问题,每一种都可能使用不同的激活函数。
预测概率不是回归问题;这是分类。在所有分类情况下,您的模型将预测类成员的概率(例如,一个示例属于每个类的概率),您可以通过舍入(对于 sigmoid)或 argmax(对于 softmax)将其转换为清晰的类标签。
如果有两个互斥的类(二进制分类),那么您的输出层将有一个节点,应该使用 sigmoid 激活函数。如果有两个以上互斥的类(多类分类),那么你的输出层每个类有一个节点,应该使用 softmax 激活。如果有两个或更多相互包含的类(multilabel 分类),那么输出层将为每个类提供一个节点,并使用 sigmoid 激活函数。
- 二元分类:一个节点,Sigmoid 激活。
- 多类分类:每类一个节点,softmax 激活。
- 多标签分类:每类一个节点,Sigmoid 激活。
下图总结了如何为神经网络模型的输出层选择激活函数。
如何选择输出层激活函数
进一步阅读
如果您想更深入地了解这个主题,本节将提供更多资源。
教程
书
- 深度学习,2016 年。
- 神经锻造:前馈人工神经网络中的监督学习,1999。
- 用于模式识别的神经网络,1996。
- 用 Python 深度学习,2017。
文章
摘要
在本教程中,您发现了如何为神经网络模型选择激活函数。
具体来说,您了解到:
- 激活函数是神经网络设计的关键部分。
- 隐藏层的现代默认激活函数是 ReLU 功能。
- 输出层的激活函数取决于预测问题的类型。
你有什么问题吗? 在下面的评论中提问,我会尽力回答。
10 个用于 Amazon Web Services 深度学习的命令行秘籍
原文:
machinelearningmastery.com/command-line-recipes-deep-learning-amazon-web-services/
在 Amazon Web Services EC2 上运行大型深度学习流程是学习和开发模型的一种廉价而有效的方法。
只需几美元,您就可以访问数十 GB 的 RAM,数十个 CPU 内核和多个 GPU。我强烈推荐它。
如果您不熟悉 EC2 或 Linux 命令行,那么在云中运行深度学习脚本时,您会发现有一组指令非常有用。
在本教程中,您将了解我每次使用 EC2 来适应大型深度学习模型时使用的 10 个命令的私有列表。
阅读这篇文章后,你会知道:
- 如何将数据复制到 EC2 实例和从 EC2 实例复制数据。
- 如何将脚本设置为安全地运行数天,数周或数月。
- 如何监控进程,系统和 GPU 表现。
让我们开始吧。
注意:在工作站执行的所有命令都假定您运行的是 Linux 类型的环境(例如 Linux,OS X 或 cygwin)。
你有在 EC2 上运行模型的任何其他提示,技巧或喜欢的命令吗? 请在下面的评论中告诉我。
10 亚马逊网络服务深度学习命令行方案 chascar 的照片,保留一些权利。
概观
本文中提供的命令假定您的 AWS EC2 实例已在运行。
为保持一致性,还做了一些其他假设:
- 您的服务器 IP 地址是
54.218.86.47;将其更改为您服务器的 IP 地址。 - 您的用户名是 ec2-user ;将其更改为您的用户名。
- 您的 SSH 密钥位于 〜/ .ssh / 中,文件名为 aws-keypair.pem ;将其更改为 SSH 密钥位置和文件名。
- 您正在使用 Python 脚本。
如果您需要帮助来设置和运行基于 GPU 的 AWS EC2 实例以进行深度学习,请参阅教程:
1.从您的工作站登录到服务器
您必须先登录服务器才能执行任何有用的操作。
您可以使用 SSH 安全 shell 轻松登录。
我建议将 SSH 密钥存储在 〜/ .ssh / 目录中,并使用有用的名称。我使用名称 aws-keypair.pem 。请记住:文件必须具有权限 600。
以下命令将使您登录到服务器实例。请记住将用户名和 IP 地址更改为您的用户名和服务器实例 IP 地址。
ssh -i ~/.ssh/aws-keypair.pem ec2-user@54.218.86.47
2.将文件从工作站复制到服务器
使用安全副本(scp)将文件从工作站复制到服务器。
以下示例在您的工作站上运行,将工作站本地目录中的script.pyPython 脚本复制到您的服务器中。
scp -i ~/.ssh/aws-keypair.pem script.py ec2-user@54.218.86.47:~/
3.在服务器将脚本作为后台进程运行
您可以将 Python 脚本作为后台进程运行。
此外,您可以以这样的方式运行它,它将忽略来自其他进程的信号,忽略任何标准输入(stdin),并将所有输出和错误转发到日志文件。
根据我的经验,所有这些都是长期运行脚本以适应大型深度学习模型所必需的。
nohup python /home/ec2-user/script.py >/home/ec2-user/script.py.log </dev/null 2>&1 &
这基于假设您正在运行位于 / home / ec2-user / 目录中的script.pyPython 脚本,并且您希望将此脚本的输出转发到文件script.py.log位于同一目录中。
调整你的需求。
如果这是你第一次体验 nohup,你可以在这里了解更多:
- 维基百科上的 nohup
如果这是您第一次重定向标准输入(stdin),标准输出(标准输出)和标准错误(sterr),您可以在此处了解更多信息:
- 维基百科上的重定向
4.在服务器上的特定 GPU 上运行脚本
如果您的 AWS EC2 实例可以针对您的问题处理它,我建议您同时运行多个脚本。
例如,您选择的 EC2 实例可能有 4 个 GPU,您可以选择在每个实例上运行一个脚本。
使用 CUDA,您可以指定要与环境变量CUDA_VISIBLE_DEVICES一起使用的 GPU 设备。
我们可以使用上面相同的命令来运行脚本并指定要使用的特定 GPU 设备,如下所示:
CUDA_VISIBLE_DEVICES=0 nohup python /home/ec2-user/script.py >/home/ec2-user/script.py.log </dev/null 2>&1 &
如果您的实例上有 4 个 GPU 设备,则可以将 CUDA_VISIBLE_DEVICES = 0 设定为 CUDA_VISIBLE_DEVICES = 3。
我希望这可以用于 Theano 后端,但我只测试了用于 Keras 的 TensorFlow 后端。
您可以在帖子中了解有关CUDA_VISIBLE_DEVICES的更多信息:
5.监视服务器上的脚本输出
您可以在脚本运行时监视脚本的输出。
如果您在每个训练周期结束后或每个算法运行后输出分数,这可能很有用。
此示例将列出脚本日志文件的最后几行,并在脚本中添加新行后更新输出。
tail -f script.py.log
如果屏幕暂时没有获得新输出,亚马逊可能会积极关闭您的终端。
另一种方法是使用 watch 命令。我发现使用这个命令时亚马逊将保持终端打开:
watch "tail script.py.log"
我发现 python 脚本的标准输出(粗壮)似乎没有经常更新。
我不知道这是 EC2 还是 Python 的东西。这意味着您可能无法经常看到更新日志中的输出。当缓冲区达到固定大小或运行结束时,它似乎被缓冲并输出。
你对此有更多了解吗? 请在下面的评论中告诉我。
6.监视服务器上的系统和进程表现
监控 EC2 系统表现是个好主意。特别是监控你正在使用和剩下的 RAM 量。
您可以使用将每隔几秒更新一次的 top 命令来执行此操作。
top -M
如果您知道其进程标识符(PID),还可以监视系统和进程。
top -p PID -M
7.监控服务器上的 GPU 表现
密切关注 GPU 表现是一个好主意。
如果您计划并行运行多个脚本并使用 GPU RAM,再次强调请关注运行 GPU 的 GPU 利用率。
您可以使用 nvidia-smi 命令来关注 GPU 的使用情况。我喜欢使用watch命令来保持终端打开并为每个新结果清屏。
watch "nvidia-smi"
8.检查服务器上仍在运行哪些脚本
密切关注哪些脚本仍在运行也很重要。
您可以使用ps命令执行此操作。
同样,我喜欢使用 watch 命令来保持终端打开。
watch "ps -ef | grep python"
9.编辑服务器上的文件
我建议不要在服务器上编辑文件,除非你真的需要。
不过,您可以使用vi编辑器编辑文件。
下面的示例将在 vi 中打开您的脚本。
vi ~/script.py
当然,您可以使用自己喜欢的命令行编辑器,如 emacs;如果您是 Unix 命令行的新手,本说明非常适合您。
如果这是您第一次接触 vi,您可以在此处了解更多信息:
- 维基百科上的 vi
10.从您的工作站下载服务器中的文件
我建议将模型以及任何结果和图表明确保存到新脚本和单独文件中作为脚本的一部分。
您可以使用安全副本(scp)将这些文件从服务器实例下载到工作站。
以下示例从您的工作站运行,并将所有 PNG 文件从您的主目录复制到您的工作站。
scp -i ~/.ssh/aws-keypair.pem ec2-user@54.218.86.47:~/*.png .
其他提示和技巧
本节列出了在 AWS EC2 上进行大量工作时的一些其他提示。
- 一次运行多个脚本。我建议选择具有多个 GPU 并一次运行多个脚本的硬件以充分利用该平台。
- 仅在工作站上编写和编辑脚本。将 EC2 视为伪生产环境,并且只在那里复制脚本和数据才能运行。在您的工作站上进行所有开发并编写代码的小测试,以确保它能按预期工作。
- 将脚本输出显式保存到文件。将结果,图形和模型保存到文件中,以后可以将这些文件下载到工作站进行分析和应用。
- 使用 watch 命令。亚马逊会杀死没有活动的终端会话。您可以使用 watch 命令密切关注事物,该命令可以足够频繁地发送数据以保持终端打开。
- 从工作站运行命令**。上面列出的任何打算在服务器上运行的命令也可以从您的工作站运行,只需要通过在命令前添加“ ssh - i 〜/ .ssh / aws-keypair._ pem ec2-user@54.218.86.47 “并引用您要运行的命令。这对于全天检查流程非常有用。
总结
在本教程中,您了解了我每次使用 GPU 在 AWS EC2 实例上训练大型深度学习模型时使用的 10 个命令。
具体来说,你学到了:
- 如何将数据复制到 EC2 实例和从 EC2 实例复制数据。
- 如何将脚本设置为安全地运行数天,数周或数月。
- 如何监控进程,系统和 GPU 表现。
你有任何问题吗? 在下面的评论中提出您的问题,我会尽力回答。
机器学习卷积神经网络的速成课程
原文:
machinelearningmastery.com/crash-course-convolutional-neural-networks/
卷积神经网络是一种强大的人工神经网络技术。
这些网络保留了问题的空间结构,并且是为诸如手写数字识别之类的物体识别任务而开发的。卷积神经网络能够在困难的计算机视觉和自然语言处理任务上取得了最先进的成果,所以很受欢迎。
在这篇文章中,您将了解用于深度学习的卷积神经网络,也称为 ConvNets 或 CNN,通过完成本速成课程后,您将了解:
- CNN 中使用的构建块,例如卷积层和池化层。
- 如何将构建块与一个简短的工作示例结合在一起。
- 在您自己的物体识别任务上配置 CNN 的最佳实践。
- 适用于复杂机器学习问题的最新网络参考。
让我们开始吧。
用于机器学习的卷积神经网络的速成课程 照片由 Bryan Ledgard提供 ,并保留所属权利。
卷积神经网络的案例
给定灰度图像的数据集,其标准化尺寸各为 32×32 像素,传统的前馈神经网络将需要 1024 个输入权重(加上一个偏差)。
这种结构是均匀的,但是像素的图像矩阵扁平化为像素值的长向量会丢失图像中的所有空间结构,除非所有图像都完美地调整大小,否则神经网络将很难解决问题。
卷积神经网络通过使用小方块输入数据学习内部特征表示来期望并保持像素之间的空间关系。在整个图像中学习和使用特征,允许图像中的对象在场景中被移位或平移,并且仍然可以被网络检测到。
这就是为什么网络对于照片中选择具有不同方向的数字,面部,对象等的物体识别,非常有用的原因。
总之,以下是使用卷积神经网络的一些好处:
- 与完全连接的网络相比,它们使用更少的参数(权重)来学习。
- 它们被设计为对场景中的物体位置和失真不变。
- 它们会自动学习并生成输入域中的特征。
卷积神经网络的构建模块
卷积神经网络中有三种类型的层:
- 卷积层。
- 池化层。
- 完全连接层。
1.卷积层
卷积层由滤波器和特征图组成。
过滤器
滤波器是层的“神经元”,具有输入权重并有一个输出值,输入大小是一个固定的方块,称为 patch 或感受野。
感受野((Receptive Field )用来表示网络内部的不同位置的神经元对原图像的感受范围的大小.
如果卷积层是输入层,则 patch 将是像素值,如果卷积层是网络架构中的更深层,则卷积层将从前一层的特征映射中获取输入。
特征图
特征图被应用于上一层的滤波器的输出。
一个给定的滤波器横跨整个前一层网络,一次移动一个像素。每个位置导致神经元的激活,并且输出值被收集在特征图中,您可以看到,如果将感知字段的一个像素从激活移动到另一个激活,则该领域将与之前激活的(领域宽度 - 1)输入值重叠。
零填充
滤波器在每次激活时从前一层的输入移动的距离称为步幅。
如果前一层的大小不能被过滤器接收场的大小和步幅的大小完全整除,那么感收野可能会尝试读取输入特征图的边缘,在这种情况下,可以使用诸如零填充之类的技术来编造用于读取的感受野的模拟输入。
2.池化层
池化层对前一层的特征图进行下采样。
池化层遵循一个或多个卷积层的序列,旨在合并在先前层的特征图中学习和表达的特征,因此,池化层可以被认为是压缩或概括特征表示的技术,并且通常能够减少模型对训练数据的过拟合。
它们也有一个感受野,通常比卷积层小得多。此外,为每次激活移动感受野的输入的步幅或数量通常等于感受野的大小以避免任何重叠。
池化层通常非常简单,取输入值的平均值或最大值以创建自己的特征映射。
关于池化层更多的信息,可以参考以下文章:
3.完全连接层
完全连接层是正常的平坦前馈神经网络层。
这些层可以由非线性激活函数或softmax激活,以便输出对分类预测的概率。
在卷积层和池化层执行特征提取和合并之后,在网络末端使用完全连接层,用于创建最终的非线性特征组合,并且通过网络做出预测。
卷积神经网络的工作实例
您现在知道卷积层,池化层和完全连接层,现在,我们可以通过研究如何更加具体的将这三个层连接在一起
1.图像输入数据
假设我们有一个灰度图像的数据集,每个图像具有 32 像素宽和 32 像素高的相同尺寸,并且像素值在 0 到 255 之间,例如,一个 32x32x1 或 1024 像素值的矩阵。
图像输入数据表示为宽度高度通道的三维矩阵,如果我们在我们的示例中使用彩色图像,我们将有 3 个通道用于红色,绿色和蓝色像素值,例如 32x32x3。
2.卷积层
我们定义了一个卷积层,其中包含 10 个滤波器和一个 5 像素宽,5 像素高,步长为 1 的感受野。
因为每个滤波器一次只能从(即“看”)5×5(25)像素输入,我们可以计算每个滤波器需要 25 + 1 个输入权重(偏置输入加 1)。
在步幅宽度为 1 的情况下在输入图像数据上拖动 5×5 感受野将导致每个图像具有 28×28 个输出值或 784 个不同激活的特征图。
我们有 10 个滤波器,因此将为一个图像创建 10 个不同的 28×28 的特征图或 7480 个输出。
最后,我们知道每个滤波器有 26 个输入,10 个滤波器和 28×28 输出值来计算每个滤波器,因此我们的卷积层总共有 26x10x28x28 或 203,840 个“连接”,我们想用传统的神经元来表达它网络命名法。
卷积层还利用非线性传递函数作为激活的一部分,并且整流器激活函数是常用的默认激活函数。
3.池化层
我们定义了一个具有感受野的池化层,其输入宽度和高度均为 2,我们还使用 2 的步幅来确保没有重叠。
这导致特征图的大小是输入要素图的一半,从 10 个不同的 28×28 特征图作为输入到 10 个不同的 14×14 特征映射作为图。
我们将对每个感知字段使用 max()操作,以便激活是最大输入值。
4.完全连接层
最后,我们可以将方形特征图平坦化为传统的平坦完全连接层。
我们可以用 200 个隐藏的神经元定义完全连接的层,每个神经元具有 10x14x14 输入连接,或者每个神经元具有 1960 + 1 个权重。这一层共有 392,200 个连接和权重。
我们可以使用 sigmoid 或 softmax 传递函数直接输出类值的概率。
卷积神经网络最佳实践
现在我们已经了解了卷积神经网络的构建块以及这些层如何连接在一起,我们可以回顾一下应用它们时要考虑的一些最佳实践。
- 输入感受野维度:图像的默认值为 2D,但可以是 1D,例如句子中的单词或添加时间维度的视频的 3D。
- 感受野的大小:patch 应尽可能小,但应该大到足以“看到”输入数据中的特征,通常在小图像上使用 3×3,在较大图像尺寸上使用 5×5 或 7×7 或更多。
- 步幅宽度:使用默认步幅 1.这很容易理解,并且您不需要填充来处理从图像边缘掉落的感受野。对于较大的图像,这可以增加到 2 或更大。
- 滤波器数量:滤波器是特征检测器,通常在输入层使用较少的滤波器,并且在较深层使用的滤波器越来越多。
- 填充:设置为零并在读取非输入数据时调用零填充。当您不能或不想标准化输入图像大小或想要使用不能整齐划分输入图像大小的感知字段和步幅大小时,这将非常有用。
- 池化:池化是一种破坏性或泛化过程,以减少过拟合,感受野几乎总是设置为 2×2,步幅为 2,以丢弃前一层输出的 75%激活。
- 数据准备:考虑标准化输入数据,包括图像尺寸和像素值。
- 模式架构:通常在网络架构中对层进行模式化。这可能是一个,两个或一些卷积层,后面是池化层。然后可以重复该结构一次或多次。最后,完全连接层通常仅在输出端使用,并且可以堆叠一个,两个或更多个深度。
- dropout:CNN 容易造成一种过拟合,即使是池化层也是如此,应该在完全连接的层之间,或池化层之后使用 Dropout。
您是否了解使用 CNN 的更多最佳做法?请在评论中告诉我。
进一步阅读卷积神经网络
你可能在卷积神经网络上浅尝辄止,该领域正在快速发展,并且一直在讨论和使用新的有趣的架构和技术。
如果您正在寻找对该技术的更深入理解,请查看 LeCun 等, al 的开创性论文题为“基于梯度的学习应用于文档识别”[PDF]。他们将 LeNet 应用于手写数字识别,并仔细解释各层以及网络连接方式。
网络上有很多关于 CNN 的教程和讨论,下面列出了一些供选择的示例,就个人而言,我发现文章中的可解释性的图片只有在理解了网络如何连接之后才有用,许多解释令人困惑,如果有疑问可以在 LeNet 的论文中了解更多信息。
- DeepLearning4J 中的卷积网络
- [斯坦福 CS231n 课程中的卷积网络模型](cs231n.github.io/convolution… cs231n.github.io/)
- 卷积网络与视觉应用 [PDF]
- Michael Nielsen 开放式深度学习书第六章
- 来自于牛津实践的 VGG 卷积神经网络
- 了解 Denny Britz 对 NLP 的卷积神经网络的理解
摘要
在这篇文章中,您学习卷积神经网络,你学习了:
- 为什么需要 CNN 来保留输入数据中的空间结构及其优点。
- CNN 的构建块包括卷积,池化和完全连接层。
- CNN 中的层如何连接在一起。
- 将 CNN 应用于您自己的问题时的最佳做法。
你对卷积神经网络或这篇文章有任何疑问吗?在评论中提出您的问题,我会尽力回答。
如何在 Python 和 Keras 中对深度学习使用度量
原文:
machinelearningmastery.com/custom-metrics-deep-learning-keras-python/
Keras 库提供了一种在训练深度学习模型时的计算方法和报告一系列标准指标的方法。
除了为分类和回归问题提供标准指标外,Keras 还允许您在训练深度学习模型时定义和报告您自己的自定义指标。当您想要在训练期间更好地获取模型函数的表现度量时,这将特别有用。
在本教程中,您将了解如何使用内置指标以及如何在 Keras 中训练深度学习模型时定义和使用您自己的指标。
完成本教程后,您将了解:
- Keras 指标的工作原理以及在训练模型时如何使用它们。
- 通过实例了解如何使用 Keras 中的回归和分类指标。
- 通过实例如何在 Keras 中定义和使用您自己的自定义指标。
让我们开始吧。
度量标准以及如何在 Python 中使用 Keras 进行深度学习的自定义度量标准 Indi Samarajiva 的照片,保留一些权利。
教程概述
本教程分为 4 个部分;他们是:
- Keras 指标
- Keras 回归指标
- Keras 分类指标
- Keras 的自定义指标
Keras 指标
Keras 允许您列出在模型训练期间要监控的指标。
您可以通过指定“metrics”参数并为模型上的compile()函数提供函数名称列表(或函数名称别名)来完成此操作。
例如:
model.compile(..., metrics=['mse'])
您列出的特定指标可以是 Keras 函数的名称(如mean_squared_error)或这些函数的字符串别名(如'mse')。
度量值记录在训练数据集的每个迭代的末尾。如果还提供了验证数据集,则还会记录为验证数据集计算的度量指标。
所有度量都以详细输出和从调用fit()函数返回的历史对象中报告。在这两种情况下,度量函数的名称都用作度量值的键。对于验证数据集的度量标准,将“val_”前缀添加到密钥。
损失函数和明确定义的 Keras 指标都可用作训练指标。
Keras 回归指标
以下是您可以在 Keras 中用于回归问题的指标列表。
- 均方差:mean_squared_error,MSE 或 mse
- 平均绝对误差:mean_absolute_error,MAE,mae
- 均匀绝对百分比误差:mean_absolute_percentage_error,MAPE,mape
- 余弦近似 :cosine_proximity,cosine
下面的示例演示了一个简单的人为回归问题中的 4 个内置回归指标。
from numpy import array
from keras.models import Sequential
from keras.layers import Dense
from matplotlib import pyplot
# prepare sequence
X = array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0])
# create model
model = Sequential()
model.add(Dense(2, input_dim=1))
model.add(Dense(1))
model.compile(loss='mse', optimizer='adam', metrics=['mse', 'mae', 'mape', 'cosine'])
# train model
history = model.fit(X, X, epochs=500, batch_size=len(X), verbose=2)
# plot metrics
pyplot.plot(history.history['mean_squared_error'])
pyplot.plot(history.history['mean_absolute_error'])
pyplot.plot(history.history['mean_absolute_percentage_error'])
pyplot.plot(history.history['cosine_proximity'])
pyplot.show()
运行该示例将在每次迭代结束后打印度量标准值。
...
Epoch 96/100
0s - loss: 1.0596e-04 - mean_squared_error: 1.0596e-04 - mean_absolute_error: 0.0088 - mean_absolute_percentage_error: 3.5611 - cosine_proximity: -1.0000e+00
Epoch 97/100
0s - loss: 1.0354e-04 - mean_squared_error: 1.0354e-04 - mean_absolute_error: 0.0087 - mean_absolute_percentage_error: 3.5178 - cosine_proximity: -1.0000e+00
Epoch 98/100
0s - loss: 1.0116e-04 - mean_squared_error: 1.0116e-04 - mean_absolute_error: 0.0086 - mean_absolute_percentage_error: 3.4738 - cosine_proximity: -1.0000e+00
Epoch 99/100
0s - loss: 9.8820e-05 - mean_squared_error: 9.8820e-05 - mean_absolute_error: 0.0085 - mean_absolute_percentage_error: 3.4294 - cosine_proximity: -1.0000e+00
Epoch 100/100
0s - loss: 9.6515e-05 - mean_squared_error: 9.6515e-05 - mean_absolute_error: 0.0084 - mean_absolute_percentage_error: 3.3847 - cosine_proximity: -1.0000e+00
然后创建训练时期上的 4 个度量的线图。
用于回归的内置 Keras 度量的线图
注意,使用字符串别名值指定度量['mse','mae','mape','cosine' ]并使用其扩展函数名称作为历史对象上的键值引用。
我们还可以使用其扩展名称指定指标,如下所示:
model.compile(loss='mse', optimizer='adam', metrics=['mean_squared_error', 'mean_absolute_error', 'mean_absolute_percentage_error', 'cosine_proximity'])
如果将函数名称导入脚本,我们也可以直接指定它们。
from keras import metrics
model.compile(loss='mse', optimizer='adam', metrics=[metrics.mean_squared_error, metrics.mean_absolute_error, metrics.mean_absolute_percentage_error, metrics.cosine_proximity])
您还可以将损失函数用作指标。
例如,您可以使用均方对数误差(mean_squared_logarithmic_error,MSLE或msle)损失函数作为度量,如下所示:
model.compile(loss='mse', optimizer='adam', metrics=['msle'])
Keras 分类指标
以下是您可以在 Keras 中用于分类问题的指标列表。
- 二进制准确度:binary_accuracy,acc
- 分类准确度:categorical_accuracy,acc
- 稀疏分类准确度:sparse_categorical_accuracy
- 前 k 个分类准确度:top_k_categorical_accuracy(要求你指定一个 k 参数)
- 稀疏顶部 k 分类精度:sparse_top_k_categorical_accuracy(需要指定 k 参数)
准确度是具体的数值。
无论您的问题是二分类还是多分类问题,您都可以指定'acc'指标来报告准确率。
下面是一个使用了内置的精度指标的二分类问题的示例。
from numpy import array
from keras.models import Sequential
from keras.layers import Dense
from matplotlib import pyplot
# prepare sequence
X = array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0])
y = array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1])
# create model
model = Sequential()
model.add(Dense(2, input_dim=1))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['acc'])
# train model
history = model.fit(X, y, epochs=400, batch_size=len(X), verbose=2)
# plot metrics
pyplot.plot(history.history['acc'])
pyplot.show()
运行该示例,在每个训练时期结束时输出了准确率。
...
Epoch 396/400
0s - loss: 0.5934 - acc: 0.9000
Epoch 397/400
0s - loss: 0.5932 - acc: 0.9000
Epoch 398/400
0s - loss: 0.5930 - acc: 0.9000
Epoch 399/400
0s - loss: 0.5927 - acc: 0.9000
Epoch 400/400
0s - loss: 0.5925 - acc: 0.9000
创建每次迭代结束后的精确度线图。
用于分类的内置 Keras 度量的线图
Keras 的自定义指标
您还可以定义自己的度量标准,并在调用compile()函数时在“metrics”参数的函数列表中指定函数名称。
我经常想要跟踪的度量是均方根误差或 RMSE。
您可以通过检查现有指标的代码来了解如何编写自定义指标。
例如,下面是 Keras 中 mean_squared_error 损失函数和度量的代码。
def mean_squared_error(y_true, y_pred):
return K.mean(K.square(y_pred - y_true), axis=-1)
K 是 Keras 使用的后端。
该示例和损失函数和度量的其他示例中的方法是在后端使用标准数学函数来计算想要的度量。
例如,我们可以编写自定义指标来计算 RMSE,如下所示:
from keras import backend
def rmse(y_true, y_pred):
return backend.sqrt(backend.mean(backend.square(y_pred - y_true), axis=-1))
您可以发现该函数与 MSE 的代码相同,只是添加了sqrt()包装结果。
我们可以在我们的回归示例中对此进行如下测试。请注意,我们只是直接列出函数名称,而不是将其作为 Keras 要解析的字符串或别名提供。
from numpy import array
from keras.models import Sequential
from keras.layers import Dense
from matplotlib import pyplot
from keras import backend
def rmse(y_true, y_pred):
return backend.sqrt(backend.mean(backend.square(y_pred - y_true), axis=-1))
# prepare sequence
X = array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0])
# create model
model = Sequential()
model.add(Dense(2, input_dim=1, activation='relu'))
model.add(Dense(1))
model.compile(loss='mse', optimizer='adam', metrics=[rmse])
# train model
history = model.fit(X, X, epochs=500, batch_size=len(X), verbose=2)
# plot metrics
pyplot.plot(history.history['rmse'])
pyplot.show()
运行该示例,在每个训练时期结束后返回自定义 RMSE 度量指标。
...
Epoch 496/500
0s - loss: 1.2992e-06 - rmse: 9.7909e-04
Epoch 497/500
0s - loss: 1.2681e-06 - rmse: 9.6731e-04
Epoch 498/500
0s - loss: 1.2377e-06 - rmse: 9.5562e-04
Epoch 499/500
0s - loss: 1.2079e-06 - rmse: 9.4403e-04
Epoch 500/500
0s - loss: 1.1788e-06 - rmse: 9.3261e-04
在运行结束时,将创建自定义 RMSE 度量标准的折线图。
用于回归的自定义 RMSE Keras 度量的线图
您的自定义度量函数必须在 Keras 内部数据结构上运行,根据所使用的后端可能会有所不同(例如使用 tensorflow 时tensorflow.python.framework.ops.Tensor)而不是直接使用 原始 yhat 和 y 值。
出于这个原因,我建议尽可能使用后端数学函数来保持一致性和执行速度。
进一步阅读
如果您要深入了解,本节将提供有关该主题的更多资源。
总结
在本教程中,您了解了在训练深度学习模型时如何使用 Keras 指标。
具体来说,你学到了:
- Keras 指标的工作原理以及如何配置模型以在训练期间报告指标。
- 如何使用 Keras 内置的分类和回归指标。
- 如何在训练深度学习模型的同时有效地定义和返回自己的自定义指标。
你有任何问题吗? 在下面的评论中提出您的问题,我会尽力回答。
深度学习书籍
目前关于深度学习的书籍并不多,因为它是一个较新的学习领域。
虽然有一些书籍可供使用,还有一些非常有趣未出版的书籍可以提前体验购买到。
在这篇文章中,您将了解到现在可用于深度学习的书籍。
让我们开始吧。
深度学习书籍(我希望) 摄影: Indi Samarajiva ,保留一些权利。
深度学习教科书
有一本深入学习的教科书已经出版了几年,简称深度学习。
它由顶级深度学习科学家 Ian Goodfellow , Yoshua Bengio 和 Aaron Courville 撰写,包括该领域所有主要算法和一些练习。
我认为它应该是该领域的重点阅读材料,主要是因为他们免费开源(很像统计学习要素是机器学习中必读的)。
书的内容很多已经完成,我强烈建议阅读它以获得深度学习算法的背景理论。
目前的目录如下:
- 第一部分:应用数学和机器学习基础
- 线性代数
- 概率论与信息论
- 数值计算
- 机器学习基础
- 第二部分:现代实用的深度网络
- 深度前馈网络
- 正则
- 深度模型训练的优化
- 卷积网络
- 序列建模:循环网络和递归网络
- 实用方法论
- 应用
- 第三部分:深度学习研究
- 线性因子模型
- 自编码
- 表征学习
- 深度学习的结构化概率模型
- 蒙特卡罗方法
- 对抗配分函数
- 近似推论
- 深度生成模型
来自 O'Reilly 的深度学习书籍
目前有两本来自 O'Reilly 的书正在筹备中,这让我很兴奋:
深度学习:从业者的方法
这是由 DeepLearning4J 的两个创作者编写的应用书: Adam Gibson 和 Josh Patterson 。 DeepLearning4J (或 DL4J)是 Java 应用程序的深度学习框架。
本书是为 Java 开发人员和数据科学家编写的实用书籍,我只能假设它提供了使用 DL4J 框架的示例。
这本书将于 2016 年 5 月出版,目前没有我能找到的目录。
深度学习的基础知识:设计下一代机器智能算法
这是 Nikhil Buduma 编写的另一本 Python 应用书。它涵盖了深度学习概念和示例。您可以提前阅读本书,撰写本文时共有 5 章。
本书目前的工作目录如下:
- 神经网络
- 训练前馈神经网络
- 在 TensorFlow 中实现神经网络
- 超越梯度下降
- 卷积神经网络:
- 嵌入和表示学习
- 序列分析的深度学习模型
- 记忆增强的深度学习模型
- 生成性深度学习模型
- 深度强化学习
- 面向一般无监督学习
- 训练极深度神经网络
我很高兴能得到这本书。
Packt Publishing 的深度学习
Packet 2016 年 5 月出版了一本书,由 Yusuke Sugomori 撰写,题为深度学习与 Java 。它适合于 Java 开发人员和数据科学家,并将使用 DeepLearning4J 框架提供示例。
似乎没有可用于本书的目录,但我相信你可以尽早获得它。
C ++和 CUDA C 中的深信仰网
Timothy Masters 多年来撰写了许多关于人工神经网络的书籍。 2015 年,他用 C ++和 CUDA 写了两本关于 Deep Belief Networks 的书。
这些书提供了示例,主要关注他的软件 DEEP。您可以在网页上了解有关其软件的更多信息。
这两本书是:
本书的目录是:
- 监督前馈网络
- 受限制的玻尔兹曼机器
- 贪心训练
- DEEP 操作手册
Deep Belief Nets in C++ and CUDA C: Volume II: Autoencoding in the Complex Domain
本书的目录是:
- 嵌入式类标签
- 信号预处理
- 图像预处理
- Autoencoding
- DEEP 操作手册
人工智能
Jeff Heaton 是一本关于人工智能的三本书系列的研究员和作者:
该系列的第三本书涵盖了人工神经网络,并有一些关于深度学习技术的章节。
目录如下:
- 神经网络基础知识
- 自组织映射
- Hopfield 和 Boltzmann 机器
- 前馈神经网络
- 训练和评估
- 反向传播训练
- 其他传播训练
- NEAT,CPNN 和 HyperNEAT
- 深度学习
- 卷积神经网络
- 修剪和模型选择
- dropout 和正规化
- 时间序列和循环网络
- 构建神经网络
- 可视化
- 用神经网络建模
一般来说,杰夫是一个很好的交流对象,他的书得到了社区的关注,因为他在创作过程中使用了 KickStarter 。如果你正在寻找神经网络的介绍并发现深度学习适合的地方,他书籍系列的第三部分会是很好的阅读材料。
R 的深度学习
N. D. Lewis 有一系列关于统计学和机器学习的书籍,包括有关神经网络的书籍。 2016 年初,他发表了一本关于深度学习的书,名为:深度学习轻松学习 R:数据科学的温和介绍。 。
目录如下:
- 深度神经网络
- Elman 神经网络
- Jordan 神经网络
- 自编码器的秘密
- 坚果壳中的堆叠自编码器
- 受限制的玻尔兹曼机器
- 深度信念网络
更新:更多书籍
本节列出了撰写本文后已发布(或预计将发布)的附加书籍。
- 神经网络与深度学习
- Grokking 深度学习
- 使用 TensorFlow 进行机器学习
- TensorFlow 机器学习手册
- TensorFlow 入门
- Scikit-Learn 和 TensorFlow 实践机器学习:构建智能系统的概念,工具和技术
摘要
在这篇文章中,您将发现现在可用于深度学习的书籍。
您是否购买或阅读过其中一本书?发表评论,让我知道你对它的看法。
还有更多关于深度学习的书籍,你知道它们已经或已经在这里吗?请在评论中告诉我。
深度学习能力的三个层次
最后更新于 2019 年 8 月 19 日
深度学习并非灵丹妙药,但该技术已在大量极具挑战性的问题领域显示出高效性。
这意味着企业对有效的深度学习实践者有着巨大的需求。
问题是,一般的企业如何区分好的和坏的从业者?
作为深度学习的实践者,你如何最好地证明你能提供熟练的深度学习模型?
在这篇文章中,你将发现深度学习能力的三个层次,作为一名实践者,你必须在每个层次上展示什么。
看完这篇文章,你会知道:
- 评估深度学习能力的问题最好通过项目组合来解决。
- 三个能力等级的层次结构可用于对从业者进行分类,并为识别预期技能提供框架。
- 初学者最常犯的错误是从第 3 级开始,这意味着他们试图同时学习所有级别,导致混乱和沮丧。
用我的新书用 Python 深度学习来启动你的项目,包括分步教程和所有示例的 Python 源代码文件。
我们开始吧。
深度学习能力的三个层次 图片由贝恩德·塔勒提供,版权所有。
概观
本文分为三个部分;它们是:
- 能力评估问题
- 开发深度学习作品集
- 深度学习能力的水平
能力评估问题
你如何知道一个从业者是否有能力进行深度学习?
这是一个难题。
- 一个学者可能能够很好地用数学方法描述技术,并提供一份论文清单。
- 开发人员也可能能够使用直观的解释和一系列 API 很好地描述技术。
两者都是理解的好迹象。
但是,在真正的商业项目中,我们不需要解释。
我们需要能做出巧妙预测的工作模型。我们需要结果。
结果几乎胜过一切。
当然,结果胜过教育背景、工作经历和经验水平等典型的能力信号。
大多数开发人员和开发人员招聘经理都已经知道这一点。
有些没有。
开发深度学习作品集
回答一个从业者是否胜任的问题,最好的方法是展示,而不是讲述。
从业者必须提供证据来证明他们理解如何应用深度学习技术,并使用它们来开发熟练的模型。
这意味着使用开源库和公开可用的数据集开发一个公共项目组合。
这有很多好处,原因如下:
- 可以呈现出巧妙的模型。
- 代码可以查看。
- 设计决策是可以辩护的。
对真实项目的诚实讨论将很快揭示从业者是否知道他们在做什么。
- 为了评估能力,雇主必须要求并关注已完成的工作组合。
- 深度学习实践者必须开发和维护已完成项目的组合,以展示能力。
作为一个从业者,问题变成了:能力的层次是什么,每个层次的期望是什么?
深度学习能力的水平
可以仔细选择项目,以便发展和展示特定的技能。
在本节中,我们将概述深度学习能力的水平,以及作为实践者,您可以开发和实施的项目类型,以便学习、获得和展示每一个能力水平。
深度学习能力有三个层次;它们是:
- 一级:建模
- 2 级:调谐
- 第三级:应用
这可能不完整,但为商业环境中的从业者提供了一个良好的起点。
关于此层次结构的一些注意事项:
- 这些水平假设你已经是一个机器学习实践者,可能不是从零开始。
- 并非所有的企业都需要或能够充分利用三级从业者。
- 许多练习者在第 3 级开始练习,并试图在运行中找出第 1 级和第 2 级。
- 第二级经常被忽视,但我认为这对于展示更深层次的理解至关重要。
其他级别可能会捕获未讨论的主题,例如从头开始编码算法、处理大数据或流数据、GPU 编程、开发新方法等。
如果你对能力水平或项目有更多的想法,请在下面的评论中告诉我。
现在,让我们依次仔细看看每个级别。
第一级:建模
这种深度学习的能力水平假设你已经是一个机器学习的实践者。
这是最低的水平,表明你可以在一个经典的机器学习类型的项目中有效地使用这些工具和方法。
这并不意味着你被期望拥有高级学位或你是一个大师级的从业者。相反,这意味着您熟悉应用机器学习的基础知识和端到端预测建模项目的工作过程。
这不是一个严格的先决条件,因为如果需要,这些元素可以在这个级别快速学习。
这一级别的能力证明了以下几点:
- 图书馆能力:说明你知道如何使用开源深度学习图书馆开发模型。
- 建模能力:说明你知道如何将应用的机器学习过程应用到神经网络模型中。
图书馆能力
库能力意味着你知道如何设置开发环境和使用应用编程接口最常见的方面,以便定义、拟合和使用神经网络模型进行预测。
这也意味着你知道每种类型的神经网络模型之间的基本区别,以及什么时候使用它是合适的。
这并不意味着你知道每个函数调用和每个参数。这也不意味着你知道具体技术的数学描述。
建模能力
建模能力意味着你知道如何使用神经网络模型端到端地完成机器学习项目。
具体来说,这意味着您能够完成以下任务:
- 定义监督学习问题并收集相关数据。
- 准备数据,包括特征选择、输入缺失值、缩放和其他转换。
- 使用客观的测试工具评估一套模型和模型配置。
- 选择和准备最终模型,并使用它对新数据进行预测。
这意味着在开发和使用一个熟练的模型时,你可以在新项目中有效地利用神经网络。
这并不意味着你是使用所有或甚至一些神经网络技术的专家,也不意味着你可以获得最好的结果。这也不意味着您熟悉所有数据类型。
项目
展示这种能力水平的项目应该使用开源深度学习库(如 Keras),并在公共表格机器学习数据集上展示应用机器学习过程的每个步骤。
这并不意味着获得数据集的最佳可能结果,甚至不意味着使用神经网络是数据集的最佳可能模型。相反,目标是展示使用神经网络的能力,很可能是更简单的模型类型,如多层感知机。
数据集的一个很好的来源是在 20 世纪 90 年代和 21 世纪广泛用于展示机器学习甚至神经网络表现的内存中的小数据集,例如在 UCI 机器学习资源库上列出的那些数据集。
事实上,数据集很小,很容易放入内存,这意味着项目的范围也很小,允许使用稳健的模型评估方案,如 k 倍交叉验证,并可能需要仔细的模型设计,以避免过度拟合。
我希望有一系列项目能够处理标准预测建模项目的正常问题,例如:
不同的输入数据,以证明适合神经网络的数据准备:
- 输入相同比例的变量。
- 不同尺度的输入变量。
- 数字和类别变量的混合。
- 缺少值的变量。
- 具有冗余输入特征的数据。
各种目标变量,以展示合适的模型配置:
- 二元分类任务。
- 多类分类任务。
- 回归任务。
级别 2:调整
这种能力水平假定为 1 级能力,并表明您可以使用经典和现代技术,以便从深度学习神经网络模型中获得最大收益。
它演示了以下内容:
- 学习能力。你可以改进神经网络模型的训练过程。
- 概括能力。可以减少训练数据的过拟合,减少样本外数据的泛化误差。
- 预测能力。你可以减少最终模型预测的差异,提升模型技能。
学习能力
学习能力意味着你知道如何配置和调整学习算法的超参数,以便获得良好或更好的表现。
这意味着调整随机梯度下降的超参数的技能,例如:
- 批量。
- 学习率。
- 学习进度计划
- 适应性学习率。
这意味着调整影响模型能力的方面的技能,例如:
- 车型选择。
- 激活函数的选择。
- 节点数。
- 层数。
这意味着解决学习问题的技能,例如:
- 消失渐变。
- 爆炸梯度。
这也意味着用技巧来加速学习,例如:
- 批量标准化。
- 分层训练。
- 转移学习。
概括能力
泛化能力意味着您知道如何配置和调整模型,以减少过度拟合并提高样本外数据的模型表现。
这包括经典技术,例如:
- 权重正则化。
- 增加噪音。
- 提前停止。
这也包括现代技术,例如:
- 体重限制。
- 活动正规化。
- 辍学。
预测能力
预测能力意味着你知道如何在进行预测时使用技术来减少所选模型的方差,并组合模型以提高表现。
这意味着使用合奏技术,例如:
- 模型平均。
- 堆叠合奏。
- 重量平均。
项目
展示这种能力水平的项目可能不太关注应用机器学习过程中的所有步骤,而是可能关注特定的问题和技术或旨在缓解该问题的一系列技术。
对于这三个职能领域,可以是:
- 模型学习不良或缓慢的问题。
- 训练数据集的过拟合问题。
- 高方差预测问题。
同样,这并不意味着在某个特定问题上实现最佳表现,只是证明了技术的正确使用及其解决已识别问题的能力。
数据集甚至问题类型的选择可能不如正在调查的问题的明确表现重要。
有些数据集自然会带来问题;例如,小的训练数据集和不平衡的数据集会导致过拟合。
可以使用标准的机器学习数据集。或者,可以设计问题来演示问题,或者可以使用数据集生成器。
第三级:应用
这种能力水平假设 1 级和 2 级能力,并表明您可以在专门的问题领域中使用深度学习神经网络技术。
这是超越简单表格数据集的深度学习技术的演示。
这也是对问题域类型和具体问题实例的深度学习的展示,在这些领域中,技术可能表现良好,甚至是最先进的。
它演示了以下内容:
- 数据处理能力。您可以加载和准备特定领域的数据,为神经网络建模做好准备。
- 技术能力。你可以比较和选择合适的特定领域的神经网络模型。
数据处理能力
数据处理能力意味着您可以获取、加载、使用和准备用于建模的数据。
这将很可能证明处理数据的标准库和准备数据的标准技术的能力。
域和数据处理的一些示例可能包括:
- 时间序列预测。将时间序列问题框架化为监督学习问题的代码。
- 计算机视觉。用于加载图像和转换以调整像素大小(也许是标准化像素)的 API。
- 自然语言处理。用于加载文本数据和对字符或单词进行编码的转换的 API。
技术能力
技术能力意味着您可以正确地识别适合给定领域特定建模问题的技术、模型和模型架构。
这很可能需要熟悉学术文献和/或行业中用于该领域一般类别问题的常用方法。
域和特定于域的方法的一些示例可能包括:
- 时间序列预测。使用序列预测模型,如卷积和递归神经网络模型。
- 计算机视觉。深度卷积神经网络模型的使用和特定结构的使用。
- 自然语言处理。深度递归神经网络模型的使用和特定体系结构的使用。
项目
展示这种能力水平的项目必须涵盖应用的机器学习过程,包括仔细的模型调整(能力水平 1 和 2 的方面),并且必须关注特定领域的数据集。
数据集可能来自:
- 学术界用来演示方法的标准数据集。
- 用于竞争性机器学习网站的数据集。
- 您定义和收集的原始数据集。
可能有大量的问题属于给定的问题领域,尽管可能会有更常见或更突出的子集,这些可能是示范项目的重点。
一些领域和突出子问题的例子可能包括:
- 时间序列预测。单变量、多变量、多步骤和分类。
- 计算机视觉。对象分类、对象定位和对象描述。
- 自然语言处理。文本分类、文本翻译和文本摘要。
可能需要在多个领域展示高水平的能力,并且数据处理、建模技术和技能将会很好地转化。
在解决了最突出的问题和技术之后,可能还需要专攻一个领域,并缩小到关于细微子问题的示范项目。
因为这种类型的项目可能展示了深度学习更广泛的吸引力(例如,超越经典方法的能力),所以直接跳到这个水平是有危险的。
对于有经验的从业者来说,可能对其他机器学习方法有更深的知识和经验,或者对该领域有更深的知识和经验。
然而,这要困难得多,因为你可能不得不学习,而且你必须同时驾驭和展示所有三个水平的能力。
这是初学者最大的错误,他们潜入特定领域的项目,遇到一个又一个障碍,因为他们还不能胜任这个库,完成一个项目的过程,以及提高模型表现的过程,更不用说领域中使用的特定数据处理和建模技术了。
同样,也有可能从这个层面开始;这只会使工作量增加两倍,并可能导致沮丧。
这个能力框架引起共鸣了吗?你认为有洞吗? 评论里告诉我。
进一步阅读
如果您想更深入地了解这个主题,本节将提供更多资源。
邮件
文章
摘要
在这篇文章中,你发现了深度学习能力的三个层次,作为一名实践者,你必须在每个层次上展示什么。
具体来说,您了解到:
- 评估深度学习能力的问题最好通过项目组合来解决。
- 三个能力等级的层次结构可用于对从业者进行分类,并为识别预期技能提供框架
- 初学者最常犯的错误是从第 3 级开始,这意味着他们试图同时学习所有级别,导致混乱和沮丧。
你有什么问题吗? 在下面的评论中提问,我会尽力回答。
深度学习课程
深入学习可能很难开始。
值得庆幸的是,许多大学免费开设了深度学习的课程,当您希望更好地理解深度学习的基础时,这可能是一个很好的起点。
在这篇文章中,您将了解关于深度学习的课程,您可以浏览和学习,以发展和巩固您对该领域的理解。
这是一篇很长的文章,可以深入链接到很多视频,你可以收藏,跳转到整个课程的特定目录,而不是选择一门课程并从头至尾完成。
通过我的新书中的几行代码,了解如何为一系列问题的预测性建模并开发深度学习模型,总共包括 18 个分步教程和 9 个项目。
让我们现在开始吧。
概述
我们将快速浏览以下 6 个深度学习课程。
- 牛津深度学习
- 谷歌深度学习 Udacity
- 蒙特利尔深度学习暑期学校
- 斯坦福大学自然语言处理的深度学习
- 斯坦福大学视觉识别的卷积神经网络
- 舍布鲁克大学的神经网络课程
最后还有一个“其他课程”部分,以收集其他视频课程,这些课程并不是免费的,而且是零散的课程,并且适合更为细分的领域,并不完全适合本摘要评审。
课程提示和文章使用指南
有很多课程和很多很棒的免费材料。
我最好的建议是:
不要选择一门课程并通过从头至尾的方式学习。
这与大多数人的建议相反。
你“认真”并且挑选“最好的”课程学习并完成所有的课程材料的冲动会几乎导致你肯定失败。
材料很难,你需要花时间在每个主题上获得不同的观点。
真正进入这一材料的最好方法是逐个主题地学习,并从所有课程中选取相关介绍,直到你真正理解一个主题,然后再进入下一个主题学习。
您无需了解所有主题,也无需使用单一来源来理解单个主题。
将此页面添加为书签,然后在您需要时浏览案例并深入了解您需要的材料,同时学习如何使用 Keras 等平台在代码中实现真正的真实深度学习模型。
牛津深度学习
这是一个机器学习课程,侧重于 Nando de Freitas 在牛津大学教授的深度学习。
我真的很喜欢这门课程,我花费了双倍时间观看了所有视频并做了笔记,它提供了良好的理论基础,涵盖了现代深度学习主题,如 LSTM,代码示例显示在 Torch 中。
我注意到教学大纲与实际可用的视频讲座不同,YouTube 播放列表列出了无序的讲座,因此以下是 2015 年视频讲座的顺序:
- 深度学习讲座 1:简介
- 深度学习讲座 2:线性模型
- 深度学习讲座 3:最大可能性和信息
- 深度学习第 4 讲:正则化,模型复杂性和数据复杂性(第一部分)
- 深度学习第五讲:正则化,模型复杂性和数据复杂性(第二部分)
- 深度学习第六讲:优化
- 深度学习第 7 讲:逻辑回归,Torch 实现
- 深度学习第 8 讲:模块化反向传播,逻辑回归和 Torch
- 深度学习讲座 9:Torch 中的神经网络和模块化设计
- 深度学习讲座 10:卷积神经网络
- 深度学习讲座 11:最大边缘学习,转移和记忆网络
- 深度学习讲座 12:递归神经网络和 LSTM
- 深度学习讲座 13:Alex Graves 关于 RNNs 的设想
- 深度学习第 14 讲:关于变分自编码器和图像生成的 Karol Gregor
- 深度学习讲座 15:深度强化学习 - 政策检索
- 深度学习第 16 讲:强化学习和神经动态规划
对我来说,最重要的课程是 Alex Graves 关于 RNN 的讨论(第 13 讲),这是一个聪明的人做的伟大的工作,我在观看这个视频的时候正在阅读很多亚历克斯的论文,所以我可能会有偏见。
资源
谷歌深度学习 Udacity
这是来自 Udacity 的 Arpan Chakraborty 和 Google 的首席科学家 Vincent Vanhoucke 之间的一个小型课程合作。
该课程是免费的,托管在 Udacity 上,专注于 TensorFlow。它是 Udacity 上托管的机器学习工程师 Nanodegree 的一小部分。
您必须注册 Udacity,但一旦您登录,您就可以免费访问此课程。
所有课程视频都在 YouTube 上,但(有意)很难找到不良的命名和链接,如果有人知道所有视频的盗版播放列表,请在评论中发布。
该课程分为 4 课:
- 第 1 课:从机器学习到深度学习
- 第 2 课:深度神经网络
- 第 3 课:卷积神经网络
- 第 4 课:文本和序列的深层模型
该课程很短,但分为许多短视频并且 Udacity 的界面友好, Vincent 似乎出现在我看过的所有视频中(这很棒),视频也显示在 YouTube 界面中。
还有一个讨论表格,您可以通过流畅的对话软件来提问和回答问题。
我倾向于深入了解我感兴趣的视频,而不是完成整个课程或完成任何课程作业。
资源
蒙特利尔深度学习暑期学校
2015 年在蒙特利尔大学举办了深度学习暑期学校。
根据该网站,暑期学校的目标是研究生和工业工程师以及已经掌握机器学习基础知识的研究人员。
在从入门材料到最新研究的一系列主题的深度学习领域,至少有著名研究人员的 30 场演讲(有 30 个视频)。
蒙特利尔深度学习暑期学校
这些视频是真正的宝库,花点时间仔细挑选您的主题。所有视频都在 VideoLectures.net 网站上托管,该网站具有足够好的界面,但不如 YouTube 干净。
许多(所有?)谈话都在视频下方提供了 PDF 幻灯片的下载链接,更多信息可从官方网站的日程页面获得。
以下是讲座主题的完整列表,其中包含视频链接。我试图将相关视频列在一起(例如,第一部分,第二部分)。
- 机器学习简介
- 深度学习:理论动机
- 多层神经网络
- 训练深度神经网络
- 多层神经网络
- 深度学习分布估计
- 无向图形模型
- 受限制的玻尔兹曼机器
- 在歧管和自编码器
- 视觉特征:从傅立叶到 Gabor
- 视觉特征 II
- 卷积网络
- 学习比较
- NLP 和深度学习 1:人类语言单词向量
- NLP 和深度学习 2:成分深度学习
- 使用深度学习看人
- 深度学习
- 深度学习 2
- 语音识别和深度学习
- 神经网络优化问题教程
- 深度学习(希望更快)
- 对抗性实例
- 从语言建模到机器翻译
- 深 NLP 递归神经网络
- Deep NLP 应用程序和动态记忆网络
- 记忆,阅读和理解
- 平滑,有限和凸优化深度学习暑期学校
- 非平滑,非有限和非凸优化
- 变分自编码器和扩展
- 深度生成模型
选择一个主题并深入学习,效果会非常好!
看起来会有一个 2016 暑期学校,希望会有视频。
资源
斯坦福大学自然语言处理的深度学习
这是一个深度学习课程,重点是斯坦福大学 Richard Socher 教授的自然语言处理(NLP)。
一个有趣的说明是,您可以访问 PDF 版本的学生报告,这些工作可能会激发您的灵感或给您提供具有创意的想法。
YouTube 播放列表的文件名称很差,而且有些缺少讲座, 2016 年的视频尚未全部上传。以下是 2015 年讲座和视频链接的列表。只是选择进一个特定主题就轻松多了。
- 讲座 1:NLP 和深度学习简介
- 第 2 讲:简单的单词向量表示:word2vec,GloVe
- 第 3 讲:高级单词向量表示:语言模型,softmax,单层网络
- 第 4 讲:词窗分类和神经网络
- 第 5 讲:项目建议,神经网络和反支柱(全部详细信息)
- 第 6 讲:实用技巧:梯度检查,过拟合,正则化,激活功能,细节
- 第 7 讲:用于语言建模和其他任务的循环神经网络
- 第 7 讲(8!?):用于机器翻译的 GRU 和 LSTM
- 第 9 讲:递归神经网络的解析
- 第 10 讲:针对不同任务的递归神经网络(例如情绪分析)
- 第 11 讲:期中考试
- 第 13 讲:用于句子分类的卷积神经网络
- 第 15 讲:DL 在 NLP 方面上 的应用
- 与 Andrew Maas 的客座讲座:语音识别
- 与杰森韦斯顿的客座讲座:记忆网络
- 与 Elliot 英语的客座讲座:高效的实现和 GPU
如果您正在深入学习 NLP,这将是一个非常优秀的领域,这也是一个很好的学习材料。
资源
斯坦福大学视觉识别的卷积神经网络
本课程重点介绍使用卷积神经网络对计算机视觉应用进行深度学习。
这是斯坦福大学的另一门课程,这次由 Andrej Karpathy 和其他人讲授。
不幸的是,课程视频被删除了,但是一些聪明的人已经找到了将它们放回其他地方的方法,请参阅下面资源部分中的播放列表。
我现在很遗憾的通知,由于法律问题,我们被迫删除了 CS231n 视频。仅仅有 25 万的社会观点因此服务而受益。
- Andrej Karpathy(@karpathy) 2016 年 5 月 3 日
另一个很棒的课程
以下是 2016 年课程的视频讲座,但我不确定这些链接会持续多长时间,如果链接失效,请发表评论以便于我及时修复链接。
- 第 1 讲 引言及历史背景
- 第 2 讲 数据驱动方法,kNN,线性分类 1
- 第 3 讲 线性分类 2,优化
- 第 4 讲 神经网络第一部分,反向传播
- 第 5 讲 神经网络第二部分
- 第 6 讲 神经网络第三部分,卷积介绍
- 第 7 讲 卷积神经网络
- 第 8 讲 定位和检测
- 第 9 讲 可视化,深度梦想,神经风格,对抗性实例
- 讲座 10 回归神经网络,图像字幕,LSTM
- 第 11 讲 实践中的讲座
- 第 12 讲 深度学习库
- 第 13 讲 分段,软注意,空间变换器
- 第 14 讲 视频和无监督学习
- 第 15 讲 由 Jeff Dean 邀请演讲
资源
舍布鲁克大学的神经网络课程
这是由魁北克舍布鲁克大学的 Hugo Larochelle 教授的神经网络课程。
有大量的材料,至少一吨(^_^)。
视频是一对一而不是讲座,每个主题都有许多小视频,而不是大型的一小时视频信息。
我认为这可能是比传统讲座更好的方式,但我还没有完全尝试并比较,困难的是有 92 个视频(!!!)可供浏览,很难找到要观看的特定视频。
教材包括 10 个主题:
- 主题 1:前馈神经网络
- 主题 2:训练神经网络
- 主题 3:条件随机字段
- 主题 4:训练条件随机字段
- 主题 5:受限制的玻尔兹曼机器
- 主题 6:自编码器
- 主题 7:深度学习
- 主题 8:稀疏编码
- 主题 9:计算机视觉
- 主题 10:自然语言处理
我的建议是使用主菜单主页浏览主题,然后将这利用这些链接学习特定视频, YouTube 播放列表中有太多视频无法播放和理解,选择的悖论会杀死你。
资源
其他课程
以下是一些非免费,难以访问或范围较小的视频课程。
- CILVR Lab @ NYU 的深度学习课程(断开的链接?)
- Udemy 的小型深度学习课程
- CMU 的深度学习
- 用于深度学习的 Nvidia 自学课程
- 多伦多大学 Coursera 机器学习神经网络(太棒了,但不再免费)
- 更新:您可以在这里免费观看所有视频。
- 研究生暑期学校:深度学习,特色学习,2012
摘要
在这篇文章中,您发现了许多关于深度学习的世界级视频课程,包括理论,理论,计算机视觉,自然语言处理等。
注意这篇文章顶部的建议。
按主题浏览并深入讲座学习,而不要尝试学习整个课程,学习一件事,而不是尝试学习一切。
你可以花点时间,为此页面添加书签,以便您可以方便回来享受学习的乐趣。
你知道我还没有列出其他深度学习的视频课程吗?请在评论中告诉我,我会更新清单。
你所知道的深度学习是一种谎言
原文:
machinelearningmastery.com/deep-learning-for-developers/
开始深度学习是一项艰巨的任务。
这是一场斗争,因为深度学习是由 _ 学者 _ 教给 _ 学者 _ 。
如果您是开发人员(或从业者),那就不同了。 你想要的结果。
实践者学习新技术的方式是通过快速快速实现价值的模型。
这是一种自上而下的学习方法,但这并不是深度学习的方式。
还有另一种方式。一种适用于像你这样的自上而下的实践者的方式。
在这篇文章中,您将了解这种方式。
(我教这种方法并帮助超过 1,145 名开发人员 开始深入学习 python,点击了解更多 )
您会相信通过应用深度学习取得成功是可能的。我希望它能激励你迈出实现这一目标的第一步。
让我们开始。
你认为你所知道的深度学习是一种谎言 照片由 Simon Matzinger 拍摄,保留一些权利。
你想在深度学习中开始......
但你却与众不同
你没有高等数学相关的硕士或博士学位。
你不是机器学习专家。
你是一个有兴趣并且渴望开始使用深度学习的专业人士或学生。
也许你是开发人员
- 您想知道如何应用深度学习来解决复杂问题。
- 您需要深度学习技能来改善您的工作前景。
- 您希望深度学习成为您进入数据科学家(或类似)职业的杠杆。
也许你是一名数据科学家
- 您希望在未来的项目中使用深度学习。
- 您有一个棘手的问题,您认为深度学习可以提供帮助。
- 您需要深度学习技能才能保持跟进行业动态并掌控相关的领域。
也许你是学生
- 您需要深度学习技能来改善您的工作前景。
- 你有一个有趣的问题,你认为深度学习是一个很好的选择去解决问题。
- 你想要了解为什么深度学习如此受欢迎。
其中一个原因适合你吗? 请在评论中告诉我,我很想听听你的理由吗?
你有进入深度学习的不同理由吗? 请在评论中告诉我,我会给你个人建议。
进入深度学习领域的原因是多种多样的。
无论如何,你将和其他人一样被对待。像一个学者。
深度学习不仅仅适用于学者 Breyten Ernsting 的照片,保留一些权利。
深度学习是为了学者......谎言
深度学习是一个学术研究领域。
这个领域已经出现有很长一段时间了。该领域曾用于研究小型人工神经网络。现在的重点是更大的网络和更奇特的网络架构。该领域的突破仍然来自学术界。这个领域很年轻,也是很值得期待的。
这意味着深度学习的大部分信息都是由学者撰写的。它是为其他学者编写的,如研究人员,硕士和博士。学生们。
它不是像我们这样为开发人员编写的。
这就是你看到如下错误建议的原因:
你需要博士学位才能深入学习。
或者评论如下:
在进入深度学习之前,您需要 3 年的高级数学。
垃圾!
这就是为什么开始深度学习是一场如此艰难的斗争。这是一个挑战,开发人员认为他们只能通过回到学校,再过着 3 至 7 年背负债务的生活。
愚蠢至极!
您可以在几分钟内完成深度学习教程。您可以开始构建可用于展示您在该领域不断增加的技能的作品。你可以从今天开始。
编程仅适用于计算机科学家(不是)
编程过去很难,很具有理论性。
在有计算机之前,你需要了解很多数学知识才能理解编程。
在编程的早期阶段,您必须定义自己的数据结构和基本算法。在算法和数据结构并无成果时才是这样,所以这需要很好地理解离散数学。
像复杂性理论这样的东西。
这些理论性的知识领域可以帮助您成为更好的程序员和工程师。他们仍然在计算机科学课程中教授。
但是你和我都知道你不需要他们开始编程。如果您在大多数编程工作中工作,您甚至不需要这些相关知识。
您调用排序例程, 您没有从第一原则中派生出新的排序操作。
我们可以将这个类比扩展到深度学习吗?
您是否需要从第一原理推导出反向传播方程并从零开始实现?相反,我们可以在深度学习 API 上调用 model.fit()。
等等......顶级工程师怎么样?
是的,顶级工程师可以推导出一种新的算法。
事实上,他们经常被雇用来做这件事。这是他们的工作。他们可以做简单的事情和更难的事情。他们可以调用 sort 例程并为业务数据派生一个新的排序方法,该方法太大而无法容纳到内存中。
我的观点是,这些功能不必先出现,它们可以在以后出现。
自顶向下。而不是自下而上。
这是关键。
就像现实世界中的实际编程一样。
自上而下的程序员(... _ 获得结果 _)
编程很有趣。
你学习这个功能。你学习了那个 API。您将自己的程序拼接在一起,发现您可以用自己的想法解决问题。
你很早就开始工作,只是随着时间的推移变得更有成效。您可以深入研究理论,以解决更具挑战性的问题。由你决定。
尽早提高工作效率有两个原因:
- 它让你保持动力,让你保持参与。
- 它可以让您尽早交付价值,从而提供动力。
停下来太容易了。 放弃太容易了。
这是强大的动力。你知道自己可以可以写一个程序来解决一个特定的问题。然后有信心实际实现和部署。
在最开始,代码和设计将变得糟糕。很难维护。不适合长期使用。但是随着经验积累,导师的引导和不断学习你的代码能力会变得更好。
这就是大多数 IT 运营的方式。自顶向下。不是自下而上的。
您没有参加计算机语言理论的大学课程来学习 Ruby on Rails,以用于您的下一个 Web 开发项目。您通过一些教程,犯了一些错误并熟悉平台。
重复下一个框架,下一个库。一次又一次。
重复深度学习。
深度学习不仅仅适用于学者
您可以从下至上学习深度学习。
这可能需要很多年和更高的学位,但你会对深度学习技术的理论有很多了解。
即使经过所有这些努力,您可能会或可能不知道如何在实践中将它们应用于实际数据。在大学里他们通常不会教授实践或职业技能。
学术教科书,视频课程和期刊论文是一个很好的资源。他们是思想的金矿。在开始深度学习时,它们不是开始的地方。
深度学习是为学者,谎言 照片由 Quinn Dombrowski ,保留一些权利。
专注于通过深度学习提供价值
深入学习商业和其他研究领域的价值在于可靠的预测。
了解如何使用深度学习来模拟问题。
开发(或参考)用于处理预测性建模问题的系统过程。然后再次应用它,一次又一次,直到你真正擅长提供问题的结果。
善于应用深度学习。 我们都喜欢我们擅长的东西。
如果你能做得很好而且可靠,那么你将拥有市场所需的宝贵技能。
您会发现自己正在深入研究的学术论文中的希腊字母,发送电子邮件或致电作者。所有这些都可以向你提供可以用来在下一个项目中获得更好模型表现的宝贵灵感。
是时候通过深度学习获得成功
现在,希望你相信你可以开始并善于应用深度学习。
现在是采取行动的时候了。现在是开始深度学习的时候了。
1.选择一个框架
我推荐 Keras 平台。它支持 Python。这意味着您可以利用 scikit-learn 和整个 SciPy 生态系统进行深度学习项目。
这个很重要。
您基本上可以免费获得数据准备,模型评估和超参数优化。
Keras 还提供了从业者友好的 API(即简单直观)。它包含了 Theano 和 TensorFlow 库的功效(以及不必要的复杂性)。它为您提供了前沿框架的速度和效率,而无需使用数十或数百行代码来完成某些工作。
我在 Keras 上有一些教程,以及一个免费的 14 天迷你课程,请参阅:
2.选择一个流程
保持简单,但选择一个强大的骨架,您可以添加和定制您喜欢的技术和问题类型。
我喜欢在预测性建模项目中使用的一组很好的一般步骤是:
- 定义问题:您试图解决的问题以及解决问题所需的数据和框架。
- 准备数据:转换为应用于数据的内容,以创建最能将预测问题的结构暴露给模型的视图。
- 评估算法:用于建模问题的技术,以及从不良解决方案中过滤好的指标。
- 改进结果:使用什么参数调整甚至整体方法来充分利用正在工作的东西。
- 当前结果:您取得的成果,经验教训以及您可以直接使用的已保存模型或预测集。
有关处理预测性建模问题的过程的更多信息,请参阅:
3.选择一个问题
你需要练习。很多练习。
如果您对使用图像数据做出预测性建模感兴趣,请查找图像数据的所有标准机器学习问题并按照它们的方式进行操作。
文字数据?视频数据?使用相同的方法。
了解如何使用您的流程获得结果。 然后学习如何获得好成绩。 然后是世界级的结果。
标准机器学习数据集的好处是你有一个基准分数来比较你的结果。
还不确定你的偏好吗?从 UCI 机器学习库的标准数据集开始使用多层感知机(这是一个教程)。然后在标准物体识别问题上尝试卷积神经网络(这里是一个教程)。在简单的时间序列问题上转向 Recurrent Neural Networks(这是一个教程)。
然后,去挑战像 Kaggle 那样的机器学习竞赛中使用的更复杂的问题。进一步研究定义自己的问题并从创意共享中收集数据。
您的目标是开发一个完整项目的模型。
当您处理大型且更具挑战性的项目时,此组合将成为您可以利用的资源。它也可以是一种资源,您可以通过深入学习和提供价值的能力来展示您不断增长的技能。
有关开发机器学习组合的更多信息,请参阅帖子:
总结
你发现你所知道的深度学习是“_ 学术界深度学习 ”。不是“ 开发人员深度学习 _”。
您现在知道,有一整套库和教程专为您和像您这样的开发人员而设计。
您发现了一个简单的 3 步流程,您可以将其用作开发人员深度学习的成功,总结如下:
- 选择一个框架(如 Keras)。
- 选择一个流程(如上面列出的流程)。
- 选择一个问题(然后开发一个模型)。
这改变了你对深度学习的看法吗? 发表评论让我知道。
您可能希望阅读的更多深度学习帖子包括: