C++ pytorch/libtorch C+中的自定义子模块+;

C++ pytorch/libtorch C+中的自定义子模块+;,c++,pytorch,libtorch,C++,Pytorch,Libtorch,完全公开,几天前我在PyTorch论坛上问了同样的问题,但没有得到回复,所以这在技术上是一个转载,但我相信这仍然是一个好问题,因为我一直无法在网上找到答案。下面是: 您能举例说明如何将寄存器模块与自定义模块一起使用吗? 我在网上找到的唯一例子是将线性层或卷积层注册为子模块 我试图写我自己的模块,并注册到另一个模块,但我无法让它工作。 我的IDE告诉我重载函数“MyModel::register\u module”的实例与参数列表不匹配——参数类型为:(const char[14],TreeEmb

完全公开,几天前我在PyTorch论坛上问了同样的问题,但没有得到回复,所以这在技术上是一个转载,但我相信这仍然是一个好问题,因为我一直无法在网上找到答案。下面是:

您能举例说明如何将寄存器模块与自定义模块一起使用吗? 我在网上找到的唯一例子是将线性层或卷积层注册为子模块

我试图写我自己的模块,并注册到另一个模块,但我无法让它工作。 我的IDE告诉我
重载函数“MyModel::register\u module”的实例与参数列表不匹配——参数类型为:(const char[14],TreeEmbedding)

(TreeEmbedding是我创建的另一个结构的名称,它扩展了torch::nn::Module。)

我错过什么了吗?举个例子会很有帮助



编辑:下面是其他上下文

我有一个头文件“model.h”,其中包含以下内容:

结构树嵌入:火炬::nn::模块{ 树嵌入(); torch::张量向前(图树); }; 结构MyModel:torch::nn::Module{ 尺寸t嵌入尺寸; 树嵌入树嵌入; MyModel(大小\u t嵌入大小=10); torch::张量向前(std::vector子句,std::vector上下文); }; 我还有一个cpp文件“model.cpp”,其中包含以下内容:

MyModel::MyModel(大小\u t嵌入大小):
嵌入尺寸(嵌入尺寸)
{
treeEmbedding=寄存器模块(“treeEmbedding”,treeEmbedding{});
}
此设置仍存在与上述相同的错误。文档中的代码确实有效(使用内置组件,如线性层),但使用自定义模块则不行。在跟踪torch::nn::Linear之后,它看起来好像是一个
模块文件夹
(不管是什么…)

谢谢,
杰克

如果有人能提供更多细节,我会接受一个更好的答案,但万一有人想知道,我想我会把我能找到的小信息放在上面:

register_module将字符串作为其第一个参数,其第二个参数可以是ModuleHolder(我不知道这是什么…),也可以是模块的共享_ptr。下面是我的例子:

treeEmbedding = register_module<TreeEmbedding>("treeEmbedding", make_shared<TreeEmbedding>());
treeEmbedding=register_模块(“treeEmbedding”,make_shared());

到目前为止,这似乎对我有效。

你的PyTorch版本是什么?根据,如果第二个参数子类
torch::nn::module
正确实例化,您应该能够
注册\u模块(“tree\u嵌入”,tree\u嵌入)
register\u模块(“tree\u嵌入”,TreeEmbedding{neccessary,arguments})
?你是否在你的
TreeEmbedding
类型的类中创建了
private
成员?我不确定我的pytorch的确切版本,但我在上个月左右下载了最新版本,所以我认为它相对较新<代码>寄存器模块(“树嵌入”,树嵌入{neccessary,arguments})对我不起作用。我不确定您是否询问我的外部模块是否有TreeEmbedding类型的私有实例,或者如果你问我的树嵌入是否有内部成员……但无论是哪种方式,答案是否定的。我确实有一个公共的成员树型嵌入在我的外部模块。@ JaveKoOne PyrPoto<代码> 1.5.0在21.04.2020发布了稳定的C++ API,所以你可能需要重新下载<代码> LIBLARTS/CODEN>,因为这是一个重大的变化。我所说的
{}
是指使用C++的统一初始化以及
构造函数所需的参数来构造对象,所以我也不是指。根据我在您的答案中看到的,使用
1.5.0
您可以检查
treeEmbedding=register\u模块(“treeEmbedding”,treeEmbedding{})
是否工作,如所示(前提是您继承了前面提到的
torch::nn::module
),您的外部模块应该有一个名为
TreeEmbedding
TreeEmbedding
类型的公共成员,再次检查在前面的
Linear
层教程中是如何完成的。如果您可以发布
TreeEmbedding
的代码以及您试图注册到的外部模块
TreeEmbedding
,这将非常有用。正如您在我编辑的问题中所看到的,我已经尝试了所有这些方法。我甚至刚刚使用
wget下载了最新版本https://download.pytorch.org/libtorch/nightly/cpu/libtorch-shared-with-deps-latest.zip
来自教程。