开启eager执行时如何获取KerasTensor的值转为numpy数组查看模型层输出
报错原因
cnn.layers[0].output是Keras构建计算图时生成的符号型KerasTensor对象,仅代表张量的计算逻辑,不存储实际运行产生的数值,因此没有numpy()方法,也无法用K.eval()直接取值。
可行解决方法
方法1:构建中间层提取模型(最常用)
基于原模型的输入和目标层的输出新建一个临时提取模型,传入输入数据直接推理就能拿到对应层的实际输出值:
import numpy import tensorflow.keras.models as models import tensorflow.keras.layers as layers cnn = models.Sequential([ layers.Conv2D(filters=64, kernel_size=3, activation='relu', kernel_initializer='he_uniform', padding='same', input_shape=(32,32,3))], name='cnn') # 构建提取指定层输出的模型 extract_model = models.Model(inputs=cnn.input, outputs=cnn.layers[0].output) # 传入输入数据推理,拿到实际输出张量 layer_output_tensor = extract_model(numpy.random.random((1,32,32,3))) # 转numpy数组 layer_output_np = layer_output_tensor.numpy() print(layer_output_np)
方法2:使用backend.function直接构造取值函数
如果不需要复用中间模型,也可以直接用Keras后端构造取值函数,调用后直接返回numpy数组:
from keras import backend as K get_layer0_output = K.function([cnn.input], [cnn.layers[0].output]) # 传入输入数据直接拿到numpy格式的层输出 layer_output_np = get_layer0_output([numpy.random.random((1,32,32,3))])[0] print(layer_output_np)
注意事项
eager执行模式下仅实际运行产生的EagerTensor对象可以调用.numpy()方法转numpy数组,静态计算图中的符号张量无法直接取值。
内容的提问来源于stack exchange,提问作者leet
相关产品推荐
相关产品推荐

