Я построил два пользовательских слоя Keras и пользовательскую модель Keras для тензорного потока 2.0.Я пытаюсь понять, почему model.build (), кажется, устанавливает параметры, что делает невозможным вызов функции model.call () в дальнейшем со следующей ошибкой в eager::execute.py::quick_execute()
:
TypeError: An op outside of the function building code is being passed
a "Graph" tensor. It is possible to have Graph tensors
leak out of the function building context by including a
tf.init_scope in your function building code.
For example, the following function will fail:
@tf.function
def has_init_scope():
my_constant = tf.constant(1.)
with tf.init_scope():
added = my_constant * 2
The graph tensor has name: ...
Это стоитотмечая, что я также не могу назвать отдельные слои моделей (например, model.layer_1.call(input)
).
Я постараюсь сделать вопрос как можно более понятным, но код для модели и слоя довольно сложный.
Код, который не работает:
model = CustomModel(params)
model.build((1, 41)) # Builds OK
a = tf.Variable(tf.ones((1, 41)))
print(model.call(a)) # Fails
Интересно, что если я позвоню model.call()
до , то я не буду создавать проблемы.То есть этот код не дает сбоя:
model = CustomModel(params)
a = tf.Variable(tf.ones((1, 41)))
print(model.call(a)) # Returns predictions
model.build((1, 41)) # Builds OK
print(model.call(a)) # Still works
Моя model.build()
функция основана на моделях Keras, и, возможно, проблема в этом?
def build(self, input_shape=None):
if input_shape is None:
raise ValueError('You must provide an `input_shape` argument.')
input_shape = tuple(input_shape)
self._build_input_shape = input_shape
super(CustomModel, self).build(input_shape)
# Need to call the model with another positional argument to initialize all the layers
self.call(tf.ones(input_shape), use_target=True)
self.built = True
Такое поведениедовольно запутанно, и я не уверен, что это проблема с TF или я неправильно понимаю роль build()
.
Я знаю, что TF2 довольно новый и все еще находится в разработке, но если у кого-то есть какое-то понимание, это будет с благодарностью!:)