常见的‘融合’操作
复杂神经网络模型的实现离不开"融合"操作。常见融合操作如下:
(1)求和,求差
# 求和
layers.Add(inputs)
# 求差
layers.Subtract(inputs)
inputs: 一个输入张量的列表(列表大小至少为 2),列表的shape必须一样才能进行求和(求差)操作。
例子:
input1 = keras.layers.Input(shape=(16,))
x1 = keras.layers.Dense(8, activation='relu')(input1)
input2 = keras.layers.Input(shape=(32,))
x2 = keras.layers.Dense(8, activation='relu')(input2)
added = keras.layers.add([x1, x2])
out = keras.layers.Dense(4)(added)
model = keras.models.Model(inputs=[input1, input2], outputs=out)
(2)乘法
# 输入张量的逐元素乘积(对应位置元素相乘,输入维度必须相同)
layers.multiply(inputs)
# 输入张量样本之间的点积
layers.dot(inputs, axes, normalize=False)
dot即矩阵乘法,例子1:
x = np.arange(10).reshape(1, 5, 2)
y = np.arange(10, 20).reshape(1, 2, 5)
# 三维的输入做dot通常像这样指定axes,表示矩阵的第一维度和第二维度参与矩阵乘法,第0维度是batchsize
tf.keras.layers.Dot(axes=(1, 2))([x, y])
# 输出如下:
<tf.Tensor: shape=(1, 2, 2), dtype=int64, numpy=
array([[[260, 360],
[320, 445]]])>
例子2:
x1 = tf.keras.layers.Dense(8)(np.arange(10)<