Я построил модель Sequential
Keras с тремя слоями: слой Gaussian Noise
, скрытый слой и выходной слой с тем же размером, что и входной слой.Для этого я использую пакет Keras , который поставляется с Tensorflow 2.0.0-beta1 .Таким образом, я хотел бы получить выходные данные скрытого слоя, чтобы я обошел слой 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()
,но мне нужно убедиться, что вывод из моего скрытого слоя оценивается по входу, который не загрязнен шумом (т. е. в режиме «тест», а не в режиме «тренировка»).
Я знаю свой другойвариант заключается в создании модели из исходного шумоподавляющего автоэнкодера, но кто-нибудь может подсказать мне, почему мой подход из официально документированного создания функтора не удался?