其中激活函数计算在session.run()

Where activation function calculated in the session.run()

我正在学习 Tensorflow 开源代码。 我想找到执行实际计算的具体位置。

但是,从深层次的开源代码中确实很难找到。 所以,我想从已经在这里工作过的人那里得到任何指示。

我所有的工作都是假设神经网络。

我从 class BaseSession 的 session.run 函数开始。

我从那里开始四处寻找源代码。 我终于想到所有真正的计算都在 c 包装库中运行,而不是 python 框架。

所以如果我想hook真正的计算部分,我是否应该重新编译c库并使用swig再次包装它???

我从源码中查到的是这样的。我认为这是执行实际计算的地方。 (https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/client/session.py)

def _call_tf_sessionrun(self, options, feed_dict, fetch_list, target_list, run_metadata):
  return tf_session.TF_SessionRun_wrapper(self._session, options, feed_dict, fetch_list, target_list, run_metadata)

我的最终目标是在执行激活函数(即 relu 等)后获取值。

我想我有两个选项可以从激活函数中捕获值。

  1. 制作自定义激活函数,在 tensorflow 激活中模拟完全相同的方式,并使其打印值。

    • 是否可以通过自定义激活函数来捕获激活函数计算后的所有值?
  2. 修改C源码重新编译库放入tensorflowpython库

    • 处理这个问题的所有问题看起来很糟糕

有什么更好的方法?

如果您有更简单的方法来捕获这些值,请告诉我方法...

通过将适当的操作输入 session.run,这在 TensorFlow 中很容易做到。例如,如果我们定义以下操作:

x = tf.placeholder(tf.float32, [None, input_dim])
pre_act_1 = tf.add(tf.matmul(x, weights['h1']), biases['b1'])
act_1 = tf.nn.relu(pre_act_1)
pre_act_2 = tf.add(tf.matmul(act_1, weights['h2']), biases['b2'])
act_2 = tf.nn.relu(pre_act_2)

然后训练模型,这样权重就已经设置好了。然后做推理通常会做:

pred = session.run(act_2, feed_dict={x: some_value_for_x})

这为您提供了模型的输出,即 act_2,即第二层的激活。要获得多次激活,只需执行以下操作:

a1, a2 = session.run(act_1, act_2, feed_dict={x: some_value_for_x})

您甚至可以通过以下方式获取预激活值:

pa1, a1, pa2, a2 = session.run(pre_act_1, act_1, pre_act_2, act_2, feed_dict={x: some_value_for_x})

如您所见,无需破解 TF 的源代码即可执行此操作。