Google ML Engine训练后模型保存失败,请求排查
解决Google ML Engine模型保存阶段的UnicodeDecodeError问题
问题根源
从你的错误栈可以明确定位问题:你用文本模式读取了二进制的Keras模型文件(.h5格式)。错误信息里的0x89是HDF5文件的起始字节标识,它不属于UTF-8文本字符范畴,当代码尝试用UTF-8解码读取的内容时,就触发了UnicodeDecodeError。
具体修复方案
修改你代码中的copy_file_to_gcs函数,将文件打开模式从文本模式改为二进制模式即可:
原代码:
def copy_file_to_gcs(job_dir, file_path): with file_io.FileIO(file_path, mode='r') as input_f: with file_io.FileIO(os.path.join(job_dir, file_path), mode='w+') as output_f: output_f.write(input_f.read())
修改后:
def copy_file_to_gcs(job_dir, file_path): with file_io.FileIO(file_path, mode='rb') as input_f: with file_io.FileIO(os.path.join(job_dir, file_path), mode='wb+') as output_f: output_f.write(input_f.read())
为什么这样有效
Keras生成的.h5模型文件是二进制格式的HDF5文件,并非纯文本文件。使用二进制模式(rb/wb+)读写时,代码会直接处理原始字节流,不会自动进行UTF-8编码/解码操作,既避免了编码错误,也能保证文件内容完整复制到GCS存储桶中。
额外说明
虽然你使用的是官方示例代码,但可能在TensorFlow 1.4搭配对应Keras版本的环境下,这个文本模式的细节问题没有被覆盖到。修改为二进制模式后,应该就能顺利完成模型保存和GCS同步的流程了。
内容的提问来源于stack exchange,提问作者Johnathan Brown




