复现代码又双叒出bug啦,不管能不能解决,先记录一下。
IGD代码 windows 运行 p256 下ssim_main.py 报如下警告且 AUC 数值为 NAN:
\lib\site-packages\sklearn\metrics\_ranking.py:1124: UndefinedMetricWarning: No negative samples in y_true, false positive value should be meaningless warnings.warn(
chatgpt解释:
这个警告信息是来自 scikit-learn 库的
metrics._ranking.py
模块。警告的具体内容是:在y_true
中没有负样本,因此假正例的值可能没有意义。这个警告通常出现在使用二分类评估指标(如准确率、精确率、召回率等)时,当真实标签
y_true
中只包含正样本而没有负样本时,会触发这个警告。警告的含义是,由于没有负样本,因此计算假正例(False Positive)的值在这种情况下可能没有实际意义,因为没有负样本可以判断。这是一个正常的警告,是 scikit-learn 库为了提醒用户注意的机制。
如果你的任务是二分类问题,并且你确定在计算评估指标时只有正样本存在,你可以忽略这个警告。但如果你期望在评估中同时考虑正负样本,可以尝试修改数据集或调整模型,以便包含负样本。
确实是一个仅依赖正样本学习,进行正负样本检测的一个无监督模型。通过前2篇文章提到的方法 打断点进行调试,发现库函数 auc 的有一个输入 已为 NAN 。
继续向前排查:调用的库函数 roc_curve 输入正常,y为长度为83的全1向量,score为长度83的小数向量(0-1之间)。
尝试运行p32的 ssin_main.py 打断点在同样位置,看是否出现同样问题,结果,还没运行到断点报新错!
AssertionError: Image size should be larger than 32 due to the 4 downsamplings in ms-ssim
发现这个模型的GitHub仓库下面有该问题的讨论:
https://github.com/tianyu0207/IGD/issues/5
解决方案如下:(将 batch size 和 max epoch 都设置为1,加快代码测试速度)
问题解决了,又出现新的问题 ==
OSError: [WinError 1455] 页面文件太小,无法完成操作
解决方案是收到下面这篇博文启发:
pytorch训练报OSError: [WinError 1455] 页面文件太小,无法完成操作_页面文件太小,无法完成操作-CSDN博客
博主提到了 num_workers 这个参数,我发现我运行的代码里果然有该参数,而且之前调试的时候我能够看到程序狂开线程,但是一直找不到哪里控制线程,好家伙,被我找到了:
根据chatgpt:
在深度学习中,
num_worker = 12
可能指的是并行处理的工作线程数量。在深度学习中,训练和推断(inference)过程通常需要处理大量的数据和计算量,而使用多个工作线程可以加快处理速度并提高效率。
根据这篇文章:训练代码中num_worker的设置_num_workers-CSDN博客
作者说这个超参数按 2、4、6……这样调,直到最大cpu最大核心数,调到表现最好即可,参数初始为12,我调成2,不会报页面太小的错误了。最大核心数使用下面的python代码打印,我是16。
import multiprocessing
num_cores = multiprocessing.cpu_count()
print(num_cores)
世界线收束,p32 还是出现了 AUC 数值为 NAN 的情况,虽然能够正常训练:
明明之前linux系统系统运行有AUC数值,见碎碎念。猜测可能是 sklearn 这个第三方包的实现有所差别?
更新:经过排查,y为长度为83的全1向量,在ROC的计算中确实是异常的,二分类中计算ROC,标签不能全部一样,问题出在 y 的生成代码中:
该段代码在循环中代表,若当前图像的文件夹名称为 good 时,将其标签设置为0,否则设置为1,但是明显 y 的所有值都为1,包括在处理 good 文件夹时,所以该变量并没有识别出文件夹的名字,经过调试 label[0] 的值一直为 ['test'],将其替换为 current_defect 变量即可正常计算出 AUC。(还得是本机跑代码,可以调试监测变量值,云服务器暂时还没好的解决方案,后续试出来了再记录)
大乌龙事件!碎碎念,后面可不看,仅做个人记录:明明之前使用 linux服务器的时候完全没这问题,但是现在同样的代码+数据,换到windows系统打印出来的东西完全不一样,令人迷惑。
服务器应该是ubuntu系统,显卡信息如下:
打印出的信息:
现在使用的windows 10专业版,显卡信息如下:
打印出的信息:
打印多次 ”Divice……“,大概是因为并行计算开了很多进程,但不明白为什么只有windows会这样,可能并行库函数的实现不同?之前也没有保存linux系统的环境,只能见招拆招了。
其实因为运行的不是一个py文件,linux上运行的是p32下的main文件,windows上运行的是p256上的文件!==