Tensorflow @ tf.function - не удается получить сеанс внутри функции графа Tensorflow - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь использовать директиву @ tf.function с функциональным API-интерфейсом Keras, чтобы создать график TF на этапе обучения простой нейронной сети. Я использую Tensorflow v 2.1.0, установленную с Python 3.7. Однако я получаю ошибку времени выполнения, как в заголовке, и я был бы признателен за любую подсказку, чтобы понять причину этого.

Код следующий.

import tensorflow as tf
import numpy as np

# import the CIFAR10 dataset and normalise the feature distributions                                                                                                                             
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.cifar10.load_data()                                                                                         
train_images = train_images / np.max(train_images)
test_images  = test_images / np.max(train_images)

# convert the datasets to tf.data, batching the data                                                                                                                    
train_data = tf.data.Dataset.from_tensor_slices((train_images, train_labels)).batch(128)
test_data  = tf.data.Dataset.from_tensor_slices((test_images,  test_labels)).batch(128)

# make a model with a single dense layer
# note that the flatten layer is needed to convert the                                                                                                         
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(units = 10, activation = "relu"))

# compile the model                                                                                                                                  
model.compile(optimizer = tf.keras.optimizers.Adam(learning_rate = 0.001),
              loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits = True),
              metrics = ["accuracy"])

# training step
@tf.function
def train(model, train_data, test_data):
    model.fit(x = train_data,
              validation_data = test_data,
              epochs = 10)

    return

# train the model                                                                                                                                    
train(model = model, train_data = train_data, test_data = test_data)

Ошибка, которую я получаю во время выполнения выглядит следующим образом.

2020-04-01 11:33:27.084545: W tensorflow/core/framework/cpu_allocator_impl.cc:81] Allocation of 1228800000 exceeds 10% of system memory.
Traceback (most recent call last):
  File "report.py", line 41, in <module>
    train(model = model, train_data = train_data, test_data = test_data)
  File "/home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/eager/def_function.py", line 568, in __call__
    result = self._call(*args, **kwds)
  File "/home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/eager/def_function.py", line 615, in _call
    self._initialize(args, kwds, add_initializers_to=initializers)
  File "/home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/eager/def_function.py", line 497, in _initialize
    *args, **kwds))
  File "/home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/eager/function.py", line 2389, in _get_concrete_function_internal_garbage_collected
    graph_function, _, _ = self._maybe_define_function(args, kwargs)
  File "/home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/eager/function.py", line 2703, in _maybe_define_function
    graph_function = self._create_graph_function(args, kwargs)
  File "/home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/eager/function.py", line 2593, in _create_graph_function
    capture_by_value=self._capture_by_value),
  File "/home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/framework/func_graph.py", line 978, in func_graph_from_py_func
    func_outputs = python_func(*func_args, **func_kwargs)
  File "/home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/eager/def_function.py", line 439, in wrapped_fn
    return weak_wrapped_fn().__wrapped__(*args, **kwds)
  File "/home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/framework/func_graph.py", line 968, in wrapper
    raise e.ag_error_metadata.to_exception(e)
RuntimeError: in converted code:

    report.py:34 train  *
        model.fit(x = train_data,
    /home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training.py:819 fit
        use_multiprocessing=use_multiprocessing)
    /home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_arrays.py:648 fit
        shuffle=shuffle)
    /home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training.py:2346 _standardize_user_data
        all_inputs, y_input, dict_inputs = self._build_model_with_inputs(x, y)
    /home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training.py:2523 _build_model_with_inputs
        inputs, targets, _ = training_utils.extract_tensors_from_dataset(inputs)
    /home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_utils.py:1677 extract_tensors_from_dataset
        iterator = get_iterator(dataset)
    /home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_utils.py:1658 get_iterator
        initialize_iterator(iterator)
    /home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_utils.py:1665 initialize_iterator
        K.get_session((init_op,)).run(init_op)
    /home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/keras/backend.py:493 get_session
        session = _get_session(op_input_list)
    /home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/keras/backend.py:453 _get_session
        raise RuntimeError('Cannot get session inside Tensorflow graph function.')

    RuntimeError: Cannot get session inside Tensorflow graph function.

Обратите внимание, что тот же код, что и раньше, работает нормально без директивы @ tf.function. С другой стороны, я получаю одинаковую ошибку на разных наборах данных и на разных моделях.

Заранее спасибо.

1 Ответ

1 голос
/ 01 апреля 2020

Глядя на документацию https://www.tensorflow.org/guide/function, мне не ясно, что определенная вами функция может быть скомпилирована в график. Я думаю, что он предназначен для использования в функциях, которые используются в лямбда-слое https://www.tensorflow.org/api_docs/python/tf/keras/layers/Lambda или аналогичных.

Вы уже вызвали компиляцию модели, которая будет преобразовывать ее в график, больше ничего не нужно делать.

Я предполагаю, что он выбрасывает, потому что не знает, как построить график из вызова model.fit, но сообщение об ошибке очень запутанное.

Если вы попробуете простую арифметическую c функцию, такую ​​как

@tf.function
def add(x, y):
    return x + y

add(1, 2)

Теперь выдает тензор:

<tf.Tensor: shape=(), dtype=int32, numpy=3>

TensorFlow работает быстро. Я не буду беспокоиться о производительности, пока вы действительно не поймете, что происходит в библиотеке, и не узнаете, что есть проблема.

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