Keras-API实现 Inception 模块和残差连接

使用keras框架常见的神经网络都是用 Sequential 模型实现的。 Sequential 模型假设,网络只有一个输入和一个输出,而且网络是层的线性堆叠。这是一个经过普遍验证的假设。这种网络配置非常常见,以至于只用 Sequential模型类就能够涵盖许多主题和实际应用。但有些情况下这种假设过于死板。有些网络需要多个独立的输入,有些网络则需要多个输出,而有些网络在层与层之间具有内部分支,这使得网络看起来像是层构成的图(graph) ,而不是层的线性堆叠。例如多输入问题以及多输出问题。


 Inception 模块

此外,许多最新开发的神经架构要求非线性的网络拓扑结构,即网络结构为有向无环图。比如,Inception 系列网络(由 Google 的 Szegedy 等人开发) a 依赖于 Inception 模块,其输入被多个并行的卷积分支所处理,然后将这些分支的输出合并为单个张量 。如下图:

keras实现:

from keras import layers 
 
branch_a = layers.Conv2D(128, 1, 
                         activation='relu', strides=2)(x)   
branch_b = layers.Conv2D(128, 1, activation='relu')(x)   
branch_b = layers.Conv2D(128, 3, activation='relu', strides=2)(branch_b)

branch_c = layers.AveragePooling2D(3, strides=2)(x)   
branch_c = layers.Conv2D(128, 3, activation='relu')(branch_c) 
 
branch_d = layers.Conv2D(128, 1, activation='relu')(x) 
branch_d = layers.Conv2D(128, 3, activation='relu')(branch_d) 
branch_d = layers.Conv2D(128, 3, activation='relu', strides=2)(branch_d)

#分支输出连接在一起得到模块输出
output = layers.concatenate( 
    [branch_a, branch_b, branch_c, branch_d], axis=-1)

残差连接

最近还有一种趋势是向模型中添加残差连接(residual connection) ,它最早出现于 ResNet 系列网络(由微软的何恺明等人开发) 。b 残差连接是将前面的输出张量与后面的输出张量相加,从而将前面的表示重新注入下游数据流中,这有助于防止信息处理流程中的信息损失。如下图:

使用函数式 API,你可以直接操作张量,也可以把层当作函数来使用,接收张量并返回张量(因此得名函数式 API)。

keras实现

from keras import layers 
 
x = ... 
y = layers.Conv2D(128, 3, activation='relu', padding='same')(x)

y = layers.Conv2D(128, 3, activation='relu', padding='same')(y) 
y = layers.Conv2D(128, 3, activation='relu', padding='same')(y) 

#将原始 x 与输出特征相加
y = layers.add([y, x])

 

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值