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

Что такое инициализатор ядра по умолчанию в файлах tf.layers.conv2d и tf.layers.dense?

Официальный документ API Tensorflow утверждает, что для параметра kernel_initializer по умолчанию установлено значение None для tf.layers.conv2d и tf.layers.dense.

Однако, читая учебник по слоям (https://www.tensorflow.org/tutorials/layers), я заметил, что этот параметр не задан в коде. Например:

# Convolutional Layer #1
conv1 = tf.layers.conv2d(
    inputs=input_layer,
    filters=32,
    kernel_size=[5, 5],
    padding="same",
    activation=tf.nn.relu)

Пример кода из учебника выполняется без каких-либо ошибок, поэтому я думаю, что kernel_initializer по умолчанию не None. Итак, какой инициализатор используется?

В другом коде я не установил kernel_initializer conv2d и плотных слоев, и все было хорошо. Однако, когда я попытался установить для kernel_initializer значение tf.truncated_normal_initializer(stddev=0.1, dtype=tf.float32), я получил ошибки NaN. Что здесь происходит? Кто-нибудь может помочь?

4b9b3361

Ответ 1

Отличный вопрос! Это довольно трюк, чтобы узнать!

  • Как вы можете видеть, это не описано в tf.layers.conv2d
  • Если вы посмотрите на определение функции, вы увидите, что функция вызывает variable_scope.get_variable:

В коде:

self.kernel = vs.get_variable('kernel',
                                  shape=kernel_shape,
                                  initializer=self.kernel_initializer,
                                  regularizer=self.kernel_regularizer,
                                  trainable=True,
                                  dtype=self.dtype)

Следующий шаг: что делает область переменной, когда инициализатором является None?

Здесь говорится:

Если инициализатор равен None (по умолчанию), инициализатор по умолчанию прошел в     используется конструктор. Если этот None тоже, мы используем новый     glorot_uniform_initializer.

Итак, ответ таков: он использует glorot_uniform_initializer

Для полноты определения этого инициализатора:

Единый инициализатор Glorot, также называемый равномерным инициализатором Xavier.   Он рисует выборки из равномерного распределения в пределах [-лимит, предел]   где limit sqrt(6 / (fan_in + fan_out))  где fan_in - количество входных единиц в тензоре веса   и fan_out - количество выходных единиц в весовом тензоре.   Ссылка: http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf

Изменить: это то, что я нашел в коде и документации. Возможно, вы можете убедиться, что инициализация выглядит так: запустив eval на весах!

Ответ 2

Согласно этому курсу Эндрю Нга и документации Xavier, если вы используете ReLU в качестве функции активации, лучше измените инициализатор весов по умолчанию (который является равномерным Xavier) на обычный Xavier:

y = tf.layers.conv2d(x, kernel_initializer=tf.contrib.layers.xavier_initializer(uniform=False), )