Подтвердить что ты не робот

Автокодеры с привязанными весами в Caffe

Насколько я понимаю, обычно автокодер правильно использует привязанные веса в сетях кодирования и декодирования?

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

Как реализовать привязанные автокодеры в Caffe?

4b9b3361

Ответ 1

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

Тем не менее, Caffe поддерживает автокодеры с привязанными весами, и возможно использовать две функции: разделение параметров между слоями и флаг транспонирования полностью подключенного уровня (InnerProduct в Caffe). Более конкретно, два параметра разделяются в Caffe, если их имя одинаковое, которое может быть указано в поле param так:

layer {
  name: "encode1"
  type: "InnerProduct"
  bottom: "data"
  top: "encode1"
  param {
    name: "encode1_matrix"
    lr_mult: 1
    decay_mult: 1
  }
  param {
    name: "encode1_bias"
    lr_mult: 1
    decay_mult: 0
  }
  inner_product_param {
    num_output: 128
    weight_filler {
      type: "gaussian"
      std: 1
      sparse: 15
    }
    bias_filler {
      type: "constant"
      value: 0
    }
  }
}

Если на другом полностью подключенном слое (с соответствующими размерами) используются имена "encode1_matrix" и "encode1_bias", то эти параметры всегда будут одинаковыми, и Caffe позаботится об агрегировании градиентов и правильном обновлении параметров. Вторая часть использует флаг транспонирования полностью подключенного уровня, так что общая матрица транспонируется перед умножением ее ввода. Итак, расширив приведенный выше пример, если бы мы хотели иметь полностью подключенный слой с той же весовой матрицей, что и "encode1_matrix" как часть процесса декодирования, тогда мы определим его так:

layer {
  name: "decode1"
  type: "InnerProduct"
  bottom: "encode1"
  top: "decode1"
  param {
    name: "encode1_matrix"
    lr_mult: 1
    decay_mult: 1
  }
  param {
    name: "decode1_bias"
    lr_mult: 1
    decay_mult: 0
  }
  inner_product_param {
    num_output: 784
    transpose: true
    weight_filler {
      type: "gaussian"
      std: 1
      sparse: 15
    }
    bias_filler {
      type: "constant"
      value: 0
    }
  }
}

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

См. здесь полный рабочий пример связанного автокодера с использованием Caffe: https://gist.github.com/orsharir/beb479d9ad5d8e389800c47c9ec42840