了解Keras functional API
序列模型
Keras序列api是用于创建任何深度学习模型的流行模型。然而,该模型有一个假设,即它只接受一个输入,只有一个输出。同样,一些深度学习网络可能具有多个内部分支(例如,inception模块),这与传统的顺序模型有很大不同。为了处理这样的体系结构,keras的functional api非常方便。
(Sequential api失败的多输入架构)
在functional api中,我们把层看作是以张量为输入,同时也输出张量的函数。
functional API的语法:
与Sequential api不同,在functional api的情况下,我们必须提供输入的形状。因此,第一步是提供输入的形状。
在上面的Python代码块中,我们以张量作为输入。
在这里,我们建立了简单的深度学习模型。最后,它产生一个张量作为输出。
model=Model(x,z)
在最后一步,我们把输入和输出张量转换成模型对象。最终的输出张量z是通过变换输入张量x得到的。如果我们试图提供模型除了定义的形状之外的任何形状,都会导致运行时错误。
我们可以使用keras functional api形成有向无环图。这里需要注意的一件关键的事情是,我们只能对非循环图,因为循环图有一个条件,即一个张量x可以成为另一个产生x的层的输入,这在逻辑上是不正确的。
使用Functional API的Inception模型:
(具有多个并行分支的Inception模型的结构)
上图显示了基本的Inception架构。该模型的架构非常复杂,我们无法使用基本的sequential api进行编码。让我们看一下Inception模块的编码部分。
这里每个部分都引用了Inception模块的一个分支。这里我们可以看到,x是上一层的输入。part_a是指第一个分支,它有128个1*1核。在第二个分支part_b中,我们有一个初始1 * 1卷积,然后是3 * 3卷积。最初的1 * 1卷积从前一层(即x)获得输入,而3 * 3从前一层的输出(即part_b第一层的输出)获得输入。同样,我们也可以理解part_c和part_d的代码。在最后一步中,我们将所有四个分支的输出串联在一起。
这里要注意一个关键点,我们在所有层上都保持2的步幅。这样做是为了使最终连接中的所有输出都具有相同的形状,否则将显示错误。
使用Functional API的残差连接:
残差连接有助于解决长网络的梯度消失问题。它直接从上一层直接提供到下一层。
(基本残差块)
这里的关键是,我们将前一层的输入用作后一层y的输入。如果形状出现任何差异,我们可以利用1 * 1卷积来获得所需的形状。
使用模型作为层:
我们还可以像使用层一样使用模型。例如,假设我们有一个训练过的模型mod,我们想使用模型mod,就像我们使用层实例一样。下面是一个例子
y=mod(x)
在这里,mod是一个已经训练好的模型,我们将其用于生成中间层的输出。当提供x作为中间张量输入时,我们得到输出张量y。
本文展示了functional api的强大功能,它使我们能够创建超出基本序列模型范围之外的任何复杂模型体系结构。