我可以在 PyTorch 中使用 scipy.optimize 模块吗?

数据挖掘 火炬 scipy
2021-09-20 18:43:58

在使用 pytorch 对一些数据进行编码后,我需要使用 scipy.optimize 模块。但是, scipy.optimize 不会将 torch.tensor 作为其输入。如何使用带有渐变路径的数据的 scipy.optimize 模块?

2个回答

这是我目前正在使用的解决方法:

# model definition
class MLP(Module):
    # define model elements
    def __init__(self):
        super(MLP, self).__init__()
        self.hidden1 = Linear(2, 200)
        self.hidden2 = Linear(200, 100)
        self.hidden3 = Linear(100, 1)
        self.activation1 = LeakyReLU()
        self.activation2 = LeakyReLU()
 
    # forward propagate input
    def forward(self, X):
        optimize_flag = False
        if not torch.is_tensor(X):
            optimize_flag = True
            X = Variable(torch.from_numpy(X)).float()
        X = self.hidden1(X)
        X = self.activation1(X)
        X = self.hidden2(X)
        X = self.activation2(X)
        X = self.hidden3(X)
        if optimize_flag:
            return X.detach()
        return X

只需确保在使用 scipy.optimize.minimize 或任何其他使用x0标志输入的函数时传入分离的张量(即minimize(surrogate, x0=x.detach().numpy())

我写了一个库来做到这一点:autograd-minimize

您可以执行以下操作:

from autograd_minimize.torch_wrapper import torch_function_factory
from autograd_minimize import minimize 

func, params = torch_function_factory(your_model, your_loss, X_train, y_train)

# Minimization
res = minimize(func, params, method='L-BFGS-B')
```