问题描述
Traceback (most recent call last):
File "/home/visionx/nickle/temp/SimCLR/linear_evaluation.py", line 233, in <module>
plt.scatter(t_sne_embeddings[node_labels == class_id, 0],
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
IndexError: boolean index did not match indexed array along dimension 0; dimension is 128 but corresponding boolean dimension is 49920
原因分析和解决
这个原因到是很好分析:就是索引对不上,indexError嘛,那为什么索引对不上呢?
我们看一下报错信息就知道了,这个错误是和node_labels密切相关的,这个看名字大概能猜出来是对某个内容的标签,其实就是所取数据,那既然是取数据,总有一定的数量对吧,按照cv习惯的处理方法,其实就是分batch进行操作,那结果是什么对不上了呢?我们就得分析整个过程是怎么样的。
我们再进行模型加载,或者预训练模型加载的时候是把批量的特征存储进来的,批量是多少?128,那就和报错信息内容对应上了,那为什么还有一个49920呢?这个时候我们留个心眼除一下就知道了,正好的390,也就是说按照128每batch去取,取了390次正好可以训练一个轮次,在验证的时候是把一个轮次epoch而不是一个批次batch,那明白了这一点就好处理了。
我们把对应部分的代码放到batch里面就可以了
再次运行,就没有这个问题了,当然,如果出现其他问题,就解决其他问题。
bug无处不在,debug至死不渝
扩展阅读
1、很正常的数目对不上
其实这类错误是因为使用布尔类型对具体位置进行索引时,被索引的个数和布尔个数不对应。(a组数列有10个,bool只有6个,因此报错),让二者一致就可以了
2、是因为实际应用的数据集的问题
比如说这个:
完结撒花
我很想你,但我不能告诉你,我不能输了人,还输了阵