【发布时间】: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