Skip to content

Support for scikit neural networks, like MLPRegressor? #183

@wangyexiang

Description

@wangyexiang

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions