如何在 Keras 中获取深度 RNN 的所有中间层的输出
How to get outputs of all intermediate layers of a deep RNN in Keras
我正在尝试获取 Keras 中自定义 RNN 模型每一层的输出。该模型的代码如下。
from tensorflow.python import keras
from tensorflow.python.keras import backend as K
from tensorflow.python.keras.layers import RNN, Dense, Activation
from tensorflow.python.keras.models import Model
import numpy as np
class MinimalRNNCell(keras.layers.Layer):
def __init__(self, units, **kwargs):
self.units = units
self.state_size = units
super(MinimalRNNCell, self).__init__(**kwargs)
def build(self, input_shape):
self.kernel = self.add_weight(shape=(input_shape[-1], self.units),
initializer='uniform',
name='kernel')
self.recurrent_kernel = self.add_weight(
shape=(self.units, self.units),
initializer='uniform',
name='recurrent_kernel')
self.built = True
def call(self, inputs, states):
prev_output = states[0]
h = K.dot(inputs, self.kernel)
output = h + K.dot(prev_output, self.recurrent_kernel)
return output, [output]
cells = [MinimalRNNCell(32), MinimalRNNCell(64)]
x = keras.Input((None, 257))
y = RNN(cells)(x)
out = Dense(257, name='fin_dense')(y)
out = Activation('sigmoid', name='out_layer')(out)
model = Model(inputs=x, outputs=out)
我可以使用
得到预测
in_test = np.random.randn(1, 3, 257)
mod_out = model.predict(in_test)
但我想要每一层的输出,当我尝试使用适用于所有其他 Keras 模型的 getLayerOutputs
函数时
def getLayerOutputs(model, input_data, learning_phase=1):
outputs = [layer.output for layer in model.layers[1:]] # exclude Input
layers_fn = K.function([model.input, K.learning_phase()], outputs)
return layers_fn([input_data, learning_phase])
layer_outs = getLayerOutputs(model, in_test)
我获得了整个 RNN 层的输出,而不是其中的每个单元格,如何使用 RNN 获得每个单元格的输出?
这应该在 tensorflow 1.x(测试版本 1.12.0)上执行:
sess = K.get_session()
outs = dict()
for i in range(1, len(model.layers)):
outs[model.layers[i].name] = sess.run([model.layers[i].output], feed_dict={model.input:in_test})
(outs有每一层的中间结果)
如果您使用的是 TensorFlow 2(测试版本 2.0.0-rc1):
outs = dict()
for i in range(1, len(model.layers)):
outs[model.layers[i].name] = Model(x, model.layers[i].output).predict(in_test)
通过将 return_state 标记更改为 True
,就像这样
y = RNN(cells, return_state=True)(x)
我们将 RNN 的每个单元的输出状态作为列表
我正在尝试获取 Keras 中自定义 RNN 模型每一层的输出。该模型的代码如下。
from tensorflow.python import keras
from tensorflow.python.keras import backend as K
from tensorflow.python.keras.layers import RNN, Dense, Activation
from tensorflow.python.keras.models import Model
import numpy as np
class MinimalRNNCell(keras.layers.Layer):
def __init__(self, units, **kwargs):
self.units = units
self.state_size = units
super(MinimalRNNCell, self).__init__(**kwargs)
def build(self, input_shape):
self.kernel = self.add_weight(shape=(input_shape[-1], self.units),
initializer='uniform',
name='kernel')
self.recurrent_kernel = self.add_weight(
shape=(self.units, self.units),
initializer='uniform',
name='recurrent_kernel')
self.built = True
def call(self, inputs, states):
prev_output = states[0]
h = K.dot(inputs, self.kernel)
output = h + K.dot(prev_output, self.recurrent_kernel)
return output, [output]
cells = [MinimalRNNCell(32), MinimalRNNCell(64)]
x = keras.Input((None, 257))
y = RNN(cells)(x)
out = Dense(257, name='fin_dense')(y)
out = Activation('sigmoid', name='out_layer')(out)
model = Model(inputs=x, outputs=out)
我可以使用
得到预测in_test = np.random.randn(1, 3, 257)
mod_out = model.predict(in_test)
但我想要每一层的输出,当我尝试使用适用于所有其他 Keras 模型的 getLayerOutputs
函数时
def getLayerOutputs(model, input_data, learning_phase=1):
outputs = [layer.output for layer in model.layers[1:]] # exclude Input
layers_fn = K.function([model.input, K.learning_phase()], outputs)
return layers_fn([input_data, learning_phase])
layer_outs = getLayerOutputs(model, in_test)
我获得了整个 RNN 层的输出,而不是其中的每个单元格,如何使用 RNN 获得每个单元格的输出?
这应该在 tensorflow 1.x(测试版本 1.12.0)上执行:
sess = K.get_session()
outs = dict()
for i in range(1, len(model.layers)):
outs[model.layers[i].name] = sess.run([model.layers[i].output], feed_dict={model.input:in_test})
(outs有每一层的中间结果)
如果您使用的是 TensorFlow 2(测试版本 2.0.0-rc1):
outs = dict()
for i in range(1, len(model.layers)):
outs[model.layers[i].name] = Model(x, model.layers[i].output).predict(in_test)
通过将 return_state 标记更改为 True
,就像这样
y = RNN(cells, return_state=True)(x)
我们将 RNN 的每个单元的输出状态作为列表