Я хочу реализовать DSD: Тренинг Dense-Sparse-Dense для глубоких нейронных сетей , Han et al. Короче говоря, в статье предлагается следующая схема обучения для повышения точности сети:
- Обучайте сеть как обычно, пока она не сходится.
- Сократите сеть и обучите с ограниченным ограничением. Это достигается путем удаления процента от общего веса ближе к
0
в абсолютных значениях. Эти веса будут полностью сокращены, что не повлияет на вычисления в прямом или обратном проходе. - После обучения разреженной сети восстановите сокращенные веса с помощью
0
и обучите модель с 1/10
исходной скорости обучения, так какРазреженная модель уже находится на хороших локальных минимумах. - Прибыль. Скорее всего, вы добились лучшего достижения Net.
Вопрос касается процесса обрезки. Примеры Tensorflow и Keras, такие как this и this , включают только обрезку, но не восстановление этих весов снова. Эти подходы предназначены для сжатия моделей. Таким образом, лучший способ реализовать DSD - пренебречь соответствующими весами (они близки к 0, как наше ограничение разрежения в процентах) и не допускать их прямого прохода или обратного распространения. Существует этот аналогичный вопрос, спрашивающий, может ли ручная установка весов на ноль с обратными вызовами после каждого прохода вперед или назад может помочь, но там также утверждается, что веса получают обновления, тем не менее.
TL; DR. Есть ли какой-либо способ в tf или keras, который бы отображал выбранные веса, не влияя на проход вперед или назад. Буквально, как будто они даже не существуют.
Спасибо.