这可能是一个非常基本的张量流/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
对象的输出?
使用
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.])
你想要的只是:
model.predict(inputs)
这将在给定输入的情况下对模型进行前向传递,并产生数字输出。
正如卢克已经提到的,你似乎混淆了 keras 实际上在这里为你做什么。
Keras、tensorflow 或 PyTorch 等库有两个阶段。
1. Computational Graph inference
2. Computation using sessions
您处于第 1 阶段,您将创建静态计算图。这还没有进行任何计算,但它很有帮助,因为您事先知道如何在图表中向前和向后运行数据,从而使其比每次传递数据时计算它更快。
如果您确实想获得 numpy 数组形式的输出,则必须将数据传递到图形的输入。在 Tensorflow 中,这必须使用会话来完成,但 Keras 向您隐藏了这一点并让您自由输入数据。
在keras中你通常会做类似的事情
scores = model.predict(X)
如果您使用模型子类化(而不是使用 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