【问题标题】:How can I merge or concatenate two sequential models using Keras?如何使用 Keras 合并或连接两个顺序模型?
【发布时间】:2019-12-16 09:37:58
【问题描述】:

我有一个包含两个文本字段的数据集,在标记化之后我创建了两个顺序模型,我正在尝试合并或合并,但是在合并时我遇到了错误。

我已经构建了两个顺序模型,我正在尝试在不使用 Keras 功能 API 的情况下合并它们。

# define the model
model1 = Sequential()
model1.add(Embedding(vocabulary_size_1, embedding_size, input_length=MAXLEN))
model1.add(Flatten())
model1.add(Dense(op_units, activation='softmax'))

# define the model
model2 = Sequential()
model2.add(Embedding(vocabulary_size_2, embedding_size, input_length=MAXLEN))
model2.add(Flatten())
model2.add(Dense(op_units, activation='softmax'))

merged = concatenate(axis=1)
merged_model=merged([model1.output, model2.ouput])

TypeError                                 Traceback (most recent call last)
<ipython-input-76-79cf08fec6fc> in <module>
----> 1 merged = concatenate(axis=1)
      2 merged_model=merged([model1.output, model2.ouput])

TypeError: concatenate() missing 1 required positional argument: 'inputs'

我期待一种不使用 Keras 功能 API 的方法

【问题讨论】:

    标签: keras deep-learning nlp artificial-intelligence


    【解决方案1】:

    concatenate() 函数要求您指定要连接的模型。

    merged = concatenate([model1,model2],axis=1)。但是,轴必须是 axis=-1(您可以使用适合 yopur 情况的任何内容。)

    您的代码可以进一步编写成如下函数式:

    inputs = Input(shape=(vocabulary_size,embedding_size), dtype='float32')
    
    model1=Embedding(vocabulary_size, embedding_size)(inputs)
    model1=Flatten()(model1)
    model1=Dense(op_units, activation='softmax')(model1)
    
    model2=Embedding(vocabulary_size, embedding_size)(inputs)
    model2=Flatten()(model2)
    model2=Dense(op_units,activation='softmax')(model2)
    
    merged = concatenate([model1,model2],axis=-1)
    
    model=Model(inputs=inputs,outputs=merged)
    

    【讨论】:

    • 我已经进行了更改,现在我收到了一个值错误。 ValueError:应在至少 2 个输入的列表上调用 Concatenate
    • 我使用的是顺序的,因为我开发的两个模型是文本列,我已经对其进行了进一步的标记化以解决 nlp 问题。当任何列被标记时,使用 Keras 功能 API 构建模型变得困难。如果您有任何想法将功能 api 用于文本标记列,请分享。
    • 嗨,答案似乎真的很有用,但我有两种词汇量。在提供输入时我应该使用哪一个?
    • 其实你应该使用序列长度(token的个数)。
    • inputs = Input(shape=(token_length,embedding_size), dtype='float32')。您不应该使用我们词汇量的大小(字典中的单词数)。相反,使用顺序使用的最大令牌数。假设您希望句子中最多有 200 个标记,请使用它。
    【解决方案2】:

    model1.outputmodel2.output 是张量。我假设两个模型共享相同的输入。有几种方法,这里是 Keras 中处理这些模型的解决方案。你可以使用keras.layers.Concatenatekeras.models.Model

    inp = Input([MAXLEN,])
    out = Concatenate()([model1(inp), model2(inp)])
    model = Model(inp, out)
    

    如果他们不共享相同的文本输入。你也可以这样做:

    inp = [model1.input, model2.input]
    out = Concatenate()([model1.output, model2.output])
    model = Model(inp, out)
    

    默认情况下,连接最后一个维度的输出,恰好是相同的axis=1

    无论如何,连接 softmax 输出似乎很奇怪。如果有两个不同的文本有两个不同的预测,你需要两个输出。你不需要连接它们。您可以将输出作为列表,并忽略串联:

    inp = [model1.input, model2.input]
    out = [model1.output, model2.output]
    model = Model(inp, out)
    

    如果你得到了其他类型的输出,比如 numpy 数组,那么情况就不同了。

    【讨论】:

    • 我有两个文本字段预测一个目标是多类
    • 那么你为什么要连接两个softmax层?你不应该有一个softmax层并在softmax之前连接两个模型吗?如果你有 10 类目标,连接起来就是 20 类,它们的概率总和不等于 1!
    • 我不明白。你能澄清一下吗? :)
    猜你喜欢
    • 2019-02-13
    • 2018-02-09
    • 2018-03-05
    • 2021-02-22
    • 1970-01-01
    • 2019-03-05
    • 2019-11-11
    • 2019-11-08
    • 2020-08-10
    相关资源
    最近更新 更多