我有模型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节点?
答案 0 :(得分:1)
您可以直接连接模型。换句话说,您不会使用占位符来表示B的输入,而是使用A_in和A_out的混合。如果您只想运行B,您仍然可以将输入输入到来自A的张量中。仅提供占位符很常见,但TensorFlow支持将值输入任何张量。如果它更容易思考,您可以通过tf.identity
传递A的输出,以便您拥有类似占位符的内容。
另一种方法是通常在GAN中进行的操作(将发生器输出馈入鉴别器)。你可以创建两个"塔"共享变量的操作。一个塔将只是B,您可以将您的输入馈送到B的占位符中以便仅运行B.另一个塔可以在A的顶部B,您可以使用它来一起运行/训练A和B.这两个塔中的Bs将具有相同的结构并共享变量,但具有单独的操作。这种方法可能是最干净,最灵活的。