训练模型时出错:无法获取未知等级的形状长度

问题描述 投票:0回答:1

跑步时:

`

class FaceTracker(Model): 
def init(self, eyetracker,  **kwargs): super().init(**kwargs) self.model = eyetracker

def compile(self, opt, classloss, localizationloss, **kwargs):
    super().compile(**kwargs)
    self.closs = classloss
    self.lloss = localizationloss
    self.opt = opt

def train_step(self, batch, **kwargs):
    X, y = batch
    
    # Assurez-vous que X a la forme correcte (batch_size, 120, 120, 3)
    print(f"X shape: {X.shape}")  # Devrait être (batch_size, 120, 120, 3)
    
    # Diviser y en classes et coordonnées
    classes = y[0]  # Extraire la classe, forme (batch_size, 1)
    coords = y[1]   # Extraire les coordonnées, forme (batch_size, 4)
    
    # Assurez-vous que les types sont corrects
    classes = tf.cast(classes, tf.float32)  # Convertir en float si nécessaire
    coords = tf.cast(coords, tf.float32)    # Convertir en float
    
    # Afficher les formes de classes et de coordonnées
    print(f"classes shape: {classes.shape}")  # Devrait être (batch_size, 1)
    print(f"coords shape: {coords.shape}")    # Devrait être (batch_size, 4)

    with tf.GradientTape() as tape:
        # Sortie du modèle : classes prédites et coordonnées prédites
        predicted_classes, predicted_coords = self.model(X, training=True)
        
        # Afficher les formes des prédictions
        print(f"predicted_classes shape: {predicted_classes.shape}")  # Devrait être (batch_size, 1)
        print(f"predicted_coords shape: {predicted_coords.shape}")    # Devrait être (batch_size, 4)

        # Calcul des pertes
        batch_classloss = self.closs(classes, predicted_classes)  # classes, predicted_classes
        batch_localizationloss = self.lloss(coords, predicted_coords)  # coords, predicted_coords
        
        # Perte totale
        total_loss = batch_localizationloss + 0.5 * batch_classloss

        # Calcul des gradients
        grads = tape.gradient(total_loss, self.model.trainable_variables)
    
    # Appliquer les gradients
    self.opt.apply_gradients(zip(grads, self.model.trainable_variables))
    
    # Retourner les informations de perte
    return {"total_loss": total_loss, "class_loss": batch_classloss, "regress_loss": batch_localizationloss}


def test_step(self, batch, **kwargs): 
    X, y = batch
    
    classes, coords = self.model(X, training=False)
    
    batch_classloss = self.closs(y[0], classes)
    batch_localizationloss = self.lloss(tf.cast(y[1], tf.float32), coords)
    total_loss = batch_localizationloss+0.5*batch_classloss
    
    return {"total_loss":total_loss, "class_loss":batch_classloss, "regress_loss":batch_localizationloss}
    
def call(self, X, **kwargs): 
    return self.model(X, **kwargs)`

以及以下:

model = FaceTracker(facetracker) 

model.compile(opt, classloss, regressloss)

问题就在这里:

logdir='logs' 

tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=logdir) 

hist = model.fit(train, epochs=10, validation_data=val, callbacks=[tensorboard_callback])

他打印:

ValueError                                Traceback (most recent call last) Cell In[285], line 3       1 logdir='logs'       2 tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=logdir) ----> 3 hist = model.fit(train, epochs=10, validation_data=val, callbacks=[tensorboard_callback])  File C:\Louis\TIPEEEE\.venv\Lib\site-packages\keras\src\utils\traceback_utils.py:122, in filter_traceback.<locals>.error_handler(*args, **kwargs)     119     filtered_tb = _process_traceback_frames(e.__traceback__)     120     # To get the full stack trace, call:     121     # `keras.config.disable_traceback_filtering()` --> 122     raise e.with_traceback(filtered_tb) from None     123 finally:     124     del filtered_tb  Cell In[283], line 39, in FaceTracker.train_step(self, batch, **kwargs)      36 print(f"predicted_coords shape: {predicted_coords.shape}")    # Devrait être (batch_size, 4)      38 # Calcul des pertes ---> 39 batch_classloss = self.closs(classes, predicted_classes)  # classes, predicted_classes      40 batch_localizationloss = self.lloss(coords, predicted_coords)  # coords, predicted_coords      42 # Perte totale  ValueError: Cannot take the length of shape with unknown rank.

我不知道如何解决这个问题,我查看了以前遇到过的问题,但找不到解决我的问题的方法。

谢谢您的帮助

valueerror
1个回答
0
投票

该错误表明,predicted_classes、predicted_coords、classes 或 coords 的排名在运行时未知。也许模型没有返回具有预期形状的张量。打印模型输出(预测类、预测坐标)和地面实况标签(类、坐标)的确切形状:

print(f"Classes shape (y[0]): {classes.shape}")
print(f"Coords shape (y[1]): {coords.shape}")
print(f"Predicted classes shape: {predicted_classes.shape}")
print(f"Predicted coords shape: {predicted_coords.shape}")

predicted_classes 和类必须具有相同的形状。 Predicted_coords 和 coords 也应该具有相同的形状。如果您需要有关 Tensorflow 中 python 变量类型的更多信息,可以在这里查看:https://www.theengineeringprojects.com/2023/01/types-of-python-variables-in-tensorflow.html

© www.soinside.com 2019 - 2024. All rights reserved.