TensorFlow训练报错ValueError:无法将NumPy数组转为Tensor求助
问题原因和修复方案
1 核心错误:npz读写逻辑导致输入数据结构/类型不合法
你在生成npz文件时用*p将样本列表展开为多个独立参数传入np.savez_compressed,等价于把每个样本的矩阵单独存储为npz下的独立数组,读取时.values()得到的是多个零散数组组成的可迭代对象,转列表后puzzle_train是元素为独立矩阵的列表,且因为开启allow_pickle=True整体dtype为object,TensorFlow无法将这种结构直接转换为Tensor,触发报错。
修复方案有两种,二选一即可:
- 方案A:优化npz生成逻辑,直接存整组数(更推荐,读写效率更高)
修改生成代码:
def dataConverter(): for file in range(2, 13, 2): filename = "data/puzzle_data%s.csv" % file data = pd.read_csv(filename, header=None) p = [] for i in range(data.shape[0]): if (i % 500 == 0): print(i) puzzle = pr(data[0][i], data[1][i], data[2][i].split(" ")) p.append(puzzle.get_matrix_representation()) # 新增:先把样本列表转成统一维度的大数组 p = np.array(p) np.savez_compressed("data/matrix_rep%s" % file, data=p)
对应修改读取代码:
# 直接读取整组数据,不需要拼接 puzzlesdb = np.load("data/matrix_rep%s.npz" % num, allow_pickle=True)['data'] puzzle_train = puzzlesdb[:train_ind]
- 方案B:不修改生成逻辑,只修改读取逻辑,手动拼接样本
puzzlesdb = np.load("data/matrix_rep%s.npz" % num, allow_pickle=True) # 按存储的key读取所有样本,拼接为统一数组 all_puzzles = np.array([puzzlesdb[k] for k in puzzlesdb.keys()]) puzzle_train = all_puzzles[:train_ind]
2 次要可能错误:标签类型不兼容
你当前传入的train_labels是pandas Series类型,部分TensorFlow版本对pandas自定义类型适配有问题,建议转成NumPy数组再传入:
puzzle_labels = pd.read_csv("data/puzzle_data%s.csv" % num, names=["fen", "moves", "labels"]).pop("labels") train_labels = puzzle_labels.head(train_ind).values
3 可选检查项
如果修改后仍报错,检查puzzle.get_matrix_representation()的返回值,确认所有返回结果都是数值类型的数组,没有None、字符串、类对象等非数值返回,单个样本类型异常会导致整个数组的dtype被推导为object,同样会触发转换失败。
内容的提问来源于stack exchange,提问作者Schtew
相关产品推荐
相关产品推荐

