-
Notifications
You must be signed in to change notification settings - Fork 33
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
PLSC多个数据集训练loss问题 #58
Comments
能把组网代码也大体贴一下吗? |
@sandyhouse 主要想通过下面3个函数实现对不同数据集采用对应的分类层,实现同一网络的联合训练
|
多出OP的原因是:为第一个loss调用backward会在program自动插入反向操作(OP),此时的program成为program1;为第二个loss调用backward会在program1的基础上插入反向操作(OP),所以会多出很多OP。我考虑下这种场景需求怎么可以满足。 |
好的,多谢。我在很多应用场景都要用到多种数据源来联合训练。你们做的联邦学习PaddleFL也会使用不同数据源训练不同任务 |
想到一个比较粗糙的方案,为不同的数据集构建不同的program(结合使用with program_guard和unique_name),这样在作反向的时候相当于只对各自loss对应的program执行相应操作。 |
@sandyhouse 好的,我先试试,到时候再请教 |
请问你的问题是否解决 @gobigrassland |
@sandyhouse 有两个思路: 您还有其他更好的解决办法没? |
目前看还是觉得这种方案比较简单一些,但不知道实现中是否存在其它问题。 |
我开始也看program_guard和unique_name的API,可能对这些理解不到位,还是没有实现您说的。我这段时间再试一试这种方法。如果您方便的话,可不可以给我写个简单的示例,我参考一下 |
PLSC很好解决大规模分类训练。实际模型训练会使用多个数据集,而且这些数据集存在不同程度id重叠,而清理这些数据集间重叠id也比较麻烦。于是训练时采用多个数据集输入,模型主干网络参数共享,针对各个数据集有各自的分类层。目前PLSC代码中
shard_logit = loss._get_info('shard_logit‘)
shard_prob = loss._get_info('shard_prob’)
shard_label = loss._get_info('shard_label‘)
shard_dim = loss._get_info('shard_dim’)
大体上通过这块实现大的分类层权重分拆到多个GPU中(这里描述不准确)。
针对多个分类的连接权重,现在的PLSC代码就不能处理了。我对plsc/model/dist_algo.py中minimize函数进行修改,大概修改为如下形式:
希望能针对不同分支的分类loss分别求梯度,然后再进行各个分支的梯度聚合操作,但是发现不同数据集对应的分支,op就有很大差异。之前我在tensorflow中实现的,只有最后各个分类层参数不一样也不需共享,因此可以对共同的参数梯度比如取一个均值然后再更新。我实验中,以webface和vggface2为例,发现这两个分支对应op差异很大。其中一个比另一个分支多了很多op
多出的部分op:
上面是使用多个数据,针对不同数据集使用不同分类层来联合训练。不过遇到上面问题,希望能给个建议
The text was updated successfully, but these errors were encountered: