Python Tensorflow 2+的知识蒸馏损失;凯拉斯

Python Tensorflow 2+的知识蒸馏损失;凯拉斯,python,deep-learning,tensorflow2.0,tf.keras,Python,Deep Learning,Tensorflow2.0,Tf.keras,我试图实现一个非常简单的keras模型,该模型使用另一个模型的知识提炼[1]。 大致上,我需要用L(y\u-true,y\u-pred)+L(y\u-teacher\u-pred,y\u-pred)替换原始损失L(y\u-true,y\u-pred),其中y\u-teacher\u-pred是另一个模型的预测 我已经试过了 def使用蒸馏创建学生模型(教师模型): inp=tf.keras.layers.Input(shape=(21,)) model=tf.keras.models.Seque

我试图实现一个非常简单的keras模型,该模型使用另一个模型的知识提炼[1]。 大致上,我需要用
L(y\u-true,y\u-pred)+L(y\u-teacher\u-pred,y\u-pred)
替换原始损失
L(y\u-true,y\u-pred)
,其中
y\u-teacher\u-pred
是另一个模型的预测

我已经试过了

def使用蒸馏创建学生模型(教师模型):
inp=tf.keras.layers.Input(shape=(21,))
model=tf.keras.models.Sequential()
模型添加(inp)
模型。添加(…)
添加模型(tf.keras.layers.Dense(单位=1))
教师pred=教师模型(inp)
定义我的损失(y_真,y_pred):
损失=tf.keras.loss.mean_squared_误差(y_true,y_pred)
损失+=tf.keras.loss.mean_squared_误差(教师pred,y_pred)
回波损耗
compile(loss=my\u loss,optimizer='adam')
回归模型
然而,当我尝试在我的模型上调用
fit
时,我得到了

TypeError:正在传递函数构建代码之外的op
“图形”张量。有可能有图张量
通过包含
函数构建代码中的tf.init_作用域。
我如何解决这个问题

裁判


[1]

事实上,这篇博文回答了你的问题:

但简言之,您应该使用新的TF2 API并在
tf.GradientTape()
块之前调用教师的
predict

def train_step(self, data):
        # Unpack data
        x, y = data

        # Forward pass of teacher
        teacher_predictions = self.teacher(x, training=False)

        with tf.GradientTape() as tape:
            # Forward pass of student
            student_predictions = self.student(x, training=True)

            # Compute losses
            student_loss = self.student_loss_fn(y, student_predictions)
            distillation_loss = self.distillation_loss_fn(
                tf.nn.softmax(teacher_predictions / self.temperature, axis=1),
                tf.nn.softmax(student_predictions / self.temperature, axis=1),
            )
            loss = self.alpha * student_loss + (1 - self.alpha) * distillation_loss

问题可能是
teacher\u pred=teacher\u model(inp)
。Keras正试图通过您的教师模型反向传播梯度。您可以在创建数据集时而不是在loss函数中生成教师模型logits。