python - 有没有办法反转 TensorFlow 中的图?

标签 python tensorflow

正如标题所示,我正在寻找一种反转 TensorFlow 图流的方法。这样做的原因是,我想在给定训练图输出的 logit 向量的情况下可视化图的隐藏层。

例如,假设我有一个完全连接的图,如下所示(受 MNIST 启发):

inputs = tf.placeholder(dtype=tf.float32, shape=[None, 784])
hidden_w1 = tf.get_variable('w1', [784,100], initializer=tf.random_normal_initializer)
hidden_b1 = tf.get_variable('b1', [100], initializer=tf.random_normal_initializer)
a1 = tf.matmul(inputs, hidden_w1) + hidden_b1
z1 = tf.nn.relu(a1)

hidden_w2 = tf.get_variable('w2', [100,100], initializer=tf.random_normal_initializer)
hidden_b2 = tf.get_variable('b2', [100], initializer=tf.random_normal_initializer)
a2 = tf.matmul(z1, hidden_w2) + hidden_b2
z2 = tf.nn.relu(a2)

output_w = tf.get_variable('w3', [100,10], initializer=tf.random_normal_initializer)
output_b = tf.get_variable('b3', [10], initializer=tf.random_normal_initializer)
a3 = tf.matmul(z2, output_w) + output_b
output = tf.nn.relu(a3)

loss = tf.nn.softmax_cross_entropy_with_logits_v2(labels=..., logits=output)
train_op = tf.train.AdamOptimizer().minimize(loss)

假设我现在训练这个图,并希望在仅激活第一个输出神经元时可视化隐藏 1。我这样做的方法是反转图形的流动并从输出中输入张量 [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]通过反转图层回,直到最终得到隐藏层 1 的输出。我试图看看是否有办法在 TensorFlow 中做到这一点,但似乎对此的信息很少。我直观地构造它的方法是在运行图形时添加一个操作 sess.run_reverse() ,如下所示:

with tf.Session() as sess:
while training:
    sess.run(train_op, feed_dict={inputs:...})

# finished training, reverse graph
category_to_visualize = tf.one_hot(indices=0, depth=10)
sess.run_reverse(hidden1, feed_dict={output:category_to_visualize})

但是,如果这种操作不存在或者甚至不可能实现,我会构造单独的运算符来反转图的流程,如下所示:

output_reversed = tf.placeholder(dtype=tf.float32, shape=[1,10])
z3_reversed = tf.nn.relu(output_reversed)
a3_reversed = tf.matrix_inverse(output_w)*(z3_reversed - output_b)

z2_reversed = tf.nn.relu(a3_reversed)
a2_reversed = tf.matrix_inverse(hidden_w2)*(z2_reversed - hidden_b2)

z1_reversed = tf.nn.relu(a2_reversed)
a1_reversed = tf.matrix_inverse(hidden_w1)*(z1_reversed - hidden_b1)

我意识到这种方法可能存在逻辑缺陷,无法实现。我忽略的一些事情是当输入低于 0 时奇异矩阵和 ReLu 的未定义反转(不过,ReLu 可以用 sigmoid 替换,以理论上定义整个输入空间的反转)。不过,核心思想是可视化给定类别的特征图 - 我认为如果允许一些假设,这应该是可能的。

无论如何,请告诉我我的想法是否错误,以及是否有办法反转图表!

最佳答案

我认为你的逻辑有问题。某些操作是不可逆转的。我在你的程序中看到有两个无法撤消的地方。

ReLU

ReLU 是一个将负输入变成零并保留正输入的函数。考虑以下示例。

x = np.array([1, 2, -1, -2])
y = np.maximum(x, 0) # Numpy's version of relu

这给了我们[1, 2, 0, 0]。问题是负数,即我们知道 1212,但是,有我们无法判断 0 是什么(甚至应该)是什么。如果您使用的是leaky ReLU,那么会有一个解决方案,但是由于矩阵乘法,它不是很有用。

矩阵乘法

矩阵乘法的问题在于您需要对列和行的乘积求和。例如(不是用Python编写的,只是矩阵):

[1, 2]   [ 7,  8,  9]
[3, 4] * [10, 11, 12]
[5, 6]

计算的方法是:

[[1], [2]]   [ [7],  8,  9]
[ 3 ,  4 ] * [[10], 11, 12]
[ 5 ,  6 ]
->
[1*7 + 2*10, ?, ?]
[         ?, ?, ?]
[         ?, ?, ?]

[27, ?, ?]
[ ?, ?, ?]
[ ?, ?, ?]

然后我们迭代这些列以获取其余的值。问题在于,我们不知道 27 的总结是什么,也不知道他们的产品是什么,也就是说,您正在尝试解决 27 = ab+cd >。实际上有无数种方法可以解决这个问题。对于更大的矩阵,情况只会变得更糟,例如您可能需要找到27 = ab+cd+ef+gh+kl...+yz无法以神经网络有用的方式计算该值。

结论

神经网络旨在处理和抽象数据。换句话说,它需要一些复杂的东西(像素网格)并使其变得更简单(一个整数)。向后做这件事没有多大意义。 Tensorflow,不,任何机器学习库都不会这样做,因为这是不可能的,也没有用。

如果你想要一些可以近似输入的东西,那么我建议使用 GaNN,或 Generative Adversarial Neural Network 。基本前提是你有两个神经网络,称为生成器和鉴别器。生成器被赋予一个随机数,旨在欺骗鉴别器。鉴别器收到输入数据集和生成器的图像,并有望区分它们。

关于python - 有没有办法反转 TensorFlow 中的图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49575909/

相关文章:

python - 如何在循环中使用使用 pyplot.Spectral 创建的调色板来绘制散点图?

python - 由于某种原因无法在Python2.7中调用Tkinter模块

python - GPU 上的训练速度会随着时间变慢

python - 为什么要使用该图像作为前一个过程的图像?

python - 多标签分类: How to learn threshold values?

tensorflow - 如何为以 encoded_image_string_tensor 作为输入的 tensorflow 模型编码输入

python - 如何用马尔可夫链构建文本?

python - OSError : SavedModel file does not exist at: C:\Users\Munib\New folder/{saved_model. pbtxt|saved_model.pb}

python-3.x - Keras "fit"输入不清楚

python - 使用 TensorFlow 2.0 Alpha 时无法在 Tensorboard 中看到 keras 模型图