如何连接两个型号

时间:2017-10-11 22:38:45

标签: tensorflow neural-network autoencoder

我有模型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占位符(图表会连接)?

这是构建classifier_images的我的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节点?

1 个答案:

答案 0 :(得分:1)

您可以直接连接模型。换句话说,您不会使用占位符来表示B的输入,而是使用A_in和A_out的混合。如果您只想运行B,您仍然可以将输入输入到来自A的张量中。仅提供占位符很常见,但TensorFlow支持将值输入任何张量。如果它更容易思考,您可以通过tf.identity传递A的输出,以便您拥有类似占位符的内容。

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