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

使用Keras在去噪自动编码器中获得隐藏层输出,keras,python-3.6,autoencoder,tensorflow2.0,Keras,Python 3.6,Autoencoder,Tensorflow2.0,我已经建立了一个序列Keras模型,它有三个层:一个高斯噪声层,一个隐藏层,以及与输入层具有相同维度的输出层。为此,我使用了Tensorflow 2.0.0-beta1附带的Keras包。因此,我希望得到隐藏层的输出,这样我就避开了高斯噪声层,因为它只在训练阶段需要 为了实现我的目标,我按照中的说明进行了操作,这些说明也在中进行了详细描述 我从官方的Keras文档中尝试了以下示例: 来自tensorflow导入keras的 从tensorflow.keras导入后端为K dae=keras.Se

我已经建立了一个
序列
Keras模型,它有三个层:一个
高斯噪声
层,一个隐藏层,以及与输入层具有相同维度的输出层。为此,我使用了Tensorflow 2.0.0-beta1附带的Keras包。因此,我希望得到隐藏层的输出,这样我就避开了
高斯噪声
层,因为它只在训练阶段需要

为了实现我的目标,我按照中的说明进行了操作,这些说明也在中进行了详细描述

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

来自tensorflow导入keras的

从tensorflow.keras导入后端为K
dae=keras.Sequential([
高斯噪声(0.001,输入形状=(10,),
keras.layers.Dense(80,name=“hidden”,activation=“relu”),
keras。层。致密(10)
])
optimizer=keras.optimizers.Adam()
编译(loss=“mse”,optimizer=optimizer,metrics=[“mae”])
#这里是装配过程。。。
#dae.fit(·)
#正在尝试检索解码器函子。
编码器=K.函数([dae.输入,K.学习阶段(),
[dae.get_层(“隐藏”).output])
但是,当使用
K.learning\u 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'
回溯(最近一次呼叫最后一次):
文件“/anaconda3/lib/python3.6/contextlib.py”,第99行,在退出时__
self.gen.throw(类型、值、回溯)
文件“/anaconda3/lib/python3.6/site packages/tensorflow\u core/python/keras/backend.py”,第534行,在图中
产量图
文件“/anaconda3/lib/python3.6/site packages/tensorflow_core/python/keras/backend.py”,第3670行,在u init中__
基本图=源图)
文件“/anaconda3/lib/python3.6/site packages/tensorflow_core/python/eager/lift_to_graph.py”,lift_to_图中第249行
已访问的_ops=set([x.op代表源中的x])
文件“/anaconda3/lib/python3.6/site packages/tensorflow_core/python/eager/lift_to_graph.py”,第249行,在
已访问的_ops=set([x.op代表源中的x])
AttributeError:“int”对象没有属性“op”
如果我不包括
K.learning_phase()
,那么代码工作得很好,但我需要确保在没有噪声污染的输入上评估隐藏层的输出(即在“测试”模式——而不是“训练”模式)


我知道我的另一个选择是从原始的去噪自动编码器创建一个模型,但是有人能告诉我为什么我从官方记录的functor创建方法失败了吗?

首先,确保您的包是最新的,因为您的脚本对我来说很好。其次,
encoder
将无法获得输出-在
之后继续从您的代码片段中执行\35;以下是拟合过程…

x=np.random.randn(32,10)#玩具数据
y=np.random.randn(32,10)#玩具标签
dae.fit(x,y)#运行一次迭代
编码器=K.函数([dae.input,K.learning_phase()],[dae.get_layer(“hidden”).output])
输出=[encoder([x,int(False)]][0][0]#[0][0]以索引到len 1的嵌套列表中
打印(输出.形状)
# (32, 80)
但是,从Tensorflow 2.0.0-rc2开始,这将无法在启用紧急执行的情况下工作-通过以下方式禁用:

tf.compat.v1.disable_eager_execution()

如果您共享完整的模型代码,或者共享最小版本的模型代码,以获得可重复性最低的示例,这会有所帮助。另外,如果使用
tensorflow.keras.backend
,为了兼容性,请确保所有层都来自
tensorflow.keras
,而不是
keras
reasons@OverLordGoldDragon我添加了一个简单的代码片段,在构建
编码器时失败。奇怪,我没有错误-您的包是最新的吗?另外,
encoder
不会得到输出,但我在回答中包含了一个完整的脚本,可以得到输出。如果不起作用,请告诉我。(另外,如果还没有使用,我强烈建议您使用python包,因为它可以确保没有冲突)很不幸,但这只适用于tensorflow 1.14(稳定版本)的环境。我通过Anaconda升级了我的所有软件包,但我没有找到一种方法来使用tensorflow 2.0.0-rc2的
conda安装。因此,我不得不为TF2使用
pip安装
。@YoungMin这就是为什么我要传递beta,尤其是像TF这样的大型产品,即使在测试版之外也几乎没有bug。提高兼容性的一种方法是,将TF2安装放在TF1所在的Anaconda文件夹中—然后运行
conda update--all
—我自己做过一次,成功了(但没有承诺;备份正在工作的conda环境以防万一)。最后,尝试传入
int(0)
而不是
K。learning_phase()
@YoungMin同样,我只是查看了源代码,并更改了一个相关函数:
function()
,用于计算
function()
;相反,它现在是从
tensorflow.python.keras.backend
as
tf\u keras\u backend
导入的,并最终通过
执行函数
类运行,该类由错误跟踪指向;看起来,
int(0)
实际上可能更糟,因为
.op
的计算结果必须是某种程度的valid@YoungMin这些线现在更近了,但仍然断开-请注意,您的3670线是master的。现在,你有没有试着不急着运行它?“渴望”不会使您更容易看到所使用代码的输出,而且它可能是错误的根源。如果禁用它不起作用,请在本地打开,并在那里添加
print(sources)
——然后重新运行所有内容并查看输出是的,它在没有急切执行的情况下工作了!谢谢@OverLordGoldDragon!