Почему в примере тензорного потока cifar10 на сверточных слоях вес не снижается?

Похоже, что на сверточных слоях в cifar10< не происходит снижения веса. /a> пример на тензорном потоке. На самом деле ни на каких слоях, кроме двух полносвязных слоев, вес не уменьшается. Это обычная практика? Я думал, что снижение веса применяется ко всем весам (кроме смещений).

Для справки, вот соответствующий код (wd — коэффициент снижения веса):

  # conv1
  with tf.variable_scope('conv1') as scope:
    kernel = _variable_with_weight_decay('weights', shape=[5, 5, 3, 64],
                                         stddev=1e-4, wd=0.0)
    conv = tf.nn.conv2d(images, kernel, [1, 1, 1, 1], padding='SAME')
    biases = _variable_on_cpu('biases', [64], tf.constant_initializer(0.0))
    bias = tf.nn.bias_add(conv, biases)
    conv1 = tf.nn.relu(bias, name=scope.name)
    _activation_summary(conv1)

  # pool1
  pool1 = tf.nn.max_pool(conv1, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1],
                         padding='SAME', name='pool1')
  # norm1
  norm1 = tf.nn.lrn(pool1, 4, bias=1.0, alpha=0.001 / 9.0, beta=0.75,
                    name='norm1')

  # conv2
  with tf.variable_scope('conv2') as scope:
    kernel = _variable_with_weight_decay('weights', shape=[5, 5, 64, 64],
                                         stddev=1e-4, wd=0.0)
    conv = tf.nn.conv2d(norm1, kernel, [1, 1, 1, 1], padding='SAME')
    biases = _variable_on_cpu('biases', [64], tf.constant_initializer(0.1))
    bias = tf.nn.bias_add(conv, biases)
    conv2 = tf.nn.relu(bias, name=scope.name)
    _activation_summary(conv2)

  # norm2
  norm2 = tf.nn.lrn(conv2, 4, bias=1.0, alpha=0.001 / 9.0, beta=0.75,
                    name='norm2')
  # pool2
  pool2 = tf.nn.max_pool(norm2, ksize=[1, 3, 3, 1],
                         strides=[1, 2, 2, 1], padding='SAME', name='pool2')

  # local3
  with tf.variable_scope('local3') as scope:
    # Move everything into depth so we can perform a single matrix multiply.
    dim = 1
    for d in pool2.get_shape()[1:].as_list():
      dim *= d
    reshape = tf.reshape(pool2, [FLAGS.batch_size, dim])

    weights = _variable_with_weight_decay('weights', shape=[dim, 384],
                                          stddev=0.04, wd=0.004)
    biases = _variable_on_cpu('biases', [384], tf.constant_initializer(0.1))
    local3 = tf.nn.relu(tf.matmul(reshape, weights) + biases, name=scope.name)
    _activation_summary(local3)

  # local4
  with tf.variable_scope('local4') as scope:
    weights = _variable_with_weight_decay('weights', shape=[384, 192],
                                          stddev=0.04, wd=0.004)
    biases = _variable_on_cpu('biases', [192], tf.constant_initializer(0.1))
    local4 = tf.nn.relu(tf.matmul(local3, weights) + biases, name=scope.name)
    _activation_summary(local4)

  # softmax, i.e. softmax(WX + b)
  with tf.variable_scope('softmax_linear') as scope:
    weights = _variable_with_weight_decay('weights', [192, NUM_CLASSES],
                                          stddev=1/192.0, wd=0.0)
    biases = _variable_on_cpu('biases', [NUM_CLASSES],
                              tf.constant_initializer(0.0))
    softmax_linear = tf.add(tf.matmul(local4, weights), biases, name=scope.name)
    _activation_summary(softmax_linear)

  return softmax_linear

person Clash    schedule 05.03.2016    source источник
comment
Действительно странно. Вы можете изменить его, если хотите, со значением wd, но кажется, что это не настраивается, даже если функция _variable_with_weight_decay делает его настраиваемым.   -  person fabrizioM    schedule 06.03.2016


Ответы (1)


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

Что касается того, может ли снижение веса только части модели быть хорошим по сравнению с уменьшением веса всей модели, кажется менее распространенным такое упорядочение только некоторых весов. Однако я не знаю, есть ли для этого теоретическая причина. В общем, нейронные сети уже имеют слишком много гиперпараметров для настройки. Использовать снижение веса или нет — это уже вопрос, и насколько сильно регуляризировать веса, если вы это делаете. Если вы также задаетесь вопросом, какие слои я должен упорядочить таким образом, у вас быстро закончится время, чтобы проверить производительность всех различных способов включения и выключения для каждого слоя.

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

person Nathan    schedule 25.10.2017