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

使用Keras(模型API)的多输入模型

简烨烁
2023-03-14

我一直在尝试使用Keras构建一个多输入模型。我来自使用顺序模型,并且只有一个相当直接的输入。我一直在查看StackOverflow上的留档(https://keras.io/getting-started/functional-api-guide/)和一些答案(如何在Keras 2.0中“合并”顺序模型?)。基本上,我想要的是让两个输入训练一个模型。一个输入是一段文本,另一个是从该文本中提取的一组手工挑选的特征。手工挑选的特征向量长度恒定。以下是我目前为止尝试的:

    left = Input(shape=(7801,), dtype='float32', name='left_input')
    left = Embedding(7801, self.embedding_vector_length, weights=[self.embeddings],
                     input_length=self.max_document_length, trainable=False)(left)

    right = Input(shape=(len(self.z_train), len(self.z_train[0])), dtype='float32', name='right_input')

    for i, filter_len in enumerate(filter_sizes):
        left = Conv1D(filters=128, kernel_size=filter_len, padding='same', activation=c_activation)(left)
        left = MaxPooling1D(pool_size=2)(left)

    left = CuDNNLSTM(100, unit_forget_bias=1)(left)
    right = CuDNNLSTM(100, unit_forget_bias=1)(right)

    left_out = Dense(3, activation=activation, kernel_regularizer=l2(l_2), activity_regularizer=l1(l_1))(left)
    right_out = Dense(3, activation=activation, kernel_regularizer=l2(l_2), activity_regularizer=l1(l_1))(right)
    for i in range(self.num_outputs):
        left_out = Dense(3, activation=activation, kernel_regularizer=l2(l_2), activity_regularizer=l1(l_1))(left_out)
        right_out = Dense(3, activation=activation, kernel_regularizer=l2(l_2), activity_regularizer=l1(l_1))(right_out)

    left_model = Model(left, left_out)
    right_model = Model(right, right_out)

    concatenated = merge([left_model, right_model], mode="concat")
    out = Dense(3, activation=activation, kernel_regularizer=l2(l_2), activity_regularizer=l1(l_1), name='output_layer')(concatenated)

    self.model = Model([left_model, right_model], out)
    self.model.compile(loss=loss, optimizer=optimizer, metrics=[cosine, mse, categorical_accuracy])

这会产生以下错误:

TypeError: Input layers to a `Model` must be `InputLayer` objects. Received inputs: Tensor("cu_dnnlstm_1/strided_slice_16:0", shape=(?, 100), dtype=float32). Input 0 (0-based) originates from layer type `CuDNNLSTM`.

共有1个答案

巫马嘉祯
2023-03-14

错误很明显(你就快到了)。代码当前正试图将输入设置为模型[left_model,right_model],而输入必须是输入层[左,右]。上面代码示例的相关部分应为:

self.model = Model([left, rigt], out)

参考我的答案:合并图层,尤其是第二个例子。

 类似资料:
  • 问题内容: 我正在尝试合并两个模型的输出,并使用keras顺序模型将它们作为第三模型的输入。型号1: 型号1: 型号3: 直到这里,我的理解是,来自两个模型的输出x和y被合并并作为第三模型的输入。但是当我全都喜欢的时候 in1和in2是尺寸为10000 * 750的两个numpy ndarray,其中包含我的训练数据,而np_res_array是相应的目标。 这给了我错误,因为“列表”对象没有属性

  • 问题内容: 在Keras中创建顺序模型时,我知道您在第一层中提供了输入形状。然后,此输入形状会构成 隐式 输入层吗? 例如,下面的模型明确指定了2个密集层,但这实际上是一个3层模型,即由输入形状隐含的一个输入层,一个具有32个神经元的隐藏密集层,然后一个具有10个可能输出的输出层组成的模型吗? 问题答案: 好吧,实际上它实际上 是 一个隐式输入层,即您的模型是一个具有三层“输入,隐藏和输出”的“老

  • 我有一个顺序模型定义如下: 我想更改此模型,以获取可变形状的输入。具体来说,第一个维度需要可变。阅读关于指定输入形状的Keras文档,我发现可以在input\u shape元组中使用None条目,其中None表示可能需要任何正整数。 对于现有模型,如果我将input\u形状从(2,4)更改为(None,4),我将收到以下错误: 我不确定,但我不相信当模型包含一个flatte()层时,可以指定可变的

  • 问题内容: 我对通过Keras API的简单性构建强化学习模型感兴趣。不幸的是,我无法提取相对于权重的输出梯度(不是误差)。 关于如何计算模型输出相对于每一层的权重的梯度的任何想法将被理解。 问题答案: 要使用Keras获得相对于权重的模型输出的梯度,您必须使用Keras后端模块。我创建了这个简单的示例来确切说明该怎么做: 为了计算梯度,我们首先需要找到输出张量。对于模型的输出(我最初的问题是什么

  • /usr/local/lib/python3.6/dist-packages/tensorflow/python/training/checkpointable/base.py in_method_wrapper(self,*args,**kwargs)362 self._setattr_tracking=False#pylint:disable=protected-access 363 try:

  • 我想使用两个包,一个用Keras1.2编写,另一个用TensorFlow编写。我想将构建在tensorflow中的体系结构的一部分用于Keras模型。 这里提出了一个部分的解决方案,但它是针对顺序模型的。关于功能模型的建议--将预处理包装在一个Lambda层中--没有奏效。