有没有任何解决方案可以帮助casadi MX变量在pytorch nn.conv1d(卷积)中使用?

问题描述 投票:0回答:1

我现在有一个顺序神经网络,用于预测机器人状态。但是当我在 Casadi 中实现神经网络来解决 MPC 问题时遇到了问题。该错误不断警告我,我无法在需要卷积过程的顺序神经网络中使用 Casadi MX 变量。

我看过 repo l4casadi 但它似乎只支持 nn.linear 而不是 nn.conv1d。希望在这里找到解决方案并感谢您的回答。

python pytorch controls robot casadi
1个回答
0
投票

L4CasADi 支持超过线性层(例如卷积)的 PyTorch 模型。 L4CasADi 支持所有 PyTorch 模型,这些模型是 jit 可追踪/可编写脚本的。

L4CasADi 卷积示例:

import torch
import numpy as np
import l4casadi as l4c
import casadi as cs


# Create a model with convolutional layers
class ConvModel(torch.nn.Module):
    def __init__(self):
        super().__init__()

        self.conv1 = torch.nn.Conv2d(1, 32, 3, padding=1)
        self.conv2 = torch.nn.Conv2d(32, 64, 3, padding=1)
        self.conv3 = torch.nn.Conv2d(64, 64, 3, padding=1)
        self.fc1 = torch.nn.Linear(64 * 7 * 7, 128)
        self.fc2 = torch.nn.Linear(128, 1)

    def forward(self, x):
        x = x.reshape(-1, 1, 7, 7)
        x = torch.nn.functional.relu(self.conv1(x))
        x = torch.nn.functional.relu(self.conv2(x))
        x = torch.nn.functional.relu(self.conv3(x))
        x = x.view(-1, 64 * 7 * 7)
        x = torch.nn.functional.relu(self.fc1(x))
        x = self.fc2(x)
        return x


x = np.random.randn(49).astype(np.float32)
model = ConvModel()
y = model(torch.tensor(x)[None])
print(f'Torch output: {y}')

l4c_model = l4c.L4CasADi(model, model_expects_batch_dim=True)

x_sym = cs.MX.sym('x', 49)
y_sym = l4c_model(x_sym)

f = cs.Function('y', [x_sym], [y_sym])
y = f(x)

print(f'L4CasADi Output: {y}')

© www.soinside.com 2019 - 2024. All rights reserved.