当前位置: 首页 > 知识库问答 >
问题:

在Keras中实施后期融合

郭坚壁
2023-03-14

我正在研究一个包含图像和文本的多模式分类器。我已经开发并成功地实现了两个模型,一个是用于图像的CNN模型,另一个是基于BERT的文本模型。这两个模型的最后一层都是密集的,有n个单元和softmax激活(其中n是类的数量)。Keras提供了不同的合并层,用于合并这些模型的输出向量(https://keras.io/api/layers/merging_layers/)然后就有可能创建一个新的网络,但我的问题是:有没有更好的方法来组合单一模型的决策?也许可以根据一些标准对向量中的值进行加权?目前,我已使用以下简单的连接层开发了我的模型:

image_side = images_model(image_input)
text_side = text_model(text_input)
# Concatenation
merged = layers.Concatenate(name='Concatenation')([image_side, text_side])
merged = layers.Dense(128, activation = 'relu', name='Dense_128')(merged)
merged = layers.Dropout(0.2)(merged)
output = layers.Dense(nClasses, activation='softmax', name = "class")(merged)

提前感谢您!

共有1个答案

濮赤岩
2023-03-14

这里可以在两个张量(模型输出)之间实现加权平均,其中可以自动学习权重。我还引入了权重总和必须为1的约束。要实现这一点,我们只需在体重上应用softmax。在下面的虚拟示例中,我将此方法与两个完全连接的分支的输出相结合,但您可以在其他任何场景中对其进行管理

这里是自定义层:

class WeightedAverage(Layer):

    def __init__(self, n_output):
        super(WeightedAverage, self).__init__()
        self.W = tf.Variable(initial_value=tf.random.uniform(shape=[1,1,n_output], minval=0, maxval=1),
            trainable=True) # (1,1,n_inputs)

    def call(self, inputs):

        # inputs is a list of tensor of shape [(n_batch, n_feat), ..., (n_batch, n_feat)]
        # expand last dim of each input passed [(n_batch, n_feat, 1), ..., (n_batch, n_feat, 1)]
        inputs = [tf.expand_dims(i, -1) for i in inputs]
        inputs = Concatenate(axis=-1)(inputs) # (n_batch, n_feat, n_inputs)
        weights = tf.nn.softmax(self.W, axis=-1) # (1,1,n_inputs)
        # weights sum up to one on last dim

        return tf.reduce_sum(weights*inputs, axis=-1) # (n_batch, n_feat)

以下是回归问题中的完整示例:

inp1 = Input((100,))
inp2 = Input((100,))
x1 = Dense(32, activation='relu')(inp1)
x2 = Dense(32, activation='relu')(inp2)
x = [x1,x2]
W_Avg = WeightedAverage(n_output=len(x))(x)
out = Dense(1)(W_Avg)

m = Model([inp1,inp2], out)
m.compile('adam','mse')

n_sample = 1000
X1 = np.random.uniform(0,1, (n_sample,100))
X2 = np.random.uniform(0,1, (n_sample,100))
y = np.random.uniform(0,1, (n_sample,1))

m.fit([X1,X2], y, epochs=10)

最后,您还可以通过以下方式可视化权重的值:

tf.nn.softmax(m.get_weights()[-3]).numpy()

参考和其他示例:https://towardsdatascience.com/neural-networks-ensemble-33f33bea7df3

 类似资料:
  • 本文向大家介绍在keras下实现多个模型的融合方式,包括了在keras下实现多个模型的融合方式的使用技巧和注意事项,需要的朋友参考一下 在网上搜过发现关于keras下的模型融合框架其实很简单,奈何网上说了一大堆,这个东西官方文档上就有,自己写了个demo: 补充知识:keras的融合层使用理解 最近开始研究U-net网络,其中接触到了融合层的概念,做个笔记。 上图为U-net网络,其中上采样层(绿

  • 本文向大家介绍使用keras实现densenet和Xception的模型融合,包括了使用keras实现densenet和Xception的模型融合的使用技巧和注意事项,需要的朋友参考一下 我正在参加天池上的一个竞赛,刚开始用的是DenseNet121但是效果没有达到预期,因此开始尝试使用模型融合,将Desenet和Xception融合起来共同提取特征。 代码如下: 如下进行调用: 最后生成的模型图

  • 问题内容: 我正在尝试在C中实现管道-例如- 我写了以下代码- 使用两个参数可以很好地工作,例如- 但是,当我尝试两个以上的参数时,它将不起作用。 有人可以告诉我我的代码有什么问题吗,或者有其他方法可以做到这一点? 问题答案: 这实际上没有进行错误检查,但是为什么这么复杂?

  • 40min 1.jvm调优问题 2.hashmap冲突怎么造成的? 3.mysql索引,全文索引,10G数据,8G内存怎么整?(没听懂问题) 4.es的api,构建bsl 5.springboot自动装配 6.kafka怎么生产怎么消费? 7.问项目,项目涉及哪些实体,又问业务流程 8.项目难点

  • 招联金融暑期实习后端,今天一二面结束。一面有难度,二面一般般。 #暑期实习# #我的实习求职记录# 二面: 本科生为什么不读研? 本科怎么学习? 问我擅长哪些方向? JAVA的集合体系。阻塞队列的特点。 我回答生产者消费者模式,问我使用场景。 我回答谢谢队列,然后问rabbitMQ有哪些组建。 计算机网络:http1.1 https http2.0特点。非对称加密算法与对称加密区别。 剩下就是正常

  • 问题内容: 几乎每个人都使用它们,但是包括我在内的许多人只是简单地认为它们只是在起作用。 我正在寻找高质量的材料。我使用的语言是:Java,C,C#,Python,C ++,所以这些是我最感兴趣的。 现在,C ++可能是一个不错的起点,因为您可以使用该语言编写任何东西。 而且,C接近组装。如何使用纯C构造而不使用汇编来模拟异常? 最后,我听说有传言称,出于速度考虑,Google员工在某些项目中不使