1、残差连接
# coding: utf-8
"""残差连接 residual connection:
是一种常见的类图网络结构,解决了所有大规模深度学习的两个共性问题:
1、梯度消失
2、表示瓶颈
(甚至,向任何>10层的神经网络添加残差连接,都可能会有帮助)
残差连接:让前面某层的输出作为后面某层的输入,从而在序列网络中有效地创造一条捷径。
"""
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)
y = layers.add([y, x]) # 将原始x与输出特征相加
# ---------------------如果特征图尺寸不同,采用线性残差连接-------------------
x = ...
y = layers.Conv2D(128, 3, activation='relu', padding='same')(x)
y = layers.Conv2D(128, 3, activation='relu', padding='same')(y)
y = layers.MaxPooling2D(2, strides=2)(y)
residual = layers.Conv2D(128, 1, strides=2, padding='same')(x) # 使用1*1的卷积,将原始张量线性下采样为y具有相同的形状
y = layers.add([y, residual]) # 将原始x与输出特征相加
2、权重共享
即多次调用同一个实例
# coding: utf-8
"""函数式子API:权重共享
能够重复的使用同一个实例,这样相当于重复使用一个层的权重,不需要重新编写"""
from keras import layers
from keras import Input
from keras.models import Model
lstm = layers.LSTM(32) # 实例化一个LSTM层,后面被调用很多次
# ------------------------左边分支--------------------------------
left_input = Input(shape=(None, 128))
left_output = lstm(left_input) # 调用lstm实例
# ------------------------右分支---------------------------------
right_input = Input(shape=(None, 128))
right_output = lstm(right_input) # 调用lstm实例
# ------------------------将层进行连接合并------------------------
merged = layers.concatenate([left_output, right_output], axis=-1)
# -----------------------在上面构建一个分类器---------------------
predictions = layers.Dense(1, activation='sigmoid')(merged)
# -------------------------构建模型,并拟合训练-----------------------------------
model = Model([left_input, right_input], predictions)
model.fit([left_data, right_data], targets)