【发布时间】:2020-03-27 00:08:54
【问题描述】:
我正在尝试实现一个非常简单的 keras 模型,该模型使用来自另一个模型的知识蒸馏 [1]。
粗略地说,我需要用L(y_true, y_pred)+L(y_teacher_pred, y_pred) 替换原始损失L(y_true, y_pred),其中y_teacher_pred 是另一个模型的预测。
我已经尝试过了
def create_student_model_with_distillation(teacher_model):
inp = tf.keras.layers.Input(shape=(21,))
model = tf.keras.models.Sequential()
model.add(inp)
model.add(...)
model.add(tf.keras.layers.Dense(units=1))
teacher_pred = teacher_model(inp)
def my_loss(y_true,y_pred):
loss = tf.keras.losses.mean_squared_error(y_true, y_pred)
loss += tf.keras.losses.mean_squared_error(teacher_pred, y_pred)
return loss
model.compile(loss=my_loss, optimizer='adam')
return model
但是,当我尝试在我的模型上调用 fit 时,我得到了
TypeError: An op outside of the function building code is being passed
a "Graph" tensor. It is possible to have Graph tensors
leak out of the function building context by including a
tf.init_scope in your function building code.
我该如何解决这个问题?
参考
【问题讨论】:
-
问题很可能是
teacher_pred = teacher_model(inp)。 Keras 正在尝试通过您的教师模型反向传播梯度。您可以在创建数据集而不是在损失函数中生成教师模型 logits。
标签: python deep-learning tensorflow2.0 tf.keras