es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo utilizar una variable de gurobi como entrada para un modelo de TensorFlow?

En un modelo gurobi, necesito utilizar una variable (agregada a través de addVar) como entrada a un modelo de tensorflow (usé un modelo simple entrenado para seguir la función: y = 2x + 1) que luego se usa en una restricción.

El modelo de tensorflow ya está entrenado y cargado, solo necesito usar el método de predicción.

El problema de optimización es el siguiente: Obtener la mejor entrada para el modelo de tensorflow para que la predicción de salida esté más cerca de una referencia dada.

Por ejemplo, si quiero que la predicción sea 11, la entrada del modelo debería ser muy cercana a 5 (2*5+1 = 11).

La forma en que he implementado esto es mediante una función objetivo del error absoluto entre el valor de referencia y el predicho, linealizando la función abs() para poder usarla en Gurobi.

El modelo gurobi es correcto, el problema radica en usar una variable gurobi como entrada al modelo tf, porque hasta que se haya resuelto el problema de optimización, no tiene un valor definido (darle un valor inicial no funcionará).

Este es el código para mi modelo:

import gurobipy as gp

model = tf.keras.models.load_model('./models/test_model.h5')

mdl = gp.Model()
ref = 11 # valor de salida deseado

w = mdl.addVar(lb=-10, name='input')
a = ref # solo para fines de nomenclatura
b = mdl.addVar(lb=-10,name = "b")
x = mdl.addVar(name='error') # variable necesaria para linealizar la función abs()

mdl.update()

mdl.setObjective(x, gp.GRB.MINIMIZE)

mdl.addConstr(w <= 10)
mdl.addConstr(w >= -10)

mdl.addConstr(b == model.predict([w])[0][0])

mdl.addConstr(x >= 0)
mdl.addConstr(a - b <= x)
mdl.addConstr(b - a <= x)
mdl.update()

# Resolver y mostrar la solución

mdl.optimize()

for v in mdl.getVars():
    print('%s %g' % (v.varName, v.x))

print('2w+1 =', 2*w.X+1)

Y el error que se muestra es:

ValueError: Failed to find data adapter that can handle input: (<class 'list'=""> containing values of types {'<class 'gurobipy.var'="">'}), <class 'nonetype'="">

Sin embargo, si uso la línea anterior a la restricción <code>b == model.predict([w])[0][0]</code>, todo funciona bien y la solución encontrada es de hecho 5:

“`
Gurobi Optimizer version 9.5.0 build v9.5.0rc5 (win64)
Thread count: 2 physical cores, 4 logical processors, using up to 4 threads
Optimize a model with 6 rows, 3 columns and 9 nonzeros
Model fingerprint: 0xc4fcfa7a
Coefficient statistics:
Matrix range [1e+00, 2e+00]
Objective range [1e+00, 1e+00]
Bounds range [1e+01, 1e+01]
RHS range [1e+00, 1e+01]
Presolve removed 4 rows and 1 columns
Presolve time: 0.01s
Presolved: 2 rows, 2 columns, 4 nonzeros

Iteration Objective Primal Inf. Dual Inf. Time
0 0.0000000e+00 1.050000e+01 0.000000e+00 0s
1 0.0000000e+00 0.000000e+00 0.000000e+00 0s

Solved in 1 iterations and 0.04 seconds (0.00 work units)
Optimal objective 0.000000000e+00
input 5
b 11
error 0
2w+1 = 11.0
“`

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El error que está recibiendo parece estar relacionado con el formato de la entrada proporcionada al método model.predict. Según el mensaje de error, la entrada debe ser de tipo list que contenga valores del tipo <class 'gurobipy.var'="">, pero está pasando una única variable w.

    Para solucionar esto, puede crear una lista que contenga el valor de w usando una comprensión de lista, de la siguiente manera:

    prediction = model.predict([w.x for w in [w]])[0][0]
    

    Esto extraerá el valor de w como un número flotante y lo pasará al método model.predict como una lista. La variable resultante prediction debería contener la salida del modelo de TensorFlow para la entrada dada.

    Luego, puede utilizar esta variable en las restricciones de Gurobi según sea necesario, como por ejemplo:

    mdl.addConstr(b == prediction)
    

    Esto establecerá el valor de la variable b en la salida del modelo de TensorFlow para la entrada dada, como se predice por el método model.predict.

    Con estas modificaciones, su código debería ser capaz de utilizar el modelo de TensorFlow dentro del problema de optimización de Gurobi.

Comments are closed.