如何获取 keras 模型的输出作为数值,而不是 Tensor 对象?

问题描述 投票:0回答:4

这可能是一个非常基本的张量流/keras 问题,但我似乎无法在 docs 中找到它。我希望将隐藏层的输出检索为数值,以便在后续计算中使用。这是模型

from io import StringIO
import pandas as pd
import numpy as np
import keras

data_str = """     
ti,z1,z2
0.0,1.000,0.000
0.1,0.606,0.373
0.2,0.368,0.564
0.3,0.223,0.647
0.4,0.135,0.669
0.5,0.082,0.656
0.6,0.050,0.624
0.7,0.030,0.583
0.8,0.018,0.539
0.9,0.011,0.494
1.0,0.007,0.451"""
data = pd.read_csv(StringIO(data_str), sep=',')

wd = r'/path/to/working/directory'
model_filename = os.path.join(wd, 'example1_with_keras.h5')

RUN = True
if RUN:
    model = keras.Sequential()
    model.add(keras.layers.Dense(3, activation='tanh', input_shape=(1, )))
    model.add(keras.layers.Dense(2, activation='tanh'))
    model.compile(optimizer='adam', loss='mean_squared_error')
    model.fit(data['ti'].values, data[['z1', 'z2']].values, epochs=30000)
    model.save(filepath=model_filename)
else:
    model = keras.models.load_model(model_filename)

outputs = model.layers[1].output
print(outputs)

这将打印以下内容:

>>> Tensor("dense_2/Tanh:0", shape=(?, 2), dtype=float32)

如何获得

np.array
而不是
Tensor
对象的输出?

python tensorflow keras
4个回答
2
投票

使用

model.layer[1].output
不会产生输出,它只是返回输出的张量定义。为了实际产生输出,您需要通过模型运行数据并指定
model.layer[1].output
作为输出。

您可以使用

tf.keras.backend.function
文档)来完成此操作,它将返回 Numpy 数组。可以在here找到与您类似的问题。

如果您只需要

model.layers[1].output
的输出并且将
data
转换为 Numpy 数组作为输入,则以下内容应该适用于您的示例:

from keras import backend as K
outputs = [model.layers[1].output]
functor = K.function([model.input, K.learning_phase()], outputs)
layer_outs = functor([data, 1.])

2
投票

你想要的只是:

model.predict(inputs)

这将在给定输入的情况下对模型进行前向传递,并产生数字输出。


1
投票

正如卢克已经提到的,你似乎混淆了 keras 实际上在这里为你做什么。

Keras、tensorflow 或 PyTorch 等库有两个阶段。

1. Computational Graph inference

2. Computation using sessions

您处于第 1 阶段,您将创建静态计算图。这还没有进行任何计算,但它很有帮助,因为您事先知道如何在图表中向前和向后运行数据,从而使其比每次传递数据时计算它更快。

如果您确实想获得 numpy 数组形式的输出,则必须将数据传递到图形的输入。在 Tensorflow 中,这必须使用会话来完成,但 Keras 向您隐藏了这一点并让您自由输入数据。

在keras中你通常会做类似的事情

scores = model.predict(X)


0
投票

如果您使用模型子类化(而不是使用 Keras 的顺序或函数式 API)编写模型,您可以修改调用方法以打印任何层的输出:

from tensorflow.keras import backend as K

class YourModel(keras.Model):
# ... your model initialization code goes here

def call(self, x):        
    layer = self.dense(x)
    K.print_tensor(x, message='dense output: ')
    # rest of your model...
    return layer
© www.soinside.com 2019 - 2024. All rights reserved.