如何连接两个模型

问题描述:

我有模型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 - 标签),以便它尝试重建图像并在同时。在这里我只想更新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的代码,构造classifier_images(混合(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

是否有任何特定的问题,您正在转换此代码为tf?这似乎是非常简单的代码,应该可以使用'tf.concat','tf.zeros','tf.random_shuffle'等来实现。另外,我不确定为什么你需要洗牌。据推测,不同的图像在同一时间进给只是为了配料和独立处理。如果是这样,你不应该洗牌,除非你批量大,你想洗牌更好的优化轨迹。 – iga

+0

关于洗牌的好处 - 这不是必要的。然而,这并没有改变主要问题:如何将分类器(B_in:numpy(mix(A_in,A_out))转换为分类器(mix(A_out,A_in)),以便这两个图形连接起来? – MichaelSB

+0

我明白了。 。这个问题,我会尝试用一个答案回答它 – iga

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

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

+0

“而是用你的A_IN和A_OUT的混合物” 这正是想什么,我知道:?该怎么做 我想知道如果我能做到这一点像这样: 'A_OUT =自动编码器(A_IN:orig_images) 混合= tf.concat(A_OUT,A_IN) B_OUT =分类(混合)' – MichaelSB

+0

我可能会丢失一些东西,但为什么你认为它可能是一个问题?只要它在逻辑上是正确的并且形状匹配....你期望什么问题? – iga

+0

我不知道“分类器”期望什么样的参数,所以很难说出任何内容。它期望'feed_dict'中使用的具体值,它不会“连接”模型。如果它期望张量并将它们用作其操作的输入,它将“连接”模型。 – iga