在 keras 中不能有输入和输出的名称 model.fit
Cannot have names for input and output in keras model.fit
简而言之:
为什么这条线有效 -
model.fit(x_train, y_train, epochs=30, batch_size=40, verbose=2)
而这一行没有
model.fit({"word_input": x_train, "main_output": y_train}, epochs=30, batch_size=40, verbose=2)
进一步说明
我正在尝试用 keras 实现 LSTM。我写了下面的代码
word_input = Input(shape=(mxlen,), dtype="int32", name="word_input")
x1 = Embedding(len(vocab), 100, input_length=mxlen, weights=[embeddings], trainable=False)(word_input)
x1 = LSTM(100)(x1)
y = Dense(6, activation="softmax", name="main_output")(x1)
model = Model(inputs=[word_input], outputs=[y])
adam = optimizers.Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, amsgrad=False)
model.compile(optimizer=adam,loss="categorical_crossentropy",metrics=["categorical_accuracy"]) # have to look into it
model.fit({"word_input": x_train, "main_output": y_train}, epochs=30, batch_size=40, verbose=2)
我在最后一行收到一条错误消息“ValueError:没有为任何变量提供渐变”。但是当我将最后一行更改为 this
时,确切的代码有效
model.fit(x_train, y_train, epochs=30, batch_size=40, verbose=2)
我想要在 model.fit 中输入和输出的名称或标签的原因是因为我想要多个输入。我从以下代码行得到标签的想法
model.fit(
{'main_input': X_train, 'pos_input': X_train_pos,
'aux_input': X_train_meta, 'dep_input': X_train_dep},
{'main_output': Y_train}, epochs = num_epochs, batch_size = batch_size,
validation_data = (
{'main_input': X_val, 'pos_input': X_val_pos,
'aux_input': X_val_meta, 'dep_input' : X_val_dep},
{'main_output': Y_val}
), callbacks=[csv_logger,checkpoint])
完整错误截图如下
解决方案
这似乎是用于 tensorflow 的 open-github-issue,目前正在开发中,named-output 尚未使用 dict
实现。
documentation for Model.fit()
显示当前输入 x
可以是 命名输入 通过使用 dict
,但是,输出,y
还不接受任何 dict
。
fit(
x=None, y=None, batch_size=None, epochs=1, verbose=1, callbacks=None,
validation_split=0.0, validation_data=None, shuffle=True, class_weight=None,
sample_weight=None, initial_epoch=0, steps_per_epoch=None,
validation_steps=None, validation_freq=1, max_queue_size=10, workers=1,
use_multiprocessing=False, **kwargs
)
其中,
INPUT, x
= numpy array/list-of-arrays 或张量或字典或生成器。
A dict mapping input names to the corresponding array/tensors, if the model has named inputs.
OUTPUT, y
= numpy 数组或张量,或者当 x 是生成器时未指定。
快速参考
简而言之: 为什么这条线有效 -
model.fit(x_train, y_train, epochs=30, batch_size=40, verbose=2)
而这一行没有
model.fit({"word_input": x_train, "main_output": y_train}, epochs=30, batch_size=40, verbose=2)
进一步说明
我正在尝试用 keras 实现 LSTM。我写了下面的代码
word_input = Input(shape=(mxlen,), dtype="int32", name="word_input")
x1 = Embedding(len(vocab), 100, input_length=mxlen, weights=[embeddings], trainable=False)(word_input)
x1 = LSTM(100)(x1)
y = Dense(6, activation="softmax", name="main_output")(x1)
model = Model(inputs=[word_input], outputs=[y])
adam = optimizers.Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, amsgrad=False)
model.compile(optimizer=adam,loss="categorical_crossentropy",metrics=["categorical_accuracy"]) # have to look into it
model.fit({"word_input": x_train, "main_output": y_train}, epochs=30, batch_size=40, verbose=2)
我在最后一行收到一条错误消息“ValueError:没有为任何变量提供渐变”。但是当我将最后一行更改为 this
时,确切的代码有效model.fit(x_train, y_train, epochs=30, batch_size=40, verbose=2)
我想要在 model.fit 中输入和输出的名称或标签的原因是因为我想要多个输入。我从以下代码行得到标签的想法
model.fit(
{'main_input': X_train, 'pos_input': X_train_pos,
'aux_input': X_train_meta, 'dep_input': X_train_dep},
{'main_output': Y_train}, epochs = num_epochs, batch_size = batch_size,
validation_data = (
{'main_input': X_val, 'pos_input': X_val_pos,
'aux_input': X_val_meta, 'dep_input' : X_val_dep},
{'main_output': Y_val}
), callbacks=[csv_logger,checkpoint])
完整错误截图如下
解决方案
这似乎是用于 tensorflow 的 open-github-issue,目前正在开发中,named-output 尚未使用 dict
实现。
documentation for Model.fit()
显示当前输入 x
可以是 命名输入 通过使用 dict
,但是,输出,y
还不接受任何 dict
。
fit(
x=None, y=None, batch_size=None, epochs=1, verbose=1, callbacks=None,
validation_split=0.0, validation_data=None, shuffle=True, class_weight=None,
sample_weight=None, initial_epoch=0, steps_per_epoch=None,
validation_steps=None, validation_freq=1, max_queue_size=10, workers=1,
use_multiprocessing=False, **kwargs
)
其中,
INPUT, x
= numpy array/list-of-arrays 或张量或字典或生成器。
A dict mapping input names to the corresponding array/tensors, if the model has named inputs.
OUTPUT, y
= numpy 数组或张量,或者当 x 是生成器时未指定。