这可能是一个基本的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
对象的输出?
答案 0 :(得分:1)
使用model.layer[1].output
不会产生输出,它只是返回输出的张量定义。为了实际产生输出,您需要通过模型运行数据并指定model.layer[1].output
作为输出。
您可以使用tf.keras.backend.function
(documentation)来执行此操作,这将返回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)
在输入的情况下,将对模型进行前向传递,并产生数值输出。