Ранее я упоминал, что в 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