Возможно ли получить выходные данные промежуточного уровня?

#python #tensorflow #deep-learning #neural-network #computer-vision

#python #тензорный поток #глубокое обучение #нейронная сеть #компьютерное зрение

Вопрос:

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

Пример: в этой struct2depth (см. Ниже) три модели обучаются без присмотра. Однако то, что мне действительно нужно, это движение объекта, а именно 3D Object Motion Estimation часть. Поэтому мне интересно, возможно ли это

  • train в исходных сетях, но
  • inference только с Object Motion Estimator , т. е. с другими следующими слоями, замороженными / отброшенными?

Я видел, что в tensorflow можно получить тензорный вывод указанного слоя, но для экономии ненужных вычислений я бы хотел просто заморозить все остальные части … не знаю, возможно ли это.

С нетерпением жду некоторых идей. Заранее спасибо!

Struct2Depth

Комментарии:

1. Вы имеете в виду, что после обучения вы хотите просто ввести вход детектора движения 3D-объекта и получить его выходные данные, забыв обо всей остальной части сети?

2. @amin да, именно так! поскольку во время вычисления вывода выполняется только вперед, верно?

3. Извините, я думаю, что я немного запутался. допустим, у вас есть sub_model 1, 2, 3, а ваша основная модель похожа на sub_model_1 -> sub_model_2 -> sub_model_3. теперь вам просто нужен sub_model_2, так почему бы просто не предоставить sub_model_2 входные данные и не получить выходные данные?

4. @amin Потому что это самостоятельное обучение. Я могу выполнять обучение только со всеми 3 подмоделями.

Ответ №1:

Вы можете игнорировать веса, установив для них значение 0. Для этого вы можете напрямую получить вес W и сделать W.assign(tf.mul(W,0)) . Я знаю, что вы заботитесь об ускорении вывода, но если вы не перепишете свой код для использования разреженных представлений, вы, вероятно, не ускорите вывод, поскольку веса не могут быть удалены полностью.

Что вы можете сделать в качестве альтернативы, так это посмотреть на существующие решения для обрезки в пользовательских слоях:

 class MyDenseLayer(tf.keras.layers.Dense, tfmot.sparsity.keras.PrunableLayer):

  def get_prunable_weights(self):
    # Prune bias also, though that usually harms model accuracy too much.
    return [self.kernel, self.bias]

# Use `prune_low_magnitude` to make the `MyDenseLayer` layer train with pruning.
model_for_pruning = tf.keras.Sequential([
  tfmot.sparsity.keras.prune_low_magnitude(MyDenseLayer(20, input_shape=input_shape)),
  tf.keras.layers.Flatten()
])
 

Вы можете, например, использовать ConstantSparsity (см. Здесь ) и установить параметры таким образом, чтобы ваши слои были полностью обрезаны.

Другой альтернативой является создание второй, меньшей модели, которую вы используете только для вывода. Затем вы можете сохранить требуемые веса отдельно (вместо сохранения всей модели) после обучения и загрузить их во вторую модель.

Комментарии:

1. Спасибо за подробное объяснение. На самом деле, я думаю, что последняя альтернатива кажется многообещающей, поскольку мне нужна только эта подмодель. Я попробую это 🙂