PaddleClas icon indicating copy to clipboard operation
PaddleClas copied to clipboard

请问如何使用paddleclas实现multi-head的模型

Open xywlpo opened this issue 2 years ago • 3 comments

您好,我想基于paddleclas实现多head的模型,就是有n个分类头,然后他们共享一个backbone,训练时backbone使用所有的数据迭代,但是每个不同的分类头使用相应的任务数据进行迭代,仍然使用配置文件的方式进行训练,请问大概应该如何修改?

xywlpo avatar May 17 '22 02:05 xywlpo

你的意思是比如一次输入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

HydrogenSulfate avatar May 17 '22 12:05 HydrogenSulfate

你的意思是比如一次输入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配置文件的形式来实现这个功能,应该怎么来写配置文件

xywlpo avatar May 17 '22 13:05 xywlpo

你的意思是比如一次输入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文件里就能使用了。

HydrogenSulfate avatar May 25 '22 03:05 HydrogenSulfate