【问题标题】:Error while concatenating keras layers: A `Concatenate` layer requires inputs with matching shapes连接 keras 层时出错:“连接”层需要具有匹配形状的输入
【发布时间】:2019-08-28 20:04:33
【问题描述】:

我有这个模型,叫做Hierarchical Attention Networks

建议用于文档分类。我对句子单词使用 word2vec 嵌入,我想在 A 点连接另一个句子级嵌入(见图)。

我将它用于包含 3 个句子的文档;模型总结:

word_input = Input(shape=(self.max_senten_len,), dtype='float32')
word_sequences = self.get_embedding_layer()(word_input)
word_lstm = Bidirectional(self.hyperparameters['rnn'](self.hyperparameters['rnn_units'], return_sequences=True, kernel_regularizer=kernel_regularizer))(word_sequences)
word_dense = TimeDistributed(Dense(self.hyperparameters['dense_units'], kernel_regularizer=kernel_regularizer))(word_lstm)
word_att = AttentionWithContext()(word_dense)
wordEncoder = Model(word_input, word_att)
sent_input = Input(shape=(self.max_senten_num, self.max_senten_len), dtype='float32')
sent_encoder = TimeDistributed(wordEncoder)(sent_input)

""" I added these following 2 lines. The dimension of self.training_features is (number of training rows, 3, 512). 512 is the dimension of the sentence-level embedding.  """
USE = Input(shape=(self.training_features.shape[1], self.training_features.shape[2]), name='USE_branch')
merge = concatenate([sent_encoder, USE], axis=1)

sent_lstm = Bidirectional(self.hyperparameters['rnn'](self.hyperparameters['rnn_units'], return_sequences=True, kernel_regularizer=kernel_regularizer))(merge)
sent_dense = TimeDistributed(Dense(self.hyperparameters['dense_units'], kernel_regularizer=kernel_regularizer))(sent_lstm)
sent_att = Dropout(dropout_regularizer)(AttentionWithContext()(sent_dense))
preds = Dense(len(self.labelencoder.classes_))(sent_att)
self.model = Model(sent_input, preds)

当我编译上面的代码时,我得到以下错误:

ValueError: A Concatenate 层需要具有匹配形状的输入 除了 concat 轴。得到输入形状:[(None, 3, 128), (None, 3, 514)]

我指定了连接轴 = 1,以连接 (3) 句子的数量,但我不知道为什么我仍然收到错误。

【问题讨论】:

    标签: python-3.x keras deep-learning concatenation


    【解决方案1】:

    这是因为如果您指定该轴,则形状不匹配。如果您这样做,这将起作用:

    merge = concatenate([sent_encoder, USE], axis=-1)
    

    现在其余轴上的形状没有冲突

    【讨论】:

    • 我收到了这个错误:ValueError: Graph disconnected: cannot obtain value for tensor Tensor("USE_branch:0", shape=(?, 3, 514), dtype=float32) at layer "USE_branch". The following previous layers were accessed without issue: ['input_2', 'time_distributed_2']
    【解决方案2】:

    错误是由于两行:

    merge = concatenate([sent_encoder, USE], axis=1)
    # should be:
    merge = concatenate([sent_encoder, USE], axis=2) # or -1 as @mlRocks suggested
    

    还有一行:

    self.model = Model(sent_input, preds)
    # should be:
    self.model = Model([sent_input, USE], preds) # to define both inputs
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多