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 并不总是有意义:)
我的主要问题是关于在声明 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 并不总是有意义:)