Как получить промежуточные результаты в TF 2.3 Eager с Learning_phase? - PullRequest
0 голосов
/ 04 августа 2020

Пример ниже работает в 2.2; K.function значительно изменен в 2.3, теперь строит a Model в нетерпеливом исполнении, поэтому мы передаем Model(inputs=[learning_phase,...]).

У меня есть временное решение, но оно hacki sh и намного сложнее, чем K.function; если никто не может показать простой подход, я опубликую свой.


from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model
from tensorflow.python.keras import backend as K
import numpy as np

ipt = Input((16,))
x   = Dense(16)(ipt)
out = Dense(16)(x)
model = Model(ipt, out)
model.compile('sgd', 'mse')

outs_fn = K.function([model.input, K.symbolic_learning_phase()],
                     [model.layers[1].output])  # error
x = np.random.randn(32, 16)
print(outs_fn([x, True]))
>>> ValueError: Input tensors to a Functional must come from `tf.keras.Input`. 
Received: Tensor("keras_learning_phase:0", shape=(), dtype=bool) 
(missing previous layer metadata).

1 Ответ

1 голос
/ 04 августа 2020

Для получения выходных данных промежуточного слоя в режиме ожидания нет необходимости создавать K.function и использовать фазу обучения. Вместо этого мы можем построить модель для достижения этого:

partial_model = Model(model.inputs, model.layers[1].output)

x = np.random.rand(...)
output_train = partial_model([x], training=True)   # runs the model in training mode
output_test = partial_model([x], training=False)   # runs the model in test mode

В качестве альтернативы, если вы настаиваете на использовании K.function и хотите переключить этап обучения в активный режим, вы можете использовать eager_learning_phase_scope из tensorflow.python.keras.backend (обратите внимание, что этот модуль является расширенным набором tensorflow.keras.backend и содержит внутренние функции, такие как упомянутая, которые могут измениться в будущих версиях):

from tensorflow.python.keras.backend import eager_learning_phase_scope

fn = K.function([model.input], [model.layers[1].output])

# run in test mode, i.e. 0 means test
with eager_learning_phase_scope(value=0):
    output_test = fn([x])

# run in training mode, i.e. 1 means training
with eager_learning_phase_scope(value=1):
    output_train = fn([x])
...