如何使用Keras API添加一个层来执行带有常量的元素产品?



我有一个使用Keras API构建的简单的全连接前馈神经网络。该网络有一个输入,一个包含两个神经元的隐藏层,和一个大小为3的输出。

from keras.models import Sequential
from keras.layers import Dense
# construct network
model = Sequential()
model.add(Dense(2, input_dim=1, activation='relu'))
model.add(Dense(3, activation='linear'))

让我用a_i表示最后一层——网络的输出——的激活。我现在要做的是用a_i取3个(常数)矩阵T_i的线性组合,因此:

q = a_1*T_1 +a_2*T_2 +a_3*T_3

我想要这个数量,q作为网络的输出(即在损失中使用的数量)。如何在Keras中做到这一点?换句话说,我如何在最后手动添加一个层来执行上面的元素乘积和求和,并使得到的数量成为网络的输出?

你可以使用lambda层,它的输入是大小为(3)的张量然后把这三个数相乘,你得到的输出是大小为(1)的张量

这是keras中lambda层的一个例子:

def normalizer(x):
a = x[:, :, :, :, 1] # input
b = x[:, :, :, :, 2] # pred
asum = tf.keras.backend.sum(a)
bsum = tf.keras.backend.sum(b)
ratio = tf.math.divide(asum, bsum)
ratio = tf.cast(ratio, dtype=tf.float32) 
return tf.multiply(b, ratio)

这一层根据输入对预测进行规范化,你可以做类似的事情

你可以尝试这样实现:

def multiplier(x):
a = x[:, 1] # first value
b = x[:, 2] # second value
c = x[:, 3] # third value
ab = tf.multiply(a, b)
return tf.multiply(ab, c)

然后把它像普通图层一样放到模型中

最新更新