TensorFlow训练Fashion-MNIST CNN时标签越界错误排查与解决
问题分析与解决方案
嘿,我一眼就看穿这个-2147483648标签错误的根源了——这完全是pandas索引方式用错导致的锅!
为什么会出现这个奇怪的负标签?
你排查的时候检查了整个标签序列没发现负标签,这很正常,因为原始标签确实没问题。问题出在你批量取标签的步骤上:
- 用
StratifiedShuffleSplit划分数据集后,fmnist_train_df的索引是原数据集索引的子集(比如原数据集是0~59999,划分后训练集的索引可能是[1,3,5,...]这种非连续的),所以fmnist_train_labels这个Series的索引也跟着变成了非连续的原索引。 - 你生成的
rnd_idx是基于训练集样本数的连续整数(0到47999),当你用fmnist_train_labels[rnd_idx_batch]取值时,pandas会把这些连续整数当成标签索引去匹配,而这些数字根本不在fmnist_train_labels的索引里,所以返回的全是NaN。 - 当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
相关产品推荐
相关产品推荐

