public void TrainNetwork(NetworkModel network, NetworksStorageModel storage, QueryDataFormat dataFormat, TaskProgressVM taskProgressVM = null)
        {
            if (taskProgressVM != null)
            {
                taskProgressVM.EndValue = TrainDatas.Count;
                taskProgressVM.TaskName = "Training network";
            }

            if (network.Generation == 0)
            {
                SaveHistory(network);
            }

            Parallel.ForEach(TrainDatas, (model) =>
            {
                var trainData = new MNIST28x28TrainData(model);
                network.Train(trainData);


                if (taskProgressVM != null)
                {
                    taskProgressVM.Value++;
                }
            });

            network.Generation++;
            SaveHistory(network);
            _workshopModel.SaveStorageAsync(storage.Id.ToString());
        }
        private void SaveHistory(NetworkModel networkModel)
        {
            var historyData = new TrainHisoryData()
            {
                Generation  = networkModel.Generation,
                NetworkData = networkModel.GetNetworkData()
            };

            string networkFolderPath = Path.Combine(_workshopModel.WorkingFolder, _workshopModel.GetStorageModel(networkModel.StorageId.ToString()).Name, "Networks");

            _fileService.SaveToFileAsync <TrainHisoryData>(historyData, networkFolderPath, new TrainHistoryDataSaveStrategy());
        }
        public string QueryNetwork(NetworkModel network, QueryDataModel queryData, QueryDataFormat dataFormat)
        {
            switch (dataFormat)
            {
            case QueryDataFormat.BlackMNIST28x28:
                var outputs = network.Query(queryData.InputValues);
                return(queryData.Marker = Array.IndexOf(outputs, outputs.Max()).ToString());

            default:
                return("Bad request");
            }
        }
예제 #4
0
        public async void LoadNetworkAsync(string fileName)
        {
            if (string.IsNullOrEmpty(fileName))
            {
                return;
            }

            var data = await _fileService.ReadFromFileAsync <NetworkDataModel>(fileName, new NetworkDataModelReadStrategy());

            var networkModel = new NetworkModel(data);

            DefaultStorage.AddInstance(networkModel);
        }
        public QueryDataModel BackQuery(NetworkModel network, QueryDataModel targetData, QueryDataFormat dataFormat)
        {
            switch (dataFormat)
            {
            case QueryDataFormat.BlackMNIST28x28:
                var inputs = network.BackQuery(targetData.OutputValues);
                var data   = new QueryDataModel()
                {
                    InputValues  = inputs,
                    Marker       = targetData.Marker,
                    OutputValues = targetData.OutputValues
                };
                var readyData = new MNIST28x28BackQueryData(data);
                return(readyData);

            default:
                return(null);
            }
        }
        public void AddInstance(NetworkModel nNetworkInstance)
        {
            int currentInputsCounts = nNetworkInstance.Layers[0];
            int currentOutputsCount = nNetworkInstance.Layers[nNetworkInstance.Layers.Length - 1];

            if (!IsStrict)
            {
                if (Networks.Count == 0 && StorageConstraints is null)
                {
                    StorageConstraints = new NetworkStorageConstraints(currentInputsCounts, currentOutputsCount);
                }

                if (currentInputsCounts != StorageConstraints.InputsCount || currentOutputsCount != StorageConstraints.OutputsCount)
                {
                    throw new ArgumentException("Invalid network properties");
                }
            }

            Networks.Add(nNetworkInstance);
            OnPropertyChanged(nameof(Networks));
        }