深度神经网络
简介
这节课我们将看到神经网络著名的学习复杂关系的能力。
其核心的知识点是模块化,从众多简单的功能模块建立一个复杂的网络。我们已经见识过线性单元是如何计算线性函数的——现在,我们来看看如何修改这些单个单元来组合成更复杂的关系。
层
- 神经网络一般以层来组织构成。当我们将具有相同输入集合的线性单元收集在一起时,我们会获得一个密度(dense)层。
- 你可以将每一个层看成是一个相对简单的数据变形。通过一个深层的层次堆叠,一个神经网络可以将输入转化成更复杂的方式。每一层的转化将我们与最终结果拉得更近。
激活函数
- 实际上,两个密度层中间什么都没有,和一个密度层的价值没什么区别。单单一个密度层永远不能将我们从线性和平面世界脱离出去。我们需要的是一些非线性的东西。这就是激活函数。
没有激活函数,神经网路只能学习线性关系。要想拟合曲线,我们就要使用激活函数。 - 激活函数 是我们使用在每一层的输出(它的激活量)上的一些函数。最常见的是修正函数 max(0, x)。
- 修正函数有一个将负值修正为零的图像。对神经元的输出使用该修正函数会使得输出值图像有一个弯曲部分,使我们的结果不再是简单的直线。
- 当我们将修正函数与线性单元结合时,我们会获得一个修正线性单元或ReLU(因此,我们有时候称修正函数为"ReLU函数")。使用修正后的激活值意味着我们的输出变成了
max(0, w * x + b)
。
堆叠密度层
- 现在,我们就有了一些非线性的元素,我们 来看看如何使用堆叠层次获得复杂的数据转换。
- 一堆密度层组合在一起就形成了"全连接的"网络
- 在输出层之前的层次被称为隐藏层,因为它们往往不会在输出中直接体现。
- 现在,注意如果输出层仍然是一个线性单元(意思是他的输出没有使用激活函数)。这就使得该网络适合处理回归任务,我们往往使用这种任务来预测不确定的数值。其他任务(如分类)可能在输出结果上也要运用激活函数。
建立序列化(Sequential)的模型
Sequential
模型会将一系列的层级结构从前到后连接起来:第一层是输入层、最后一层是输出层。下面的代码创建了该模型
from tensorflow import keras
from tensorflow.keras import layers
model = keras.Sequential([
# the hidden ReLU layers
layers.Dense(units=4, activation='relu', input_shape=[2]),
layers.Dense(units=3, activation='relu'),
# the linear output layer
layers.Dense(units=1),
])
- 确保我们传入的层是在一个列表中,像
[layer, layer, layer, ...]
,而不是分开的参数。要将激活函数加入层中,需要传入Activation
参数。