美文网首页自然语言处理
多输入时model.fit中validation_data参数设

多输入时model.fit中validation_data参数设

作者: 京漂的小程序媛儿 | 来源:发表于2019-01-16 21:16 被阅读0次

    错误提示:

    ValueError: Error when checking model input: the list of Numpy arrays that you are passing to your model is not the size the model expected. Expected to see 3 array(s), but instead got the following list of 1 arrays: [array([[1245,  177, 2587, ..., 1057,  962, 1057],

    报错语句:

    model.fit(x=[x_content_train, x_syntax_train, x_depth_train], y=y_train,

                  batch_size=batch_size, epochs=nb_epoch,

                  validation_data=([x_content_test, x_syntax_test, x_depth_test], y_test),

                  callbacks=[metrics, checkpoint])

    并没有解决问题的纠结:

    1.以为是格式写错了,换成字典方式传入Input,照旧报错。

    model.fit({'content_input':x_content_train,'syntax_input':x_syntax_train,'depth_input':x_depth_train}, y_train,

                  batch_size=batch_size, epochs=nb_epoch,

                  validation_data=({'content_input':x_content_test,'syntax_input':x_syntax_test,'depth_input':x_depth_test}, y_test),

                  callbacks=[metrics, checkpoint])

    2.以为是validation_data的错,结果换成validation_split=0.3也一样的错误。

    debug

    网上查了很多资料,两个小时都没有解决,无解,自己debug代码吧:

    1.首先确认是验证集的问题,证据如下:

    a.在每个epoch训练时都是正常的,但是在每个epoch结束做验证时就报错,所以应该是验证集的问题。

    b.在model.fit语句中去掉validation相关项+callbacks,是可以正常运行的。

    即model.fit(x=[x_content_train, x_syntax_train, x_depth_train], y=y_train,

                  batch_size=batch_size, epochs=nb_epoch)

    c.打印出所有的input:包括train和test部分,对比一下错误提示中的数组,看到底是得到了哪一个,哪两个丢了。

    结果发现,得到的是第一个input,后面两个丢了。

    print x_content_test:

    [[1850 1047 1197 ... 2220 1189  788]

    [2106 2458 1655 ... 1057  962 1057]

    [ 423 1490  919 ... 2451  482  788]

    ...

    [1599 2602 1731 ... 1057  962 1057]

    [ 369 1197 1412 ... 1057  962 1057]

    [  85 1966 2757 ...  788 1057 1057]]

    error get only on array as:

    [array([[1850, 1047, 1197, ..., 2220, 1189,  788],

          [2106, 2458, 1655, ..., 1057,  962, 1057],

          [ 423, 1490,  919, ..., 2451,  482,  788],

          ...,

          [1599, 2602, 1731, ..., 1057, ...

    解决方案:

    没找到多输入时model.fit中设置validation_data的例子,而且用validation_split也一样是错的,但是验证集又是必须用的,所以后来我就把多输入改成单输入了,其实就是在输入之前先拼接,输入之后再拆分,费点功夫而已,单输入时validation_data是没问题的。

    参考链接:

    https://www.jianshu.com/p/0c7af5fbcf72 作者:赤乐君

    首先Keras的fit函数中,传入的validation data并不用于更新权重,只是用是来检测loss和accuracy等指标的。但是!作者说了,即使模型没有直接在validation data上训练,这也会导致信息泄露,模型会对validation data逐渐熟悉。所以这里我简单总结一下比较方便的data split方法。

    第一步:调参

    1、用sklearn的train_test_split来把数据分割为training data和test data.(根本没有validation data注意了)

    2、用keras的model.fit()时,不要使用validation_data这个参数,而是直接使用validation_split这个参数,把training data中的一部分用来作为validation data就行了。

    必须在validation data上进行验证,输出loss,观察变化,调参,包括:更改layer,unit,加dropout,使用L2正则化,添加新feature等等。

    第二步:训练

    等调参结束后,拿着我们满意的参数,再一次在整个training data上进行训练,这一次就不用validation_split了。因为我们已经调好了参数,不需要观察输出的loss。

    训练完之后,用model.evaluate()在test data上进行预测。

    相关文章

      网友评论

        本文标题:多输入时model.fit中validation_data参数设

        本文链接:https://www.haomeiwen.com/subject/bnhvdqtx.html