Влияние функции Tensorflow vs on numy flatten на обучение машинному обучению - PullRequest
0 голосов
/ 09 мая 2018

Я начинаю с глубокого изучения вещей, используя керасы и тензорный поток. На самом первом этапе я застрял с сомнением. когда я использую tf.contrib.layers.flatten (Api 1.8) для выравнивания изображения (также может быть многоканальным).

Чем это отличается от использования функции flatten от numpy? Как это влияет на тренировку. Я вижу, что tf.contrib.layers.flatten занимает больше времени, чем сглаживать. Это делает что-то большее?

Это очень близкий вопрос , но здесь принятый ответ включает в себя Theano и точно не решает мои сомнения.

Пример: Допустим, у меня есть тренировочные данные (10000,2,96,96) формы. Теперь мне нужно, чтобы вывод был в форме (10000,18432). Я могу сделать это, используя tenorflow flatten или используя numpy flatten, например

X_reshaped = X_train.reshape(*X_train.shape[:1], -2)

Какая разница в обучении и какая практика лучше?

Ответы [ 4 ]

0 голосов
/ 09 мая 2018

Разница

Когда вы используете tenorflow flatten, он добавляется в графическую операцию как операция (op). Может работать только на тензорах. Numpy, с другой стороны, работает с реальными массивами numpy. Использование совершенно другое.

Использование

Вы будете использовать tenorflow op, если это операция в процессе обучения, например изменение размера перед подачей на следующий слой.

Вы бы использовали numpy op, когда хотите оперировать с фактическим значением в это время, например, изменение формы для расчета точности в конце шага обучения.

Так что, если у вас было задание

тензор A -> изменить форму -> matrix_mul

Если вы используете tenorflow для изменения формы, вы можете напрямую запустить matrix_mul из сеанса.

Однако, если вы используете numpy , вам придется выполнить операцию в в два этапа (два сеансовых вызова).

  1. Вы вычисляете тензор A

  2. Вы изменили его в numpy.

  3. Запустите matrix_mul путем «подачи» в измененный массив.

Производительность

Я ничего не тестировал, но я бы сказал, что для операции преобразования только в автономном режиме numpy будет быстрее (без учета gpu), но в процессе, где reshape является промежуточной операцией, тензор потока должен быть быстрее.

0 голосов
/ 09 мая 2018
  • Используйте numpy непосредственно на ваших данных, без участия нейронной сети. Это только для предварительной обработки и последующей обработки
  • Используйте слои TF или Keras внутри моделей, если по какой-либо причине в модели необходима эта операция. Это обеспечит подключение модели и правильное обратное распространение

Модели - это символические графики, предназначенные для создания нейронных сетей, которые можно обучать. Будет правильное соединение, и обратное распространение будет работать правильно, если у вас есть график, связанный от входа к выходу.

Если вы не собираетесь создавать сеть, не используйте слой TF. Если ваша цель просто сплющить массив, вам не нужна нейронная сеть.

Теперь, если внутри модели вам нужно изменить формат данных без потери соединения и обратного распространения, перейдите к сглаживающему слою.

0 голосов
/ 09 мая 2018

Самое большое различие между np.flatten и tf.layers.flatten (или tf.contrib.layers.flatten) заключается в том, что операции с числами применимы только к статическим массивам nd , тогда как операции с тензорным потоком могут работать с динамическими тензорами . Динамический в этом случае означает, что точная форма будет известна только во время выполнения (обучение или тестирование).

Так что моя рекомендация довольно проста:

  • Если входные данные являются статическими массивами, например при предварительной обработке используйте np.flatten. Это позволяет избежать ненужных накладных расходов и также возвращает массив numpy.
  • Если данные уже являются тензорными, используйте любой из flatten операций, предоставляемых tenorflow. Среди них tf.layers.flatten - лучший выбор, поскольку tf.layers API более стабилен, чем tf.contrib.*.
0 голосов
/ 09 мая 2018

Функция сглаживания в numpy выполняет полное сглаживание массива, что означает, что в итоге вы получите одну ось данных (только 1 измерение). Например,

import numpy as np
a = np.arange(20).reshape((5,4))
print(a)

print(a.flatten().shape)

В предыдущем примере вы получили 1-й массив из 20 элементов. В тензорном потоке выравнивающий слой (tf.layers.flatten) сохраняет ось партии (ось 0). В предыдущем примере с тензорным потоком вы все равно имели бы форму (5,4).

В любом случае, тренировки не влияют, если вы используете выравнивание эквивалентным образом. Тем не менее, вы должны избегать использования numpy при работе с tenorflow, так как почти все numpy операции имеют свои аналоги tenorflow. Tensorflow и numpy полагаются на разные библиотеки времени выполнения, и объединение обеих может быть неэффективным во время выполнения.

Кроме того, избегайте использования слоев пакета contrib, если они уже существуют в основном пакете (используйте tf.layers.flatten вместо tf.contrib.layers.flatten).

Для более общего сравнения производительности между numpy и tenorflow, взгляните на этот вопрос: Tensorflow против Numpy Performance

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