/// <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); }
/// <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; }