跑步时:
`
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.
我不知道如何解决这个问题,我查看了以前遇到过的问题,但找不到解决我的问题的方法。
谢谢您的帮助
该错误表明,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