[Python] AttributeError: The layer sequential has never been called and thus has no defined...

Discussão em 'Python' iniciado por Stack, Março 7, 2025.

  1. Stack

    Stack Membro Participativo

    I am trying to write a Python class that applies the VGG-Face recognition algorithm. This class is written in the deepface.py file:

    import cv2
    import numpy as np
    from deepface import DeepFace
    from sklearn.metrics import classification_report
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import LabelEncoder
    from sklearn.svm import SVC

    from base import Base


    class VGGClassification(Base):
    def __init__(self):
    super().__init__()
    self.X_rgb = None
    self.y_encoded = None
    self.X_train = None
    self.X_test = None
    self.y_train = None
    self.y_test = None
    self.clf = None

    def preprocess_images(self):
    self.X_rgb = np.array([
    cv2.resize(cv2.cvtColor(img.reshape(self.h, self.w), cv2.COLOR_GRAY2RGB), (224, 224))
    for img in self.X
    ])

    def encode_labels(self):
    encoder = LabelEncoder()
    self.y_encoded = encoder.fit_transform(self.y)

    def split_data(self):
    self.X_train, self.X_test, self.y_train, self.y_test = train_test_split(self.X_rgb, self.y_encoded,
    test_size=0.2, random_state=42,
    stratify=self.y_encoded)

    def extract_embeddings(self, images):
    return np.array([
    DeepFace.represent(img_path=img, model_name='VGG-Face', enforce_detection=False)[0]['embedding']
    for img in images
    ])

    def train_model(self):
    X_train_embedded = self.extract_embeddings(self.X_train)
    X_test_embedded = self.extract_embeddings(self.X_test)
    self.clf = SVC(kernel='linear', probability=True)
    self.clf.fit(X_train_embedded, self.y_train)

    y_pred = self.clf.predict(X_test_embedded)
    print(classification_report(self.y_test, y_pred, target_names=self.target_names))

    def execute(self):
    super().execute()
    self.preprocess_images()
    self.encode_labels()
    self.split_data()
    self.train_model()


    This class inherits a base class, stored in the base.py file:

    import os
    from sklearn.datasets import fetch_lfw_people


    class Base:

    def __init__(self):
    """Initializes the Base object with default values."""
    self.n_samples = 0
    self.h = 0
    self.w = 0
    self.X = None
    self.n_features = 0
    self.y = None
    self.target_names = None
    self.n_classes = 0

    def load_data(self):
    """
    Loads the LFW dataset and extracts its attributes.

    Returns:
    tuple: (X, y, n_samples, n_classes, n_features)
    """
    lfw_people = fetch_lfw_people(data_home=os.getcwd(), min_faces_per_person=70, resize=0.4)
    self.n_samples, self.h, self.w = lfw_people.images.shape
    self.X = lfw_people.data
    self.n_features = self.X.shape[1]

    self.y = lfw_people.target
    self.target_names = lfw_people.target_names
    self.n_classes = self.target_names.shape[0]

    def print_load_results(self):
    """
    Prints the total dataset size, including the number of samples, features, and classes.
    """
    print('Total dataset size: ')
    print(f'n_samples: {self.n_samples}')
    print(f'n_features: {self.n_features}')
    print(f'n_classes: {self.n_classes}')

    def execute(self):
    self.load_data()
    self.print_load_results()


    I tried to run the execute() method of an instance of the VGGClassification class and I get the error message:


    AttributeError: The layer sequential has never been called and thus has no defined input.. Did you mean: 'inputs'?
    ​

    The full traceback is:

    Traceback (most recent call last):
    File "C:\Users\alexz\OneDrive\Uni stuff\Articole\Articol Cristina 2\Python\main.py", line 22, in <module>
    vgg_class.execute()
    File "C:\Users\alexz\OneDrive\Uni stuff\Articole\Articol Cristina 2\Python\vgg_deepface.py", line 59, in execute
    self.train_model()
    File "C:\Users\alexz\OneDrive\Uni stuff\Articole\Articol Cristina 2\Python\vgg_deepface.py", line 46, in train_model
    X_train_embedded = self.extract_embeddings(self.X_train)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "C:\Users\alexz\OneDrive\Uni stuff\Articole\Articol Cristina 2\Python\vgg_deepface.py", line 41, in extract_embeddings
    DeepFace.represent(img_path=np.array(img), model_name='VGG-Face', enforce_detection=False)[0]['embedding']
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "C:\Users\alexz\OneDrive\Uni stuff\Articole\Articol Cristina 2\Python\.venv\Lib\site-packages\deepface\DeepFace.py", line 418, in represent
    return representation.represent(
    ^^^^^^^^^^^^^^^^^^^^^^^^^
    File "C:\Users\alexz\OneDrive\Uni stuff\Articole\Articol Cristina 2\Python\.venv\Lib\site-packages\deepface\modules\representation.py", line 68, in represent
    model: FacialRecognition = modeling.build_model(
    ^^^^^^^^^^^^^^^^^^^^^
    File "C:\Users\alexz\OneDrive\Uni stuff\Articole\Articol Cristina 2\Python\.venv\Lib\site-packages\deepface\modules\modeling.py", line 96, in build_model
    cached_models[task][model_name] = model()
    ^^^^^^^
    File "C:\Users\alexz\OneDrive\Uni stuff\Articole\Articol Cristina 2\Python\.venv\Lib\site-packages\deepface\models\facial_recognition\VGGFace.py", line 45, in __init__
    self.model = load_model()
    ^^^^^^^^^^^^
    File "C:\Users\alexz\OneDrive\Uni stuff\Articole\Articol Cristina 2\Python\.venv\Lib\site-packages\deepface\models\facial_recognition\VGGFace.py", line 158, in load_model
    vgg_face_descriptor = Model(inputs=model.input, outputs=base_model_output)
    ^^^^^^^^^^^
    File "C:\Users\alexz\OneDrive\Uni stuff\Articole\Articol Cristina 2\Python\.venv\Lib\site-packages\keras\src\ops\operation.py", line 268, in input
    return self._get_node_attribute_at_index(0, "input_tensors", "input")
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "C:\Users\alexz\OneDrive\Uni stuff\Articole\Articol Cristina 2\Python\.venv\Lib\site-packages\keras\src\ops\operation.py", line 299, in _get_node_attribute_at_index
    raise AttributeError(
    AttributeError: The layer sequential has never been called and thus has no defined input.. Did you mean: 'inputs'?


    I cannot figure out what I am doing wrong. Can you help me?

    Continue reading...

Compartilhe esta Página