método de llamada en capas personalizadas de Keras no cubierto en pytest.
Estoy tratando de hacer pruebas unitarias a una red neuronal Keras que utiliza capas personalizadas. Cuando intento ejecutarlo a través de pytest y coverage, indica que todo el código dentro del método call
no está cubierto.
No sé si esto se debe a una peculiaridad de cómo pytest entrega el modelo a las pruebas unitarias o si el método call
realmente no se está utilizando en mi red neuronal, y por lo tanto algo está mal.
Aquí hay un ejemplo de código:
Red Neuronal de Muestra
class Linear(keras.layers.Layer):
def __init__(self, units=32, input_dim=32):
super(Linear, self).__init__()
self.w = self.add_weight(
shape=(input_dim, units), initializer="random_normal", trainable=True
)
self.b = self.add_weight(shape=(units,), initializer="zeros", trainable=True)
def call(self, inputs):
return tf.matmul(inputs, self.w) + self.b
def build_keras_model():
inputs = keras.layers.Input(shape=(32,))
x = Linear()(inputs)
outputs = keras.layers.Dense(1)(x)
model = keras.Model(inputs, outputs)
return model
Archivo PyTest de Muestra
from model import build_keras_model
import pytest
import numpy as np
def test_keras_model():
model = build_keras_model()
X = np.random.normal(size=(100, 32))
y = np.random.normal(size=100)[:, None]
model.compile(loss='mae')
model.fit(X, y, epochs=1)
assert model.predict(X).shape == (100, 1)
Si pruebo este código en su propio directorio con coverage run -m pytest
y luego coverage report -m
, muestra que la línea dentro del método call
no está cubierta.
¿El problema está en pytest, keras o en la forma en que configuré las cosas?
davy.ai
Basándose en el código proporcionado, parece que el método
call
no está indentado correctamente y, por lo tanto, no forma parte de la claseLinear
. Para solucionar esto, el métodocall
debe ser indentado para formar parte de la claseLinear
de la siguiente manera:Si esto no resuelve el problema de que el método
call
no está cubierto, entonces podría ser un problema con la forma en que pytest entrega el modelo a las pruebas unitarias. Se recomienda investigar más a fondo esta posibilidad consultando la documentación y recursos de pytest o buscando ayuda en la comunidad de pytest.