Что инициализатор по умолчанию в ТФ.слоев.conv2d и ТФ.слоев.плотная?

Официальный Tensorflow по API док утверждает, что по умолчанию параметр kernel_initializer в none для ТФ.слоев.conv2d и ТФ.слоев.плотный.

Однако, прочитав слоев туториал (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 по умолчанию `ненет`. Так, что инициализатора используется?

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

Комментарии к вопросу (1)

в

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

  • Как вы можете видеть, это не описанной в ТФ.слоев.conv2d`
  • Если вы посмотрите на определение из function вы видите, что функция звонков 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?

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

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

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

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

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

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

Комментарии (1)

По данным [курс](https://www.youtube.com/watch?v=s2coXdufOzE) Эндрю Нг и Ксавье документация, если вы используете Релу в качестве функции активации, лучше изменить стандартные грузики инициализатора(который Ксавье униформа) в Ксавье нормальный по:

y = tf.layers.conv2d(x, kernel_initializer=tf.contrib.layers.xavier_initializer(uniform=False), )
Комментарии (0)