如何获得keras模型的输出而不是张量对象的数值?

时间:2019-01-07 21:32:22

标签: python tensorflow keras

这可能是一个基本的tensorflow / 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对象的输出?

3 个答案:

答案 0 :(得分:1)

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

您可以使用tf.keras.backend.functiondocumentation)来执行此操作,这将返回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.])

答案 1 :(得分:1)

正如卢克已经提到的那样,您似乎对keras在这里为您做的事情感到困惑。

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

1. Computational Graph inference

2. Computation using sessions

您处于阶段1,在那里您将创建一个静态计算图。这还没有进行任何计算,但是很有用,因为您事先知道如何在图形中前后运行数据,因此比每次传递数据时都要快。

如果您实际上想要以numpy-array的形式获得输出,则必须将数据传递到图形的输入。在Tensorflow中,这必须使用会话来完成,但是Keras会将其隐藏起来,让您自由输入数据。

在喀拉拉邦,您通常会做类似scores = model.predict(X)

的事情

答案 2 :(得分:1)

您想要的只是:

model.predict(inputs)

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