Keras功能(K.function)不与RNN一起使用(提供的代码)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Keras功能(K.function)不与RNN一起使用(提供的代码)相关的知识,希望对你有一定的参考价值。
我试图在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中的TypeError Traceback(最近调用最后一次调用)5 layer_outputs.append(l.output)6 get_3rd_layer_output = K.function( [model.layers [0] .input],----> 7 layer_outputs)8 layer_output = get_3rd_layer_output([enc_input])9 print('')
d:\ igs_projects \ nlp_nlu \ venv \ lib \ site-packages \ keras \ backend \ tensorflow_backend.py in function(输入,输出,更新,** kwargs)2742 msg ='无效参数“%s”传递给K.function,TensorFlow后端'%key 2743 raise ValueError(msg) - > 2744 return函数(输入,输出,更新=更新,** kwargs)2745 2746
初始化中的d:\ igs_projects \ nlp_nlu \ venv \ lib \ site-packages \ keras \ backend \ tensorflow_backend.py(自我,输入,输出,更新,名称,** session_kwargs) 2544 self.inputs = list(inputs)2545 self.outputs = list(outputs) - > 2546 with tf.control_dependencies(self.outputs):2547 updates_ops = [] 2548 for update in updates:
control_dependencies(control_inputs)中的d:\ igs_projects \ nlp_nlu \ venv \ lib \ site-packages \ tensorflow \ python \ framework \ ops.py 5002 return _NullContextmanager()5003 else: - > 5004 return get_default_graph()。control_dependencies(control_inputs)5005 5006
d:\ igs_projects \ nlp_nlu \ venv \ lib \ site \ packages \ tensorflow \ python \ framework \ ops.py in control_dependencies(self,control_inputs)4541 if 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 in as_graph_element(self,obj,allow_tensor,allow_operation)3488 3489 with self._lock: - > 3490 return 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 in _as_graph_element_locked(self,obj,allow_tensor,allow_operation)3577#我们放弃了! 3578引发TypeError(“无法将%s转换为%s。”%(type(obj).name, - > 3579 types_str))3580 3581 def get_operations(self):
TypeError:无法将列表转换为Tensor或Operation。
对于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是包含另一个列表的列表,因此错误“无法将列表转换为Tensor或Operation”。
>>> 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一起使用(提供的代码)的主要内容,如果未能解决你的问题,请参考以下文章
Keras 功能 API:将 CNN 模型与 RNN 结合起来查看图像序列