使用 Keras 在去噪自动编码器中获取隐藏层输出



我构建了一个包含三层的SequentialKeras模型:Gaussian Noise层、隐藏层和与输入层具有相同维度的输出层。 为此,我使用的是Tensorflow 2.0.0-beta1附带的Keras包。 因此,我想获取隐藏层的输出,这样我就可以绕过Gaussian Noise层,因为它仅在训练阶段是必需的。

为了实现我的目标,我按照 https://keras.io/getting-started/faq/#how-can-i-obtain-the-output-of-an-intermediate-layer 中的说明进行操作,这些说明在 Keras 中进行了描述,如何获取每层的输出?

我已经尝试了官方 Keras 文档中的以下示例:

from tensorflow import keras
from tensorflow.keras import backend as K
dae = keras.Sequential([
keras.layers.GaussianNoise( 0.001, input_shape=(10,) ),
keras.layers.Dense( 80, name="hidden", activation="relu" ),
keras.layers.Dense( 10 )
])
optimizer = keras.optimizers.Adam()
dae.compile( loss="mse", optimizer=optimizer, metrics=["mae"] )
# Here the fitting process...
# dae.fit( · )
# Attempting to retrieve a decoder functor.
encoder = K.function([dae.input, K.learning_phase()], 
[dae.get_layer("hidden").output])

但是,当K.learning_phase()用于创建 Keras 后端函子时,我收到错误:

Traceback (most recent call last):
File "/anaconda3/lib/python3.6/contextlib.py", line 99, in __exit__
self.gen.throw(type, value, traceback)
File "/anaconda3/lib/python3.6/site-packages/tensorflow_core/python/keras/backend.py", line 534, in _scratch_graph
yield graph
File "/anaconda3/lib/python3.6/site-packages/tensorflow_core/python/keras/backend.py", line 3670, in __init__
base_graph=source_graph)
File "/anaconda3/lib/python3.6/site-packages/tensorflow_core/python/eager/lift_to_graph.py", line 249, in lift_to_graph
visited_ops = set([x.op for x in sources])
File "/anaconda3/lib/python3.6/site-packages/tensorflow_core/python/eager/lift_to_graph.py", line 249, in <listcomp>
visited_ops = set([x.op for x in sources])
AttributeError: 'int' object has no attribute 'op'

如果我不包含K.learning_phase(),代码效果很好,但我需要确保隐藏层的输出是在未被噪声污染的输入上评估的(即在"测试"模式下 - 而不是"训练"模式(。

我知道我的另一个选择是从原始去噪自动编码器创建一个模型,但谁能指出为什么我从官方记录的函子创建中的方法失败了?

首先,确保您的软件包是最新的,因为您的脚本对我来说效果很好。其次,encoder不会得到输出 -# Here is the fitting process...后继续你的代码段,

x = np.random.randn(32, 10) # toy data
y = np.random.randn(32, 10) # toy labels
dae.fit(x, y) # run one iteration
encoder = K.function([dae.input, K.learning_phase()], [dae.get_layer("hidden").output])
outputs = [encoder([x, int(False)])][0][0] # [0][0] to index into nested list of len 1
print(outputs.shape)
# (32, 80)

但是,从Tensorflow 2.0.0-rc2开始,这将不适用于启用预先执行 - 通过以下方式禁用:

tf.compat.v1.disable_eager_execution()

相关内容

  • 没有找到相关文章

最新更新