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.

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?

Tags:  , , ,

Answer

  1. Avatar for 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 clase Linear. Para solucionar esto, el método call debe ser indentado para formar parte de la clase Linear de la siguiente manera:

    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
    

    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.

Comments are closed.