使用CSVLogger时出错:'utf-8'编解码器无法解码第144个位置的0x92字节:无效的起始字节。

11 浏览
0 Comments

使用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`。

0
0 Comments

最近在使用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时,如果输出目录不存在,就会出现该错误。解决这个问题的方法是手动创建输出目录。希望这篇文章能帮助到遇到相同问题的人们。

0