调用Tensorflow 模型时报错:‘UnicodeEncodeError: ‘utf-8’ codec can’t encode character ‘\udcd5’ in position 2612: surrogates not allowed’
解释:
由于实验室服务器GPU算力有限,在训练深度网络时借助了谷歌的Colaboratory,这样训练好的模型需要先保存在谷歌云盘上,然后再下载到本地。当直接调用下载来的模型时,会报错:
'UnicodeEncodeError: 'utf-8' codec can't encode character '\udcd5' in position 2612: surrogates not allowed'
在网上看了很多关于这方面报错的解释,基本都说是路径问题。后面发现确实时路径的问题,但不是下面两行代码中的路径问题:
saver = tf.train.import_meta_graph(modelpath + 'model-40.meta')
saver.restore(sess, tf.train.latest_checkpoint(modelpath))
而是模型文件夹中,checkpoint 文件中的路径问题。
TensorFlow 预训练好的模型被保存为以下四个文件:
- xxx.ckpt.meta保存了计算图结构,
- xxx.ckpt.data保存了所有变量的取值,
- xxx.ckpt.index保存了所有变量名
- checkpoint 则是所有模型的保存路径。
以记事本的方式打开checkpoint 文件,修改该文件中的路径为实际路径(各层文件夹需要用双反斜杠隔开),即可成功调用模型。
总结:
tensorflow的各种api调用确实方便,但很多方面不了解,反而会绕很多弯路,所以平时除了会用,还要尽量明白方法和原理。