Инициализация весов нейронной сети с Tensorflow - PullRequest
1 голос
/ 22 мая 2019

Я занимаюсь разработкой модели нейронной сети с использованием Tensorflow.В перекрестной проверке LOSO мне нужно обучить модель 10 раз, так как у меня есть данные по 10 различным предметам.

Принимая это во внимание, мне нужно сбросить оптимизатор и веса сети в началекаждая перекрестная проверка.Я определил веса следующим образом:

weights = {
    'w1' : tf.Variable(tf.random_uniform(shape = [100, 10],seed =   0)),

    'w2' : tf.Variable(tf.random_uniform(shape = [10, 100],seed = 0))}

и сбросил оптимизатор и веса путем повторной инициализации всех глобальных переменных следующим образом:

# Start session to run Tensors and Operations
with tf.Session() as sess:
    # Optimizer
    optimizer = tf.train.GradientDescentOptimizer(lr).minimize(loss)
    # Variables initializer
    init = tf.global_variables_initializer()
    # Loop over the 10 cross-validation subjects
    for subject in range(0,10):
        # Initialize global variables and optimizer
        sess.run(init)
        # Print initialized weights (should be always the same)
        print(sess.run(weights['w1']))
        # Loop over epochs to train the model
        for epoch in range(epochs):         
            # Run network optimizer for the current epoch
            _,cost = sess.run([optimizer,loss], feed_dict ={X:x_train[subject,:], Y:y_train[subject,:]})

Однако на каждой итерации цикла Iпечатать разные значения для весов, например, начальное значение Operation, которое я установил в 0, не выполняет свою работу.Кто-нибудь знает, чего мне не хватает?

1 Ответ

0 голосов
/ 24 мая 2019

Я думаю, что происходит следующее.Предположим, вы установили начальное начальное значение 42 в начале вашего сценария:

set_seed(42)

Затем вы выбираете случайное число:

sample()
>>> 0.875

Теперь вы снова производите выборку:

sample()
>>> 0.311

Это другое.Это не ошибка.Функция set_seed() сообщает системе, чтобы она выбирала «случайное» число, начиная с позиции 42 (в последовательности псевдослучайных чисел) каждый раз, когда вы запускаете свою программу , а не каждый раз, когда вызывается функция sample.Попробуйте запустить вашу программу несколько раз.Вы увидите, что веса ваших параметров будут различаться в разных сгибах, но будут одинаковыми на протяжении нескольких прогонов, т. Е. На всех прогонах, на сгибе 1, веса будут всегда инициализироваться одним и тем же значением.


Теперь, как это решить?

Попробуйте случайную инициализацию один раз, в начале скрипта, и инициализируйте свой вес в начале каждого сгиба:

w = tf.Variable(..., initializer=YOUR_NUMPY_ARRAY)
...