我有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'])
答案 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