训练模型后,想着测试模型效果,模型加载遇到以下问题,😭不修改测试代码,报错居然还不一样。
InvalidArgumentError (see above for traceback): Assign requires shapes of both tensors to match. lhs shape= [64] rhs shape= [4,128,1,64]
InvalidArgumentError (see above for traceback): Assign requires shapes of both tensors to match. lhs shape= [192,6126] rhs shape= [64]
模型加载代码如下
X=tf.placeholder(dtype=tf.int32,shape=[None,42])
# Y=tf.placeholder(dtype=tf.int32,shape=[None, 6126])
output=interface(X)
saver=tf.train.Saver()
with tf.Session() as sess:
saver.restore(sess, "H:/NLP/NLP/own_textcnn_1/model/textcnn_model-0")
主要是以下几个问题导致了bug的产生:
1、测试与训练的输入不同,确保
X=tf.placeholder(dtype=tf.int32,shape=[None,42])
这段代码与训练一致
2、模型保存文件夹中的checkpoint与当前模型不匹配,确保模型加载正确,保存的模型是完整的。
3、训练代码问题,无论定义函数还是分成网络结构、训练代码、测试代码来编写程序是非常有必要的。训练代码中全局变量尽量保证只有embedding_size、dropout_keep_prob、num_filters这些必要参数,并指定确切的数字。我将get_batch()函数也放在训练代码中,为了方便将数据的读取就当作全局变量,embedding_size、dropout_keep_prob、num_filters的取值有些就直接是len(x),这种操作我感觉会tf.train.Saver()会保存一些错误或者全局信息进入模型,导致维度不匹配的情况出现。在测试代码没变的情况下,修改了训练代码模型,将全局变量全部纳入某些函数中程序就调通了,证明就是训练出现的问题。