在评估 TensorFlow 模型时,如何在单个前向调用中查看特定隐藏层的值?
When evaluating a TensorFlow model, how can I see the values of a specific hidden layer in a single forward call?
我定义了一个简单的顺序模型如下:
m = tf.keras.models.Sequential([
tf.keras.layers.Dense(10, input_shape=(3,), name='fc1', activation='relu'),
tf.keras.layers.Dense(3, input_shape=(3,), name='fc2'),
])
m.summary()
Model: "sequential_6"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
fc1 (Dense) (None, 10) 40
_________________________________________________________________
fc2 (Dense) (None, 3) 33
=================================================================
Total params: 73
Trainable params: 73
Non-trainable params: 0
_________________________________________________________________
现在,我得到一个隐藏层layer_fc1
如下:
layer_fc1 = m.get_layer('fc1')
layer_fc1
<tensorflow.python.keras.layers.core.Dense at 0x7f6fcc7d9eb8>
现在,当我评估这个模型时,我想看看层的值 fc1
。
整个网络的评估和layer_fc1
在单独的forward-calls中的评估如下:
t = tf.random.uniform((1, 3))
m(t)
<tf.Tensor: id=446892, shape=(1, 3), dtype=float32, numpy=array([[ 0.0168661 , -0.12582873, -0.0308626 ]], dtype=float32)>
layer_fc1(t)
<tf.Tensor: id=446904, shape=(1, 10), dtype=float32, numpy=
array([[0. , 0. , 0.00877494, 0.05680769, 0.08027849,
0.12362152, 0. , 0. , 0.22683921, 0.17538759]],
dtype=float32)>
那么,有没有什么方法可以通过 m(t)
的单个前向调用,让我也获得隐藏层的值?这样计算效率会更高
您可以使用 功能 API 轻松完成此操作,如下所示:
inpt = tf.keras.layers.Input(shape=(3,))
fc1_out = tf.keras.layers.Dense(10, name='fc1', activation='relu')(inpt)
fc2_out = tf.keras.layers.Dense(3, name='fc2')(fc1_out)
m = tf.keras.models.Model(inputs=inpt, outputs=[fc2_out, fc1_out])
t = tf.random.uniform((1,3))
m(t)
它给出了您正在寻找的输出:
[<tf.Tensor: id=149, shape=(1, 3), dtype=float32, numpy=array([[-0.20491418, -0.33935153, 0.07777037]], dtype=float32)>,
<tf.Tensor: id=145, shape=(1, 10), dtype=float32, numpy=
array([[0. , 0.5071918 , 0. , 0.24756521, 0.05489198,
0.31997102, 0. , 0.23788954, 0.01050918, 0.24083027]],
dtype=float32)>]
我对 Sequential API 不太熟悉,但我预计这在 Sequential API 中是不可能的,因为对我来说,这不是一层之后的顺序模型另一个从输入到输出。
我定义了一个简单的顺序模型如下:
m = tf.keras.models.Sequential([
tf.keras.layers.Dense(10, input_shape=(3,), name='fc1', activation='relu'),
tf.keras.layers.Dense(3, input_shape=(3,), name='fc2'),
])
m.summary()
Model: "sequential_6"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
fc1 (Dense) (None, 10) 40
_________________________________________________________________
fc2 (Dense) (None, 3) 33
=================================================================
Total params: 73
Trainable params: 73
Non-trainable params: 0
_________________________________________________________________
现在,我得到一个隐藏层layer_fc1
如下:
layer_fc1 = m.get_layer('fc1')
layer_fc1
<tensorflow.python.keras.layers.core.Dense at 0x7f6fcc7d9eb8>
现在,当我评估这个模型时,我想看看层的值 fc1
。
整个网络的评估和layer_fc1
在单独的forward-calls中的评估如下:
t = tf.random.uniform((1, 3))
m(t)
<tf.Tensor: id=446892, shape=(1, 3), dtype=float32, numpy=array([[ 0.0168661 , -0.12582873, -0.0308626 ]], dtype=float32)>
layer_fc1(t)
<tf.Tensor: id=446904, shape=(1, 10), dtype=float32, numpy=
array([[0. , 0. , 0.00877494, 0.05680769, 0.08027849,
0.12362152, 0. , 0. , 0.22683921, 0.17538759]],
dtype=float32)>
那么,有没有什么方法可以通过 m(t)
的单个前向调用,让我也获得隐藏层的值?这样计算效率会更高
您可以使用 功能 API 轻松完成此操作,如下所示:
inpt = tf.keras.layers.Input(shape=(3,))
fc1_out = tf.keras.layers.Dense(10, name='fc1', activation='relu')(inpt)
fc2_out = tf.keras.layers.Dense(3, name='fc2')(fc1_out)
m = tf.keras.models.Model(inputs=inpt, outputs=[fc2_out, fc1_out])
t = tf.random.uniform((1,3))
m(t)
它给出了您正在寻找的输出:
[<tf.Tensor: id=149, shape=(1, 3), dtype=float32, numpy=array([[-0.20491418, -0.33935153, 0.07777037]], dtype=float32)>,
<tf.Tensor: id=145, shape=(1, 10), dtype=float32, numpy=
array([[0. , 0.5071918 , 0. , 0.24756521, 0.05489198,
0.31997102, 0. , 0.23788954, 0.01050918, 0.24083027]],
dtype=float32)>]
我对 Sequential API 不太熟悉,但我预计这在 Sequential API 中是不可能的,因为对我来说,这不是一层之后的顺序模型另一个从输入到输出。