如何将keras模型的预测向量汇总为单个向量

时间:2019-04-03 16:32:43

标签: tensorflow keras

我有2个keras模型。 第一个输入作为字符串并给出 预测,例如五个类别。

在第二个模型中,我想使用此输出。 但是,第一个模型的输出应汇总为多个输入的单个输出。

我希望对所有输入字符串的总和进行一次预测,而不希望对每个输入字符串进行预测。

model1 = tf.keras.Sequential()
model1.add(Input(shape=(len(inputs[0]),), dtype=tf.float32))
model1.add(Dense(256, activation='relu'))
model1.add(Dense(len(helper_classes), activation='softmax'))

model2 = tf.keras.Sequential()
model2.add(model1)
model2.add(Dense(16))
model2.add(Dense(len(classes), activation=tf.nn.softmax))
model2.layers[0].trainable = False
model2.compile(loss='categorical_crossentropy',optimizer='adam', metrics=['accuracy'])

model2.summary()

为便于解释:字符串已预处理为浮点向量。

模型1的实际输出:
输入:“ Hello”,“ World”,...
输出:[0.2,0,0,0.8,0],[0,0,0.4,0,0.6],...

我需要什么:
输入:“ Hello”,“ World”,...
输出:[0.2 + 0.0 + ...,0 + 0.0 + ...,0 + 0.4 + ...,0.8 + 0.0 + ...,0 + 0.6 + ...]

Image of model1
Image of model1 after adding Reduction Layer


解决方案
好吧,我现在解决了。我的第一个错误是我对轴1进行了总结。在vlad的帮助下,我可以解决的问题。 第二个错误是我没有使用keep_dims = true保持尺寸。

解决方案是在第二个模型中插入一个lambda层,基本上可以完成Vlad和Thibault的建议:

model2 = tf.keras.Sequential()
model2.add(model1)

model2.add(Lambda(lambda x: K.sum(x, axis=0,keepdims=True)))

model2.add(Dense(16))
model2.add(Dense(len(classes), activation=tf.nn.softmax))
model2.layers[0].trainable = False
model2.compile(loss='categorical_crossentropy',optimizer='adam', metrics=['accuracy'])

2 个答案:

答案 0 :(得分:0)

使用tf.reduce_sum()

import tensorflow as tf
output = tf.Variable([[0.2, 0.0, 0.0, 0.8, 0],[0.0, 0.0, 0.4, 0, 0.6],])
reduced = tf.reduce_sum(output, axis=0)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(reduced.eval())
    # [0.2 0.  0.4 0.8 0.6]

要在Keras中使用它,请定义一个自定义层,如下所示:

from tensorflow.keras import layers

class ReductionLayer(layers.Layer):
    def __init__(self):
        super(ReductionLayer, self).__init__()

    def call(self, inputs):
        return tf.reduce_sum(inputs, axis=0)

并将其添加到您的Sequential()模型中:

model.add(ReductionLayer())

答案 1 :(得分:0)

如果我很了解您的问题,那么您所要做的就是总结model1的最后一个Dense层。 您可以通过取消Keras后端Sum的使用来实现:

keras.backend.sum(x, axis=None, keepdims=False)

您可以在这里找到文档:https://keras.io/backend/#sum