PaddlePaddle / Paddle

PArallel Distributed Deep LEarning: Machine Learning Framework from Industrial Practice (『飞桨』核心框架,深度学习&机器学习高性能单机、分布式训练和跨平台部署)
http://www.paddlepaddle.org/
Apache License 2.0
22.2k stars 5.57k forks source link

使用Sequential封装模型时,输入两个参数会报错 #55996

Closed yeyupiaoling closed 1 year ago

yeyupiaoling commented 1 year ago

请提出你的问题 Please ask your question

使用Sequential封装模型时,输入两个参数会报错

import paddle

class MyLayer(paddle.nn.Layer):
    def __init__(self):
        super().__init__()
        self.fc = paddle.nn.Linear(2, 4)
        self.fc1 = paddle.nn.Linear(2, 4)

    def forward(self, x, l):
        x = self.fc(x)
        x1 = self.fc(l)
        x = x + x1
        return x

model1 = MyLayer()
x = paddle.randn((3, 2), dtype="float32")
y1 = model1(x, x)
print(y1)

model2 = paddle.nn.Sequential(model1)
y2 = model2(x, x)
print(y2)

报错信息:

    return self.forward(*inputs, **kwargs)
TypeError: forward() takes 2 positional arguments but 3 were given
cxxly commented 1 year ago

本地可复现,应该是一个Bug,已反馈给对应研发同学,麻烦您等待修复

yeyupiaoling commented 1 year ago

或许不是bug,本身就不能这输入,因为多个模型的情况下的话,如果不固定一个输入的话,上下模型的输入会有问题。

cxxly commented 1 year ago

或许不是bug,本身就不能这输入,因为多个模型的情况下的话,如果不固定一个输入的话,上下模型的输入会有问题。

哦,是的,需要有这种约束

yeyupiaoling commented 1 year ago

看来只能对模型收入封装的。

cxxly commented 1 year ago

嗯嗯,是的;话说为啥有这种需求,一般layer都是单输出

yeyupiaoling commented 1 year ago

嗯嗯,是的;话说为啥有这种需求,一般layer都是单输出

这样我的模型第1个是两个输入的,第2个分类模型是一个输入的。这个是声纹识别模型,第1个是获取声纹特征,第2个是分类器。 https://github.com/yeyupiaoling/VoiceprintRecognition-PaddlePaddle/blob/develop/ppvector/models/ecapa_tdnn.py#L264-L264