From 092b447fc37337b46e07df43846630b7b48bbb38 Mon Sep 17 00:00:00 2001 From: TAMARA JERINIC Date: Sat, 14 May 2022 22:00:45 +0200 Subject: Dodat izbor veličine skupa za validaciju na front. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/app/_data/Model.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'frontend/src/app/_data') diff --git a/frontend/src/app/_data/Model.ts b/frontend/src/app/_data/Model.ts index d1e89e84..7780dc45 100644 --- a/frontend/src/app/_data/Model.ts +++ b/frontend/src/app/_data/Model.ts @@ -29,7 +29,7 @@ export default class Model extends FolderFile { public randomOrder: boolean = true, public randomTestSet: boolean = true, public randomTestSetDistribution: number = 0.1, //0.1-0.9 (10% - 90%) JESTE OVDE ZAKUCANO 10, AL POSLATO JE KAO 0.1 BACK-U - + public validationSize:number=0.1, public isPublic: boolean = false, public accessibleByLink: boolean = false ) { -- cgit v1.2.3 From 743646bb658911b0d89fa08815fbc3872e4223a0 Mon Sep 17 00:00:00 2001 From: Sonja Galovic Date: Mon, 16 May 2022 17:57:01 +0200 Subject: Form-model: stopa ucenja postavljena na 0.01 difoltno. Home-page: izmenjeni neki fontovi i velicina, tekst vise ne izgleda kao link. --- frontend/src/app/_data/Model.ts | 2 +- .../_elements/form-model/form-model.component.html | 6 +- .../_pages/experiment/experiment.component.html | 82 +++++++++++----------- frontend/src/app/_pages/home/home.component.css | 10 +++ frontend/src/app/_pages/home/home.component.html | 8 +-- 5 files changed, 59 insertions(+), 49 deletions(-) (limited to 'frontend/src/app/_data') diff --git a/frontend/src/app/_data/Model.ts b/frontend/src/app/_data/Model.ts index 05d17e01..8fc36a31 100644 --- a/frontend/src/app/_data/Model.ts +++ b/frontend/src/app/_data/Model.ts @@ -21,7 +21,7 @@ export default class Model extends FolderFile { public metrics: string[] = [], // TODO add to add-model form public epochs: number = 5, // TODO add to add-model form public inputColNum: number = 5, - public learningRate: LearningRate = LearningRate.LR1, + public learningRate: LearningRate = LearningRate.LR3, public layers: Layer[] = [new Layer()], // Test set settings diff --git a/frontend/src/app/_elements/form-model/form-model.component.html b/frontend/src/app/_elements/form-model/form-model.component.html index 1db6195b..97e38cf1 100644 --- a/frontend/src/app/_elements/form-model/form-model.component.html +++ b/frontend/src/app/_elements/form-model/form-model.component.html @@ -11,12 +11,12 @@
Tip problema - + {{ optionName }} - + {{ optionName }} @@ -102,7 +102,7 @@
Trening Test
-
+
Nasumični redosled podataka
diff --git a/frontend/src/app/_pages/experiment/experiment.component.html b/frontend/src/app/_pages/experiment/experiment.component.html index 4c9d0222..20ff33d1 100644 --- a/frontend/src/app/_pages/experiment/experiment.component.html +++ b/frontend/src/app/_pages/experiment/experiment.component.html @@ -1,47 +1,47 @@
-
-
- Novi Eksperiment -
-
- {{experiment.name}} -
+
+
+ Novi Eksperiment +
+
+ {{experiment.name}} +
-
- - - - - Izvor podataka - {{dataset.name}} - - -

Izaberite vas izvor podataka

-
-
- - - Predvideti:{{experiment.outputColumn}} - Odabir kolona - - -

Pripremite podatke i izaberite izlazne kolone

-
-
- - - {{modelToTrain.name}} - Treniranje - -

Odaberite parametre i trenirajte model

-
- - Pregled rezultata
treniranja
-

Pregledajte tok treniranja i
grafički prikaz rezultata

-
-
+
+ + + + + Izvor podataka + {{dataset.name}} + + +

Izaberite izvor podataka

+
+
+ + + Predvideti:{{experiment.outputColumn}} + Odabir kolona + + +

Pripremite podatke i izaberite izlazne kolone

+
+
+ + + {{modelToTrain.name}} + Treniranje + +

Odaberite parametre i trenirajte model

+
+ + Pregled rezultata
treniranja
+

Pregledajte tok treniranja i
grafički prikaz rezultata

+
+
@@ -66,4 +66,4 @@
- + \ No newline at end of file diff --git a/frontend/src/app/_pages/home/home.component.css b/frontend/src/app/_pages/home/home.component.css index 906f5728..51f22320 100644 --- a/frontend/src/app/_pages/home/home.component.css +++ b/frontend/src/app/_pages/home/home.component.css @@ -11,10 +11,20 @@ h1 { font-weight: 900 !important; margin-top: 1rem; margin-bottom: 2.5rem; + font-family: /*'Garamond',*/ + 'Courier New', Courier, monospace; } .card { margin: 2.5rem !important; padding: 1.5rem; width: 26rem !important; +} + +a { + text-decoration: none; +} + +.subtitle-class { + letter-spacing: 0.2rem; } \ No newline at end of file diff --git a/frontend/src/app/_pages/home/home.component.html b/frontend/src/app/_pages/home/home.component.html index 2825b3bf..9b559bc9 100644 --- a/frontend/src/app/_pages/home/home.component.html +++ b/frontend/src/app/_pages/home/home.component.html @@ -11,9 +11,9 @@
model_training -

Experimentiši

+

Eksperimentiši

- U tri koraka napravite novu neuronsku mrežu. Koristite postojeće izvore podataka, modele, itd. + U tri koraka napravite novu neuronsku mrežu. Koristite postojeće izvore podataka, modele, itd.

@@ -21,9 +21,9 @@
storage -

Arhiva

+

Arhiva

- Upravljajte izvorima podataka, eksperimentima, modelima, i rezultatima treniranja. Pogledajte podatke koje su podelili drugi korisnici. + Upravljajte izvorima podataka, eksperimentima, modelima i rezultatima treniranja. Pogledajte podatke koje su podelili drugi korisnici.

-- cgit v1.2.3 From 00915357e9af2e6d3c1e312cdd46efd502cf106c Mon Sep 17 00:00:00 2001 From: Ivan Ljubisavljevic Date: Mon, 16 May 2022 21:25:36 +0200 Subject: Rrrrressii dodavanje public datasetova u svoje --- backend/api/api/Controllers/DatasetController.cs | 68 ++++++++++++++++++++++ backend/api/api/Interfaces/IFileService.cs | 2 + backend/api/api/Services/FileService.cs | 6 ++ backend/api/api/Services/FillAnEmptyDb.cs | 20 ++++--- frontend/src/app/_data/Dataset.ts | 1 + .../src/app/_elements/folder/folder.component.ts | 4 +- frontend/src/app/_services/datasets.service.ts | 4 ++ 7 files changed, 96 insertions(+), 9 deletions(-) (limited to 'frontend/src/app/_data') diff --git a/backend/api/api/Controllers/DatasetController.cs b/backend/api/api/Controllers/DatasetController.cs index a6ebe8ac..7602a621 100644 --- a/backend/api/api/Controllers/DatasetController.cs +++ b/backend/api/api/Controllers/DatasetController.cs @@ -148,7 +148,75 @@ namespace api.Controllers return Ok(); } } + // POST api//stealDs + [HttpPost("stealDs")] + [Authorize(Roles = "User,Guest")] + public async Task> StealDs([FromBody] Dataset dataset) + { + string uploaderId = getUserId(); + + dataset.uploaderId = uploaderId; + + //da li ce preko tokena da se ubaci username ili front salje + //dataset.username = usernameToken; + //username = "" ako je GUEST DODAO + var existingDataset = _datasetService.GetOneDatasetN(dataset.uploaderId, dataset.name); + + if (existingDataset != null) + return NotFound($"Dataset with this name already exists"); + else + { + dataset.dateCreated = DateTime.Now; + dataset.lastUpdated = DateTime.Now; + dataset.isPublic = false; + + FileModel fileModel = _fileService.getFile(dataset.fileId); + string folderName = "UploadedFiles"; + var folderPath = Path.Combine(Directory.GetCurrentDirectory(), folderName, uploaderId); + + string ext = ".csv"; + + //nesto + + //Check Directory + if (!Directory.Exists(folderPath)) + { + Directory.CreateDirectory(folderPath); + } + //Index file if same filename + var fullPath = Path.Combine(folderPath, dataset.name + ext); + int i = 0; + + while (System.IO.File.Exists(fullPath)) + { + i++; + fullPath = Path.Combine(folderPath, dataset.name + i.ToString() + ext); + } + + dataset.fileId = ""; + + _fileService.CopyFile(fileModel.path, fullPath); + + + FileModel fileModel1 = new FileModel(); + fileModel1.type = ext; + fileModel1.path = fullPath; + fileModel1.uploaderId = uploaderId; + fileModel1.date = DateTime.Now.ToUniversalTime(); + fileModel1 = _fileService.Create(fileModel1); + + dataset.fileId = fileModel1._id; + + //nesto + + + dataset.isPreProcess = false; + _datasetService.Create(dataset); + _mlConnectionService.PreProcess(dataset, fileModel.path, uploaderId); + return Ok(); + } + } // PUT api//{name} [HttpPut("{id}")] diff --git a/backend/api/api/Interfaces/IFileService.cs b/backend/api/api/Interfaces/IFileService.cs index e061dfdb..00dc0002 100644 --- a/backend/api/api/Interfaces/IFileService.cs +++ b/backend/api/api/Interfaces/IFileService.cs @@ -9,5 +9,7 @@ namespace api.Services public FileModel getFile(string id); bool CheckDb(); string GetFileId(string fullPath); + bool CopyFile(string sourceFile, string destinacionFile); + } } \ No newline at end of file diff --git a/backend/api/api/Services/FileService.cs b/backend/api/api/Services/FileService.cs index ea3fe56e..6ef74ca1 100644 --- a/backend/api/api/Services/FileService.cs +++ b/backend/api/api/Services/FileService.cs @@ -59,5 +59,11 @@ namespace api.Services return file._id; } + + public bool CopyFile(string sourceFile, string destinacionFile) + { + File.Copy(sourceFile, destinacionFile, true); + return true; + } } } diff --git a/backend/api/api/Services/FillAnEmptyDb.cs b/backend/api/api/Services/FillAnEmptyDb.cs index fc169853..28f293ce 100644 --- a/backend/api/api/Services/FillAnEmptyDb.cs +++ b/backend/api/api/Services/FillAnEmptyDb.cs @@ -53,7 +53,7 @@ namespace api.Services dataset._id = ""; dataset.uploaderId = "000000000000000000000000"; - dataset.name = "Titanik dataset"; + dataset.name = "Titanik dataset(public)"; dataset.description = "Titanik dataset"; dataset.fileId = _fileService.GetFileId(fullPath); dataset.extension = ".csv"; @@ -61,7 +61,7 @@ namespace api.Services dataset.accessibleByLink = true; dataset.dateCreated = DateTime.Now; dataset.lastUpdated = DateTime.Now; - dataset.delimiter = ""; + dataset.delimiter = ","; dataset.columnInfo = new ColumnInfo[] { }; dataset.columnInfo = new[] { @@ -84,7 +84,7 @@ namespace api.Services dataset.nullRows = 708; dataset.isPreProcess = true; dataset.cMatrix = new float[11][]; - dataset.cMatrix[0] = new float[] {1f,-0.005006660707294941f, -0.03514399379491806f,-0.03855886310338974f,0.04293888062238693f,0.03684719651937485f}; + dataset.cMatrix[0] = new float[] { 1f, -0.005006660707294941f, -0.03514399379491806f, -0.03855886310338974f, 0.04293888062238693f, 0.03684719651937485f }; _datasetService.Create(dataset); @@ -173,14 +173,14 @@ namespace api.Services dataset._id = ""; dataset.uploaderId = "000000000000000000000000"; dataset.name = "Diamonds dataset"; - dataset.description = "Diamonds dataset"; + dataset.description = "Diamonds dataset(public)"; dataset.fileId = _fileService.GetFileId(fullPath); dataset.extension = ".csv"; dataset.isPublic = true; dataset.accessibleByLink = true; dataset.dateCreated = DateTime.Now; dataset.lastUpdated = DateTime.Now; - dataset.delimiter = ""; + dataset.delimiter = ","; dataset.columnInfo = new[] { new ColumnInfo( "Unnamed: 0", true, 0, 26969.5f, 0, 53939, 26969.5f, new string[]{ }, new int[] {}, new float[] {}, 0.01f,0.1f ), @@ -199,6 +199,9 @@ namespace api.Services dataset.nullCols = 0; dataset.nullRows = 0; dataset.isPreProcess = true; + dataset.cMatrix = new float[11][]; + dataset.cMatrix[0] = new float[] { 1f, -0.005006660707294941f, -0.03514399379491806f, -0.03855886310338974f, 0.04293888062238693f, 0.03684719651937485f }; + _datasetService.Create(dataset); @@ -295,14 +298,14 @@ namespace api.Services dataset._id = ""; dataset.uploaderId = "000000000000000000000000"; dataset.name = "Iris dataset"; - dataset.description = "Iris dataset"; + dataset.description = "Iris dataset(public) "; dataset.fileId = _fileService.GetFileId(fullPath); dataset.extension = ".csv"; dataset.isPublic = true; dataset.accessibleByLink = true; dataset.dateCreated = DateTime.Now; dataset.lastUpdated = DateTime.Now; - dataset.delimiter = ""; + dataset.delimiter = ","; dataset.columnInfo = new[] { new ColumnInfo( "sepal_length", true, 0, 5.8433332443237305f, 4.300000190734863f, 7.900000095367432f, 5.800000190734863f, new string[]{ }, new int[] {}, new float[] {}, 0.01f, 0.1f ), @@ -314,6 +317,9 @@ namespace api.Services dataset.nullCols = 150; dataset.nullRows = 0; dataset.isPreProcess = true; + dataset.cMatrix = new float[11][]; + dataset.cMatrix[0] = new float[] { 1f, -0.005006660707294941f, -0.03514399379491806f, -0.03855886310338974f, 0.04293888062238693f, 0.03684719651937485f }; + _datasetService.Create(dataset); diff --git a/frontend/src/app/_data/Dataset.ts b/frontend/src/app/_data/Dataset.ts index a962fe6b..73b77bd0 100644 --- a/frontend/src/app/_data/Dataset.ts +++ b/frontend/src/app/_data/Dataset.ts @@ -17,6 +17,7 @@ export default class Dataset extends FolderFile { public rowCount: number = 0, public nullRows: number = 0, public nullCols: number = 0, + public isPreProcess : Boolean = false, public cMatrix: number[][] = [] ) { super(name, dateCreated, lastUpdated); diff --git a/frontend/src/app/_elements/folder/folder.component.ts b/frontend/src/app/_elements/folder/folder.component.ts index fff5a25d..d26ac999 100644 --- a/frontend/src/app/_elements/folder/folder.component.ts +++ b/frontend/src/app/_elements/folder/folder.component.ts @@ -301,9 +301,9 @@ export class FolderComponent implements AfterViewInit { switch (this.type) { case FolderType.Dataset: (file)._id=""; - + (file).isPreProcess = true; (file).isPublic=false; - this.datasetsService.addDataset(file).subscribe((response) => { + this.datasetsService.stealDataset(file).subscribe((response) => { this.filteredFiles.splice(this.filteredFiles.indexOf(file), 1); this.refreshFiles(null); }); diff --git a/frontend/src/app/_services/datasets.service.ts b/frontend/src/app/_services/datasets.service.ts index f5677097..1b961442 100644 --- a/frontend/src/app/_services/datasets.service.ts +++ b/frontend/src/app/_services/datasets.service.ts @@ -24,6 +24,10 @@ export class DatasetsService { return this.http.post(`${Configuration.settings.apiURL}/dataset/add`, dataset, { headers: this.authService.authHeader() }); } + stealDataset(dataset: Dataset): Observable { + return this.http.post(`${Configuration.settings.apiURL}/dataset/stealDs`, dataset, { headers: this.authService.authHeader() }); + } + getDatasetFile(fileId: any): any { return this.http.get(`${Configuration.settings.apiURL}/file/csvRead/${fileId}/-1/11`, { headers: this.authService.authHeader(), responseType: 'text' }); } -- cgit v1.2.3 From b3a47535532ca7af3943196c7c78f9dd6025a5b0 Mon Sep 17 00:00:00 2001 From: Ivan Ljubisavljevic Date: Wed, 18 May 2022 20:44:13 +0200 Subject: Predictor fix --- backend/api/api/Models/Predictor.cs | 2 -- frontend/src/app/_data/Predictor.ts | 11 ++++++----- 2 files changed, 6 insertions(+), 7 deletions(-) (limited to 'frontend/src/app/_data') diff --git a/backend/api/api/Models/Predictor.cs b/backend/api/api/Models/Predictor.cs index 4534bd8d..530257b2 100644 --- a/backend/api/api/Models/Predictor.cs +++ b/backend/api/api/Models/Predictor.cs @@ -10,8 +10,6 @@ namespace api.Models [BsonRepresentation(BsonType.ObjectId)]//mongo data type to .net public string _id { get; set; } public string uploaderId { get; set; } - //public string name { get; set; } - //public string description { get; set; } public string[] inputs { get; set; } public string output { get; set; } public bool isPublic { get; set; } diff --git a/frontend/src/app/_data/Predictor.ts b/frontend/src/app/_data/Predictor.ts index 55d610ed..c839a635 100644 --- a/frontend/src/app/_data/Predictor.ts +++ b/frontend/src/app/_data/Predictor.ts @@ -3,19 +3,20 @@ import { FolderFile } from "./FolderFile"; export default class Predictor extends FolderFile { constructor( name: string = 'Novi prediktor', - public description: string = '', + + public uploaderId: string = '', public inputs: string[] = [], public output: string = '', public isPublic: boolean = false, public accessibleByLink: boolean = false, dateCreated: Date = new Date(), - lastUpdated: Date = new Date(), - public uploaderId: string = '', - //public finalMetrics: Metric[] = [] public experimentId: string = "", public modelId: string = "", + public h5FileId: string = "", + public metrics: Metric[] = [], + public finalMetrics: Metric[] = [] ) { - super(name, dateCreated, lastUpdated); + super(name, dateCreated, dateCreated); } } -- cgit v1.2.3 From 0dea04df11e9cb5f167473dddaffbc1a0d28bd59 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Wed, 18 May 2022 23:20:15 +0200 Subject: Korisniku omoguceno da preuzme dataset sa front-end-a. --- frontend/src/app/_data/Dataset.ts | 2 +- frontend/src/app/_elements/folder/folder.component.html | 5 ++++- frontend/src/app/_elements/folder/folder.component.ts | 15 +++++++++++++++ frontend/src/app/_services/datasets.service.ts | 4 ++++ 4 files changed, 24 insertions(+), 2 deletions(-) (limited to 'frontend/src/app/_data') diff --git a/frontend/src/app/_data/Dataset.ts b/frontend/src/app/_data/Dataset.ts index 73b77bd0..c8d5771a 100644 --- a/frontend/src/app/_data/Dataset.ts +++ b/frontend/src/app/_data/Dataset.ts @@ -4,7 +4,7 @@ export default class Dataset extends FolderFile { constructor( name: string = 'Novi izvor podataka', public description: string = '', - public fileId?: number, + public fileId?: string, public extension: string = '.csv', public isPublic: boolean = false, public accessibleByLink: boolean = false, diff --git a/frontend/src/app/_elements/folder/folder.component.html b/frontend/src/app/_elements/folder/folder.component.html index da04b219..6293ec7f 100644 --- a/frontend/src/app/_elements/folder/folder.component.html +++ b/frontend/src/app/_elements/folder/folder.component.html @@ -76,7 +76,10 @@ {{file.lastUpdated | date}}
- +
diff --git a/frontend/src/app/_elements/folder/folder.component.ts b/frontend/src/app/_elements/folder/folder.component.ts index 262b3b7d..f13635e9 100644 --- a/frontend/src/app/_elements/folder/folder.component.ts +++ b/frontend/src/app/_elements/folder/folder.component.ts @@ -13,6 +13,7 @@ import { SignalRService } from 'src/app/_services/signal-r.service'; import { FormModelComponent } from '../form-model/form-model.component'; import { ActivatedRoute, Router } from '@angular/router'; import Predictor from 'src/app/_data/Predictor'; +import FileSaver from 'file-saver'; @Component({ selector: 'app-folder', @@ -308,6 +309,20 @@ export class FolderComponent implements AfterViewInit { break; } } + downloadFile(file: FolderFile, event: Event) { + event.stopPropagation(); + if (this.type==FolderType.Dataset) { + const fileId=(file).fileId; + const name=(file).name; + const ext=(file).extension; + if(fileId!=undefined) + this.datasetsService.downloadFile(fileId).subscribe((response)=>{ + FileSaver.saveAs(response,name+ext); + + }); + + } + } addFile(file: FolderFile, event: Event) { event.stopPropagation(); diff --git a/frontend/src/app/_services/datasets.service.ts b/frontend/src/app/_services/datasets.service.ts index 8d07674d..3fb4e8f2 100644 --- a/frontend/src/app/_services/datasets.service.ts +++ b/frontend/src/app/_services/datasets.service.ts @@ -51,4 +51,8 @@ export class DatasetsService { deleteDataset(dataset: Dataset) { return this.http.delete(`${Configuration.settings.apiURL}/dataset/` + dataset._id, { headers: this.authService.authHeader(), responseType: "text" }); } + + downloadFile(id:string):Observable{ + return this.http.get(`${Configuration.settings.apiURL}/file/Download?id=`+id, { headers: this.authService.authHeader(), responseType: 'blob' }); + } } -- cgit v1.2.3 From dce16507a0e8219f1bb04a2ec9a0afad521fac47 Mon Sep 17 00:00:00 2001 From: TAMARA JERINIC Date: Thu, 19 May 2022 17:14:46 +0200 Subject: Izmenjen prediktor i omogućeno čuvanje metrika. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/api/api/Models/Predictor.cs | 26 ++++++++++++++------ backend/api/api/Program.cs | 2 +- backend/api/api/appsettings.json | 7 +++--- backend/microservice/api/controller.py | 33 +++++++++++++++++++------ backend/microservice/api/newmlservice.py | 41 +++++++++++++------------------- frontend/src/app/_data/Model.ts | 4 ++-- 6 files changed, 68 insertions(+), 45 deletions(-) (limited to 'frontend/src/app/_data') diff --git a/backend/api/api/Models/Predictor.cs b/backend/api/api/Models/Predictor.cs index bfe95a0f..95dd3a23 100644 --- a/backend/api/api/Models/Predictor.cs +++ b/backend/api/api/Models/Predictor.cs @@ -14,19 +14,31 @@ namespace api.Models public string output { get; set; } public bool isPublic { get; set; } public bool accessibleByLink { get; set; } - public DateTime dateCreated { get; set; } + //public DateTime dateCreated { get; set; } public string experimentId { get; set; } public string modelId { get; set; } public string h5FileId { get; set; } - public Metric[] metrics { get; set; } - public Metric[] finalMetrics { get; set; } - } - public class Metric + //public Metric[] metrics { get; set; } + + public float[] metricsLoss { get; set; } + public float[] metricsValLoss { get; set; } + public float[] metricsAcc { get; set; } + public float[] metricsValAcc { get; set; } + public float[] metricsMae { get; set; } + + public float[] metricsValMae { get; set; } + + public float[] metricsMse { get; set; } + public float[] metricsValMse { get; set; } + //public Metric[] finalMetrics { get; set; } + } + + /*public class Metric { string Name { get; set; } string JsonValue { get; set; } - } - + }*/ + } \ No newline at end of file diff --git a/backend/api/api/Program.cs b/backend/api/api/Program.cs index cf64d58d..5977e843 100644 --- a/backend/api/api/Program.cs +++ b/backend/api/api/Program.cs @@ -37,7 +37,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddHostedService(); -builder.Services.AddHostedService(); +//builder.Services.AddHostedService(); //Ml Api Ip Filter builder.Services.AddScoped(container => diff --git a/backend/api/api/appsettings.json b/backend/api/api/appsettings.json index 44d63ac3..77708086 100644 --- a/backend/api/api/appsettings.json +++ b/backend/api/api/appsettings.json @@ -16,15 +16,16 @@ "UserStoreDatabaseSettings": { /* LocalHost*/ - /*"ConnectionString": "mongodb://127.0.0.1:27017/", + "ConnectionString": "mongodb://127.0.0.1:27017/", "DatabaseName": "si_project", "CollectionName": "users", "DatasetCollectionName": "Dataset", "ModelCollectionName": "Model", "PredictorCollectionName": "Predictor", "FilesCollectionName": "Files", - "ExperimentCollectionName": "Experiment"*/ + "ExperimentCollectionName": "Experiment" + /* "ConnectionString": "mongodb+srv://si_user:si_user@sidatabase.twtfm.mongodb.net/myFirstDatabase?retryWrites=true&w=majority", "DatabaseName": "si_db", "CollectionName": "users", @@ -32,6 +33,6 @@ "ModelCollectionName": "Model", "PredictorCollectionName": "Predictor", "FilesCollectionName": "Files", - "ExperimentCollectionName": "Experiment" + "ExperimentCollectionName": "Experiment" */ } } \ No newline at end of file diff --git a/backend/microservice/api/controller.py b/backend/microservice/api/controller.py index 6f483008..0eee571c 100644 --- a/backend/microservice/api/controller.py +++ b/backend/microservice/api/controller.py @@ -69,15 +69,26 @@ def train(): #dataset, paramsModel, paramsExperiment, callback) - filepath,result,finalMetrics= newmlservice.train(data, paramsModel, paramsExperiment,paramsDataset, train_callback) + filepath,histMetrics= newmlservice.train(data, paramsModel, paramsExperiment,paramsDataset, train_callback) """ f = request.json['filepath'] dataset = pd.read_csv(f) filepath,result=newmlservice.train(dataset,request.json['model'],train_callback) print(result) """ - - + #m = [] + #for attribute, value in result.items(): + #m.append(histMetrics(attribute,str(value)).__dict__) + ''' + m = [] + for attribute, value in result.items(): + m.append({"Name" : attribute, "JsonValue" : value})) + + print("**************************************************************") + print(m) + + print("**************************************************************") + ''' url = config.api_url + "/file/h5" files = {'file': open(filepath, 'rb')} r=requests.post(url, files=files,data={"uploaderId":paramsExperiment['uploaderId']}) @@ -92,15 +103,23 @@ def train(): "experimentId" : paramsExperiment["_id"], "modelId" : paramsModel["_id"], "h5FileId" : fileId, - "metrics" : result, - "finalMetrics":finalMetrics + "metricsLoss":histMetrics[0], + "metricsValLoss":histMetrics[1], + "metricsAcc":histMetrics[2], + "metricsValAcc":histMetrics[3], + "metricsMae":histMetrics[4], + "metricsValMae":histMetrics[5], + "metricsMse":histMetrics[6], + "metricsValMse":histMetrics[7] + + } #print(predictor) - + url = config.api_url + "/Predictor/add" r = requests.post(url, json=predictor).text - print(r) + #print(r) return r @app.route('/predict', methods = ['POST']) diff --git a/backend/microservice/api/newmlservice.py b/backend/microservice/api/newmlservice.py index bcff5a33..85be0c2f 100644 --- a/backend/microservice/api/newmlservice.py +++ b/backend/microservice/api/newmlservice.py @@ -303,7 +303,7 @@ def train(dataset, paramsModel,paramsExperiment,paramsDataset,callback): ###OPTIMIZATORI print(paramsModel['optimizer']) if(paramsModel['optimizer']=='Adam'): - opt=tf.keras.optimizers.Adam(learning_rate=3) + opt=tf.keras.optimizers.Adam(learning_rate=float(paramsModel['learningRate'])) elif(paramsModel['optimizer']=='Adadelta'): opt=tf.keras.optimizers.Adadelta(learning_rate=float(paramsModel['learningRate'])) @@ -370,7 +370,7 @@ def train(dataset, paramsModel,paramsExperiment,paramsDataset,callback): - classifier.compile(loss =paramsModel["lossFunction"] , optimizer =opt, metrics = ['mae','mse']) + classifier.compile(loss =paramsModel["lossFunction"] , optimizer =opt, metrics = ['accuracy','mae','mse']) history=classifier.fit( x=x_train, y=y_train, epochs = paramsModel['epochs'],batch_size=int(paramsModel['batchSize']),callbacks=callback(x_test, y_test,paramsModel['_id']),validation_data=(x_val, y_val)) @@ -383,9 +383,9 @@ def train(dataset, paramsModel,paramsExperiment,paramsDataset,callback): scores = classifier.evaluate(x_test, y_test) #print("\n%s: %.2f%%" % (classifier.metrics_names[1], scores[1]*100)) - + ''' classifier.save(filepath, save_format='h5') - metrics={} + macro_averaged_precision=sm.precision_score(y_test, y_pred, average = 'macro') micro_averaged_precision=sm.precision_score(y_test, y_pred, average = 'micro') macro_averaged_recall=sm.recall_score(y_test, y_pred, average = 'macro') @@ -401,12 +401,12 @@ def train(dataset, paramsModel,paramsExperiment,paramsDataset,callback): {"Name":"macro_averaged_f1","JsonValue": str(macro_averaged_f1)}, {"Name":"micro_averaged_f1", "JsonValue": str(micro_averaged_f1)} ] - + ''' #vizuelizacija u python-u #from ann_visualizer.visualize import ann_viz; #ann_viz(classifier, title="My neural network") - return filepath,hist,metrics + return filepath,[hist['loss'],hist['val_loss'],hist['accuracy'],hist['val_accuracy'],hist['mae'],hist['val_mae'],hist['mse'],hist['val_mse']] elif(problem_type=='binarni-klasifikacioni'): #print('*************************************************************************binarni') @@ -444,6 +444,7 @@ def train(dataset, paramsModel,paramsExperiment,paramsDataset,callback): history=classifier.fit( x=x_train, y=y_train, epochs = paramsModel['epochs'],batch_size=int(paramsModel['batchSize']),callbacks=callback(x_test, y_test,paramsModel['_id']),validation_data=(x_val, y_val)) hist=history.history + y_pred=classifier.predict(x_test) y_pred=(y_pred>=0.5).astype('int') @@ -452,7 +453,7 @@ def train(dataset, paramsModel,paramsExperiment,paramsDataset,callback): # ann_viz(classifier, title="My neural network") classifier.save(filepath, save_format='h5') - + """ accuracy = float(sm.accuracy_score(y_test,y_pred)) precision = float(sm.precision_score(y_test,y_pred)) recall = float(sm.recall_score(y_test,y_pred)) @@ -461,22 +462,9 @@ def train(dataset, paramsModel,paramsExperiment,paramsDataset,callback): f1 = float(sm.f1_score(y_test,y_pred)) fpr, tpr, _ = sm.roc_curve(y_test,y_pred) logloss = float(sm.log_loss(y_test, y_pred)) - metrics= [ - {"Name":"accuracy" ,"JsonValue": str(accuracy)}, - {"Name":"precision","JsonValue": str(precision)}, - {"Name":"recall" , "JsonValue":str(recall)}, - {"Name":"specificity" ,"JsonValue":str(specificity)}, - {"Name":"f1" ,"JsonValue": str(f1)}, - {"Name":"tn" , "JsonValue":str(tn)}, - {"Name":"fp" , "JsonValue":str(fp)}, - {"Name":"fn" , "JsonValue":str(fn)}, - {"Name":"tp" , "JsonValue":str(tp)}, - {"Name":"fpr" ,"JsonValue": str(fpr.tolist())}, - {"Name":"tpr" , "JsonValue":str(tpr.tolist())}, - {"Name":"logloss" , "JsonValue":str(logloss)} - ] + """ - return filepath,hist,metrics + return filepath,[hist['loss'],hist['val_loss'],hist['accuracy'],hist['val_accuracy'],hist['mae'],hist['val_mae'],hist['mse'],hist['val_mse']] elif(problem_type=='regresioni'): reg=paramsModel['layers'][0]['regularisation'] @@ -519,8 +507,10 @@ def train(dataset, paramsModel,paramsExperiment,paramsDataset,callback): #print(classifier.evaluate(x_test, y_test)) classifier.save(filepath, save_format='h5') - + ''' + mse = float(sm.mean_squared_error(y_test,y_pred)) + mae = float(sm.mean_absolute_error(y_test,y_pred)) mape = float(sm.mean_absolute_percentage_error(y_test,y_pred)) rmse = float(np.sqrt(sm.mean_squared_error(y_test,y_pred))) @@ -531,6 +521,7 @@ def train(dataset, paramsModel,paramsExperiment,paramsDataset,callback): n = 40 k = 2 adj_r2 = float(1 - ((1-r2)*(n-1)/(n-k-1))) + metrics= [ {"Name":"mse","JsonValue":str(mse)}, @@ -541,8 +532,8 @@ def train(dataset, paramsModel,paramsExperiment,paramsDataset,callback): {"Name":"r2","JsonValue":str( r2)}, {"Name":"adj_r2","JsonValue":str(adj_r2)} ] - - return filepath,hist,metrics + ''' + return filepath,[hist['loss'],hist['val_loss'],[],[],hist['mae'],hist['val_mae'],hist['mse'],hist['val_mse']] def roc_auc_score_multiclass(actual_class, pred_class, average = "macro"): diff --git a/frontend/src/app/_data/Model.ts b/frontend/src/app/_data/Model.ts index 8fc36a31..f527dc7f 100644 --- a/frontend/src/app/_data/Model.ts +++ b/frontend/src/app/_data/Model.ts @@ -117,8 +117,8 @@ export enum ActivationFunctionOutputLayer export enum LossFunction { // binary classification loss functions BinaryCrossEntropy = 'binary_crossentropy', - SquaredHingeLoss = 'squared_hinge_loss', - HingeLoss = 'hinge_loss', + SquaredHingeLoss = 'squared_hinge', + HingeLoss = 'hinge', // multi-class classification loss functions CategoricalCrossEntropy = 'categorical_crossentropy', SparseCategoricalCrossEntropy = 'sparse_categorical_crossentropy', -- cgit v1.2.3 From 6468d5d3c24029c94a749634e0241ad94b5576ad Mon Sep 17 00:00:00 2001 From: TAMARA JERINIC Date: Thu, 19 May 2022 17:36:08 +0200 Subject: Dodate metrike na front. --- backend/api/api/Models/Predictor.cs | 2 -- backend/microservice/api/controller.py | 2 -- frontend/src/app/_data/Predictor.ts | 12 ++++++++++-- 3 files changed, 10 insertions(+), 6 deletions(-) (limited to 'frontend/src/app/_data') diff --git a/backend/api/api/Models/Predictor.cs b/backend/api/api/Models/Predictor.cs index 95dd3a23..c1afd5e8 100644 --- a/backend/api/api/Models/Predictor.cs +++ b/backend/api/api/Models/Predictor.cs @@ -26,9 +26,7 @@ namespace api.Models public float[] metricsAcc { get; set; } public float[] metricsValAcc { get; set; } public float[] metricsMae { get; set; } - public float[] metricsValMae { get; set; } - public float[] metricsMse { get; set; } public float[] metricsValMse { get; set; } //public Metric[] finalMetrics { get; set; } diff --git a/backend/microservice/api/controller.py b/backend/microservice/api/controller.py index 0eee571c..c82634a2 100644 --- a/backend/microservice/api/controller.py +++ b/backend/microservice/api/controller.py @@ -111,8 +111,6 @@ def train(): "metricsValMae":histMetrics[5], "metricsMse":histMetrics[6], "metricsValMse":histMetrics[7] - - } #print(predictor) diff --git a/frontend/src/app/_data/Predictor.ts b/frontend/src/app/_data/Predictor.ts index c839a635..8de4cd17 100644 --- a/frontend/src/app/_data/Predictor.ts +++ b/frontend/src/app/_data/Predictor.ts @@ -13,8 +13,16 @@ export default class Predictor extends FolderFile { public experimentId: string = "", public modelId: string = "", public h5FileId: string = "", - public metrics: Metric[] = [], - public finalMetrics: Metric[] = [] + public metricsLoss:number[]=[], + public metricsValLoss:number []=[], + public metricsAcc:number[]=[], + public metricsValAcc: number[]=[], + public metricsMae :number []=[], + public metricsValMae :number []=[], + public metricsMse : number[]=[], + public metricsValMse : number[]=[], + //public metrics: Metric[] = [], + //public finalMetrics: Metric[] = [] ) { super(name, dateCreated, dateCreated); } -- cgit v1.2.3 From 447dbf0fe8cdb02bf5e8fb41540eac79329b3013 Mon Sep 17 00:00:00 2001 From: Danijel Anđelković Date: Fri, 20 May 2022 04:01:11 +0200 Subject: lossFunction prikaz --- backend/api/api/Program.cs | 2 +- frontend/src/app/_data/Model.ts | 13 ++++++------ .../src/app/_elements/folder/folder.component.html | 2 +- .../_elements/form-model/form-model.component.html | 8 ++++---- .../_elements/form-model/form-model.component.ts | 23 +++++++++++++++++----- frontend/src/styles/helper.css | 3 +-- 6 files changed, 32 insertions(+), 19 deletions(-) (limited to 'frontend/src/app/_data') diff --git a/backend/api/api/Program.cs b/backend/api/api/Program.cs index 5977e843..cf64d58d 100644 --- a/backend/api/api/Program.cs +++ b/backend/api/api/Program.cs @@ -37,7 +37,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddHostedService(); -//builder.Services.AddHostedService(); +builder.Services.AddHostedService(); //Ml Api Ip Filter builder.Services.AddScoped(container => diff --git a/frontend/src/app/_data/Model.ts b/frontend/src/app/_data/Model.ts index f527dc7f..898805d3 100644 --- a/frontend/src/app/_data/Model.ts +++ b/frontend/src/app/_data/Model.ts @@ -2,6 +2,7 @@ import { NgIf } from "@angular/common"; import { FolderFile } from "./FolderFile"; export default class Model extends FolderFile { + public lossFunction: LossFunction; constructor( name: string = 'Novi model', public description: string = '', @@ -12,7 +13,6 @@ export default class Model extends FolderFile { // Neural net training settings public type: ProblemType = ProblemType.Regression, public optimizer: Optimizer = Optimizer.Adam, - public lossFunction: LossFunction = LossFunctionRegression[0], public inputNeurons: number = 1, public hiddenLayers: number = 1, public batchSize: BatchSize = BatchSize.O3, @@ -28,11 +28,12 @@ export default class Model extends FolderFile { public randomOrder: boolean = true, public randomTestSet: boolean = true, public randomTestSetDistribution: number = 0.1, //0.1-0.9 (10% - 90%) JESTE OVDE ZAKUCANO 10, AL POSLATO JE KAO 0.1 BACK-U - public validationSize:number=0.1, + public validationSize: number = 0.1, public isPublic: boolean = false, public accessibleByLink: boolean = false ) { super(name, dateCreated, lastUpdated); + this.lossFunction = (this.type == ProblemType.Regression ? LossFunctionRegression[0] : (this.type == ProblemType.BinaryClassification ? LossFunctionBinaryClassification[0] : LossFunctionMultiClassification[0])); } } export class Layer { @@ -45,8 +46,8 @@ export class Layer { ) { } } export enum LearningRate { - LR1 = '0.00001', - LR2 = '0.0001', + // LR1 = '0.00001', + // LR2 = '0.0001', LR3 = '0.001', LR4 = '0.003', LR5 = '0.01', @@ -120,7 +121,7 @@ export enum LossFunction { SquaredHingeLoss = 'squared_hinge', HingeLoss = 'hinge', // multi-class classification loss functions - CategoricalCrossEntropy = 'categorical_crossentropy', + // CategoricalCrossEntropy = 'categorical_crossentropy', SparseCategoricalCrossEntropy = 'sparse_categorical_crossentropy', KLDivergence = 'kullback_leibler_divergence', @@ -134,7 +135,7 @@ export enum LossFunction { export const LossFunctionRegression = [LossFunction.MeanAbsoluteError, LossFunction.MeanSquaredError, LossFunction.MeanSquaredLogarithmicError] export const LossFunctionBinaryClassification = [LossFunction.BinaryCrossEntropy, LossFunction.SquaredHingeLoss, LossFunction.HingeLoss] -export const LossFunctionMultiClassification = [LossFunction.CategoricalCrossEntropy, LossFunction.SparseCategoricalCrossEntropy, LossFunction.KLDivergence] +export const LossFunctionMultiClassification = [/*LossFunction.CategoricalCrossEntropy,*/ LossFunction.SparseCategoricalCrossEntropy, LossFunction.KLDivergence] export enum Optimizer { Adam = 'Adam', diff --git a/frontend/src/app/_elements/folder/folder.component.html b/frontend/src/app/_elements/folder/folder.component.html index da182945..7c42b1db 100644 --- a/frontend/src/app/_elements/folder/folder.component.html +++ b/frontend/src/app/_elements/folder/folder.component.html @@ -134,7 +134,7 @@ -