自然语言处理

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

2019-01-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上进行预测。

上一篇 下一篇

猜你喜欢

热点阅读