我正在处理文本分类问题。现在我尝试通过使用在数据集不同子集上训练的模型的多个输出,即使用“装袋”方法来改进结果。每个模型由卷积层和循环层组合而成,并具有三个值的softmax输出。
最近我尝试使用API的Average()函数。但它只是简单地平均所有输出,从最好的到最差的。其他变体如Maximum()仍然不够帮助,因为据我所知,每个值的最大化会破坏“softmax”效果。
def MultiInputClassifier(input_length, input_num, class_num, classifiers):
inputs_list = []
outputs_list = []
for i in range(input_num):
inputs = Input(shape=(input_length,), name='input_{}'.format(i))
inputs_list.append(inputs)
model_output = classifiers[i](inputs)
outputs_list.append(model_output)
preds = Average()(outputs_list)
model = Model(inputs=inputs_list, outputs=preds, name='final_model')
model.compile(optimizer='nadam', loss='categorical_crossentropy', metrics=['accuracy'])
return model
可能的解决方案是在每个特定情况下选择最自信的输出。那么,有没有一种方法可以通过在所有轴上找到最大值来选择整个输出呢?
如果我们有[0.2, 0.7, 0.1]和[0.3, 0.6, 0.1],我们将只选择[0.2, 0.7, 0.1]。
回答:
假设你的输出是
output_1 = [0.2, 0.7, 0.1] output_2 = [0.3, 0.6, 0.1]
你可以将它们收集到一个数组中:
outputs = np.array([output_1, output_2])
然后选择具有最大值的那一行
outputs[np.where(outputs == np.max(outputs))[0],:]