From 1509314a97c1a122a50173382e976307f5ec9d40 Mon Sep 17 00:00:00 2001 From: TAMARA JERINIC Date: Mon, 18 Apr 2022 00:21:57 +0200 Subject: Dodat tip problema u eksperiment --- frontend/src/app/training/training.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'frontend/src/app/training') diff --git a/frontend/src/app/training/training.component.html b/frontend/src/app/training/training.component.html index 0ce4cc89..672e75fb 100644 --- a/frontend/src/app/training/training.component.html +++ b/frontend/src/app/training/training.component.html @@ -23,7 +23,7 @@

2. Izaberite model

- +

3. Treniranje modela

-- cgit v1.2.3 From 6c0ba41002e53bd6b314d0cc961866acbbb07c9a Mon Sep 17 00:00:00 2001 From: Sonja Galovic Date: Mon, 18 Apr 2022 22:06:53 +0200 Subject: Uradjeno da kad se klikne na ,,sacuvaj eksperiment,, redirektuje ga na stranicu za treniranje modela gde ce biti izabran taj eskperiment za dalji rad; Izmenjen ispis kod opcije za brisanje svih redova. --- frontend/src/app/app-routing.module.ts | 2 +- frontend/src/app/experiment/experiment.component.html | 6 ++++-- frontend/src/app/experiment/experiment.component.ts | 12 ++++++++---- frontend/src/app/training/training.component.ts | 18 +++++++++++++----- 4 files changed, 26 insertions(+), 12 deletions(-) (limited to 'frontend/src/app/training') diff --git a/frontend/src/app/app-routing.module.ts b/frontend/src/app/app-routing.module.ts index 238668d9..a0952d21 100644 --- a/frontend/src/app/app-routing.module.ts +++ b/frontend/src/app/app-routing.module.ts @@ -19,8 +19,8 @@ const routes: Routes = [ { path: '', component: HomeComponent, data: { title: 'Početna strana' } }, /*{ path: 'add-model', component: AddModelComponent, data: { title: 'Dodaj model' } },*/ { path: 'experiment', component: ExperimentComponent, data: { title: 'Dodaj eksperiment' } }, - { path: 'training', component: TrainingComponent, data: { title: 'Treniraj model' } }, { path: 'training/:id', component: TrainingComponent, data: { title: 'Treniraj model' } }, + { path: 'training', component: TrainingComponent, data: { title: 'Treniraj model' } }, { path: 'my-datasets', component: MyDatasetsComponent, canActivate: [AuthGuardService], data: { title: 'Moji izvori podataka' } }, { path: 'my-models', component: MyModelsComponent, canActivate: [AuthGuardService], data: { title: 'Moji modeli' } }, { path: 'my-predictors', component: MyPredictorsComponent, canActivate: [AuthGuardService], data: { title: 'Moji trenirani modeli' } }, diff --git a/frontend/src/app/experiment/experiment.component.html b/frontend/src/app/experiment/experiment.component.html index 62236cce..ffc1db9d 100644 --- a/frontend/src/app/experiment/experiment.component.html +++ b/frontend/src/app/experiment/experiment.component.html @@ -63,8 +63,10 @@

Popunjavanje nedostajućih vrednosti:

-
+ +

diff --git a/frontend/src/app/experiment/experiment.component.ts b/frontend/src/app/experiment/experiment.component.ts index 2d0f6ec5..7e2f0b29 100644 --- a/frontend/src/app/experiment/experiment.component.ts +++ b/frontend/src/app/experiment/experiment.component.ts @@ -6,6 +6,9 @@ import { ModelsService } from '../_services/models.service'; import Shared from '../Shared'; import { ExperimentsService } from '../_services/experiments.service'; import { ColumnEncoding } from '../_data/Experiment'; +import { Router } from '@angular/router'; +import { TrainingComponent } from '../training/training.component'; +import { retryWhen } from 'rxjs'; @Component({ selector: 'app-experiment', @@ -30,7 +33,7 @@ export class ExperimentComponent implements OnInit { tempTestSetDistribution = 90; - constructor(private modelsService: ModelsService, private experimentsService: ExperimentsService) { + constructor(private experimentsService: ExperimentsService, private router: Router) { } ngOnInit(): void { @@ -43,7 +46,6 @@ export class ExperimentComponent implements OnInit { this.experiment.outputColumn = this.selectedDataset.columnInfo[this.selectedDataset.columnInfo.length - 1].columnName; this.resetColumnEncodings(); - console.log(this.experiment.encodings); } resetColumnEncodings() { @@ -166,7 +168,7 @@ export class ExperimentComponent implements OnInit { } saveExperiment() { - if (this.selectedDataset == undefined) { + if (this.selectedDataset == undefined) { Shared.openDialog("Greška", "Izvor podataka nije izabran!"); return; } @@ -192,7 +194,7 @@ export class ExperimentComponent implements OnInit { this.experiment.randomTestSetDistribution = 1 - Math.round(this.tempTestSetDistribution / 100 * 10) / 10; - console.log("Eksperiment:", this.experiment); + //console.log("Eksperiment:", this.experiment); this.experimentsService.addExperiment(this.experiment).subscribe((response) => { this.experiment = response; @@ -202,6 +204,8 @@ export class ExperimentComponent implements OnInit { this.experiment.encodings = []; Shared.openDialog("Obaveštenje", "Eksperiment je uspešno kreiran."); + + this.router.navigate(['/training', this.experiment._id]); }, (error) => { if (error.error == "Experiment with this name exists") { Shared.openDialog("Greška", "Eksperiment sa unetim nazivom već postoji u Vašoj kolekciji. Unesite neki drugi naziv."); diff --git a/frontend/src/app/training/training.component.ts b/frontend/src/app/training/training.component.ts index 027d2c22..f60734cc 100644 --- a/frontend/src/app/training/training.component.ts +++ b/frontend/src/app/training/training.component.ts @@ -1,8 +1,8 @@ import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; import Shared from '../Shared'; import Experiment from '../_data/Experiment'; import Model from '../_data/Model'; -import { DatasetsService } from '../_services/datasets.service'; import { ExperimentsService } from '../_services/experiments.service'; import { ModelsService } from '../_services/models.service'; @@ -11,7 +11,7 @@ import { ModelsService } from '../_services/models.service'; templateUrl: './training.component.html', styleUrls: ['./training.component.css'] }) -export class TrainingComponent{ +export class TrainingComponent implements OnInit{ myExperiments?: Experiment[]; selectedExperiment?: Experiment; @@ -21,9 +21,17 @@ export class TrainingComponent{ term: string = ""; - constructor(private modelsService: ModelsService, private datasetsService: DatasetsService, private experimentsService: ExperimentsService) { - this.experimentsService.getMyExperiments().subscribe((experiments) => { - this.myExperiments = experiments; + constructor(private modelsService: ModelsService, private route: ActivatedRoute, private experimentsService: ExperimentsService) { + } + + ngOnInit(): void { + this.route.queryParams.subscribe(params => { + let expId =this.route.snapshot.paramMap.get("id"); + + this.experimentsService.getMyExperiments().subscribe((experiments) => { + this.myExperiments = experiments; + this.selectedExperiment = this.myExperiments.filter(x => x._id == expId)[0]; + }); }); } -- cgit v1.2.3 From ccdec90928311c7986f9c57d3e32d126773d9c3a Mon Sep 17 00:00:00 2001 From: Sonja Galovic Date: Tue, 19 Apr 2022 15:59:56 +0200 Subject: Model.service: napravljena fja za dobijanje korisnikovih modela odredjenog tipa problema. Kad izabere eksperiment, izlistace mu se modeli istog tipa problema kao sto je i eksperiment. --- .../src/app/_elements/model-load/model-load.component.ts | 13 ++++++++++--- frontend/src/app/_services/models.service.ts | 13 +++++-------- frontend/src/app/training/training.component.ts | 5 +++-- 3 files changed, 18 insertions(+), 13 deletions(-) (limited to 'frontend/src/app/training') diff --git a/frontend/src/app/_elements/model-load/model-load.component.ts b/frontend/src/app/_elements/model-load/model-load.component.ts index dbca3d17..4541c114 100644 --- a/frontend/src/app/_elements/model-load/model-load.component.ts +++ b/frontend/src/app/_elements/model-load/model-load.component.ts @@ -38,9 +38,16 @@ export class ModelLoadComponent implements OnInit { showMyModels: boolean = true; constructor(private modelsService: ModelsService) { - this.modelsService.getMyModels().subscribe((models) => { - this.myModels = models; - }); + if (this.forExperiment == undefined) { + this.modelsService.getMyModels().subscribe((models) => { + this.myModels = models; + }); + } + else { + this.modelsService.getMyModelsByType(this.forExperiment.type).subscribe((models) => { + this.myModels = models; + }); + } } ngOnInit(): void { diff --git a/frontend/src/app/_services/models.service.ts b/frontend/src/app/_services/models.service.ts index 44383828..1130b12c 100644 --- a/frontend/src/app/_services/models.service.ts +++ b/frontend/src/app/_services/models.service.ts @@ -1,6 +1,6 @@ import { HttpClient, HttpParams } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import Model from '../_data/Model'; +import Model, { ProblemType } from '../_data/Model'; import { AuthService } from './auth.service'; import { Observable } from 'rxjs'; import Dataset from '../_data/Dataset'; @@ -31,20 +31,16 @@ export class ModelsService { addModel(model: Model): Observable { return this.http.post(`${Configuration.settings.apiURL}/model/add`, model, { headers: this.authService.authHeader() }); } - addDataset(dataset: Dataset): Observable { - return this.http.post(`${Configuration.settings.apiURL}/dataset/add`, dataset, { headers: this.authService.authHeader() }); - } trainModel(modelId: string, experimentId: string): Observable { return this.http.post(`${Configuration.settings.apiURL}/model/trainmodel`, { ModelId: modelId, ExperimentId: experimentId }, { headers: this.authService.authHeader(), responseType: 'text' }); } - getMyDatasets(): Observable { - return this.http.get(`${Configuration.settings.apiURL}/dataset/mydatasets`, { headers: this.authService.authHeader() }); - } - getMyModels(): Observable { return this.http.get(`${Configuration.settings.apiURL}/model/mymodels`, { headers: this.authService.authHeader() }); } + getMyModelsByType(problemType: ProblemType): Observable { + return this.http.get(`${Configuration.settings.apiURL}/model/mymodelsbytype/` + problemType, { headers: this.authService.authHeader() }); + } editModel(model: Model): Observable { return this.http.put(`${Configuration.settings.apiURL}/model/`, model, { headers: this.authService.authHeader() }); @@ -53,4 +49,5 @@ export class ModelsService { deleteModel(model: Model) { return this.http.delete(`${Configuration.settings.apiURL}/model/` + model.name, { headers: this.authService.authHeader(), responseType: "text" }); } + } diff --git a/frontend/src/app/training/training.component.ts b/frontend/src/app/training/training.component.ts index f60734cc..2640b513 100644 --- a/frontend/src/app/training/training.component.ts +++ b/frontend/src/app/training/training.component.ts @@ -26,11 +26,12 @@ export class TrainingComponent implements OnInit{ ngOnInit(): void { this.route.queryParams.subscribe(params => { - let expId =this.route.snapshot.paramMap.get("id"); + let experimentId =this.route.snapshot.paramMap.get("id"); this.experimentsService.getMyExperiments().subscribe((experiments) => { this.myExperiments = experiments; - this.selectedExperiment = this.myExperiments.filter(x => x._id == expId)[0]; + if (experimentId != undefined) + this.selectedExperiment = this.myExperiments.filter(x => x._id == experimentId)[0]; }); }); } -- cgit v1.2.3 From f21885e7cbb68ef444ff9efc27483e2036e26bb0 Mon Sep 17 00:00:00 2001 From: Sonja Galovic Date: Tue, 19 Apr 2022 19:51:54 +0200 Subject: Pravljenje modela: automatski selektovan tip problema kog je i taj eskperiment, zmenjen batch size. Izbaceni neki resetovi u experiment.comp. Backend: u klasu Experiment dodat properti type. --- backend/api/api/Models/Experiment.cs | 1 + frontend/src/app/_data/Model.ts | 4 +- .../_elements/model-load/model-load.component.html | 62 ++++++++-------------- .../_elements/model-load/model-load.component.ts | 18 ++++--- .../src/app/experiment/experiment.component.ts | 4 -- frontend/src/app/training/training.component.html | 18 +++---- frontend/src/app/training/training.component.ts | 13 +++-- 7 files changed, 52 insertions(+), 68 deletions(-) (limited to 'frontend/src/app/training') diff --git a/backend/api/api/Models/Experiment.cs b/backend/api/api/Models/Experiment.cs index 6f665c52..f7bec083 100644 --- a/backend/api/api/Models/Experiment.cs +++ b/backend/api/api/Models/Experiment.cs @@ -10,6 +10,7 @@ namespace api.Models public string _id { get; set; } public string name { get; set; } public string description { get; set; } + public string type { get; set; } public List ModelIds { get; set; } public string datasetId { get; set; } public string uploaderId { get; set; } diff --git a/frontend/src/app/_data/Model.ts b/frontend/src/app/_data/Model.ts index b273f56a..7d383584 100644 --- a/frontend/src/app/_data/Model.ts +++ b/frontend/src/app/_data/Model.ts @@ -16,7 +16,7 @@ export default class Model { public inputNeurons: number = 1, public hiddenLayerNeurons: number = 1, public hiddenLayers: number = 1, - public batchSize: number = 5, + public batchSize: number = 4, public hiddenLayerActivationFunctions: string[] = ['sigmoid'], public outputLayerActivationFunction: ActivationFunction = ActivationFunction.Sigmoid, public uploaderId: string = '', @@ -94,7 +94,7 @@ export enum LossFunctionBinaryClassification { HingeLoss = 'hinge_loss', } export enum LossFunctionMultiClassification { - CategoricalCrossEntropy = 'categorical_crossentropy', + //CategoricalCrossEntropy = 'categorical_crossentropy', SparseCategoricalCrossEntropy = 'sparse_categorical_crossentropy', KLDivergence = 'kullback_leibler_divergence', } diff --git a/frontend/src/app/_elements/model-load/model-load.component.html b/frontend/src/app/_elements/model-load/model-load.component.html index dcb35c21..a1e6abd6 100644 --- a/frontend/src/app/_elements/model-load/model-load.component.html +++ b/frontend/src/app/_elements/model-load/model-load.component.html @@ -1,12 +1,10 @@
-

ili

-
@@ -17,8 +15,7 @@
    -
  • +
  • @@ -43,7 +40,7 @@
- +

Parametri treniranja modela:

@@ -54,8 +51,7 @@
-
- +
@@ -96,8 +89,7 @@
- +
@@ -107,8 +99,7 @@
-
- +
- - - {{newModel.batchSize}} - + + +
- +
- +
@@ -148,8 +137,7 @@
- +
@@ -157,8 +145,7 @@
#{{i+1}}
-
- +
-
-
-
-
-
\ No newline at end of file diff --git a/frontend/src/app/_elements/metric-view/metric-view.component.ts b/frontend/src/app/_elements/metric-view/metric-view.component.ts index 76dd7d20..9193a0e5 100644 --- a/frontend/src/app/_elements/metric-view/metric-view.component.ts +++ b/frontend/src/app/_elements/metric-view/metric-view.component.ts @@ -1,32 +1,49 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, Input, OnInit, ViewChild } from '@angular/core'; import { SignalRService } from 'src/app/_services/signal-r.service'; +import { LineChartComponent } from '../line-chart/line-chart.component'; @Component({ selector: 'app-metric-view', templateUrl: './metric-view.component.html', styleUrls: ['./metric-view.component.css'] }) export class MetricViewComponent implements OnInit { - myAcc:[]=[]; - myMae:[]=[]; - myMse:[]=[]; - myEpochs:[]=[]; + @ViewChild(LineChartComponent) linechartComponent!: LineChartComponent; + + @Input() history!: any[]; + constructor(private signalRService: SignalRService) { } ngOnInit(): void { - if(this.signalRService.hubConnection) - { - this.signalRService.hubConnection.on("NotifyEpoch", (mName: string, mId: string, stat: string, totalEpochs: number, currentEpoch: number) => { - console.log(stat) - console.log(totalEpochs) - const data=JSON.parse(stat) - for (let key in data) - { - let value = data[key]; - console.log(value) + } + + update(history: any[]) { + const myAcc: number[] = []; + const myMae: number[] = []; + const myMse: number[] = []; + const myLoss: number[] = []; + + const myEpochs: number[] = []; + this.history = history; + this.history.forEach((metrics, epoch) => { + myEpochs.push(epoch + 1); + for (let key in metrics) { + let value = metrics[key]; + console.log(key, ':::', value, epoch); + if (key === 'accuracy') { + myAcc.push(parseFloat(value)); + } + else if (key === 'loss') { + myLoss.push(parseFloat(value)); + } + else if (key === 'mae') { + myMae.push(parseFloat(value)); + } + else if (key === 'mse') { + myMse.push(parseFloat(value)); } - }); - - } + } + }); + this.linechartComponent.update(myEpochs, myAcc, myLoss, myMae, myMse); } -} +} \ No newline at end of file diff --git a/frontend/src/app/_elements/model-load/model-load.component.html b/frontend/src/app/_elements/model-load/model-load.component.html index 1afb1ecb..1f9852d1 100644 --- a/frontend/src/app/_elements/model-load/model-load.component.html +++ b/frontend/src/app/_elements/model-load/model-load.component.html @@ -173,7 +173,7 @@
-
+
diff --git a/frontend/src/app/_elements/model-load/model-load.component.ts b/frontend/src/app/_elements/model-load/model-load.component.ts index 8bf8fd93..0799b4d4 100644 --- a/frontend/src/app/_elements/model-load/model-load.component.ts +++ b/frontend/src/app/_elements/model-load/model-load.component.ts @@ -4,6 +4,7 @@ import Experiment from 'src/app/_data/Experiment'; import Model, { ActivationFunction, LossFunction, LossFunctionBinaryClassification, LossFunctionMultiClassification, LossFunctionRegression, Metrics, MetricsBinaryClassification, MetricsMultiClassification, MetricsRegression, NullValueOptions, Optimizer, ProblemType } from 'src/app/_data/Model'; import { AuthService } from 'src/app/_services/auth.service'; import { ModelsService } from 'src/app/_services/models.service'; +import { SignalRService } from 'src/app/_services/signal-r.service'; import { GraphComponent } from '../graph/graph.component'; @@ -48,10 +49,11 @@ export class ModelLoadComponent implements OnInit { }) } - fetchModels() { + fetchModels(andSelectWithId: string | null = '') { //if (this.forExperiment == undefined) { this.modelsService.getMyModels().subscribe((models) => { - this.myModels = models; + this.myModels = models.reverse(); + this.selectThisModel(this.myModels.filter(x => x._id == andSelectWithId)[0]); }); /*} else { @@ -90,7 +92,14 @@ export class ModelLoadComponent implements OnInit { this.newModel.uploaderId = Shared.userId; this.modelsService.addModel(this.newModel).subscribe((response) => { - Shared.openDialog('Model dodat', 'Model je uspešno dodat u bazu.'); + console.log(this.newModel); + //Shared.openDialog('Model dodat', 'Model je uspešno dodat u bazu.'); + + Shared.openYesNoDialog("Model dodat", "Model je uspešno dodat u bazu. Da li želite da nastavite treniranje sa dodatim modelom?", () => { + this.fetchModels(response._id); + this.showMyModels = true; + }); + this.fetchModels(); }, (error) => { Shared.openDialog('Greška', 'Model sa unetim nazivom već postoji u Vašoj kolekciji. Promenite naziv modela i nastavite sa kreiranim datasetom.'); }); diff --git a/frontend/src/app/app.module.ts b/frontend/src/app/app.module.ts index 41aec3b5..51374bd4 100644 --- a/frontend/src/app/app.module.ts +++ b/frontend/src/app/app.module.ts @@ -49,7 +49,6 @@ import { ItemExperimentComponent } from './_elements/item-experiment/item-experi import { YesNoDialogComponent } from './_modals/yes-no-dialog/yes-no-dialog.component'; import { Configuration } from './configuration.service'; import { PointLinechartComponent } from './point-linechart/point-linechart.component'; -import { GraficiComponent } from './grafici/grafici.component'; import { MixedChartComponent } from './mixed-chart/mixed-chart.component'; import { LineChartComponent } from './_elements/line-chart/line-chart.component'; @@ -92,15 +91,14 @@ export function initializeApp(appConfig: Configuration) { GraphComponent, TrainingComponent, ItemExperimentComponent, - YesNoDialogComponent, + YesNoDialogComponent, LineChartComponent, PointLinechartComponent, - GraficiComponent, MixedChartComponent, LineChartComponent, MetricViewComponent, - - + + ], imports: [ BrowserModule, diff --git a/frontend/src/app/grafici/grafici.component.css b/frontend/src/app/grafici/grafici.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/frontend/src/app/grafici/grafici.component.html b/frontend/src/app/grafici/grafici.component.html deleted file mode 100644 index 5f987238..00000000 --- a/frontend/src/app/grafici/grafici.component.html +++ /dev/null @@ -1 +0,0 @@ -

grafici works!

diff --git a/frontend/src/app/grafici/grafici.component.spec.ts b/frontend/src/app/grafici/grafici.component.spec.ts deleted file mode 100644 index 9b5ba94d..00000000 --- a/frontend/src/app/grafici/grafici.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { GraficiComponent } from './grafici.component'; - -describe('GraficiComponent', () => { - let component: GraficiComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ GraficiComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(GraficiComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/frontend/src/app/grafici/grafici.component.ts b/frontend/src/app/grafici/grafici.component.ts deleted file mode 100644 index 749b35e2..00000000 --- a/frontend/src/app/grafici/grafici.component.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Component, OnInit } from '@angular/core'; - -@Component({ - selector: 'app-grafici', - templateUrl: './grafici.component.html', - styleUrls: ['./grafici.component.css'] -}) -export class GraficiComponent implements OnInit { - - constructor() { } - - ngOnInit(): void { - } - -} diff --git a/frontend/src/app/training/training.component.html b/frontend/src/app/training/training.component.html index 2bee3b12..fa80089e 100644 --- a/frontend/src/app/training/training.component.html +++ b/frontend/src/app/training/training.component.html @@ -33,9 +33,8 @@

Rezultati treniranja

Rezultati treniranja:

-

- {{trainingResult}} -

+ {{trainingResult}} +
diff --git a/frontend/src/app/training/training.component.ts b/frontend/src/app/training/training.component.ts index 4c38f166..6b5405cb 100644 --- a/frontend/src/app/training/training.component.ts +++ b/frontend/src/app/training/training.component.ts @@ -3,6 +3,7 @@ import { ActivatedRoute } from '@angular/router'; import Shared from '../Shared'; import Experiment from '../_data/Experiment'; import Model, { ProblemType } from '../_data/Model'; +import { MetricViewComponent } from '../_elements/metric-view/metric-view.component'; import { ModelLoadComponent } from '../_elements/model-load/model-load.component'; import { AuthService } from '../_services/auth.service'; import { ExperimentsService } from '../_services/experiments.service'; @@ -17,6 +18,7 @@ import { SignalRService } from '../_services/signal-r.service'; export class TrainingComponent implements OnInit { @ViewChild(ModelLoadComponent) modelLoadComponent?: ModelLoadComponent; + @ViewChild(MetricViewComponent) metricViewComponent!: MetricViewComponent; myExperiments?: Experiment[]; selectedExperiment?: Experiment; @@ -24,16 +26,11 @@ export class TrainingComponent implements OnInit { trainingResult: any; + history: any[] = []; + term: string = ""; constructor(private modelsService: ModelsService, private route: ActivatedRoute, private experimentsService: ExperimentsService, private authService: AuthService, private signalRService: SignalRService) { - if (this.signalRService.hubConnection) { - this.signalRService.hubConnection.on("NotifyEpoch", (mName: string, mId: string, stat: string, totalEpochs: number, currentEpoch: number) => { - if (this.selectedModel?._id == mId) { - this.trainingResult = stat; - } - }); - } } ngOnInit(): void { @@ -45,17 +42,32 @@ export class TrainingComponent implements OnInit { this.authService.loggedInEvent.subscribe(_ => { this.fetchExperiments(experimentId); - this.signalRService.startConnection() + this.signalRService.startConnection(); }); + + console.log(this.signalRService.hubConnection); + if (this.signalRService.hubConnection) { + this.signalRService.hubConnection.on("NotifyEpoch", (mName: string, mId: string, stat: string, totalEpochs: number, currentEpoch: number) => { + console.log(this.selectedModel?._id, mId); + if (this.selectedModel?._id == mId) { + stat = stat.replace(/'/g, '"'); + this.trainingResult = JSON.parse(stat); + //console.log('JSON', this.trainingResult); + this.history.push(this.trainingResult); + this.metricViewComponent.update(this.history); + } + }); + } }); } fetchExperiments(andSelectWithId: string | null = '') { this.experimentsService.getMyExperiments().subscribe((experiments) => { - this.myExperiments = experiments; + this.myExperiments = experiments.reverse(); this.selectedExperiment = this.myExperiments.filter(x => x._id == andSelectWithId)[0]; - console.log("selektovan exp u training comp: ", this.selectedExperiment); + if (this.modelLoadComponent) + this.modelLoadComponent.newModel.type = this.selectedExperiment.type; }); } @@ -82,8 +94,7 @@ export class TrainingComponent implements OnInit { } this.modelsService.trainModel(this.selectedModel._id, this.selectedExperiment._id).subscribe((response: any) => { //console.log('Train model complete!', response); - Shared.openDialog("Obaveštenje", "Treniranje modela je uspešno završeno!"); - this.trainingResult = response; + Shared.openDialog("Obaveštenje", "Treniranje modela je počelo!"); }); } } -- cgit v1.2.3 From 61682b01751369307d7777f55be98d25d7fc10a9 Mon Sep 17 00:00:00 2001 From: TAMARA JERINIC Date: Wed, 20 Apr 2022 01:04:11 +0200 Subject: Onemogućeno brisanje izlazne kolone koja ima null vrednosti ukoliko korisnik zatraži brisanje svih kolona sa null vrednostima. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/microservice/api/controller.py | 15 +++++++------- backend/microservice/api/newmlservice.py | 24 ++++++++++++----------- frontend/src/app/training/training.component.html | 1 - 3 files changed, 21 insertions(+), 19 deletions(-) (limited to 'frontend/src/app/training') diff --git a/backend/microservice/api/controller.py b/backend/microservice/api/controller.py index 9b83b8e7..f870b2b1 100644 --- a/backend/microservice/api/controller.py +++ b/backend/microservice/api/controller.py @@ -53,7 +53,7 @@ class train_callback(tf.keras.callbacks.Callback): @app.route('/train', methods = ['POST']) def train(): - print("******************************TRAIN*************************************************") + #print("******************************TRAIN*************************************************") f = request.files.get("file") data = pd.read_csv(f) @@ -88,10 +88,11 @@ def train(): "h5FileId" : fileId, "metrics" : m } - print(predictor) + #print(predictor) + #print('\n') url = config.api_url + "/Predictor/add" r = requests.post(url, json=predictor).text - print(r) + #print(r) return r @app.route('/predict', methods = ['POST']) @@ -100,13 +101,13 @@ def predict(): model = tf.keras.models.load_model(h5) paramsExperiment = json.loads(request.form["experiment"]) paramsPredictor = json.loads(request.form["predictor"]) - print("********************************model loaded*******************************") + #print("********************************model loaded*******************************") result = newmlservice.predict(paramsExperiment, paramsPredictor, model) return result @app.route('/preprocess',methods=['POST']) def returnColumnsInfo(): - print("********************************PREPROCESS*******************************") + #print("********************************PREPROCESS*******************************") dataset = json.loads(request.form["dataset"]) file = request.files.get("file") data=pd.read_csv(file) @@ -126,8 +127,8 @@ def returnColumnsInfo(): dataset["colCount"] = preprocess["colCount"] dataset["rowCount"] = preprocess["rowCount"] dataset["isPreProcess"] = True - print(dataset) + #print(dataset) return jsonify(dataset) -print("App loaded.") +#print("App loaded.") app.run() \ No newline at end of file diff --git a/backend/microservice/api/newmlservice.py b/backend/microservice/api/newmlservice.py index 6cbda69c..6e65c876 100644 --- a/backend/microservice/api/newmlservice.py +++ b/backend/microservice/api/newmlservice.py @@ -129,7 +129,8 @@ def train(dataset, paramsModel,paramsExperiment,paramsDataset,callback): ###NULL null_value_options = paramsExperiment["nullValues"] null_values_replacers = paramsExperiment["nullValuesReplacers"] - + kategorijskekolone=data.select_dtypes(include=['object']).columns.copy() + #print(kategorijskekolone) if(null_value_options=='replace'): #print("replace null") # dict=null_values_replacers @@ -143,11 +144,18 @@ def train(dataset, paramsModel,paramsExperiment,paramsDataset,callback): val = np.int64(val) elif(data[col].dtype == 'float64'): val = np.float64(val) - #elif(data[col].dtype == 'object'): data[col]=data[col].fillna(val) elif(null_value_options=='delete_rows'): data=data.dropna() elif(null_value_options=='delete_columns'): + if(data[output_column].isnull().sum()>0): + if(output_column in kategorijskekolone): + replace=data[output_column].value_counts().index[0] + #print(replace) + else: + replace=data[output_column].mean() + data[output_column]=data[output_column].fillna(replace) + #print(data[output_column].isnull().sum()) data=data.dropna(axis=1) #print(data.shape) @@ -175,7 +183,8 @@ def train(dataset, paramsModel,paramsExperiment,paramsDataset,callback): encodings=paramsExperiment["encodings"] datafront=dataset.copy() svekolone=datafront.columns - kategorijskekolone=datafront.select_dtypes(include=['object']).columns + + for kolonaEncoding in encodings: kolona = kolonaEncoding["columnName"] @@ -237,13 +246,6 @@ def train(dataset, paramsModel,paramsExperiment,paramsDataset,callback): #print(x_columns) x = data[x_columns].values y = data[output_column].values - print('-----------------dfghfhgfhfg-------------------------------') - print(x) - print('-----------------dfghfhgfhfg-------------------------------') - print(y) - print('-----------------dfghfhgfhfg-------------------------------') - print(output_column) - print('-----------------dfghfhgfhfg-------------------------------') # # Podela na test i trening skupove @@ -360,7 +362,7 @@ def train(dataset, paramsModel,paramsExperiment,paramsDataset,callback): classifier.add(tf.keras.layers.Dense(units=paramsModel['hiddenLayerNeurons'], activation=paramsModel['hiddenLayerActivationFunctions'][i+1]))#i-ti skriveni sloj classifier.add(tf.keras.layers.Dense(units=1, activation=paramsModel['outputLayerActivationFunction']))#izlazni sloj - classifier.compile(loss =paramsModel["lossFunction"] , optimizer = paramsModel['optimizer'] , metrics =['accuracy','mae','mse']) + classifier.compile(loss =paramsModel["lossFunction"] , optimizer = paramsModel['optimizer'] , metrics =['accuracy']) history=classifier.fit(x_train, y_train, epochs = paramsModel['epochs'],batch_size=paramsModel['batchSize'],callbacks=callback(x_test, y_test,paramsModel['_id'])) hist=history.history diff --git a/frontend/src/app/training/training.component.html b/frontend/src/app/training/training.component.html index fa80089e..66f77c37 100644 --- a/frontend/src/app/training/training.component.html +++ b/frontend/src/app/training/training.component.html @@ -33,7 +33,6 @@

Rezultati treniranja

Rezultati treniranja:

- {{trainingResult}}
-- cgit v1.2.3 From 314e7ff51cdbb49e5d30c6a67bcfa80a42736948 Mon Sep 17 00:00:00 2001 From: Sonja Galovic Date: Wed, 20 Apr 2022 01:13:38 +0200 Subject: Dugme za treniranje se disable-uje dok traje treniranje. Podesene strelice za navigaciju i linkovi kod pravljenja eksperimenta. Obrisani/zakomentarisani console.logovi na frontu. --- .../src/app/_elements/metric-view/metric-view.component.ts | 6 +++--- .../src/app/_elements/model-load/model-load.component.ts | 2 +- .../app/_elements/notifications/notifications.component.ts | 2 +- frontend/src/app/_services/signal-r.service.ts | 6 +++--- frontend/src/app/app.component.ts | 1 - frontend/src/app/experiment/experiment.component.css | 5 +++++ frontend/src/app/experiment/experiment.component.html | 14 +++++++------- frontend/src/app/experiment/experiment.component.ts | 12 +++++++++++- frontend/src/app/training/training.component.html | 2 +- frontend/src/app/training/training.component.ts | 7 +++++-- 10 files changed, 37 insertions(+), 20 deletions(-) (limited to 'frontend/src/app/training') diff --git a/frontend/src/app/_elements/metric-view/metric-view.component.ts b/frontend/src/app/_elements/metric-view/metric-view.component.ts index 76dd7d20..18b0d1ad 100644 --- a/frontend/src/app/_elements/metric-view/metric-view.component.ts +++ b/frontend/src/app/_elements/metric-view/metric-view.component.ts @@ -16,13 +16,13 @@ export class MetricViewComponent implements OnInit { if(this.signalRService.hubConnection) { this.signalRService.hubConnection.on("NotifyEpoch", (mName: string, mId: string, stat: string, totalEpochs: number, currentEpoch: number) => { - console.log(stat) - console.log(totalEpochs) + //console.log(stat) + //console.log(totalEpochs) const data=JSON.parse(stat) for (let key in data) { let value = data[key]; - console.log(value) + //console.log(value) } }); diff --git a/frontend/src/app/_elements/model-load/model-load.component.ts b/frontend/src/app/_elements/model-load/model-load.component.ts index 8bf8fd93..8fe864b7 100644 --- a/frontend/src/app/_elements/model-load/model-load.component.ts +++ b/frontend/src/app/_elements/model-load/model-load.component.ts @@ -57,7 +57,7 @@ export class ModelLoadComponent implements OnInit { else { this.modelsService.getMyModelsByType(ProblemType.Regression).subscribe((models) => { this.myModels = models; - console.log("modeli po tipu: ", this.myModels); + //console.log("modeli po tipu: ", this.myModels); }); }*/ } diff --git a/frontend/src/app/_elements/notifications/notifications.component.ts b/frontend/src/app/_elements/notifications/notifications.component.ts index 9b460240..f324662a 100644 --- a/frontend/src/app/_elements/notifications/notifications.component.ts +++ b/frontend/src/app/_elements/notifications/notifications.component.ts @@ -24,7 +24,7 @@ export class NotificationsComponent implements OnInit { this.signalRService.hubConnection.on("NotifyEpoch", (mName: string, mId: string, stat: string, totalEpochs: number, currentEpoch: number) => { const existingNotification = this.notifications.find(x => x.id === mId) const progress = ((currentEpoch + 1) / totalEpochs); - console.log("Ukupno epoha", totalEpochs, "Trenutna epoha:", currentEpoch); + //console.log("Ukupno epoha", totalEpochs, "Trenutna epoha:", currentEpoch); if (!existingNotification) this.notifications.push(new Notification(`Treniranje modela: ${mName}`, mId, progress, true)); else { diff --git a/frontend/src/app/_services/signal-r.service.ts b/frontend/src/app/_services/signal-r.service.ts index b279b5ca..109fc9e5 100644 --- a/frontend/src/app/_services/signal-r.service.ts +++ b/frontend/src/app/_services/signal-r.service.ts @@ -16,13 +16,13 @@ export class SignalRService { }).build(); this.hubConnection.on("Notify", (message: string) => { - console.log(" " + message); + //console.log(" " + message); }); this.hubConnection .start() - .then(() => console.log("con Started")) - .catch(err => console.log("Error" + err)) + .then(() => {}) + .catch(err => {}) } constructor(private cookie: CookieService) { } } diff --git a/frontend/src/app/app.component.ts b/frontend/src/app/app.component.ts index 59f247ed..54c18bec 100644 --- a/frontend/src/app/app.component.ts +++ b/frontend/src/app/app.component.ts @@ -50,7 +50,6 @@ export class AppComponent implements OnInit { private startHttpRequest = () => { this.http.get('http://localhost:5283/chatHub') .subscribe(res => { - console.log(res); }) } diff --git a/frontend/src/app/experiment/experiment.component.css b/frontend/src/app/experiment/experiment.component.css index 4a3d7741..d84a897e 100644 --- a/frontend/src/app/experiment/experiment.component.css +++ b/frontend/src/app/experiment/experiment.component.css @@ -40,4 +40,9 @@ ul li:hover { h2 { color: #003459; +} + +.boldClass { + font-weight: bold; + font-size: 125%; } \ No newline at end of file diff --git a/frontend/src/app/experiment/experiment.component.html b/frontend/src/app/experiment/experiment.component.html index ffc1db9d..4675236c 100644 --- a/frontend/src/app/experiment/experiment.component.html +++ b/frontend/src/app/experiment/experiment.component.html @@ -4,12 +4,12 @@
-
- Izvor podataka + -
- -
diff --git a/frontend/src/app/experiment/experiment.component.ts b/frontend/src/app/experiment/experiment.component.ts index 75c8e0d8..1533ceb3 100644 --- a/frontend/src/app/experiment/experiment.component.ts +++ b/frontend/src/app/experiment/experiment.component.ts @@ -8,7 +8,7 @@ import { ExperimentsService } from '../_services/experiments.service'; import { ColumnEncoding } from '../_data/Experiment'; import { Router } from '@angular/router'; import { TrainingComponent } from '../training/training.component'; -import { retryWhen } from 'rxjs'; +import { NEVER, retryWhen } from 'rxjs'; @Component({ selector: 'app-experiment', @@ -32,6 +32,7 @@ export class ExperimentComponent implements OnInit { selectedNotNullColumnsArray: string[] = []; tempTestSetDistribution = 90; + carouselIndex: number = 0; constructor(private experimentsService: ExperimentsService, private router: Router) { } @@ -219,4 +220,13 @@ export class ExperimentComponent implements OnInit { } return counter; } + + updateCarouselIndex(newIndex: number) { + if (newIndex > 2) + newIndex = 2; + else if (newIndex < 0) + newIndex = 0; + + this.carouselIndex = newIndex; + } } diff --git a/frontend/src/app/training/training.component.html b/frontend/src/app/training/training.component.html index 2bee3b12..0849d0c3 100644 --- a/frontend/src/app/training/training.component.html +++ b/frontend/src/app/training/training.component.html @@ -26,7 +26,7 @@

3. Treniranje modela

-
diff --git a/frontend/src/app/training/training.component.ts b/frontend/src/app/training/training.component.ts index 4c38f166..bff3304f 100644 --- a/frontend/src/app/training/training.component.ts +++ b/frontend/src/app/training/training.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import Shared from '../Shared'; import Experiment from '../_data/Experiment'; @@ -17,6 +17,8 @@ import { SignalRService } from '../_services/signal-r.service'; export class TrainingComponent implements OnInit { @ViewChild(ModelLoadComponent) modelLoadComponent?: ModelLoadComponent; + @ViewChild("trainButton") trainButtonRef!: ElementRef; + myExperiments?: Experiment[]; selectedExperiment?: Experiment; @@ -55,7 +57,6 @@ export class TrainingComponent implements OnInit { this.myExperiments = experiments; this.selectedExperiment = this.myExperiments.filter(x => x._id == andSelectWithId)[0]; - console.log("selektovan exp u training comp: ", this.selectedExperiment); }); } @@ -80,8 +81,10 @@ export class TrainingComponent implements OnInit { Shared.openDialog("Greška", "Molimo Vas da izaberete model."); return; } + this.trainButtonRef.nativeElement.disabled = true; this.modelsService.trainModel(this.selectedModel._id, this.selectedExperiment._id).subscribe((response: any) => { //console.log('Train model complete!', response); + this.trainButtonRef.nativeElement.disabled = false; Shared.openDialog("Obaveštenje", "Treniranje modela je uspešno završeno!"); this.trainingResult = response; }); -- cgit v1.2.3 From decbc2dc6b583dcf11cccf77f057cc7ec7b52adc Mon Sep 17 00:00:00 2001 From: Danijel Anđelković Date: Wed, 20 Apr 2022 01:28:53 +0200 Subject: Uklonio mogucnost da korisnik izabere da izbrise izlaznu kolonu, umesto opcije pise izbrisi kolonu sada samo pise (izlazna kolona). Ispravio neke bug-ove. --- .gitignore | 3 ++ .../src/app/_elements/navbar/navbar.component.ts | 8 +++- frontend/src/app/_services/signal-r.service.ts | 5 +++ .../src/app/experiment/experiment.component.html | 16 ++++--- frontend/src/app/training/training.component.html | 50 ++++++++++++---------- 5 files changed, 53 insertions(+), 29 deletions(-) (limited to 'frontend/src/app/training') diff --git a/.gitignore b/.gitignore index 247afbd9..bdd28b3f 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,6 @@ backend/microservice/api/__pycache__/ production/app/node_modules/ production/app/dist/ backend/microservice/api/temp/ +backend/microservice/Boston.csv +backend/microservice/diamonds.csv +backend/microservice/IMDB-Movie-Data.csv diff --git a/frontend/src/app/_elements/navbar/navbar.component.ts b/frontend/src/app/_elements/navbar/navbar.component.ts index 368508ed..d5d1744f 100644 --- a/frontend/src/app/_elements/navbar/navbar.component.ts +++ b/frontend/src/app/_elements/navbar/navbar.component.ts @@ -4,6 +4,7 @@ import { AuthService } from '../../_services/auth.service'; import shared from 'src/app/Shared'; import { UserInfoService } from 'src/app/_services/user-info.service'; import { MatDialog } from '@angular/material/dialog'; +import { SignalRService } from 'src/app/_services/signal-r.service'; @Component({ selector: 'app-navbar', @@ -15,11 +16,15 @@ export class NavbarComponent implements OnInit { currentUrl: string; shared = shared; - constructor(public location: Location, private auth: AuthService, private userInfoService: UserInfoService, private matDialog: MatDialog) { + constructor(public location: Location, private auth: AuthService, private userInfoService: UserInfoService, private matDialog: MatDialog, private signalRService: SignalRService) { shared.dialog = matDialog; this.currentUrl = this.location.path(); this.location.onUrlChange(() => { this.currentUrl = this.location.path(); + }); + + this.auth.loggedInEvent.subscribe(_ => { + this.signalRService.startConnection(); }) } @@ -34,5 +39,6 @@ export class NavbarComponent implements OnInit { logOut() { this.auth.logOut(); + this.signalRService.stopConnection(); } } diff --git a/frontend/src/app/_services/signal-r.service.ts b/frontend/src/app/_services/signal-r.service.ts index 109fc9e5..6a2e61e9 100644 --- a/frontend/src/app/_services/signal-r.service.ts +++ b/frontend/src/app/_services/signal-r.service.ts @@ -24,5 +24,10 @@ export class SignalRService { .then(() => {}) .catch(err => {}) } + + public stopConnection = () => { + this.hubConnection?.stop(); + } + constructor(private cookie: CookieService) { } } diff --git a/frontend/src/app/experiment/experiment.component.html b/frontend/src/app/experiment/experiment.component.html index 4675236c..569d1bfc 100644 --- a/frontend/src/app/experiment/experiment.component.html +++ b/frontend/src/app/experiment/experiment.component.html @@ -12,7 +12,7 @@ Dodaj eksperiment
-