【发布时间】: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.concat、tf.zeros、tf.random_shuffle等来实现。另外,我不知道你为什么需要洗牌。据推测,同时输入的不同图像只是为了进行批处理,并且是独立处理的。如果是这样,你应该不需要洗牌,除非你的批量很大并且你想洗牌以获得更好的优化轨迹。 -
关于洗牌的好点 - 它不是必需的。但这并没有改变主要问题:如何将分类器(B_in: numpy(mix(A_in, A_out)) 转换为分类器(mix(A_out, A_in)) 以便连接两个图?
-
我明白了。我不知何故错过了这个问题。我会尝试用答案来回答。
标签: tensorflow neural-network autoencoder