Tensorflow: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd5 in position 337: invalid continuation byte
⚡插播一条老家自产的糖心苹果,多个品种,欢迎选购!有问题随时私信我⚡:🍎🍎来自雪域高原的馈赠——海拔2000米的大凉山高原生态糖心苹果,欢迎选购!!🍎🍎
大凉山高原生态糖心苹果
1.软件环境⚙️
Windows10
教育版64位
Python
3.6.3
Tensorflow-GPU
2.5.0
Keras
2.4.3
CUDA
10.1
sacred
0.8.3
2.问题描述🔍
今天在使用Tensorflow
对不同的数据集进行训练时,忽然发现只是修改了数据集的路径,其他的什么也没有改,但是就一直报错:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd5 in position 337: invalid continuation byte
即:
Traceback (most recent calls WITHOUT Sacred internals):
File "E:/Code/Python/tensorflow2.5.0/Classification model evaluation/model_training_sacred.py", line 239, in main
history = train()
File "E:/Code/Python/tensorflow2.5.0/Classification model evaluation/model_training_sacred.py", line 224, in train
class_weight=class_weight)
File "C:\Users\Anaconda3\envs\tf2.5\lib\site-packages\tensorflow\python\keras\engine\training.py", line 1188, in fit
callbacks.on_train_batch_end(end_step, logs)
File "C:\Users\Anaconda3\envs\tf2.5\lib\site-packages\tensorflow\python\keras\callbacks.py", line 457, in on_train_batch_end
self._call_batch_hook(ModeKeys.TRAIN, 'end', batch, logs=logs)
File "C:\Users\Anaconda3\envs\tf2.5\lib\site-packages\tensorflow\python\keras\callbacks.py", line 317, in _call_batch_hook
self._call_batch_end_hook(mode, batch, logs)
File "C:\Users\Anaconda3\envs\tf2.5\lib\site-packages\tensorflow\python\keras\callbacks.py", line 337, in _call_batch_end_hook
self._call_batch_hook_helper(hook_name, batch, logs)
File "C:\Users\Anaconda3\envs\tf2.5\lib\site-packages\tensorflow\python\keras\callbacks.py", line 375, in _call_batch_hook_helper
hook(batch, logs)
File "C:\Users\Anaconda3\envs\tf2.5\lib\site-packages\tensorflow\python\keras\callbacks.py", line 2426, in on_train_batch_end
self._stop_trace()
File "C:\Users\Anaconda3\envs\tf2.5\lib\site-packages\tensorflow\python\keras\callbacks.py", line 2457, in _stop_trace
self._stop_profiler()
File "C:\Users\Anaconda3\envs\tf2.5\lib\site-packages\tensorflow\python\keras\callbacks.py", line 2564, in _stop_profiler
profiler.stop(save=save)
File "C:\Users\Anaconda3\envs\tf2.5\lib\site-packages\tensorflow\python\profiler\profiler_v2.py", line 154, in stop
_profiler.export_to_tb()
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd5 in position 337: invalid continuation byte
这我就改了路径啊?而且之前改路径一点都没有问题,难道是数据集的问题?
3.解决方法🐡
首先,只要路径改回原来的,就不会报错了,那么就可以确定大概率是路径的问题;
再仔细看看接下来的代码有哪些地方使用了该路径:
发现是callback
里面的ModelCheckpoint
和Tensorboard
使用了该路径,由于模型都还没有生成就报错了,那么肯定不会是ModelCheckpoint
的锅,排除!
再通过仔细查看日志,看到主要是profiler_v2.py
这个文件报错,咦,profiler
这个单词有监视器,分析器的意思:
监视器,分析器?那不就是Tensorboard
吗?
综合上面的原因,Tensorboard
有严重的犯罪嫌疑!
然后再返回来看报错:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd5 in position 337: invalid continuation byte
报错主要还是编解码的问题,再看到我自己的路径里面有中文:
model_and_log_path= 'class_weight+img_aug+mixup训练国产分类模型+从俄罗斯红树林抽取少部分红树林,非国产数量远大于国产+按训练集类别比例构造验证集+Xception'
那么八九不离十就是Tensorboard
中因为中文路径带来的问题了,因此数据集的路径不变,尝试将:
TensorBoard(log_dir=os.path.join(model_and_log_path, TIME_STAMP), histogram_freq=1, write_grads=True)
单独修改为不带中文的路径,以便Tensorboard
生成的log
日志能顺利保存:
TensorBoard(log_dir=os.path.join(r'E:\Code\Python\tensorflow2.5.0\Classification model evaluation\model_and_log\test', TIME_STAMP), histogram_freq=1, write_grads=True)
这样的话,应该就没有问题了吧?
4.结果预览🤔
事实也确实如我们所料,训练不报错了,正常运行:
5.后记
通过对比正常训练和报错的log
日志文件,发现报错的log
日志只有1
个文件,正常训练的却7
个文件,足足多了6个文件,应该就是在保存这些文件的时候出错了:
其实Tensorboard
是支持中文路径的,因此之前也是中文路径也是能正常训练的,但如果是中文路径而且文件夹文字又很长的话,还是可能会有BUG
出现,因此以后还是用英文当路径吧!
这篇文章主要还是讲Debug
的思路,具体问题不重要,重要的是遇到问题,怎么分析,怎么解决,我觉得这个能力可能比问题本身更重要!
渣男!都看到这里了,还不赶紧点赞
,评论
,收藏
走一波?