Keras 函数(K.function)不适用于 RNN(提供的代码)

Posted

技术标签:

【中文标题】Keras 函数(K.function)不适用于 RNN(提供的代码)【英文标题】:Keras Function (K.function) not working with RNN (code provided) 【发布时间】:2019-09-18 22:07:59 【问题描述】:

我试图在 Keras 上查看每一层的输出,但我无法找到正确的代码,所以我在卡住的地方编写了一个简单的代码。

问题:我应该如何获得整个层中有RNN层的每一层的输出?

你可以在下面的代码中看到我是如何尝试看到的。

这是正在运行的测试代码(1):

seq_length = 3
latent_dim = 2
inputs = Input(shape=(seq_length, latent_dim))
outputs = Dense(5)(inputs)
outputs = Flatten()(outputs)

model = Model(inputs=inputs, outputs=outputs)
model.compile(optimizer='rmsprop', loss='mse')
print(model.summary())

查看每一层的输出(2):

layer_outputs = list()
for idx, l in enumerate(model.layers):
    if idx == 0:
        continue
    layer_outputs.append(l.output)
get_3rd_layer_output = K.function([model.layers[0].input],
                                  layer_outputs)
layer_output = get_3rd_layer_output([enc_input])
print('')
for l_output in layer_output:
    print(l_output[0][0])
    print('')

那么输出将类似于

[4.172303 -2.248884 1.397713 3.2669916 2.5788064]

4.172303

但是,如果我尝试使用以下使用 RNN 的代码来测试与 (2) 相同的逻辑:

seq_length = 3
latent_dim = 2
inputs = Input(shape=(seq_length, latent_dim))
outputs, last_output = GRU(latent_dim, return_state=True, return_sequences=True)(inputs)

model = Model(inputs=inputs, outputs=outputs)
model.compile(optimizer='rmsprop', loss='mse')
print(model.summary())

并使用 (2) 进行测试,它会发出如下所示:

----------------------------------- ---------------------------- TypeError Traceback(最近一次调用 最后)在 5 layer_outputs.append(l.output) 6 get_3rd_layer_output = K.function([model.layers[0].input], ----> 7 层输出) 8 layer_output = get_3rd_layer_output([enc_input]) 9 打印('')

d:\igs_projects\nlp_nlu\venv\lib\site-packages\keras\backend\tensorflow_backend.py 在函数中(输入、输出、更新、**kwargs)2742 msg = '使用 TensorFlow 传递给 K.function 的参数“%s”无效 后端' % key 2743 raise ValueError(msg) -> 2744 返回函数(输入、输出、更新=更新、**kwargs)2745 2746

d:\igs_projects\nlp_nlu\venv\lib\site-packages\keras\backend\tensorflow_backend.py 在 init(自我、输入、输出、更新、名称、**session_kwargs) 2544 self.inputs = 列表(输入) 2545 self.outputs = 列表(输出) -> 2546 with tf.control_dependencies(self.outputs): 2547 updates_ops = [] 2548 for update in updates:

d:\igs_projects\nlp_nlu\venv\lib\site-packages\tensorflow\python\framework\ops.py 在 control_dependencies(control_inputs) 5002 返回 _NullContextmanager() 5003 否则: -> 5004 返回 get_default_graph().control_dependencies(control_inputs) 5005 5006

d:\igs_projects\nlp_nlu\venv\lib\site-packages\tensorflow\python\framework\ops.py 在 control_dependencies(self, control_inputs) 4541 如果 isinstance(c, IndexedSlices): 4542 c = c.op -> 4543 c = self.as_graph_element(c) 4544 if isinstance(c, Tensor): 4545 c = c.op

d:\igs_projects\nlp_nlu\venv\lib\site-packages\tensorflow\python\framework\ops.py 在 as_graph_element(self, obj, allow_tensor, allow_operation) 3488 3489 与 self._lock: -> 3490 返回 self._as_graph_element_locked(obj,allow_tensor,allow_operation)3491 3492 def _as_graph_element_locked(self, obj, allow_tensor, allow_operation):

d:\igs_projects\nlp_nlu\venv\lib\site-packages\tensorflow\python\framework\ops.py 在 _as_graph_element_locked(self, obj, allow_tensor, allow_operation) 3577#我们放弃!第3578章 将 %s 转换为 %s。" % (type(obj).name, -> 3579 types_str)) 3580 3581 def get_operations(self):

TypeError: 无法将列表转换为张量或操作。

【问题讨论】:

【参考方案1】:

对于 GRU 层,layer.output 本身就是一个列表。

>>> model.layers[1].output
[<tf.Tensor 'gru_1/transpose_1:0' shape=(?, ?, 2) dtype=float32>, <tf.Tensor 'gru_1/while/Exit_3:0' shape=(?, 2) dtype=float32>]

layer_outputs 是一个包含另一个列表的列表,因此会出现错误“无法将列表转换为张量或操作”

>>> layer_outputs
[[<tf.Tensor 'gru_1/transpose_1:0' shape=(?, ?, 2) dtype=float32>, <tf.Tensor 'gru_1/while/Exit_3:0' shape=(?, 2) dtype=float32>]]

像这样更新代码应该可以工作:

get_3rd_layer_output = K.function([model.layers[0].input],
                                  layer_outputs[0]) #Extract the element and feed it.

【讨论】:

以上是关于Keras 函数(K.function)不适用于 RNN(提供的代码)的主要内容,如果未能解决你的问题,请参考以下文章

model.predict 不适用于 Keras 自定义层(推理错误)

TFLite 转换器:为 keras 模型实现的 RandomStandardNormal,但不适用于纯 TensorFlow 模型

使用 dropout (TF2.0) 时,可变批量大小不适用于 tf.keras.layers.RNN?

具有Tensorflow后端的Keras的K.function方法是否适用于网络层?

Keras功能(K.function)不与RNN一起使用(提供的代码)

Tensorflow compute_output_shape()不适用于自定义层