使用自定义损失时如何修复 AttributeError: 'KerasTensor' object has no attribute '_id'?

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

在学习使用点云进行机器学习时,我将原始的 PointNet 代码(用 TF1 编写)移植到 TensorFlow2。一切都很顺利,直到我尝试移植自定义丢失。我对 keras.Model 进行子类化以实现自定义训练步骤,如下所示:

class CustomModel(keras.Model):
    
    def set_params(self, end_points, reg_weight=0.001):
        self.end_points = end_points
        self.reg_weight = reg_weight
        
    def train_step(self, data):
        x, y = data

        with tf.GradientTape() as tape:
            y_pred = self(x, training=True)  # Forward pass
     
            loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y_pred, labels=y)
            
            classify_loss = tf.reduce_mean(loss)
            
            # Enforce the transformation as orthogonal matrix
            transform = self.end_points['transform'] # BxKxK
            K = transform.shape[1]
            mat_diff = tf.matmul(transform, tf.transpose(transform, perm=[0,2,1]))
            mat_diff -= tf.constant(np.eye(K), dtype=tf.float32)
            mat_diff_loss = tf.nn.l2_loss(mat_diff) 
            

            loss = classify_loss + mat_diff_loss * self.reg_weight

        # Compute gradients
        trainable_vars = self.trainable_variables
        gradients = tape.gradient(loss, trainable_vars)

        # Update weights
        self.optimizer.apply_gradients(zip(gradients, trainable_vars))

        
        self.compiled_metrics.update_state(y, y_pred)
        
        return {m.name: m.result() for m in self.metrics}

训练时,我在

gradients = tape.gradient(loss, trainable_vars)

处收到错误

错误是:

------------------------------------------------- -------------------------- AttributeError Traceback(最近调用 最后)输入 [15],在 () 中 9 steps_per_epoch = train_count//BATCH_SIZE 10validation_steps=validation_count//BATCH_SIZE ---> 12 历史 = model.fit(training_dataset, 13steps_per_epoch=steps_per_epoch,validation_data=validation_dataset,validation_steps=validation_steps, 纪元=纪元)

文件 〜/anaconda3/envs/tf_p3.9/lib/python3.9/site-packages/keras/utils/traceback_utils.py:67, 在filter_traceback..error_handler(*args, **kwargs) 65 except 异常为 e: # pylint:disable=broad- except 66 Filtered_tb = _process_traceback_frames(e.traceback) ---> 67 从 None 引发 e.with_traceback(filtered_tb) 68 最后: 69 删除过滤_tb

文件/tmp/autograph_ generated_file9wypl4wp.py:15,在 外部工厂..内部工厂..tf__train_function(迭代器) 13 尝试: 14 do_return =真 ---> 15 retval = ag_.converted_call(ag__.ld(step_function), (ag__.ld(self), ag__.ld(iterator)), None, fscope) 16 除外: 17 do_return = 假

输入[3]中,在CustomModel.train_step(self, data)中 30 # 计算梯度 31 trainable_vars = self.trainable_variables ---> 32 个梯度 = Tape.gradient(loss, trainable_vars) 34 # 更新权重 35 self.optimizer.apply_gradients(zip(梯度,trainable_vars))

属性错误:在用户代码中:

File "/home/carlos/anaconda3/envs/tf_p3.9/lib/python3.9/site-packages/keras/engine/training.py",

第 1051 行,train_function * 返回step_function(自身,迭代器) 文件“/home/carlos/anaconda3/envs/tf_p3.9/lib/python3.9/site-packages/keras/engine/training.py”, 第 1040 行,在 step_function ** 输出 = model.distribute_strategy.run(run_step, args=(data,)) 文件“/home/carlos/anaconda3/envs/tf_p3.9/lib/python3.9/site-packages/keras/engine/training.py”, 第 1030 行,在 run_step ** 中 输出 = model.train_step(数据) 文件“/tmp/ipykernel_16312/3458445038.py”,第 32 行,在 train_step 中 梯度 = Tape.gradient(loss, trainable_vars)

AttributeError: 'KerasTensor' object has no attribute '_id'

这是一个带有主要部分的Colab,您可以运行所有单元来重现错误。

我花了几个小时尝试不同的方法来实现自定义损失,但没有运气,任何帮助将不胜感激。谢谢!

python tensorflow keras deep-learning loss-function
1个回答
0
投票

我认为版本控制问题,请尝试

Keras == 2.3.1
tensorflow==2.2.0

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