2015-11-10 4 views

ответ

86

Начиная с версии 0.8 есть инициализатор Xavier, see here for the docs.

Вы можете использовать что-то вроде этого:

W = tf.get_variable("W", shape=[784, 256], 
      initializer=tf.contrib.layers.xavier_initializer()) 
+3

Знаете ли вы, что вы делаете это, не придавая форме 'get_variable', но вместо этого присваивая его инициализатору? Я использовал tf.truncated_normal (shape = [dims [l-1], dims [l]], mean = mu [l], stddev = std [l], dtype = tf.float64) ', и я указал но там теперь ваше предложение винт мой код вверх. Есть ли у вас какие-либо предложения? – Pinocchio

+1

@Pinocchio вы можете просто написать себе обертку, которая имеет ту же подпись, что и 'tf.Variable (...)', и использует 'tf.get_variable (...)' – jns

+1

«Текущая» ссылка без версии: https: // www.tensorflow.org/api_docs/python/tf/contrib/layers/xavier_initializer – scipilot

3

Я смотрел, и я не мог найти ничего, построенный в Однако, в соответствии с этим:.

http://andyljones.tumblr.com/post/110998971763/an-explanation-of-xavier-initialization

инициализации Xavier только выборки (обычно гауссово) распределение, где дисперсия является функцией от количество нейронов. tf.random_normal может сделать это за вас, вам просто нужно вычислить stddev (т. Е. Количество нейронов, представленных матрицей веса, которую вы пытаетесь инициализировать).

+0

Винс Вы должны быть взятием проб из однородного распределения. – Delip

11

@ Алеф7, инициализация Xavier/Glorot зависит от количества входящих соединений (fan_in), количества исходящих соединений (fan_out) и вида функции активации (сигмоида или tanh) нейрона. См. Это: http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf

Итак, на ваш вопрос. Это, как я хотел бы сделать это в TensorFlow:

(fan_in, fan_out) = ... 
    low = -4*np.sqrt(6.0/(fan_in + fan_out)) # use 4 for sigmoid, 1 for tanh activation 
    high = 4*np.sqrt(6.0/(fan_in + fan_out)) 
    return tf.Variable(tf.random_uniform(shape, minval=low, maxval=high, dtype=tf.float32)) 

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

Кстати, я написал post yesterday для чего-то другого, используя TensorFlow, который также использует инициализацию Xavier. Если вы заинтересованы, есть также питон ноутбук с концом до конца, например: https://github.com/delip/blog-stuff/blob/master/tensorflow_ufp.ipynb

+1

Как мы можем использовать его с функцией активации relu. – gautam840

+0

В этом документе изучается поведение градиентов веса при различных активационных функциях с обычно используемой инициализацией. Затем они предлагают универсальную инициализацию независимо от любой функции активации. Кроме того, ваш метод также не зависит от функции активации, поэтому лучше использовать встроенную инициализацию Xavier в Tensorflow. –

6

Хорошей обертка tensorflow называется prettytensor дает реализацию в исходном коде (скопированную непосредственно из here):

def xavier_init(n_inputs, n_outputs, uniform=True): 
    """Set the parameter initialization using the method described. 
    This method is designed to keep the scale of the gradients roughly the same 
    in all layers. 
    Xavier Glorot and Yoshua Bengio (2010): 
      Understanding the difficulty of training deep feedforward neural 
      networks. International conference on artificial intelligence and 
      statistics. 
    Args: 
    n_inputs: The number of input nodes into each output. 
    n_outputs: The number of output nodes for each input. 
    uniform: If true use a uniform distribution, otherwise use a normal. 
    Returns: 
    An initializer. 
    """ 
    if uniform: 
    # 6 was used in the paper. 
    init_range = math.sqrt(6.0/(n_inputs + n_outputs)) 
    return tf.random_uniform_initializer(-init_range, init_range) 
    else: 
    # 3 gives us approximately the same limits as above since this repicks 
    # values greater than 2 standard deviations from the mean. 
    stddev = math.sqrt(3.0/(n_inputs + n_outputs)) 
    return tf.truncated_normal_initializer(stddev=stddev) 
4

TF-вно имеет xavier_initializer.Вот пример того, как использовать его:

import tensorflow as tf 
a = tf.get_variable("a", shape=[4, 4], initializer=tf.contrib.layers.xavier_initializer()) 
with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    print sess.run(a) 

В дополнение к этому, tensorflow имеет другие Инициализаторы:

+0

спасибо, сэр это было очень полезно, я хочу спросить вас, могу ли я инициализировать ** смещение ** с помощью ** xavier_initializer ** –

14

Просто добавить еще один пример того, как определить tf.Variable инициализирован с помощью метода Xavier and Yoshua «s:

graph = tf.Graph() 
with graph.as_default(): 
    ... 
    initializer = tf.contrib.layers.xavier_initializer() 
    w1 = tf.Variable(initializer(w1_shape)) 
    b1 = tf.Varialbe(initializer(b1_shape)) 
    ... 

Это помешало мне получить nan значения моей функции потерь из-за числовых неустойчивостей при использовании нескольких слоев с помощью RELU.

+2

Этот формат мой код лучше всего - и это позволило мне вернуть скорость обучения до 0,5 (мне пришлось опустить его до 0,06 при добавлении другого слоя relu'd). Как только я применил этот инициализатор ко всем скрытым слоям, я получаю невероятно высокие показатели валидации с первых нескольких сотен эпох. Я не могу поверить, что это сделано! – scipilot