NTS-Net icon indicating copy to clipboard operation
NTS-Net copied to clipboard

测试问题!!!

Open gengyanlei opened this issue 4 years ago • 21 comments

你好: 我发现你的网络训练完成后,仅适用于特征分布适合的数据集,意思是仅适合本数据集,无法迁移,因为针对同一张图片,你的网络预测特征向量是每次都变化的,导致预测结果,每次都不一样。

gengyanlei avatar Aug 27 '19 11:08 gengyanlei

我也发现了这个问题,请问有什么解决办法吗?

jackymoo avatar Sep 04 '19 12:09 jackymoo

@jackymoo 抱歉,我在好几个数据集上训练好的,然后测试没有发现,后面做泛化检查时,才发现,过去了3周。郁闷,才发现是变化的。这个原因应该是它的anchor机制造成的。我没有弄明白这个机制,所以也就没办法解决,感觉这种模型是最坑的,错还错的不一样。果断放弃,你可以试试其它的,只要那些在网络中完成定位实现局部特征提取的,这样测试时不会出现变化。

gengyanlei avatar Sep 05 '19 06:09 gengyanlei

恩恩,好的。感谢!

jackymoo avatar Sep 05 '19 07:09 jackymoo

@gengyanlei ,你好,我最近也在看这个,我没有理解你们两的意思,同一张图片特征向量怎么会是不同的呢?那这样的话他提供的pth每个人跑的精度也会不同吧。

ZF4444 avatar Sep 09 '19 11:09 ZF4444

@ZF1044404254 ,你好,你可以直接下载他的模型,然后在CUB上测试,输出一下预测概率,可以看出每次都是变化的。

gengyanlei avatar Sep 12 '19 11:09 gengyanlei

@gengyanlei @ZF1044404254 @jackymoo 这个是pytorch的锅,在代码里设置一下torch的随机数种子就可以保证每次输出一致了 np.random.seed(seed) torch.manual_seed(seed) torch.cuda.manual_seed(seed)

RunshengZhu avatar Oct 23 '19 08:10 RunshengZhu

@RunshengZhu 谢谢了,我重新看一下代码,然后重新训练一下。

gengyanlei avatar Oct 25 '19 06:10 gengyanlei

@RunshengZhu 你好,我检查了一下代码,没发现有随机数的使用呢!请问这个在哪里设置呢?还是将这3行代码复制在主函数最上面呢?

gengyanlei avatar Oct 25 '19 09:10 gengyanlei

@gengyanlei 代码里没有,定一个seed值比如2019,放到主函数最上面就可以了,pytorch内部函数里会有随机部分,比如bn

RunshengZhu avatar Oct 25 '19 09:10 RunshengZhu

@RunshengZhu seed=5 np.random.seed(seed) torch.manual_seed(seed) torch.cuda.manual_seed(seed) 如果训练时不放这3行代码,测试时放到测试代码里面,我发现预测结果还是变化的,每次类别都不一样。

gengyanlei avatar Oct 25 '19 10:10 gengyanlei

@RunshengZhu 针对同一张图片,反复输出结果,在代码最前面已经写了这三行代码了。结果如下: tensor([11.4219], device='cuda:0', grad_fn=<MaxBackward0>) tensor([271], device='cuda:0') tensor([12.3799], device='cuda:0', grad_fn=<MaxBackward0>) tensor([271], device='cuda:0') tensor([12.5087], device='cuda:0', grad_fn=<MaxBackward0>) tensor([271], device='cuda:0') tensor([11.5199], device='cuda:0', grad_fn=<MaxBackward0>) tensor([271], device='cuda:0') tensor([11.6220], device='cuda:0', grad_fn=<MaxBackward0>) tensor([271], device='cuda:0') tensor([11.7060], device='cuda:0', grad_fn=<MaxBackward0>) tensor([272], device='cuda:0') tensor([11.4901], device='cuda:0', grad_fn=<MaxBackward0>) tensor([272], device='cuda:0') tensor([13.1230], device='cuda:0', grad_fn=<MaxBackward0>) tensor([272], device='cuda:0') tensor([13.0418], device='cuda:0', grad_fn=<MaxBackward0>) tensor([272], device='cuda:0') tensor([10.6846], device='cuda:0', grad_fn=<MaxBackward0>) tensor([272], device='cuda:0')

gengyanlei avatar Oct 25 '19 10:10 gengyanlei

@gengyanlei os.environ['PYTHONHASHSEED'] = str(seed) torch.backends.cudnn.deterministic = True 可以再加这两句试试,再有变化就不清楚了,我这里是ok的

RunshengZhu avatar Oct 28 '19 01:10 RunshengZhu

不小心close了issue,┭┮﹏┭┮

gengyanlei avatar Oct 28 '19 02:10 gengyanlei

好吧,在CUB上面,如果按照你的设置,应该是不会有太大变化的;但是我的测试集和训练集有较大差距时,如果是其它模型都固定好参数了,那么预测结果也是固定的,即使效果很差;但是,这个NTS就不是这样的,我用的其它的模型也使用了cudnn了,也是同样的pytorch版本,预测结果就没有问题。

gengyanlei avatar Oct 28 '19 03:10 gengyanlei

@gengyanlei 我用自己的数据train的model也没问题,开了cudnn结果也一样

RunshengZhu avatar Oct 28 '19 03:10 RunshengZhu

@RunshengZhu 我这是之前训练模型,没有设置这些参数,然后测试时在前面加了你说的这几行代码,结果仍然是变化的。我无语了,我在这个数据集上训练的,在另一个数据集上测试,结果就变化。 算了,反正这个模型 资源消耗和WS-DAN 一样,都很大,被pass了。 谢谢你了。

gengyanlei avatar Oct 28 '19 06:10 gengyanlei

难道不是nn.Dropout的问题吗?

mo-vic avatar Dec 09 '19 03:12 mo-vic

难道不是nn.Dropout的问题吗?

对,应该是这个问题,代码中resnet网络的代码作者在最后直接使用nn.dropout(p=0.5)(x),这回导致在测试阶段,虽然加了 net.eval(),但是dropout依然会生效,所以结果不固定

ZF4444 avatar Dec 09 '19 06:12 ZF4444

@mo-vic 十分感谢,没有发现这个问题。以为它使用的是pytorch的官方代码呢,没想到还做了一点改变。测试过了,发现的确如此。 如果在forward里面,使用nn.dropout 或者 F.dropout 都会导致输出结果的不一致。 建议在__init__里面创建 self.dropout = nn.Dropout()

gengyanlei avatar Dec 11 '19 02:12 gengyanlei

@jackymoo 抱歉,我在好几个数据集上训练好的,然后测试没有发现,后面做泛化检查时,才发现,过去了3周。郁闷,才发现是变化的。这个原因应该是它的anchor机制造成的。我没有弄明白这个机制,所以也就没办法解决,感觉这种模型是最坑的,错还错的不一样。果断放弃,你可以试试其它的,只要那些在网络中完成定位实现局部特征提取的,这样测试时不会出现变化。

你好,我在训练自己的数据集的时候出现了SyntaxError: not a TIFF file (header b'' not valid)这个错误,我的图片格式都是jpg的,并且为了方便调试代码数据集格式直接仿照CUB_200_2011的目录结构分配的,请问我哪里有问题能指点一下吗谢谢啦。

lunchben avatar Dec 24 '19 16:12 lunchben

对的,是Dropout的问题

boxyao avatar Feb 06 '20 02:02 boxyao