【问题标题】:Training a model using a pre-trained model使用预训练模型训练模型
【发布时间】:2017-08-19 01:26:44
【问题描述】:

我在 Keras 中有一个预先训练好的模型。我想训练另一个模型,其中模型的输出是已训练模型的输入,并且已训练模型的输出用于未训练模型的损失函数。像

in_a + mod_b(some kind of feedback from B here) --> Model A --> out_a --> Model B --> out_b

error  = (in_a - out_b)**2

然后使用这个错误来训练模型 A。 in_a 在这个系统中可以被视为一个常数,并且还有一个反馈循环

任何想法如何在 keras 或 tensorflow 中做到这一点

【问题讨论】:

  • 您希望预训练模型Model BModel A 一起接受训练吗?在任何情况下,来自Model B 损失的梯度必须流经Model B 并进入Model A。因此,您只需将Model B 的设置保持不变,并将其输入设置为Model A 的输出。
  • 不,我根本不想训练模型 B
  • 如果你想使用 tensorflow 看这里:tensorflow.org/tutorials/image_retraining

标签: tensorflow deep-learning keras


【解决方案1】:

这是一个想法。构建模型 A 直到输出层,我们假设它与模型 B 的输入层兼容。另外,假设您使用预训练的 VGG16 作为模型 B。您将使用预训练的权重加载模型:

from keras.applications.vgg16 import VGG16

# Model A is trainable
x = Input(shape=(32,))
x_d = Dense(10)(x)
model_a_out = Dense(10)(x_d)

# Model B
model_b = VGG16(weights='imagenet', include_top=True)
# Freeze Model B
for layer in model_b.layers:
    layer.trainable = False

# Set input to Model B as output from A
model_b.input = model_a_out

# Train as usual
model_b.compile... and model_b.fit ...

另一种方法是先构建A。然后:

for layer in model_b.layers:
  new_layer = layer
  new_layer.trainable = False
  model_a.add(new_layer)

查看 Keras Applications 页面了解一些想法。

【讨论】:

  • 在方法 1 的情况下,模型 A 的损失函数取决于模型 B 的输出,我该如何指定,因为没有一个预先构建的模型会这样做。如果我指定自己的损失函数来计算问题中的错误,那么将传递给它什么值。我想传递 out_b 的值,但模型 A 会将 out_a 传递给损失函数
  • 在方法 2 中,如果我将模型 B 添加到模型 A 并将 trainable 设置为 false,那么我不能做反馈的事情 out_a +(一些添加)然后输入到 model_B。所有这一切的某种自定义层(out_a + 一些添加正在做的是从某种堆栈中添加一些额外点)可能会起作用
  • 我认为可以使用keras中的功能性api来完成
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-10
  • 1970-01-01
  • 2022-10-19
  • 2017-08-15
  • 2021-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多