Получение результатов скрытого слоя в шумоподавляющем автоэнкодере с использованием Keras - PullRequest
1 голос
/ 29 сентября 2019

Я построил модель 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(),но мне нужно убедиться, что вывод из моего скрытого слоя оценивается по входу, который не загрязнен шумом (т. е. в режиме «тест», а не в режиме «тренировка»).

Я знаю свой другойвариант заключается в создании модели из исходного шумоподавляющего автоэнкодера, но кто-нибудь может подсказать мне, почему мой подход из официально документированного создания функтора не удался?

1 Ответ

1 голос
/ 29 сентября 2019

Во-первых, убедитесь, что ваши пакеты обновлены, так как ваш скрипт отлично работает для меня.Во-вторых, 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()
...