2

Если у меня есть подготовленная модель Imagnet от Google (inception-resnet-v2), и модель на самом деле дает мне два выхода назад: logits и список, называемый end_points, где я могу извлечь окончательный прогнозируемый слой, который был выполнен с помощью softmax активация, то есть переменная, называемая predictions. Однако это окончательно не дает мне метку класса, которую я бы требовал для предсказаний. Для этого мне нужно было либо сделать label = tf.argmax(predictions, 1)после Я определил train_op на графике, так что я не буду влиять на исходное вычисление.TensorFlow: Будет ли больше памяти потребляться, если я буду обрабатывать вторичные вычисления внутри графика?

В качестве альтернативы, я могу использовать np.argmax(sess.run(predictions), 1), который вычисляется из графика.

Вопрос в том, хочу ли я сделать первый подход, будет ли он потреблять больше памяти и повлияет на мои вычисления (с точки зрения batch_size, который я могу использовать)? Безопаснее и лучше ли просто вычислять необходимые метки из графика?

+0

это не имеет значения, в каком порядке граф строится, 'session.run' не знает, если вы добавили' argmax' до train_op или после –

+0

@YaroslavBulatov. Я думаю, что вопрос другой: Является ли numpy argmax более эффективным, чем argsax tensorflow, когда входные данные поступают из тензорного потока? –

+0

@ YaroslavBulatov да, но будет ли дополнительная конструкция графика, который запускается только после того, как обучение было выполнено, потребляет больше памяти? Смысл сказать, если я изначально построил график, используя максимальную память в моем текущем размере партии, если я восстановил график для вычисления дополнительных операций, которые будут выполняться в течение одного и того же сеанса (с моим первоначальным обучением, оставаясь тем же), повлияет ли мое обучение? – kwotsin

ответ

1

Когда вы выдаете несколько звонков .run, определение графика кэшируется. Если вы измените график, ему нужно будет перекодировать его и отправить его снова. Таким образом, может быть немного дополнительной памяти, используемой graph_def.SerializeToString при первом запуске модифицированного графика, но это не должно влиять на .run шагов после этого.

Соответствующая логика в session.py, обратите внимание на строку, которая проверяет self._graph.version > self._current_version

def _extend_graph(self): 
    # Ensure any changes to the graph are reflected in the runtime. 
    with self._extend_lock: 
     if self._graph.version > self._current_version: 
     # pylint: disable=protected-access 
     graph_def, self._current_version = self._graph._as_graph_def(
      from_version=self._current_version, 
      add_shapes=self._add_shapes) 
     # pylint: enable=protected-access 

     with errors.raise_exception_on_not_ok_status() as status: 
      tf_session.TF_ExtendGraph(
       self._session, graph_def.SerializeToString(), status) 
     self._opened = True 
+0

Благодарим вас за ответ. Могу ли я подтвердить, что любая операция, дополнительно определенная на графике (и даже если она не запущена), будет потреблять больше памяти? Похоже, что должно быть достаточно гибко использовать либо 'tf.argmax', либо' np.argmax', но для более сложных операций вы бы рекомендовали сделать это в графике или вне графика с точки зрения соображений памяти? – kwotsin

+0

, как правило, более эффективно выполнять вычисления внутри графика, поскольку перемещение данных через TensorFlow <-> Python берет копию памяти –

+0

Большое вам спасибо за понимание. Это то, чего я никогда не знал! – kwotsin

 Смежные вопросы

  • Нет связанных вопросов^_^