其中激活函数计算在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 等)后获取值。
我想我有两个选项可以从激活函数中捕获值。
制作自定义激活函数,在 tensorflow 激活中模拟完全相同的方式,并使其打印值。
- 是否可以通过自定义激活函数来捕获激活函数计算后的所有值?
修改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 的源代码即可执行此操作。
我正在学习 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 等)后获取值。
我想我有两个选项可以从激活函数中捕获值。
制作自定义激活函数,在 tensorflow 激活中模拟完全相同的方式,并使其打印值。
- 是否可以通过自定义激活函数来捕获激活函数计算后的所有值?
修改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 的源代码即可执行此操作。