/// <summary>
        /// Устанавливает активное состояние нейросети, используемое для выполнения запросов к данной версии нейросети.
        /// </summary>
        /// <param name="networkStateID">Идентификатор состояния нейросети, устанавливаемого в качестве активного для версии нейросети.</param>
        public void ChangeActiveNetworkState(int networkStateID)
        {
            if (networkStateID == 0)
            {
                throw new ArgumentNullException("networkStateID");
            }

            this.ActiveNetworkState = this.Context.ObjectAdapters.NetworkStates.GetObject(networkStateID, true);
        }
        /// <summary>
        /// Создаёт новый запрос тренировки нейросети для заданной схемы тренировок.
        /// Тренировка нейросети может быть инициализирована на основе другого состояния нейросети.
        /// </summary>
        /// <param name="trainSchemeID">Идентификатор схемы тренировок.</param>
        /// <param name="initialStateID">Идентификатор состояния нейросети, на основе которого будет выполнена тренировка.
        /// Если тренировка является первичной, необходимо передать значение 0.</param>
        /// <param name="user">Идентификатор схемы тренировок.</param>
        public SkyTrainRequest CreateTrainRequest(int trainSchemeID, int initialStateID, ISkyUser user)
        {
            if (trainSchemeID == 0)
            {
                throw new ArgumentNullException("trainSchemeID");
            }
            if (user == null)
            {
                throw new ArgumentNullException("user");
            }

            this.CheckExists();

            //получаем схему тренировок.
            SkyTrainScheme trainScheme = this.Context.ObjectAdapters.TrainSchemes.GetObject(trainSchemeID, true);

            //проверяем, что схема тренировок принадлежит данной сети.
            if (trainScheme.Network.ID != this.Network.ID)
            {
                throw new Exception(string.Format("The training scheme with ID={0} does not belong to the neural network with ID={1} to which this version of the neural network belongs.",
                                                  trainScheme.ID, this.Network.ID));
            }

            //получаем инициализационное состояние.
            SkyNetworkState initialState = null;

            if (initialStateID > 0)
            {
                initialState = this.Context.ObjectAdapters.NetworkStates.GetObject(initialStateID, true);

                //проверяем, что инициализационное состояние принадлежит данной версии.
                if (initialState.NetworkVersion.ID != this.ID)
                {
                    throw new Exception(string.Format("The network state with ID={0} does not belong to the version of the neural network with ID={1}.",
                                                      initialState.ID, this.ID));
                }
            }

            //создаём запрос тренировки.
            SkyTrainRequest trainRequest = this.Context.ObjectAdapters.TrainRequests.CreateObject();

            trainRequest.NetworkID        = this.Network.ID;
            trainRequest.NetworkVersionID = this.ID;
            trainRequest.TrainSchemeID    = trainScheme.ID;
            trainRequest.InitialStateID   = initialState != null ? initialState.ID : 0;
            trainRequest.UserID           = user.ID;
            trainRequest.Status           = SkyTrainRequestStatus.Creating;

            //возвращаем созданный экземпляр.
            return(trainRequest);
        }
Beispiel #3
0
        /// <summary>
        /// Выполняет тренировку.
        /// </summary>
        public void Train()
        {
            //проверяем, что запрос существует.
            this.CheckExists();

            //проверяем, что тренировка ещё не была выполнена.
            if (this.ResultStateID != 0)
            {
                throw new Exception(string.Format("The train request with ID={0} has already trained.", this.ID));
            }

            //выполняем непосредственно тренировку сети.
            //подгружаем библиотеку
            var library = this.NetworkVersion.TensorLibrary.Content;

            //загружаем
            var assembly = Assembly.Load(library);

            //тип интерфейса сети
            var neuralNetworkInterfaceType = typeof(SkychainAPI.INeuralNetwork);

            //ищем реализацию интерфейса
            var neuralNetworkImplementationType = assembly.GetTypes().FirstOrDefault(type => neuralNetworkInterfaceType.IsAssignableFrom(type));

            if (neuralNetworkImplementationType == null)
            {
                throw new Exception($"Implementation of interface '{neuralNetworkInterfaceType.AssemblyQualifiedName}' not found in assembly '{assembly.FullName}'");
            }

            //создаём реализацию
            var neuralNetwork = Activator.CreateInstance(neuralNetworkImplementationType) as SkychainAPI.INeuralNetwork;

            //вызываем реализацию
            //var operationContext = new PublicAPI.TrainOperationContext(this.NetworkVersion, this.TrainScheme, this.InitialState, this.ResultStateDescription);
            var operationContext = new PublicAPI.TrainOperationContext(this);
            var trainScheme      = new PublicAPI.TrainScheme(this.TrainScheme);

            neuralNetwork.Train(operationContext, trainScheme);

            //в качестве результата получаем состояние нейросети.
            byte[] networkStateData = operationContext.SavedState;
            if (networkStateData == null)
            {
                throw new Exception("Training did not return the result. Call IOperationContext.SaveModel to save result.");
            }

            //создаём состояние нейросети.
            SkyNetworkState networkState = this.NetworkVersion.CreateNetworkState(this.TrainScheme.ID, this.InitialStateID);

            networkState.Description = this.ResultStateDescription;
            using (MemoryStream networkStateStream = new MemoryStream(networkStateData))
            {
                networkStateStream.Position = 0;
                networkState.StateData.Upload("NetworkStateData", networkStateStream);
            }

            //сохраняем состояние.
            networkState.Update();

            //устанавливаем ссылку на сформированное состояние.
            this.ResultStateID = networkState.ID;

            //устанавливаем признак успешной обработки запроса.
            this.Succeed = true;
        }