yangze0930 / NTS-Net

This is a PyTorch implementation of the ECCV2018 paper "Learning to Navigate for Fine-grained Classification" (Ze Yang, Tiange Luo, Dong Wang, Zhiqiang Hu, Jun Gao, Liwei Wang).
MIT License
450 stars 118 forks source link

测试问题!!! #31

Open gengyanlei opened 5 years ago

gengyanlei commented 5 years ago

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

jackymoo commented 5 years ago

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

gengyanlei commented 5 years ago

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

jackymoo commented 5 years ago

恩恩,好的。感谢!

ZF4444 commented 5 years ago

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

gengyanlei commented 5 years ago

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

RunshengZhu commented 4 years ago

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

gengyanlei commented 4 years ago

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

gengyanlei commented 4 years ago

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

RunshengZhu commented 4 years ago

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

gengyanlei commented 4 years ago

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

gengyanlei commented 4 years ago

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

RunshengZhu commented 4 years ago

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

gengyanlei commented 4 years ago

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

gengyanlei commented 4 years ago

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

RunshengZhu commented 4 years ago

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

gengyanlei commented 4 years ago

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

mo-vic commented 4 years ago

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

ZF4444 commented 4 years ago

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

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

gengyanlei commented 4 years ago

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

lunchben commented 4 years ago

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

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

boxyao commented 4 years ago

对的,是Dropout的问题