Я пытаюсь решить задачу оптимизации, ограничением которой является нейронная сеть. Я создаю это ограничение в Pyomo, используя пакет OMLT. В качестве оптимизатора я использую Cyipopt. Я провожу сравнительное исследование с использованием платформы серого ящика Pynumero, которая совместима только с Cyipopt, поэтому я должен использовать Cyipopt, чтобы обеспечить согласованность оптимизатора. Он начинает работать как положено, но в какой-то момент ядро случайно выходит из строя. Кто-нибудь знает, как обойти эту проблему?
Я думаю, что с пакетами должна быть какая-то проблема несовместимости. Большую часть из них я установил из conda, некоторые доступны только из pip. Я пробовал разные версии и менял источник, но, похоже, это не помогло. Ниже приведен игрушечный пример возникновения этой проблемы.
import torch
import numpy as np
import tempfile
from omlt.io import write_onnx_model_with_bounds,load_onnx_neural_network
from omlt import OmltBlock, OffsetScaling
from omlt.neuralnet import FullSpaceNNFormulation
import onnx
import pyomo.environ as pyo
import matplotlib.pyplot as plt
class neuralnetwork(torch.nn.Module):
def __init__(self):
super().__init__()
self.activ = torch.nn.Sigmoid()
self.Dense1 = torch.nn.Linear(2,5)
self.Dense2 = torch.nn.Linear(5,1)
def forward(self, x):
x = self.Dense1(x)
x = self.activ(x)
x= self.Dense2(x)
return x
def PyomoModel(NN):
x = torch.randn(1,2)
with tempfile.NamedTemporaryFile(suffix='.onnx', delete=False) as f:
torch.onnx.export(
NN,
x,
f,
input_names=['input'],
output_names=['output'],
dynamic_axes={
'input': {0: 'batch_size'},
'output': {0: 'batch_size'}
}
)
input_bounds = [(-1,1) for _ in range(2)]
scaler = OffsetScaling(
offset_inputs=np.zeros(2),
factor_inputs=np.ones(2),
offset_outputs=np.zeros(1),
factor_outputs=np.ones(1)
)
write_onnx_model_with_bounds(f.name, None, input_bounds)
onnx_model = onnx.load(f.name)
print(f"Wrote PyTorch model to {f.name}")
network_definition = load_onnx_neural_network(onnx_model, scaling_object=scaler)
formulation = FullSpaceNNFormulation(network_definition)
mdl = pyo.ConcreteModel()
mdl.nn = OmltBlock()
mdl.nn.build_formulation(formulation)
mdl.cons1 = pyo.Constraint(expr=-1
Подробнее здесь: https://stackoverflow.com/questions/789 ... ng-cyipopt