Сокращение Keras: установка весов на ноль не ускоряет вывод?

Я пишу алгоритм обрезки для tf.keras, который просто удаляет самый низкий x процентиль весов из слоя/фильтра. Чтобы сделать это, я попытался установить значение веса для сокращения до нуля. Прочитав другие источники, у меня сложилось впечатление, что это имеет тот же эффект, что и «удаление» веса из сети, но даже если я устанавливаю все веса в сети равными нулю, никакого уменьшения времени вывода не отмечается.

Если бы я гипотетически установил все веса в слое равными нулю, код был бы следующим:

    flat_weights = np.array(self.model.layers[layer_index].get_weights()[0]).flatten()

    weight_index = 0 
    for weight in flat_weights:
        #if weight < self.delta_percentiles[index]:
        flat_weights[weight_index] = 0
        weight_index += 1

    weights[0] = np.reshape(flat_weights, original_shape)
    weights[1] = np.zeros(np.shape(weights[1]))

    self.model.layers[index].set_weights(weights)

Теоретически время вывода модели, урезанной таким образом, должно уменьшиться, но никаких изменений не происходит. Правильно ли я обрезаю?


person Jack98    schedule 29.01.2020    source источник
comment
Я не думаю, что установка весов на ноль будет иметь тот же эффект, что и их удаление. Для начала, очевидно, будет разница в потреблении памяти. Поделитесь, где вы это прочитали?   -  person thushv89    schedule 30.01.2020
comment
почему время вывода изменилось? умножение на ноль занимает столько же времени, сколько умножение на что-либо еще...   -  person Dave Kielpinski    schedule 30.01.2020
comment
Да, я понимаю, что это немного нелогично, но одним из источников является TensorFlow: medium.com/tensorflow/. «Обрезка веса означает удаление ненужных значений в тензорах веса. Мы практически устанавливаем значения параметров нейронной сети равными нулю, чтобы удалить то, что, по нашему мнению, является ненужными связями между слоями нейронной сети». Я уверен, что нашел еще несколько мест, где говорится об этом, я найду их, если понадобится.   -  person Jack98    schedule 30.01.2020


Ответы (1)


Установка веса на ноль — это то же самое, что удаление веса, так как тогда сеть будет функционально эквивалентной, если у вас будет та же архитектура, но с теми же весами и на один нейрон в этом слое меньше. Прогнозы, которые вы получите, будут такими же.

Но это не влияет на вычислительную производительность, как вы заметили. Чтобы изменить время вычислений, вам нужно будет определить новую сеть с меньшим весом, а затем загрузить веса из другой архитектуры. Теперь вы представляете, что сделать это непросто, и именно по этой причине мы обычно не делаем этого для оценки, поскольку мы хотим выяснить, как прогностическая эффективность (например, точность или среднеквадратическая ошибка) изменяется при сокращении весов.

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

person Dr. Snoopy    schedule 30.01.2020
comment
Спасибо за ваш ответ - я думаю, вы спасли меня от того, чтобы спуститься в кроличью нору, рассматривая реализацию разреженного слоя Conv2D. Чтобы уточнить: если я хочу удалить x весов из слоя, мне придется создать новую модель с этим слоем, имеющим в нем x весов меньше. Отсюда мне придется удалить эти веса из матрицы весов старой модели и скопировать их в новую? - person Jack98; 30.01.2020