【问题标题】:Can't pass validation_data to a model with several inputs in Keras无法将验证数据传递给 Keras 中具有多个输入的模型
【发布时间】:2017-09-08 23:29:38
【问题描述】:

我有一个有两个输入和一个输出的模型:

...
model = models.Model([l_in_wv, l_in_ng], [l_out])
model.compile(optimizer="Adam", loss=loss_fn, metrics=[...], sample_weight_mode="temporal")
model.fit([tokens_wv_j, tokens_ng_j], anno_onehot, validation_split=0.2  verbose=1, epochs=20, batch_size=400, sample_weight=sample_weights, callbacks=[checkpoint])

只要我不尝试将单独的数据集作为validation_data 传递,它就可以很好地训练,例如

model.fit([tokens_wv_j, tokens_ng_j], anno_onehot, validation_data=[[tokens_wv_j_val, tokens_ng_j_val], anno_j_val], verbose=1, epochs=20, batch_size=400, sample_weight=sample_weights, callbacks=[checkpoint])

如果我尝试这样做,模型会立即引发此错误

ValueError: Error when checking target: expected l_out to have 3 dimensions, but got array with shape (131943, 50)

我尝试将我将数据集传递给([tokens_wv_j_val, tokens_ng_j_val], anno_j_val) 或((tokens_wv_j_val, tokens_ng_j_val), anno_j_val) 甚至(tokens_wv_j_val, tokens_ng_j_val, anno_j_val) 的方式更改(这显然是错误的,因为在这种情况下第三个数组被认为是sample_weights),但所有选项只会导致稍微不同的错误消息。是否支持此功能?多输入模型的文档对此一无所知。

【问题讨论】:

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


    【解决方案1】:

    嗯....如果训练有效,您只需要确保这些形状匹配,除了拳头尺寸(批量大小):

    • tokens_wv_j.shape[1:] = tokens_wv_j_val.shape[1:]
    • tokens_ng_j.shape[1:] = tokens_ng_j_val.shape[1:]
    • anno_onehot.shape[1:] = anno_j_val.shape[1:]

    【讨论】:

    • 我认为这并不能真正解决问题,因为所有数组都具有相同的形状(第一个维度除外)。
    • 相信错误信息,它不会说谎。如果它们都具有相同的形状,那么您也无法进行训练。关于anno_onehot 或anno_j_val 的错误消息很清楚。它们的形状都应为(BatchSize,3)。 --- 现在,如果你确实需要它们是(BatchSize,50),那么你必须修改你的模型(如果是这样,我们应该看看它的代码)。
    • 我仔细检查了所有内容,您似乎是对的。谢谢。
    • @DanielMöller 请让我知道您对这个问题的看法:stackoverflow.com/questions/58870350/…。我期待着您的回音。谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 2021-02-07
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    相关资源
    最近更新 更多