如何在所有时间步中获得网络中所有层中所有单元的网络激活?

Posted

技术标签:

【中文标题】如何在所有时间步中获得网络中所有层中所有单元的网络激活?【英文标题】:How do I get network activations of all units in all layers in a network in all timesteps? 【发布时间】:2021-09-16 15:47:18 【问题描述】:

我想检查循环神经网络所有层中所有单元在多个时间步长上的活动。

在下面的代码中,我创建了一个带有 SimpleRNNDense 层的 Keras 模型。

如果我在初始化 RNN 时使用参数 return_sequences=True,如果我使用 rnn(inputs),我可以获得 RNN 的活动,对于任何适当的 inputs 数组。我还可以通过model(inputs) 获取输出单元随时间推移的活动。

但如果我想要两者,同时执行 rnn(inputs)model(inputs) 会使计算完成两次。有没有办法避免在随着时间的推移访问所有单元的活动时进行两次计算?谢谢!

SEED=42
tf.random.set_seed(SEED)
np.random.seed(SEED)

timesteps = 3
embedding_dim = 4
units = 2
num_samples = 5

input_shape = (num_samples, timesteps, embedding_dim)
model = Sequential([
    SimpleRNN(units, stateful=True, batch_input_shape=input_shape, return_sequences=True, activation="linear", 
              recurrent_initializer="identity", bias_initializer="ones"), 
    Dense(1)])

some_initial_state = np.ones((num_samples, units))
some_initial_state[0,0] = 0.123
rnn = model.layers[0]
rnn.reset_states(states=some_initial_state)


some_initial_state, rnn(np.zeros((num_samples, timesteps, embedding_dim))), model(np.zeros((num_samples, timesteps, embedding_dim)))

输出如下:

(array([[0.123, 1.   ],
    [1.   , 1.   ],
    [1.   , 1.   ],
    [1.   , 1.   ],
    [1.   , 1.   ]]),
<tf.Tensor: shape=(5, 3, 2), dtype=float32, numpy=
array([[[1.123    , 2.       ],
     [2.1230001, 3.       ],
     [3.1230001, 4.       ]],

    [[2.       , 2.       ],
     [3.       , 3.       ],
     [4.       , 4.       ]],

    [[2.       , 2.       ],
     [3.       , 3.       ],
     [4.       , 4.       ]],

    [[2.       , 2.       ],
     [3.       , 3.       ],
     [4.       , 4.       ]],

    [[2.       , 2.       ],
     [3.       , 3.       ],
     [4.       , 4.       ]]], dtype=float32)>,
<tf.Tensor: shape=(5, 3, 1), dtype=float32, numpy=
array([[[1.971611 ],
     [2.4591472],
     [2.9466834]],

    [[2.437681 ],
     [2.9252172],
     [3.4127533]],

    [[2.437681 ],
     [2.9252172],
     [3.4127533]],

    [[2.437681 ],
     [2.9252172],
     [3.4127533]],

    [[2.437681 ],
     [2.9252172],
     [3.4127533]]], dtype=float32)>)

【问题讨论】:

【参考方案1】:

您需要使用Functional API 的具有多个输出的模型,如下所示:

SEED=42
tf.random.set_seed(SEED)
np.random.seed(SEED)

timesteps = 3
embedding_dim = 4
units = 2
num_samples = 5

inputs = Input(batch_shape=(num_samples, timesteps, embedding_dim))
# initial state as Keras Input
initial_state = Input((units,))
rnn = SimpleRNN(units, stateful=True, return_sequences=True, activation="linear", 
                recurrent_initializer="identity", bias_initializer="ones")
hidden = rnn(inputs, initial_state=initial_state)
dense = Dense(1)(hidden)

# The initial state is a extra input and the model has two outputs
model = Model([inputs, initial_state], outputs=[hidden, dense])

some_input = np.zeros((num_samples, timesteps, embedding_dim))
some_initial_state = np.ones((num_samples, units))
some_initial_state[0,0] = 0.123
rnn_output, dense_output = model([some_input, some_initial_state])

some_initial_state, rnn_output, dense_output

请注意,您不需要使用 有状态 RNN 来使用功能 API 设置初始状态。此外,通过在您的示例中运行两次前向传递,第二个输出将对应于不同的 RNN 状态(我认为这不是预期的结果)。

【讨论】:

以上是关于如何在所有时间步中获得网络中所有层中所有单元的网络激活?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法通过 Keras 获得可变的重要性?

如何在 asp.net 4.0 中获取所有网络打印机

网络分析 ANP

如何在这种结构中建立神经网络?不同的节点连接到下一层不同数量的节点

如何使用 UMN 地图服务器在图层中获得透明背景?

在神经网络开始在训练数据上表现可接受之前的隐藏层数、隐藏层中的单元数和历元数