Официальный 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), я получил Нэн ошибки. Что здесь происходит? Может кто-нибудь помочь?
в
Отличный вопрос! Это довольно трюк, чтобы узнать!
В код:
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
Редактировать: вот что я нашел в коде и документации. Возможно, вы могли бы проверить, что инициализация выглядит так, запустив ивала на весах!
По данным [курс](
Эндрю Нг и Ксавье документация, если вы используете Релу в качестве функции активации, лучше изменить стандартные грузики инициализатора(который Ксавье униформа) в Ксавье нормальный по:y = tf.layers.conv2d(x, kernel_initializer=tf.contrib.layers.xavier_initializer(uniform=False), )