Невоспроизводимые результаты даже после установки начального значения (Python API Microsoft CNTK)

Ранее я упоминал, что в Branscripts для моделей последовательного машинного обучения CNTK нет доступных опций для определения начального значения [1]. Поэтому я перенес свой код на Python API (CNTK), который предоставляет более подробные параметры при определении начальных значений последовательных моделей машинного обучения. Ниже приведены случаи, когда я использовал случайную инициализацию в своей реализации (и также установил соответствующее начальное значение)

// импорт CNTK

import numpy as np
import pandas as pd
import random
import math as m

from cntk.device import *
from cntk import Trainer
from cntk.layers import * 

import cntk
import cntk.ops as o
import cntk.layers as l

//определение случайного начального числа

np.random.seed(8888)
random.seed(8888)

// Определение входных и выходных обучающих векторов

input_array_df = np.asarray(input_split_df[1:len(input_split_df)], dtype=np.float32)
output_array_df = np.asarray(output_df_df[1:len(output_df_df)], dtype=np.float32)
tup=(input_array_df, output_array_df)
listOfTuplesOfInputsLabels.append(tup)

// перемешивание входного вектора

 random.shuffle(listOfTuplesOfInputsLabels) 

//Определение последовательной модели

num_minibatches = len(features) // minibatch_size
    epoch_size = len(features)*1

    feature = o.input_variable((input_dim),np.float32)
    label = o.input_variable((output_dim),np.float32)

    netout=Sequential([For(range(1), lambda i: Recurrence(LSTM(lstm_cell_dimension,use_peepholes=LSTM_USE_PEEPHOLES,init=glorot_uniform(seed=8888)))),Dense(output_dim,bias=BIAS,init=glorot_uniform(seed=8888))])(feature)

    learner = momentum_sgd(netout.parameters, lr = learning_rate_schedule([(4,0.003),(16,0.002)], unit=UnitType.sample,epoch_size=epoch_size),
                               momentum=momentum_as_time_constant_schedule(minibatch_size / -m.log(0.9)), gaussian_noise_injection_std_dev = gaussian_noise,l2_regularization_weight =l2_regularization_weight)

//Разбивка на мини-партии

tf = np.array_split(features,num_minibatches)
tl = np.array_split(labels,num_minibatches)

//Тренироваться

features = np.ascontiguousarray(tf[i%num_minibatches])
labels = np.ascontiguousarray(tl[i%num_minibatches])
trainer.train_minibatch({feature : features, label : labels})

К сожалению, даже несмотря на то, что мне удалось успешно определить начальное значение в моем коде, я все же мог наблюдать небольшие вариации в моем конечном результате. Это из-за вычислений с плавающей запятой? или вы могли бы найти что-нибудь в моем коде, что я должен был установить начальное значение, чего я еще не сделал?

Спасибо !

[1] Определение начального значения в Бранскрипты для моделей последовательного машинного обучения CNTK


person Herath Bandara    schedule 05.06.2017    source источник


Ответы (1)


Можете ли вы попробовать следующее:

from _cntk_py import set_fixed_random_seed, force_deterministic_algorithms
set_fixed_random_seed(1)
force_deterministic_algorithms()
person Emad Barsoum    schedule 06.06.2017
comment
Спасибо за ответ !. Я разместил этот вопрос в профиле CNTK на Github, а также Github Question, где одно из предложений было таким же, как вы указали выше. Но, к сожалению, даже несмотря на то, что это сравнительно уменьшило первоначальную дисперсию результатов, я все же мог наблюдать небольшие вариации в моей окончательной выходной матрице. - person Herath Bandara; 06.06.2017
comment
Очевидно, на этой странице один из разработчиков дал указание вызывать cntk.cntk_py.set_fixed_random_seed(1) напрямую вместо использования _cntk_py. - person Herath Bandara; 06.06.2017
comment
Я смог решить эту проблему, обновив свой код до CNTK 2.0. Вы можете найти подробные шаги, которые я выполнил, чтобы решить эту проблему, в вопросе, который я разместил в профиле GitHub CNTK (github.com/Microsoft/CNTK/issues/1965) - person Herath Bandara; 20.06.2017