调用keras.predict()时出现cp950编码错误,求解决方案
问题排查与解决
错误根源分析
这个编码错误并非keras.predict()的计算逻辑问题,而是控制台输出编码不兼容导致的:
- 系统默认控制台编码为CP950(繁体中文编码),而
model.summary()输出包含Unicode字符\u2501(水平细线━),该字符不在CP950编码范围内,触发编码失败。 - 同时存在输入形状不匹配问题:模型第二个输入要求
(None, 93, 128),但你将v2reshape为(1, 93, 128, 1),编码问题解决后会引发新的形状不匹配错误。
解决方案
1. 修复控制台编码问题(优先处理)
在代码最开头添加以下代码,强制Python控制台输出使用UTF-8编码:
import sys import io sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')
2. 修正输入形状不匹配
将v2的reshape代码修改为符合模型输入要求的形状:
# 原错误代码 # v2 = vggish_features.reshape(1, vggish_features.shape[0], vggish_features.shape[1], 1) # 修改为 v2 = vggish_features.reshape(1, vggish_features.shape[0], vggish_features.shape[1])
3. 替代方案(无需修改编码时使用)
如果不需要查看model.summary()的输出,直接注释掉该行,跳过包含特殊字符的打印操作:
# model.summary() # 注释该行以避免触发编码错误
修改后完整代码示例
import sys import io sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8') import keras def record_audio(sr, duration): # 你的音频录制逻辑 pass def process_audio(audio_data, sr): # 你的音频处理逻辑 pass def vggish(audio_data): # 你的vggish特征提取逻辑 pass if __name__ == "__main__": sr = 16000 # 根据实际情况调整采样率 duration = 5 # 根据实际情况调整录制时长 audio_data = record_audio(sr, duration) processed_audio = process_audio(audio_data, sr) print("shape", processed_audio.shape) model = keras.saving.load_model("LSTM_P_CNN//LSTM_P_CNN.keras") print(0) vggish_features = vggish(audio_data).numpy() print(1) print(vggish_features.shape) print("Model Input Shape:", model.input_shape) print("Model Output Shape:", model.output_shape) v1 = vggish_features.reshape(1, vggish_features.shape[0], vggish_features.shape[1], 1) # 修正v2的形状 v2 = vggish_features.reshape(1, vggish_features.shape[0], vggish_features.shape[1]) print(type(v1)) try: model.summary() x = model.predict([v1, v2]) print(x) print(type(x)) except Exception as e: print("An error occurred:", e)
内容的提问来源于stack exchange,提问作者學店魔人
相关产品推荐
相关产品推荐

