Keras模型输入语法,加号(+)的使用

Keras model input syntax, use of plus (+)

我的主要问题是关于在声明 keras 模型输入/输出时使用“+”, 这与正常的 [input1, input2],[output1,output2] 方法有何不同? 例如 in this lstm seq2seq inference model: 模型训练完成后,作者定义推理模型:

decoder_model = Model(
[decoder_inputs] + decoder_states_inputs,
[decoder_outputs] + decoder_states)

我在 keras 文档中找不到这样的示例。

如果您想了解我的问题的具体情况:我正在研究:用于特征提取的 CNN -> GRU 层(给出状态)-> GRU 层 -> 用于对图像执行 OCR 的密集层架构。 我的原型训练得很好,但是当我尝试声明与上面示例类似的推理模型时,我在添加不同维度的输入时遇到错误,但是上面的示例也有不同的维度.

这是我的推理模型:

decoder_state_input = Input(shape=(deencoder_dims,))

decoder_outputs, state_h = decoder_gru(
    decoder_input, initial_state=decoder_state_input)

decoder_outputs = decoder_dense(decoder_outputs)

decoder_model = Model(
    [decoder_input] + decoder_state_input,
    [decoder_outputs] + state_h)

与 in/outputs:

decoder_input = (None,83) (num of decoder tokens)
decoder_state_input = (None,100) (states)
decoder_outputs = (None,83) (tokens)
decoder_states = (None,100) (states)

导致错误:InvalidArgumentError: Dimensions must be equal, but are 83 and 100 for 'add_1' (op: 'Add') with input shapes: [1,?,?,83], [?,100]. 不确定 [1,?,?,83] 中的 1 来自哪里...

这是示例中的代码:

decoder_state_input_h = Input(shape=(latent_dim,))
decoder_state_input_c = Input(shape=(latent_dim,))
decoder_states_inputs = [decoder_state_input_h, decoder_state_input_c]
decoder_outputs, state_h, state_c = decoder_lstm(
    decoder_inputs, initial_state=decoder_states_inputs)
decoder_states = [state_h, state_c]
decoder_outputs = decoder_dense(decoder_outputs)
decoder_model = Model(
    [decoder_inputs] + decoder_states_inputs,
    [decoder_outputs] + decoder_states)

运行良好。

我不明白为什么要这样声明输入,也无法在文档中找到任何解释。我知道当我尝试这样做时会弹出错误,因为输入的维度不同,但示例不会发生同样的情况!?它还具有不同大小的输入,这是示例中推理模型的摘要:

__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_12 (InputLayer)           (None, None, 83)     0                                            
__________________________________________________________________________________________________
input_13 (InputLayer)           (None, 100)          0                                            
__________________________________________________________________________________________________
input_14 (InputLayer)           (None, 100)          0                                            
__________________________________________________________________________________________________
lstm_4 (LSTM)                   [(None, None, 100),  73600       input_12[0][0]                   
                                                                 input_13[0][0]                   
                                                                 input_14[0][0]                   
__________________________________________________________________________________________________
dense_6 (Dense)                 (None, None, 83)     8383        lstm_4[1][0]                     
==================================================================================================

感谢您的任何见解

好的,所以基本上“+”是将 keras ADD 合并层应用于输入。这显然是向现有图形添加新输入的唯一方法,这个 给了我提示。 第二个问题是你不能添加不同维度的输入,但是可以通过将你的输入声明为列表 input1 = [Input(something)] 来规避这个问题,你也不能在 model = Model(Input = ...) 声明你的输入时这样做,我不不知道为什么,但它对我不起作用。

我的工作代码如下所示:

decoder_state_input = [Input(shape=(deencoder_dims,))]
decoder_outputs, state_h = decoder_gru(
    decoder_input, initial_state=decoder_state_input)
state_h_out = [state_h]
decoder_outputs = decoder_dense(decoder_outputs)
decoder_model = Model(
    [decoder_input]+decoder_state_input,
    [decoder_outputs]+state_h_out
)
model.summary()

注意输入声明为列表。

结论:

  • 声明新的 inputs/outputs 以附加到现有图形:需要声明为列表并与以前的输入合并(不知道 keras 如何将它们分开...)

  • keras 并不总是有意义:)