Ограничение размера графика оценщика Tensorflow для больших входных данных - PullRequest
0 голосов
/ 04 января 2019

Я думаю, что все мои тренировочные данные хранятся внутри графика, который достигает предела 2 ГБ. Как я могу использовать feed_dict в API оценки? К вашему сведению, я использую API оценки тензорного потока для обучения моей модели.

Функция ввода:

def input_fn(X_train,epochs,batch_size):
''' input X_train is the scipy sparse matrix of large input dimensions(200000) and number of rows=600000'''

X_train_tf = tf.data.Dataset.from_tensor_slices((convert_sparse_matrix_to_sparse_tensor(X_train, tf.float32)))
    X_train_tf = X_train_tf.apply(tf.data.experimental.shuffle_and_repeat(shuffle_to_batch*batch_size, epochs))
    X_train_tf = X_train_tf.batch(batch_size).prefetch(2)
    return X_train_tf

Ошибка:

Traceback (последний вызов был последним): File "/tmp/apprunner/.working/runtime/app/ae_python_tf.py", строка 259, в AE_Regressor.train (лямбда: input_fn (X_train, epochs, batch_size), hooks = [time_hist, logging_hook]) Файл "/Tmp/apprunner/.working/runtime/env/lib/python3.5/site-packages/tensorflow/python/estimator/estimator.py", линия 354, в поезде файл потерь = self._train_model (input_fn, hooks, save_listeners) "/tmp/apprunner/.working/runtime/env/lib/python3.5/site-packages/tensorflow/python/estimator/estimator.py", строка 1205, в _train_model вернуть файл self._train_model_distributed (input_fn, hooks, save_listeners) Файл "/Tmp/apprunner/.working/runtime/env/lib/python3.5/site-packages/tensorflow/python/estimator/estimator.py", строка 1352, в _train_model_distributed save_listeners) Файл "/tmp/apprunner/.working/runtime/env/lib/python3.5/site-packages/tensorflow/python/estimator/estimator.py", строка 1468, в _train_with_estimator_spec log_step_count_steps = log_step_count_steps) как mon_sess: файл "/tmp/apprunner/.working/runtime/env/lib/python3.5/site-packages/tensorflow/python/training/monitored_session.py", строка 504, в MonitoredTrainingSession stop_grace_period_secs = stop_grace_period_secs) Файл "/tmp/apprunner/.working/runtime/env/lib/python3.5/site-packages/tensorflow/python/training/monitored_session.py", строка 921, в init stop_grace_period_secs = stop_grace_period_secs) Файл "/tmp/apprunner/.working/runtime/env/lib/python3.5/site-packages/tensorflow/python/training/monitored_session.py", строка 631, в init Файл h.begin () "/tmp/apprunner/.working/runtime/env/lib/python3.5/site-packages/tensorflow/python/training/basic_session_run_hooks.py", строка 543, в начале Файл self._summary_writer = SummaryWriterCache.get (self._checkpoint_dir) "/Tmp/apprunner/.working/runtime/env/lib/python3.5/site-packages/tensorflow/python/summary/writer/writer_cache.py", строка 63, в get logdir, graph = ops.get_default_graph ()) Файл "/tmp/apprunner/.working/runtime/env/lib/python3.5/site-packages/tensorflow/python/summary/writer/writer.py", строка 367, в init Файл super (FileWriter, self). init (event_writer, graph, graph_def) Файл "/Tmp/apprunner/.working/runtime/env/lib/python3.5/site-packages/tensorflow/python/summary/writer/writer.py", строка 83, в init Файл self.add_graph (graph = graph, graph_def = graph_def) "/tmp/apprunner/.working/runtime/env/lib/python3.5/site-packages/tensorflow/python/summary/writer/writer.py", строка 193, в add_graph true_graph_def = graph.as_graph_def (add_shapes = True) Файл "/tmp/apprunner/.working/runtime/env/lib/python3.5/site-packages/tensorflow/python/framework/ops.py", строка 3124, в as_graph_def результат, _ = файл self._as_graph_def (from_version, add_shapes) "/tmp/apprunner/.working/runtime/env/lib/python3.5/site-packages/tensorflow/python/framework/ops.py", строка 3082, в _as_graph_def c_api.TF_GraphToGraphDef (self._c_graph, buf) tenorflow.python.framework.errors_impl.InvalidArgumentError: невозможно Протокол сериализации буфера типа tenorflow.GraphDef в качестве Серийный размер (2838040852 байт) будет больше, чем предел (2147483647 байт)

1 Ответ

0 голосов
/ 04 января 2019

Я обычно против буквального цитирования документации, но это объясняется дословно в TF документации , и я не могу найти способ выразить это лучше, чем они уже делают:

Обратите внимание, что [использование Dataset.from_tensor_slices() на features и labels numpy массивах] будет включать функции и метки массивы в вашем графике TensorFlow как операции tf.constant (). это хорошо работает для небольшого набора данных, но тратит память --- потому что содержимое массива будет скопировано несколько раз --- и может столкнуться с ограничение в 2 ГБ для буфера протокола tf.GraphDef.

В качестве альтернативы, вы можете определить набор данных в терминах tf.placeholder () и передают массивы NumPy, когда вы инициализировать Итератор для набора данных.

# Load the training data into two NumPy arrays, for example using `np.load()`.
with np.load("/var/data/training_data.npy") as data:
  features = data["features"]
  labels = data["labels"]

features_placeholder = tf.placeholder(features.dtype, features.shape)
labels_placeholder = tf.placeholder(labels.dtype, labels.shape)

dataset = tf.data.Dataset.from_tensor_slices((features_placeholder, labels_placeholder))
# [Other transformations on `dataset`...]
dataset = ...
iterator = dataset.make_initializable_iterator()

sess.run(iterator.initializer, feed_dict={features_placeholder: features,
                                          labels_placeholder: labels})

(Код и текст, взятые по ссылке выше, удалили один assert в коде, который не имел отношения к проблеме)


Обновление

Если вы пытаетесь использовать это с API Estimator, вам не повезло. На той же связанной странице несколько разделов над тем, что цитировался ранее:

Примечание. В настоящее время одноразовые итераторы являются единственным типом, который легко использовать с оценщиком.

Это, как вы отметили в комментарии, связано с тем, что API Estimator скрывает вызовы sess.run(), где вам нужно передать feed_dict для вашего итератора.

...