PaddleClas
PaddleClas copied to clipboard
请问如何使用paddleclas实现multi-head的模型
您好,我想基于paddleclas实现多head的模型,就是有n个分类头,然后他们共享一个backbone,训练时backbone使用所有的数据迭代,但是每个不同的分类头使用相应的任务数据进行迭代,仍然使用配置文件的方式进行训练,请问大概应该如何修改?
你的意思是比如一次输入n份数据,它们共享同一个backbone,但是出来后需要分别喂给不同的head_i,然后最后针对不同的结果统计出loss训练吗。这样的话可以参考以下代码思路:
class MultiHead(nn.Layer):
def __init__(self, num_heads, **kwargs):
super(MultiHead, self).__init__()
self.num_heads = num_heads
self.fc = [
nn.Linear(...)
for i in range(num_heads)
]
self.fc = nn.LayerList(self.fc)
def forward(self, inputs: list):
# 处理inputs...
out = []
for i in range(self.num_heads):
out.append(self.fc[i](inputs[i]))
return out
你的意思是比如一次输入n份数据,它们共享同一个backbone,但是出来后需要分别喂给不同的head_i,然后最后针对不同的结果统计出loss训练吗。这样的话可以参考以下代码思路:
class MultiHead(nn.Layer): def __init__(self, num_heads, **kwargs): super(MultiHead, self).__init__() self.num_heads = num_heads self.fc = [ nn.Linear(...) for i in range(num_heads) ] self.fc = nn.LayerList(self.fc) def forward(self, inputs: list): # 处理inputs... out = [] for i in range(self.num_heads): out.append(self.fc[i](inputs[i])) return out
感谢您的回复,主要我还是像通过config配置文件的形式来实现这个功能,应该怎么来写配置文件
你的意思是比如一次输入n份数据,它们共享同一个backbone,但是出来后需要分别喂给不同的head_i,然后最后针对不同的结果统计出loss训练吗。这样的话可以参考以下代码思路:
class MultiHead(nn.Layer): def __init__(self, num_heads, **kwargs): super(MultiHead, self).__init__() self.num_heads = num_heads self.fc = [ nn.Linear(...) for i in range(num_heads) ] self.fc = nn.LayerList(self.fc) def forward(self, inputs: list): # 处理inputs... out = [] for i in range(self.num_heads): out.append(self.fc[i](inputs[i])) return out
感谢您的回复,主要我还是像通过config配置文件的形式来实现这个功能,应该怎么来写配置文件
Clas目前应该还没有加入multihead的网络结构,如果你一定要使用的话,可以考虑仿照上面的代码在gears
文件夹中添加multihead.py
然后在__init__.py里声明好,这样在config文件里就能使用了。