错误提示:
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上进行预测。