Я использую бэкэнд-функцию Keras для тестирования модели (условный вариационный автоэнкодер, вероятно, не имеет значения), который я обучал в Keras.Вот пример кода, показанного в документации Keras.
get_3rd_layer_output = K.function([model.layers[0].input, K.learning_phase()],
[model.layers[3].output])
# output in test mode = 0
layer_output = get_3rd_layer_output([x, 0])[0]
# output in train mode = 1
layer_output = get_3rd_layer_output([x, 1])[0]
Однако, когда я пытаюсь сделать что-то подобное, я получаю сообщение об ошибке.Мой код ниже:
vae_func = K.function([vae.get_layer(name='input_img').input, vae.get_layer(name='attributes').input, K.learning_phase()], [vae.get_layer(name='output_img').output])
test_reconstruction = vae_func([x_train, y_train, 0])[0]
И конец трассировки говорит следующее странное сообщение об ошибке:
tensor_type = dtypes_module.as_dtype(tensor.dtype)
AttributeError: 'bool' object has no attribute 'dtype'
Если я исключаю ввод K.learning_phase (), код запускается,но это происходит в режиме обучения, что означает, что уровни нормализации и выпадения пакетов в моей модели ведут себя так же, как на этапе обучения, а не на этапе тестирования, что приводит к крайне нежелательным результатам.Независимо от того, пытаюсь ли я установить фазу обучения на 0 или 1, появляется та же ошибка.Является ли этот способ установки фазы обучения устаревшим?Или я что-то делаю не так?
РЕДАКТИРОВАТЬ: После дальнейшего тестирования, я стал более запутанным.Похоже, что моя консоль IPython была причиной проблем, и когда я запустил ее в терминале python, код запустился без проблем.Причина этого заключается в том, что K.learning_phase () возвращает логическое значение в консоли IPython, но возвращает логическое значение тензор при перемещении в терминал.
Однако это обнаружение имеетне решен вопрос.Тестируя выходы моих функций Keras, я обнаружил, что независимо от того, прошел я 0 (тестовый режим) или 1 (режим поезда), выход функции не останется прежним, что свидетельствует о том, что он не был успешно переключен в тестовый режим.Если кто-то знает почему, пожалуйста, ответьте.
РЕДАКТИРОВАТЬ 2: Еще раз, с еще большим тестированием, я понимаю, что это не ошибка IPython.Причина, по которой K.learning_phase () вернула логическое значение, заключалась в том, что в моем учебном коде модели была строка K.set_learning_phase (True), которая странным образом заставляла K.learning_phase () возвращать логическое значение, а не тензорный набор для этого логического значения.Однако это не решило проблему того, почему тестовый режим не работает.