-
Notifications
You must be signed in to change notification settings - Fork 72
Support for scikit neural networks, like MLPRegressor? #183
Copy link
Copy link
Open
Description
Dear developers, can omlt solve the objective functions which contain scikit neural networks, like MLPRegressor?
import numpy as np
from sklearn.neural_network import MLPRegressor
from sklearn.model_selection import train_test_split
from skl2onnx import convert_sklearn
from skl2onnx.common.data_types import FloatTensorType
import onnx
np.random.seed(0)
n_samples = 5000
X = np.random.uniform(-5, 5, size=(n_samples, 2))
x1 = X[:, 0]
x2 = X[:, 1]
y1 = (x1 - 2) ** 2 + (x2 + 1) ** 2
y2 = (x1 + 2) ** 2 + (x2 - 1) ** 2
Y = np.column_stack([y1, y2])
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=42)
model = MLPRegressor(hidden_layer_sizes=(64, ), activation="relu", solver="adam", max_iter=3000, random_state=42)
model.fit(X_train, Y_train)
initial_type = [("float_input", FloatTensorType([None, 2]))]
onnx_model = convert_sklearn(model, initial_types=initial_type)
onnx.save_model(onnx_model, "mlp_multi_output.onnx")
print("ONNX model saved as mlp_multi_output.onnx")
import pyomo.environ as pyo
from omlt import OmltBlock
from omlt.io import load_onnx_neural_network
from omlt.neuralnet import ReluBigMFormulation
onnx_model = load_onnx_neural_network("mlp_multi_output.onnx")
formulation = ReluBigMFormulation(onnx_model)
model = pyo.ConcreteModel()
model.nn = OmltBlock()
model.nn.build_formulation(formulation)
for i in range(2):
model.nn.inputs[i].setlb(-5)
model.nn.inputs[i].setub(5)
model.obj = pyo.Objective(
expr=model.nn.outputs[0],
sense=pyo.maximize
)
solver = pyo.SolverFactory("ipopt")
solver.solve(model, tee=True)
print("Maximize y1:")
print("x1 =", pyo.value(model.nn.inputs[0]))
print("x2 =", pyo.value(model.nn.inputs[1]))
print("y1 =", pyo.value(model.nn.outputs[0]))
print("y2 =", pyo.value(model.nn.outputs[1]))
File "c:\Users\x\Desktop\01sklearn\opt.py", line 6, in <module>
onnx_model = load_onnx_neural_network("mlp_multi_output.onnx")
File "D:\pyvenvs\py310\lib\site-packages\omlt\io\onnx.py", line 67, in load_onnx_neural_network
return parser.parse_network(onnx.graph, scaling_object, input_bounds)
AttributeError: 'str' object has no attribute 'graph'
when I use onnx to load model:
onnx_model = onnx.load("mlp_multi_output.onnx")
onnx_model = load_onnx_neural_network(onnx_model)
I get the error:
onnx_model = load_onnx_neural_network(onnx_model)
File "D:\pyvenvs\py310\lib\site-packages\omlt\io\onnx.py", line 67, in load_onnx_neural_network
return parser.parse_network(onnx.graph, scaling_object, input_bounds)
File "D:\pyvenvs\py310\lib\site-packages\omlt\io\onnx_parser.py", line 157, in parse_network
new_layer, new_layer_inputs = self._visit_node(node, next_nodes)
File "D:\pyvenvs\py310\lib\site-packages\omlt\io\onnx_parser.py", line 190, in _visit_node
raise ValueError(msg)
ValueError: Unhandled node type Cast
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels