You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TensorFlow训练Fashion-MNIST CNN时标签越界错误排查与解决

问题分析与解决方案

嘿,我一眼就看穿这个-2147483648标签错误的根源了——这完全是pandas索引方式用错导致的锅!

为什么会出现这个奇怪的负标签?

你排查的时候检查了整个标签序列没发现负标签,这很正常,因为原始标签确实没问题。问题出在你批量取标签的步骤上:

  1. 用StratifiedShuffleSplit划分数据集后,fmnist_train_df的索引是原数据集索引的子集(比如原数据集是0~59999,划分后训练集的索引可能是[1,3,5,...]这种非连续的),所以fmnist_train_labels这个Series的索引也跟着变成了非连续的原索引。
  2. 你生成的rnd_idx是基于训练集样本数的连续整数(0到47999),当你用fmnist_train_labels[rnd_idx_batch]取值时,pandas会把这些连续整数当成标签索引去匹配,而这些数字根本不在fmnist_train_labels的索引里,所以返回的全是NaN。
  3. 当TensorFlow把这些NaN转换成int32类型时,NaN就会被强制转成int32的最小值-2147483648,这就触发了“标签超出范围”的错误。

怎么修复?

有两种简单的办法,随便选一个都能解决问题:

办法1:把标签转成numpy数组

在获取标签的时候,直接用.values转成numpy数组,这样后续用位置索引取值就不会有问题了:

# 修改标签获取的代码
fmnist_train_labels = fmnist_train_df.label.values
fmnist_validation_labels = fmnist_validation_df.label.values

办法2:用iloc按位置取数

如果想保留pandas Series的格式,那在批量取标签的时候用iloc来指定位置索引:

# 修改训练循环里的批量取值代码
X_batch, y_batch = fmnist_train_images.values[rnd_idx_batch], fmnist_train_labels.iloc[rnd_idx_batch].values

另外给你提个小建议:你现在每一轮epoch的每个batch都打印日志,输出会特别多,把epoch % 1改成epoch % 5或者更大的数,能减少冗余输出,看起来更清爽~

内容的提问来源于stack exchange,提问作者Jobie J

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:25:47