【问题标题】:How to sum up the prediction vectors of a keras model into a single vector如何将keras模型的预测向量汇总为单个向量
【发布时间】:2019-04-04 05:49:10
【问题描述】:

我有 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()

解释:字符串被预处理为浮点向量。

model1的实际输出:
输入:“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'])

【问题讨论】:

    标签: tensorflow keras


    【解决方案1】:

    使用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())

    【讨论】:

    • 看起来不错的方法我刚刚尝试过。形状 (None, 5) 变为 (5,)。但是,如果我调用“model1.predict(np.array(keywords))”,我会收到以下错误:“无法将输入数组从形状 (5) 广播到形状 (19)”(关键字长度为 19)
    • 您发布的代码有很多错误,无法运行(例如,这不是有效的语法model2.add(len(classes), activation=tf.nn.softmax)))。如果您希望我帮助您修复代码并提供您拥有的形状的实际值(例如 len(classes) 的值)。
    • 我刚刚添加了一张模型结构的图片 vlt 对此有所帮助。是的,它可能无法运行它更像是伪代码
    • 你现在问的是一个完全不同的问题。如果没有看到代码,我将无法为您提供帮助。
    • 比较广泛。你需要哪一部分
    【解决方案2】:

    如果我理解你的问题,你所需要的就是总结你最后一个密集层模型1。 您可以通过取消 Keras 后端 Sum 来实现:

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

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

    【讨论】:

    • 我在模型 1 中的最后一个密集层已经成形(无,5)。添加此 sum 函数将使输出的形状为 (None,)
    • axis=None 在所有维度上进行缩减。阅读您自己发布的链接。
    • 是的,我的错,我误会了
    猜你喜欢
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 2018-09-06
    • 2016-12-07
    • 2017-08-18
    • 1970-01-01
    相关资源
    最近更新 更多