From aa2a296ef27520f38957bf4ef103fd5571468937 Mon Sep 17 00:00:00 2001 From: TAMARA JERINIC Date: Mon, 4 Apr 2022 00:55:52 +0200 Subject: Izmena multi-klasne klasifikacije. --- backend/microservice/api/ml_service.py | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) (limited to 'backend') diff --git a/backend/microservice/api/ml_service.py b/backend/microservice/api/ml_service.py index b264b428..40166cc4 100644 --- a/backend/microservice/api/ml_service.py +++ b/backend/microservice/api/ml_service.py @@ -205,21 +205,26 @@ def train(dataset, params, callback): if(problem_type=='multi-klasifikacioni'): func=params['hiddenLayerActivationFunctions'] - funcFirst=func.pop(0) - inputDim = len(data.columns) - 1 - classifier=tf.keras.Sequential(units=hidden_layer_neurons,input_dim=inputDim,activation=funcFirst) - for f in func: - classifier.add(tf.keras.layers.Dense(units=hidden_layer_neurons,activation=func)) output_func = params["outputLayerActivationFunction"] - numberofclasses=len(output_column.unique()) - classifier.add(tf.keras.layers.Dense(units=numberofclasses,activation=output_func)) - optimizer = params["optimizer"] metrics=params['metrics'] loss_func=params["lossFunction"] - classifier.compile(optimizer=optimizer, loss=loss_func,metrics=metrics) batch_size = params["batchSize"] epochs = params["epochs"] + inputDim = len(data.columns) - 1 + + classifier=tf.keras.Sequential() + + classifier.add(tf.keras.layers.Dense(units=len(data.columns),input_dim=inputDim))#input layer + + for f in func:#hidden layers + classifier.add(tf.keras.layers.Dense(units=hidden_layer_neurons,activation=f)) + + numberofclasses=len(output_column.unique()) + classifier.add(tf.keras.layers.Dense(units=numberofclasses,activation=output_func))#output layer + + classifier.compile(optimizer=optimizer, loss=loss_func,metrics=metrics) + history=classifier.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, callbacks=callback(x_test, y_test)) else: classifier=tf.keras.Sequential() @@ -227,10 +232,12 @@ def train(dataset, params, callback): for func in params["hiddenLayerActivationFunctions"]: classifier.add(tf.keras.layers.Dense(units=hidden_layer_neurons,activation=func)) output_func = params["outputLayerActivationFunction"] + if(problem_type!="regresioni"): classifier.add(tf.keras.layers.Dense(units=1,activation=output_func)) else: classifier.add(tf.keras.layers.Dense(units=1)) + optimizer = params["optimizer"] metrics=params['metrics'] loss_func=params["lossFunction"] @@ -249,7 +256,10 @@ def train(dataset, params, callback): elif(problem_type == "binarni-klasifikacioni"): y_pred=classifier.predict(x_test) y_pred=(y_pred>=0.5).astype('int') - + elif(problem_type=='multi-klasifikacioni'): + y_pred=classifier.predict(x_test) + y_pred=np.argmax(y_pred,axis=1) + y_pred=y_pred.flatten() result=pd.DataFrame({"Actual":y_test,"Predicted":y_pred}) classifier.save("temp/"+model_name, save_format='h5') -- cgit v1.2.3 From 15a842c76f2d2200b9e5d1fd88f9cc755bac92cb Mon Sep 17 00:00:00 2001 From: TAMARA JERINIC Date: Mon, 4 Apr 2022 01:14:24 +0200 Subject: Izmena --- backend/microservice/api/ml_service.py | 3 +++ 1 file changed, 3 insertions(+) (limited to 'backend') diff --git a/backend/microservice/api/ml_service.py b/backend/microservice/api/ml_service.py index 40166cc4..73b191da 100644 --- a/backend/microservice/api/ml_service.py +++ b/backend/microservice/api/ml_service.py @@ -333,6 +333,9 @@ def train(dataset, params, callback): "adj_r2" : adj_r2 } elif(problem_type=="multi-klasifikacioni"): + + cr=sm.classification_report(y_test, y_pred) + cm=sm.confusion_matrix(y_test,y_pred) # https://www.kaggle.com/code/nkitgupta/evaluation-metrics-for-multi-class-classification/notebook accuracy=metrics.accuracy_score(y_test, y_pred) macro_averaged_precision=metrics.precision_score(y_test, y_pred, average = 'macro') -- cgit v1.2.3 From 4f21c365006b3a737ebf8d1339922af1fd25a6d6 Mon Sep 17 00:00:00 2001 From: Ivan Ljubisavljevic Date: Mon, 4 Apr 2022 19:43:30 +0200 Subject: Odradjen upload i download h5 fajla. Sitne izmene oko prediktora #75 #66 --- backend/api/api/Controllers/FileController.cs | 103 +++++++++++++++++++++ backend/api/api/Controllers/PredictorController.cs | 4 +- backend/api/api/Models/FileModel.cs | 1 + backend/api/api/Services/PredictorService.cs | 2 +- .../browse-predictors.component.html | 2 +- .../browse-predictors.component.ts | 2 +- .../src/app/_pages/predict/predict.component.html | 17 ++-- 7 files changed, 119 insertions(+), 12 deletions(-) (limited to 'backend') diff --git a/backend/api/api/Controllers/FileController.cs b/backend/api/api/Controllers/FileController.cs index 0fe8415b..d29c5676 100644 --- a/backend/api/api/Controllers/FileController.cs +++ b/backend/api/api/Controllers/FileController.cs @@ -4,6 +4,7 @@ using api.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Net.Http.Headers; + namespace api.Controllers { [Route("api/[controller]")] @@ -11,6 +12,7 @@ namespace api.Controllers public class FileController : ControllerBase { private string[] permittedExtensions = { ".csv" }; + private string[] permittedExtensionsH5 = { ".h5" };//niz da bi dodali h4 itd private readonly IConfiguration _configuration; private IJwtToken _token; private IFileService _fileservice; @@ -22,6 +24,77 @@ namespace api.Controllers } + [HttpPost("h5")] + [Authorize(Roles = "User,Guest")] + public async Task> H5Upload([FromForm] IFormFile file) + { + + //get username from jwtToken + string uploaderId; + string folderName; + var header = Request.Headers[HeaderNames.Authorization]; + if (AuthenticationHeaderValue.TryParse(header, out var headerValue)) + { + + var scheme = headerValue.Scheme; + var parameter = headerValue.Parameter; + uploaderId = _token.TokenToId(parameter); + if (uploaderId == null) + return null; + } + else + return BadRequest(); + if (uploaderId == "") + { + folderName = "TempFiles"; + } + else + { + folderName = "UploadedFiles"; + } + + + //Check filetype + var filename = file.FileName; + var ext = Path.GetExtension(filename).ToLowerInvariant(); + var name = Path.GetFileNameWithoutExtension(filename).ToLowerInvariant(); + if (string.IsNullOrEmpty(ext) || !permittedExtensionsH5.Contains(ext)) + { + return BadRequest("Wrong file type"); + } + var folderPath = Path.Combine(Directory.GetCurrentDirectory(), folderName, uploaderId); + //Check Directory + if (!Directory.Exists(folderPath)) + { + Directory.CreateDirectory(folderPath); + } + //Index file if same filename + var fullPath = Path.Combine(folderPath, filename); + int i = 0; + + while (System.IO.File.Exists(fullPath)) + { + i++; + fullPath = Path.Combine(folderPath, name + i.ToString() + ext); + } + + + //Write file + using (var stream = new FileStream(fullPath, FileMode.Create)) + { + await file.CopyToAsync(stream); + } + FileModel fileModel = new FileModel(); + fileModel.type = "h5"; + fileModel.path = fullPath; + fileModel.uploaderId = uploaderId; + fileModel.date = DateTime.Now.ToUniversalTime(); + fileModel = _fileservice.Create(fileModel); + + + return Ok(fileModel); + } + [HttpPost("Csv")] [Authorize(Roles = "User,Guest")] @@ -81,6 +154,7 @@ namespace api.Controllers await file.CopyToAsync(stream); } FileModel fileModel= new FileModel(); + fileModel.type = "csv"; fileModel.path=fullPath; fileModel.uploaderId= uploaderId; fileModel.date = DateTime.Now.ToUniversalTime(); @@ -90,6 +164,35 @@ namespace api.Controllers return Ok(fileModel); } + + //msm generalno moze da se koristi Download samo + [HttpGet("downloadh5")] + [Authorize(Roles = "User,Guest")] + public async Task DownloadH5(string id) + { + //Get Username + string uploaderId; + var header = Request.Headers[HeaderNames.Authorization]; + if (AuthenticationHeaderValue.TryParse(header, out var headerValue)) + { + + var scheme = headerValue.Scheme; + var parameter = headerValue.Parameter; + uploaderId = _token.TokenToId(parameter); + if (uploaderId == null) + return null; + } + else + return BadRequest(); + + string filePath = _fileservice.GetFilePath(id, uploaderId); + if (filePath == null) + return BadRequest(); + + return File(System.IO.File.ReadAllBytes(filePath), "application/octet-stream", Path.GetFileName(filePath)); + + } + [HttpGet("Download")] [Authorize(Roles = "User,Guest")] public async Task DownloadFile(string id) diff --git a/backend/api/api/Controllers/PredictorController.cs b/backend/api/api/Controllers/PredictorController.cs index cdc14632..d9609cc7 100644 --- a/backend/api/api/Controllers/PredictorController.cs +++ b/backend/api/api/Controllers/PredictorController.cs @@ -77,7 +77,7 @@ namespace api.Controllers // GET api//getpredictor/{name} [HttpGet("getpredictor/{id}")] - [Authorize(Roles = "User")] + [Authorize(Roles = "User,Guest")] public ActionResult GetPredictor(string id) { string username; @@ -188,7 +188,7 @@ namespace api.Controllers // POST api//usepredictor {predictor,inputs} [HttpPost("usepredictor/{id}")] - [Authorize(Roles = "User")] + [Authorize(Roles = "User,Guest")] public ActionResult UsePredictor(String id, [FromBody] String[] inputs) { diff --git a/backend/api/api/Models/FileModel.cs b/backend/api/api/Models/FileModel.cs index 1043309d..47b12110 100644 --- a/backend/api/api/Models/FileModel.cs +++ b/backend/api/api/Models/FileModel.cs @@ -8,6 +8,7 @@ namespace api.Models [BsonId] [BsonRepresentation(BsonType.ObjectId)] public string _id { get; set; } + public string type { get; set; } public string uploaderId { get; set; } public string path { get; set; } [BsonDateTimeOptions(Kind = DateTimeKind.Utc)] diff --git a/backend/api/api/Services/PredictorService.cs b/backend/api/api/Services/PredictorService.cs index 01bc8359..b15255ac 100644 --- a/backend/api/api/Services/PredictorService.cs +++ b/backend/api/api/Services/PredictorService.cs @@ -42,7 +42,7 @@ namespace api.Services } public Predictor GetPredictor(string username, string id) { - return _predictor.Find(predictor => predictor.username == username && predictor._id == id).FirstOrDefault(); + return _predictor.Find(predictor => predictor._id == id && (predictor.username == username || predictor.isPublic == true)).FirstOrDefault(); } //last private models diff --git a/frontend/src/app/_pages/browse-predictors/browse-predictors.component.html b/frontend/src/app/_pages/browse-predictors/browse-predictors.component.html index a4ab6e2c..7b3e1bdb 100644 --- a/frontend/src/app/_pages/browse-predictors/browse-predictors.component.html +++ b/frontend/src/app/_pages/browse-predictors/browse-predictors.component.html @@ -14,7 +14,7 @@

{{predictor.name}}

{{predictor.description}}

- Otvori + Iskoristi


- +
- - + + +
- - + + +

+
Date: Mon, 4 Apr 2022 20:48:03 +0200 Subject: Prediktori FIX #66 --- backend/api/api/Controllers/PredictorController.cs | 6 +-- backend/api/api/Models/PredictorColumns.cs | 8 ++++ .../src/app/_pages/predict/predict.component.html | 43 +++++++++------------- .../src/app/_pages/predict/predict.component.ts | 12 +++++- frontend/src/app/_services/predictors.service.ts | 3 +- 5 files changed, 42 insertions(+), 30 deletions(-) create mode 100644 backend/api/api/Models/PredictorColumns.cs (limited to 'backend') diff --git a/backend/api/api/Controllers/PredictorController.cs b/backend/api/api/Controllers/PredictorController.cs index d9609cc7..161271e2 100644 --- a/backend/api/api/Controllers/PredictorController.cs +++ b/backend/api/api/Controllers/PredictorController.cs @@ -189,7 +189,7 @@ namespace api.Controllers // POST api//usepredictor {predictor,inputs} [HttpPost("usepredictor/{id}")] [Authorize(Roles = "User,Guest")] - public ActionResult UsePredictor(String id, [FromBody] String[] inputs) + public ActionResult UsePredictor(String id, [FromBody] PredictorColumns[] inputs) { string username; @@ -207,8 +207,8 @@ namespace api.Controllers Predictor predictor = _predictorService.GetPredictor(username, id); - foreach(String i in inputs) - Debug.WriteLine(i); + foreach(PredictorColumns i in inputs) + Debug.WriteLine(i.value.ToString()); return NoContent(); } diff --git a/backend/api/api/Models/PredictorColumns.cs b/backend/api/api/Models/PredictorColumns.cs new file mode 100644 index 00000000..82f3e979 --- /dev/null +++ b/backend/api/api/Models/PredictorColumns.cs @@ -0,0 +1,8 @@ +namespace api.Models +{ + public class PredictorColumns + { + public String name { get; set; } + public String value { get; set; } + } +} diff --git a/frontend/src/app/_pages/predict/predict.component.html b/frontend/src/app/_pages/predict/predict.component.html index 4516fbb4..13afa8e4 100644 --- a/frontend/src/app/_pages/predict/predict.component.html +++ b/frontend/src/app/_pages/predict/predict.component.html @@ -18,7 +18,24 @@
+ + +
+
+ +
+ +
+
+
+
+
+ + +
+
@@ -28,7 +45,7 @@
- +
@@ -41,31 +58,7 @@
-
-
- -
- - - -
-
- - - -
-
-
-
- - -
- -