【问题标题】:How to connect two models如何连接两个模型
【发布时间】:2017-10-11 22:38:45
【问题描述】:

我有模型 A(自动编码器),它将一批图像 A_in(原始图像)作为输入,并输出一批图像 A_out(重建图像)。然后我有模型 B(二元分类器),它将一批图像 B_in 作为输入,它是 A_in 和 A_out 的混合。

我想让 B 区分 A_in 和 A_out,看看 A 是否在重建图像方面做得很好。 B_out 是给定图像是 A_in 的概率。

B 与 A 并行训练以对两种图像进行分类。 B_loss = (B_out - 标签)。标签为 0 或 1(原始或重建)。当我们优化 B_loss 时,我们只更新 B 参数。

我想训练模型 A 以优化组合损失函数:Combined_Loss = 重建误差 (A_out - A_in) - 分类误差 (B_out - 标签),以便它尝试重建图像并同时愚弄 B时间。这里我只想更新A参数(这里我们不想帮助B)。

现在,我的问题是关于构建 A_in 和 A_out 的混合物,并将其馈送到 B 以便图 A 和 B 连接起来。

现在是这样的:

A_out = autoencoder(A_in: orig_images)
B_out = classifier(B_in: numpy(mix(A_in, A_out))

我该如何定义它:

A_out = autoencoder(A_in: orig_images)
B_out = classifier(mix(A_out, A_in))

这样当我同时训练 A 和 B 时:

sess.run([autoencoder_train_op, classifier_train_op], feed_dict=
            {A_in: orig_images, B_in: classifier_images, labels: classifier_labels})

我不需要 B_in 占位符(图表将被连接)?

这是我构造分类器图像的 Numpy 代码 (mix(A_in, A_out)):

reconstr_images = sess.run(A_out, feed_dict={A_in: orig_images})

half_and_half_images = np.concatenate((reconstr_images[:batch_size/2], orig_images[batch_size/2:]))

half_and_half_labels = np.zeros(labels.shape)
half_and_half_labels[batch_size/2:] = 1

random_indices = np.random.permutation(batch_size)

classifier_images = half_and_half_images[random_indices]
classifier_labels = half_and_half_labels[random_indices]

如何将其转换为 TensorFlow 节点?

【问题讨论】:

  • 在将此代码转换为 tf 时遇到任何具体问题吗?看起来很简单的代码应该可以使用tf.concattf.zerostf.random_shuffle 等来实现。另外,我不知道你为什么需要洗牌。据推测,同时输入的不同图像只是为了进行批处理,并且是独立处理的。如果是这样,你应该不需要洗牌,除非你的批量很大并且你想洗牌以获得更好的优化轨迹。
  • 关于洗牌的好点 - 它不是必需的。但这并没有改变主要问题:如何将分类器(B_in: numpy(mix(A_in, A_out)) 转换为分类器(mix(A_out, A_in)) 以便连接两个图?
  • 我明白了。我不知何故错过了这个问题。我会尝试用答案来回答。

标签: tensorflow neural-network autoencoder


【解决方案1】:

您可以直接连接模型。换句话说,B 的输入不使用占位符,而是使用 A_in 和 A_out 的混合。如果您只想运行 B,您仍然可以将输入输入来自 A 的张量。只输入占位符很常见,但 TensorFlow 支持将值输入任何张量。如果它更容易考虑,您可以通过 tf.identity 传递 A 的输出,这样您就有了类似于占位符的东西。

另一种方法是通常在 GAN 中完成的(将生成器输出馈送到鉴别器中)。您可以创建两个共享变量的操作“塔”。一个塔将只是 B,您可以将输入输入 B 的占位符以仅运行 B。另一个塔可以是 A 顶部的 B,您可以使用它来运行/训练 A 和 B。这两个塔中的 B 将具有相同的结构并共享变量,但具有独立的操作。这种方法可能是最干净和最灵活的。

【讨论】:

  • "但是使用你的 A_in 和 A_out 的混合物" 这正是我想知道的:如何做到这一点?我想知道我是否可以这样做:A_out = autoencoder(A_in: orig_images) mixed = tf.concat(A_out, A_in) B_out = classifier(mixed)
  • 我可能遗漏了一些东西,但您为什么认为这可能是个问题?只要它在逻辑上是正确的并且形状匹配......你期待什么问题?
  • 我不知道classifier 期望什么参数,所以很难说什么。它需要在feed_dict 中使用的具体值,它不会“连接”模型。如果它期望张量并将它们用作其操作的输入,它将“连接”模型。
  • 分类器需要一批图像。要将其连接到自动编码器,我必须获取作为一批图像的张量(自动编码器的输出),并将其用作分类器的输入。正如我的问题中所述,我不能这样做,因为输入必须是 AE 输出图像和原始图像的混合。因此,在我上面的评论中,我建议创建一个中间 tf 节点 tf.concat(A_out, A_in),并将其提供给分类器。我还没试过,不知道能不能用。
猜你喜欢
  • 1970-01-01
  • 2020-08-10
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-04
相关资源
最近更新 更多