python - AttributeError: The layer sequential has never been called and thus has no defined input.. Did you mean: 'input

I am trying to write a Python class that applies the VGG-Face recognition algorithm. This class is writ

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?

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1744919651a4601053.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信