我在进行LSTM网络模型训练的时候,dataloader迭代时候报错KeyEorror:7458
当我看回溯的时候,我发现问题是出现在dataloader这里,再追溯根源,出现在__getitem__的这个方法里面
知道问题的来源,我就开始去试着从源头去解决问题,对于这个数据的预处理,我是自己定义了一个类Dataset的子类来让dataloader可以直接对数据进行迭代
从这段代码可以看到在__getitem__方法中,对于text_array的迭代是没有问题,但是对于label_array的迭代是有问题,为什么会这样呢?抱着这个问题,我开始寻找两个数据的区别,经过我不断调试和观察我终于找到问题所在
这里是我传进去的text_array
这里是我传进去的label_array
大家有发现什么区别没,对!一个是np数据,一个是pandas数据的series类型。回到我创建的Dataset子类
可以看到我的__getitem__中无论是对np数据,还是pd数据,我都是用data[]的方式对数据进行迭代,这样子是有问题,牵扯到python的基础语法。
对于pd.series数据
对于pd.series数据,它是有两部分组成。一个是索引,一个是值(类似于字典中键值对形式),当我用data[]的方式去迭代的时候,它是按照索引对应去迭代的,也就是说我之前的报错KeyError:3571是因为在我的pd数据中没有3571这样的索引值。
如果我想要取下标为2的数据,就会报错KeyError:3571
对于np数据(数组)
np数据,没有类似于pd.series数据的索引和值。它只有值,或者说它的索引就是它的下标。简单来说,就是一个数组,所以它可以直接按照下标取值。
解决办法(两种)
- 将pd数据转为 np数据
s=s.values #取走pd数据中的值,得到的就是np数据了
- 用data.iloc[]格式对pd数据进行取值,同样可以不按照pd数据索引进行取值,可以按照下标进行取值