使用CSVLogger时出错:'utf-8'编解码器无法解码第144个位置的0x92字节:无效的起始字节。
使用CSVLogger时出错:'utf-8'编解码器无法解码第144个位置的0x92字节:无效的起始字节。
我在网络训练中尝试使用CSVLogger,但是在每个epoch结束时遇到以下错误:
2022-06-05 12:55:34 - ERROR - 'utf-8'编解码器无法解码位置144的字节0x92:无效的起始字节 追溯如下:
File "D:\Users\Username\project\simulations\trainer.py",第188行,在train_network函数中
history = compile_and_fit(
File "D:\Users\Username\project\neural\neural_utils.py",第77行,在compile_and_fit函数中
history = model.fit(
File "D:\Users\Username\project\venv\lib\site-packages\keras\utils\traceback_utils.py",第67行,在error_handler函数中
raise e.with_traceback(filtered_tb) from None
File "C:\Python39\lib\csv.py",第143行,在writeheader函数中
return self.writerow(header) File "C:\Python39\lib\csv.py",第154行,在writerow函数中
return self.writer.writerow(self._dict_to_list(rowdict))
UnicodeDecodeError:'utf-8'编解码器无法解码位置144的字节0x92:无效的起始字节
我的系统信息如下:
- 系统:Windows 11
- Tensorflow版本:2.9.1
- Python版本:3.9
这是我的实现:
early_stopping = tf.keras.callbacks.EarlyStopping( monitor='val_loss', patience=5, mode='min', restore_best_weights=True ) csv_logger = tf.keras.callbacks.CSVLogger( Path(output_files_directory, 'training.csv'), separator=',', append=False ) model.compile( loss=tf.losses.MeanSquaredError(), optimizer=tf.optimizers.SGD(nesterov=True), metrics=[tf.metrics.MeanSquaredError(), tf.metrics.Accuracy()] ) # 打印模型摘要 print('模型摘要:') model.summary() history = model.fit( window.train, epochs=nb_epochs, validation_data=window.val, callbacks=[ early_stopping, cp_callback, csv_logger ] )
请注意,输出路径中包含空格(我无法更改输出路径,它由之前的脚本固定)。例如,在之前的脚本中,`output_files_directory`等于`D:\trained_data\output\16 bits - Original - 1.25MHz\LSTM_32`。
最近在使用tf.keras.callbacks.CSVLogger时遇到了一个问题,错误信息为"Error using CSVLogger: 'utf-8' codec can't decode byte 0x92 in position 144: invalid start byte"。经过一番调查,我发现了问题的原因并找到了解决方法。
问题的根源在于输出目录不存在。在使用tf.keras.callbacks.ModelCheckpoint这样的回调函数时,如果输出目录不存在,它会自动创建该目录。但是对于tf.keras.callbacks.CSVLogger来说,它没有这样的功能。
解决该问题的方法很简单,只需手动创建输出目录即可。以下是一个示例代码,演示了如何解决这个问题:
import os import tensorflow as tf # 创建输出目录 os.makedirs('logs', exist_ok=True) # 定义CSVLogger回调函数 callbacks = [ tf.keras.callbacks.CSVLogger('logs/log.csv') ] # 编译和训练模型 model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train, epochs=10, callbacks=callbacks)
在这个示例中,我们通过os.makedirs函数创建了一个名为logs的目录,并将其传递给tf.keras.callbacks.CSVLogger。这样,当CSVLogger尝试写入日志文件时,就不会再出现"Error using CSVLogger"的错误了。
总结一下,当使用tf.keras.callbacks.CSVLogger时,如果输出目录不存在,就会出现该错误。解决这个问题的方法是手动创建输出目录。希望这篇文章能帮助到遇到相同问题的人们。