从零搭建多分类神经网络 One-hot自定义函数报字符串拼接错误
One-Hot编码函数报错排查与修复
报错根因
你遇到的can only concatenate str (not "int") to str错误,触发点在原函数的Y.max() +1代码行:
- 该代码默认参数Y是存储整数类别的数值型numpy数组,但实际传入的Y包含字符串类型的标签值
- 当Y为字符串数组时,
Y.max()会返回字典序排序后的字符串类型最大值,此时直接对字符串做加整数的运算,就会直接触发类型不匹配的报错,和报错堆栈完全对应。
原函数的核心逻辑在输入为连续整数标签的场景下是可正常运行的,问题完全来自输入数据类型和函数预期的不匹配。
修复方案
调整函数逻辑,兼容字符串类标签的输入场景,同时规避非连续整数标签带来的矩阵冗余问题,修正后的函数代码如下:
import numpy as np def one_hot(Y): # 统一转换输入为numpy数组,兼容列表类输入格式 Y = np.asarray(Y) # 对所有类别标签做去重排序,建立标签到0起始整数的映射 unique_classes = np.unique(Y) label_to_idx = {cls: idx for idx, cls in enumerate(unique_classes)} # 将原始标签批量转换为映射后的整数索引 mapped_labels = np.array([label_to_idx[label] for label in Y]) # 按照映射后的标签维度生成one-hot矩阵 one_hot_mat = np.zeros((mapped_labels.size, len(unique_classes))) one_hot_mat[np.arange(mapped_labels.size), mapped_labels] = 1 # 按照原函数的维度要求做矩阵转置,适配神经网络前向传播的形状要求 return one_hot_mat.T
排错与注意事项
- 原函数仅适配输入标签为0起始连续整数的场景,如果传入的整数标签非连续(比如类别值为1、5、9),哪怕数据类型为数值,原函数生成的one-hot矩阵也会出现大量无意义的全零列,和实际类别数不匹配。修复后的版本会自动根据实际的去重类别数生成对应维度的矩阵,彻底规避该问题。
- 定位问题时可在调用函数前增加单行校验:运行
print(Y.dtype),如果输出为object或<U*这类字符串类型标识,就会触发你遇到的类型报错,必须使用上述兼容字符串标签的版本。
内容的提问来源于stack exchange,提问作者abdulrhman fuw
相关产品推荐
相关产品推荐

