private MNCDContext InitCtx(string databaseName) { var options = new DbContextOptionsBuilder <MNCDContext>() .UseInMemoryDatabase(databaseName) .Options; var ctx = new MNCDContext(options); ctx.DataSets.RemoveRange(ctx.DataSets); ctx.SaveChanges(); var edgeList = "0 0 1 0 1"; var dataSet = new NetworkDataSet { Content = edgeList, FileType = FileType.EdgeList, EdgeList = edgeList, Name = "Data set 1", Hash = _hasher.GetHashFor(edgeList), ActorNames = new List <string> { "A0", "A1" }, EdgeCount = 1, LayerCount = 1, LayerNames = new List <string> { "L1" }, NodeCount = 2, }; ctx.DataSets.Add(dataSet); ctx.SaveChanges(); return(new MNCDContext(options)); }
/// <summary> /// Выбрать файл для тестирования. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Btn_ChooseTestingFile_Click(object sender, EventArgs e) { try { using (var openFileDialog = new OpenFileDialog()) { openFileDialog.Filter = "Excel Files|*.xls;*.xlsx;*.xlsm"; openFileDialog.InitialDirectory = CommonUtils.ResourcesDirectory; if (openFileDialog.ShowDialog() == DialogResult.OK) { using (new CursorHandler()) { var excelFilePath = Path.Combine(CommonUtils.ResourcesDirectory, openFileDialog.FileName); tbTestingFile.Text = excelFilePath; var dataTable = _reader.ReadFromFile(excelFilePath); _testingDataSet = _converter.Convert(dataTable); _interfaceMediator.DrawDataIntoGrid(_testingDataSet.Entities, _neuralNetwork.InputAttributes, dgvTesingData); } } } } catch (Exception ex) { MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
public static Network ReadDataSet(NetworkDataSet dataSet) { return(dataSet.FileType switch { FileType.MPX => new MpxReader().FromString(dataSet.Content), FileType.EdgeList => new EdgeListReader().FromString(dataSet.Content), _ => throw new ApplicationException("Unsupported file type."), });
/// <summary> /// Загрузить данные из файла для обучения сети. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Btn_ChooseLearningFile_Click(object sender, EventArgs e) { try { using (var openFileDialog = new OpenFileDialog()) { openFileDialog.Filter = "Excel Files|*.xls;*.xlsx;*.xlsm"; openFileDialog.InitialDirectory = CommonUtils.ResourcesDirectory; if (openFileDialog.ShowDialog() == DialogResult.OK) { using (new CursorHandler()) { var excelFilePath = Path.Combine(CommonUtils.ResourcesDirectory, openFileDialog.FileName); tbLearningFile.Text = excelFilePath; var learningDataTable = _reader.ReadFromFile(excelFilePath); _learningDataSet = _converter.Convert(learningDataTable); _neuralNetwork.InputAttributes = _learningDataSet.Attributes .Select(a => new InputAttributeBase { InputAttributeNumber = a.OrderNumber, Name = a.Name }) .ToList(); _interfaceMediator.DrawDataIntoGrid(_learningDataSet.Entities, _neuralNetwork.InputAttributes, dgvInputLearningData); RecalcMinMaxValues(_learningDataSet); RecalcMinMaxValues(_testingDataSet); var normalizedData = _learningDataSet.Entities .Select(l => new NetworkDataEntity() { Name = l.Name, OrderNumber = l.OrderNumber, AttributeValues = l.AttributeValues.Select(a => new NetworkEntityAttributeValue { Attribute = a.Attribute, Value = a.GetNormalizedValue(_neuralNetwork.NormalizationType) }).ToList() }) .ToList(); _interfaceMediator.DrawDataIntoGrid(normalizedData, _neuralNetwork.InputAttributes, dgvNormalizedLearningData); } } } } catch (Exception ex) { MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
private async Task <Visualization> GetVisualizationFromDataSet( NetworkDataSet dataSet, VisualizationType type) { if (type == VisualizationType.MultiLayer_Diagonal) { var diagonal = dataSet.Visualizations .FirstOrDefault(v => v.Type == VisualizationType.MultiLayer_Diagonal); if (diagonal is null) { var request = new MultilayerRequest { EdgeList = dataSet.EdgeList, Type = VisualizationType.MultiLayer_Diagonal }; diagonal = await VisualizeMultilayer(request); dataSet.Visualizations.Add(diagonal); await _ctx.SaveChangesAsync(); } return(diagonal); } else if (type == VisualizationType.MultiLayer_Slices) { var slices = dataSet.Visualizations .FirstOrDefault(v => v.Type == VisualizationType.MultiLayer_Slices); if (slices is null) { var request = new MultilayerRequest { EdgeList = dataSet.EdgeList, Type = VisualizationType.MultiLayer_Slices }; slices = await VisualizeMultilayer(request); dataSet.Visualizations.Add(slices); await _ctx.SaveChangesAsync(); } return(slices); } throw new NotSupportedException($"Visualization type '{type}' is not supported for datasets."); }
/// <summary> /// Пересчитать минимальное и максимальое значение. /// </summary> /// <param name="dataSet">Данные.</param> private void RecalcMinMaxValues(NetworkDataSet dataSet) { if (!(dataSet?.Attributes?.Any() ?? false)) { return; } foreach (var attribute in dataSet.Attributes) { attribute.Max = dataSet.Entities .Max(e => e.AttributeValues.First(a => a.Attribute.OrderNumber == attribute.OrderNumber).Value); attribute.Min = dataSet.Entities .Min(e => e.AttributeValues.First(a => a.Attribute.OrderNumber == attribute.OrderNumber).Value); dataSet.Entities .ForEach(entity => entity.AttributeValues.First(a => a.Attribute.OrderNumber == attribute.OrderNumber).Attribute = attribute); } }
/// <summary> /// Изменить кластер - повторная кластеризация. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Btn_EditCluster_Click(object sender, EventArgs e) { try { var isEdit = _networkBase?.NetworkId > 0; if (!isEdit) { throw new Exception("Невозможно изменить кластер у несохраненной нейронной сети."); } if (tvClusters.SelectedNode?.Tag == null || string.IsNullOrEmpty(tvClusters.SelectedNode.Tag.ToString())) { throw new Exception("Выберите кластер для изменения."); } var cluster = tvClusters.SelectedNode.Tag as NetworkCluster; var neuron = _neuralNetwork.Neurons.First(n => n.NeuronNumber == cluster.Number); if (neuron.NeuronId <= 0) { throw new Exception("Невозможно изменить кластер у несохраненной нейронной сети."); } var dataSet = new NetworkDataSet() { Entities = _testingDataSet.Entities .Where(t => cluster.Entities.Select(c => c.OrderNumber).Contains(t.OrderNumber)) .ToList(), Attributes = _testingDataSet.Attributes }; var mainForm = IoC.Instance.Resolve<MainForm>( new IoC.NinjectArgument("networkId", cluster.NetworkId), new IoC.NinjectArgument("parentNeuronId", neuron.NeuronId), new IoC.NinjectArgument("parentNeuronDataSet", dataSet.Clone() as NetworkDataSet)); if (mainForm.ShowDialog() == DialogResult.OK) { // Обновить кластеры InitializeExistingNetwork(_networkBase.NetworkId); Btn_Test_Click(); } } catch (Exception ex) { MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
public async Task <NetworkDataSet> AddDataSet(string name, string content, FileType fileType) { if (string.IsNullOrEmpty(name)) { throw new ArgumentException("Name must not be empty.", nameof(name)); } if (string.IsNullOrEmpty(content)) { throw new ArgumentException("Content must not be empty.", nameof(content)); } var hash = _hashService.GetHashFor(content); if (await ExistsDataSet(hash)) { throw new NetworkDataSetExistsException($"Data set already exists in the system."); } var network = ReadNetwork(content, fileType); var edgeList = GetEdgeList(network); var dataSet = new NetworkDataSet { Name = name, Content = content, EdgeList = edgeList, FileType = fileType, Hash = hash, NodeCount = network.ActorCount, EdgeCount = network.Layers.Sum(l => l.Edges.Count) + network.InterLayerEdges.Count, LayerCount = network.LayerCount, ActorNames = network.Actors.Select(a => a.Name).ToList(), LayerNames = network.Layers.Select(l => l.Name).ToList() }; await _ctx.DataSets.AddAsync(dataSet); await _ctx.SaveChangesAsync(); return(dataSet); }
/// <summary> /// Обучить нейронную сеть. /// </summary> /// <param name="inputDataSet">Набор входных данных для обучения.</param> /// <param name="neuronsCount">Количество нейронов.</param> /// <param name="iterationsCount">Количество эпох.</param> public virtual void Study(NetworkDataSet inputDataSet, int neuronsCount, int iterationsCount) { GenerateNeurons(inputDataSet?.Attributes, neuronsCount); for (int iteration = 0; iteration < iterationsCount; iteration++) { var randomNumber = _random.Next(0, inputDataSet.Entities.Count - 1); var randomEntity = inputDataSet.Entities[randomNumber]; var attributeValues = randomEntity.AttributeValues .Select(e => new InputAttributeValue { InputAttributeNumber = e.Attribute.OrderNumber, Value = e.GetNormalizedValue(NormalizationType) }) .ToList(); var totalError = StudyInputEntity(attributeValues, iteration, iterationsCount); IterationCompleted?.Invoke(this, null); } }
public MainForm( INetworkService networkService, IReader reader, AbstractNetwork network, int? networkId = null, int? parentNeuronId = null, NetworkDataSet parentNeuronDataSet = null) { InitializeComponent(); _reader = reader; _networkService = networkService; _converter = new NetworkDataSetConverter(); _interfaceMediator = new InterfaceHelpers(); _neuralNetwork = network; _neuralNetwork.IterationCompleted += OnNetworkWeightsChanged; // При редактировании существующей сети скрыть обучение var isEdit = networkId > 0; if (isEdit) { InitializeExistingNetwork(networkId ?? 0); } else { _networkBase = new NetworkBase { ParentNeuronId = parentNeuronId }; } if (parentNeuronId > 0) { if (parentNeuronDataSet == null || !(parentNeuronDataSet?.Entities?.Any() ?? false)) { throw new Exception("Не задан набор обучающих данных для повторной кластеризации."); } _learningDataSet = parentNeuronDataSet; _testingDataSet = parentNeuronDataSet; btnChooseLearningFile.Enabled = false; btnChooseTestingFile.Enabled = false; RecalcMinMaxValues(_learningDataSet); RecalcMinMaxValues(_testingDataSet); _neuralNetwork.InputAttributes = _learningDataSet.Attributes .Select(a => new InputAttributeBase { InputAttributeNumber = a.OrderNumber, Name = a.Name }) .ToList(); _interfaceMediator.DrawDataIntoGrid(_learningDataSet.Entities, _neuralNetwork.InputAttributes, dgvInputLearningData); var normalizedData = _learningDataSet.Entities .Select(l => new NetworkDataEntity() { Name = l.Name, OrderNumber = l.OrderNumber, AttributeValues = l.AttributeValues.Select(a => new NetworkEntityAttributeValue { Attribute = a.Attribute, Value = a.GetNormalizedValue(_neuralNetwork.NormalizationType) }).ToList() }) .ToList(); _interfaceMediator.DrawDataIntoGrid(normalizedData, _neuralNetwork.InputAttributes, dgvNormalizedLearningData); _interfaceMediator.DrawDataIntoGrid(_testingDataSet.Entities, _neuralNetwork.InputAttributes, dgvTesingData); } btnEditCluster.Enabled = isEdit; SetSaveButtonEnabled(); }