Tensorflow2.0a: почему сначала model.call (), а затем model.build (), но не в обратном порядке? - PullRequest
2 голосов
/ 17 мая 2019

Я построил два пользовательских слоя 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 довольно новый и все еще находится в разработке, но если у кого-то есть какое-то понимание, это будет с благодарностью!:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...