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

Как получить стабильные результаты с помощью TensorFlow, установив случайное семя

Я пытаюсь запустить нейронную сеть несколько раз с различными параметрами, чтобы откалибровать параметры сетей (вероятность отсева, скорость обучения e.d.). Однако у меня проблема с тем, что работа с сетью при сохранении параметров одинаково по-прежнему дает мне другое решение, когда я запускаю сеть в цикле следующим образом:

filename = create_results_file()
for i in range(3):
  g = tf.Graph()
  with g.as_default():
    accuracy_result, average_error = network.train_network(
        parameters, inputHeight, inputWidth, inputChannels, outputClasses)
    f, w = get_csv_writer(filename)
    w.writerow([accuracy_result, "did run %d" % i, average_error])
    f.close()

Я использую следующий код в начале моей функции train_network перед настройкой слоев и функцией ошибки в моей сети:

np.random.seed(1)
tf.set_random_seed(1)

Я также попытался добавить этот код до создания графика TensorFlow, но я продолжаю получать разные решения в результатах моих результатов.

Я использую AdamOptimizer и инициализирую вес сети, используя tf.truncated_normal. Кроме того, я использую np.random.permutation для перетасовки входящих изображений для каждой эпохи.

4b9b3361

Ответ 1

Установка текущего случайного семени TensorFlow влияет только на текущий график по умолчанию. Поскольку вы создаете новый график для своего обучения и устанавливаете его по умолчанию (with g.as_default():), вы должны установить случайное семя в пределах области with.

Например, ваш цикл должен выглядеть следующим образом:

for i in range(3):
  g = tf.Graph()
  with g.as_default():
    tf.set_random_seed(1)
    accuracy_result, average_error = network.train_network(
        parameters, inputHeight, inputWidth, inputChannels, outputClasses)

Обратите внимание, что это будет использовать одно и то же случайное семя для каждой итерации внешнего цикла for. Если вы хотите использовать в каждой итерации другое семя, но все еще детерминированное семя, вы можете использовать tf.set_random_seed(i + 1).

Ответ 2

Детерминированное поведение может быть получено либо путем предоставления начального уровня на уровне графов, либо на уровне операций. Оба работали на меня. Начальное число на уровне графов можно разместить с помощью tf.set_random_seed. Начальное число операционного уровня может быть помещено, например, в переменный инициализатор, например:

myvar = tf.Variable(tf.truncated_normal(((10,10)), stddev=0.1, seed=0))

Ответ 3

Пожалуйста, добавьте все случайные начальные функции перед вашим кодом:

tf.reset_default_graph()

tf.set_random_seed (0)

random.seed(0)

np.random.seed(0)

Я думаю, что некоторые модели в TensorFlow используют случайную функцию numpy или python.