2 * Copyright (c) 2021 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 var MachineLearningTrainer = function () { };
20 OPTIMIZER_ADAM: 'OPTIMIZER_ADAM',
21 OPTIMIZER_SGD: 'OPTIMIZER_SGD',
22 OPTIMIZER_UNKNOWN: 'OPTIMIZER_UNKNOWN'
26 DATASET_GENERATOR: 'DATASET_GENERATOR',
27 DATASET_FILE: 'DATASET_FILE',
28 DATASET_UNKNOWN: 'DATASET_UNKNOWN'
35 LAYER_CONV2D: 'LAYER_CONV2D',
36 LAYER_POOLING2D: 'LAYER_POOLING2D',
37 LAYER_FLATTEN: 'LAYER_FLATTEN',
38 LAYER_ACTIVATION: 'LAYER_ACTIVATION',
39 LAYER_ADDITION: 'LAYER_ADDITION',
40 LAYER_CONCAT: 'LAYER_CONCAT',
41 LAYER_MULTIOUT: 'LAYER_MULTIOUT',
42 LAYER_LOSS_MSE: 'LAYER_LOSS_MSE',
43 LAYER_LOSS_CROSS_ENTROPY_SIGMOID: 'LAYER_LOSS_CROSS_ENTROPY_SIGMOID',
44 LAYER_LOSS_CROSS_ENTROPY_SOFTMAX: 'LAYER_LOSS_CROSS_ENTROPY_SOFTMAX',
45 LAYER_BACKBONE_NNSTREAMER: 'LAYER_BACKBONE_NNSTREAMER',
46 LAYER_EMBEDDING: 'LAYER_EMBEDDING',
47 LAYER_RNN: 'LAYER_RNN',
48 LAYER_UNKNOWN: 'LAYER_UNKNOWN'
51 var VerbosityLevel = {
52 SUMMARY_MODEL: 'SUMMARY_MODEL',
53 SUMMARY_LAYER: 'SUMMARY_LAYER',
54 SUMMARY_TENSOR: 'SUMMARY_TENSOR'
57 var Layer = function(id, type) {
58 Object.defineProperties(this, {
70 _id: { value: id, writable: false, enumerable: false }
74 var ValidSetPropertyExceptions = [
80 Layer.prototype.setProperty = function() {
81 var args = validator_.validateArgs(arguments, [
92 if (!args.has.name || !args.has.value) {
93 throw new WebAPIException(
94 WebAPIException.TYPE_MISMATCH_ERR,
95 'Invalid parameter: ' + (args.has.name ? 'value' : 'name') + ' is undefined'
105 var result = native_.callSync('MLTrainerLayerSetProperty', callArgs);
107 if (native_.isFailure(result)) {
108 throw native_.getErrorObjectAndValidate(
110 ValidSetPropertyExceptions,
116 var Optimizer = function(id, type) {
117 Object.defineProperties(this, {
123 _id: { value: id, writable: false, enumerable: false }
127 Optimizer.prototype.setProperty = function() {
128 var args = validator_.validateArgs(arguments, [
139 if (!args.has.name || !args.has.value) {
140 throw new WebAPIException(
141 WebAPIException.TYPE_MISMATCH_ERR,
142 'Invalid parameter: ' + (args.has.name ? 'value' : 'name') + ' is undefined'
152 var result = native_.callSync('MLTrainerOptimizerSetProperty', callArgs);
154 if (native_.isFailure(result)) {
155 throw native_.getErrorObjectAndValidate(
157 ValidSetPropertyExceptions,
163 var Dataset = function(id, type) {
164 Object.defineProperties(this, {
170 _id: { value: id, writable: false, enumerable: false }
174 Dataset.prototype.setProperty = function() {
175 var args = validator_.validateArgs(arguments, [
186 if (!args.has.name || !args.has.value) {
187 throw new WebAPIException(
188 WebAPIException.TYPE_MISMATCH_ERR,
189 'Invalid parameter: ' + (args.has.name ? 'value' : 'name') + ' is undefined'
199 var result = native_.callSync('MLTrainerDatasetSetProperty', callArgs);
201 if (native_.isFailure(result)) {
202 throw native_.getErrorObjectAndValidate(
204 ValidSetPropertyExceptions,
210 var Model = function(id) {
211 Object.defineProperties(this, {
212 _id: { value: id, writable: false, enumerable: false }
216 function ValidateCompileOptions(options) {
218 if (options.hasOwnProperty('loss_val')) {
219 args.loss = options.loss_val;
221 if (options.hasOwnProperty('loss')) {
222 args.loss = options.loss;
224 if (options.hasOwnProperty('batch_size')) {
225 args.batch_size = options.batch_size;
230 var ValidModelCompileExceptions = [
231 'InvalidValuesError',
236 Model.prototype.compile = function() {
237 var args = validator_.validateArgs(arguments, [
240 type: validator_.Types.DICTIONARY,
246 if (args.has.options) {
247 options = ValidateCompileOptions(args.options);
255 var result = native_.callSync('MLTrainerModelCompile', callArgs);
257 if (native_.isFailure(result)) {
258 throw native_.getErrorObjectAndValidate(
260 ValidModelCompileExceptions,
266 function ValidateRunOptions(options) {
268 if (options.hasOwnProperty('batch_size')) {
269 args.batch_size = options.batch_size;
271 if (options.hasOwnProperty('epochs')) {
272 args.epochs = options.epochs;
274 if (options.hasOwnProperty('save_path')) {
275 args.save_path = options.save_path;
280 var ValidModelRunExceptions = [
281 'InvalidValuesError',
285 Model.prototype.run = function() {
286 var args = validator_.validateArgs(arguments, [
289 type: validator_.Types.DICTIONARY,
294 name: 'successCallback',
295 type: types_.FUNCTION
298 name: 'errorCallback',
299 type: types_.FUNCTION,
305 if (args.has.options) {
306 runOptions = ValidateRunOptions(args.options);
314 var callback = function (result) {
315 if (native_.isFailure(result)) {
316 native_.callIfPossible(
318 native_.getErrorObjectAndValidate(
320 ValidModelRunExceptions,
325 args.successCallback();
329 var result = native_.call('MLTrainerModelRun', callArgs, callback);
330 if (native_.isFailure(result)) {
331 throw native_.getErrorObjectAndValidate(
333 ValidModelRunExceptions,
339 Model.prototype.summarize = function() {
340 var args = validator_.validateArgs(arguments, [
344 values: Object.values(VerbosityLevel),
352 level: args.level ? args.level : "SUMMARY_MODEL"
355 var result = native_.callSync('MLTrainerModelSummarize', callArgs);
357 if (native_.isFailure(result)) {
358 throw native_.getErrorObjectAndValidate(
360 ValidBasicExceptions,
365 return result.summary
368 var ValidBasicExceptions = [
373 Model.prototype.addLayer = function() {
374 var args = validator_.validateArgs(arguments, [
377 type: types_.PLATFORM_OBJECT,
382 if (!args.has.layer) {
383 throw new WebAPIException(
384 WebAPIException.TYPE_MISMATCH_ERR, 'Invalid parameter: layer is undefined'
390 layerId: args.layer._id
393 var result = native_.callSync('MLTrainerModelAddLayer', callArgs);
395 if (native_.isFailure(result)) {
396 throw native_.getErrorObjectAndValidate(
398 ValidBasicExceptions,
404 Model.prototype.setDataset = function() {
405 var args = validator_.validateArgs(arguments, [
408 type: types_.PLATFORM_OBJECT,
413 if (!args.has.dataset) {
414 throw new WebAPIException(
415 WebAPIException.TYPE_MISMATCH_ERR, 'Invalid parameter: dataset is undefined'
421 datasetId: args.dataset._id
424 var result = native_.callSync('MLTrainerModelSetDataset', callArgs);
426 if (native_.isFailure(result)) {
427 throw native_.getErrorObjectAndValidate(
429 ValidBasicExceptions,
435 Model.prototype.setOptimizer = function() {
436 var args = validator_.validateArgs(arguments, [
439 type: types_.PLATFORM_OBJECT,
444 if (!args.has.optimizer) {
445 throw new WebAPIException(
446 WebAPIException.TYPE_MISMATCH_ERR, 'Invalid parameter: optimizer is undefined'
452 optimizerId: args.optimizer._id
455 var result = native_.callSync('MLTrainerModelSetOptimizer', callArgs);
457 if (native_.isFailure(result)) {
458 throw native_.getErrorObjectAndValidate(
460 ValidBasicExceptions,
466 var ValidCreateLayerExceptions = ['NotSupportedError', 'TypeMismatchError', 'AbortError'];
469 MachineLearningTrainer.prototype.createLayer = function() {
470 var args = validator_.validateArgs(arguments, [
474 values: Object.values(LayerType),
483 var result = native_.callSync('MLTrainerLayerCreate', nativeArgs);
484 if (native_.isFailure(result)) {
485 throw native_.getErrorObjectAndValidate(
487 ValidCreateLayerExceptions,
492 return new Layer(result.id, args.type);
495 function ValidateAndReturnDatasetPaths(train, valid, test) {
498 train: tizen.filesystem.toURI(train),
499 valid: valid ? tizen.filesystem.toURI(valid) : '',
500 test: test ? tizen.filesystem.toURI(test) : ''
504 throw new WebAPIException(WebAPIException.NOT_FOUND_ERR, 'Path is invalid');
508 MachineLearningTrainer.prototype.createFileDataset = function() {
509 var args = validator_.validateArgs(arguments, [
527 if (!args.has.train) {
528 throw new WebAPIException(
529 WebAPIException.TYPE_MISMATCH_ERR,
530 'Invalid parameter: training set path is undefined'
534 var nativeArgs = ValidateAndReturnDatasetPaths(
536 args.has.valid ? args.valid : undefined,
537 args.has.test ? args.test : undefined
540 var result = native_.callSync('MLTrainerDatasetCreateFromFile', nativeArgs);
541 if (native_.isFailure(result)) {
542 throw native_.getErrorObjectAndValidate(
544 ValidCreateLayerExceptions,
549 return new Dataset(result.id, 'DATASET_FILE');
552 MachineLearningTrainer.prototype.createGeneratorDataset = function() {
553 var args = validator_.validateArgs(arguments, [
556 type: types_.FUNCTION
560 type: types_.FUNCTION,
566 type: types_.FUNCTION,
571 ValidateDatasetPaths(
573 args.has.validate ? args.validate : undefined,
574 args.has.test ? args.test : undefined
578 return new Dataset(result.id, 'DATASET_GENERATOR');
581 var ValidCreateOptimizerExceptions = [
587 MachineLearningTrainer.prototype.createOptimizer = function() {
588 var args = validator_.validateArgs(arguments, [
592 values: Object.values(OptimizerType),
601 var result = native_.callSync('MLTrainerOptimizerCreate', nativeArgs);
602 if (native_.isFailure(result)) {
603 throw native_.getErrorObjectAndValidate(
605 ValidCreateOptimizerExceptions,
610 return new Optimizer(result.id, args.type);
613 var ValidCreateModelWithConfigurationExceptions = [
614 'InvalidValuesError',
620 MachineLearningTrainer.prototype.createModelWithConfiguration = function() {
621 var args = validator_.validateArgs(arguments, [
628 if (args.has.configPath) {
630 args.configPath = tizen.filesystem.toURI(args.configPath);
632 throw new WebAPIException(WebAPIException.NOT_FOUND_ERR, 'Path is invalid');
636 configPath: args.configPath
639 var result = native_.callSync('MLTrainerModelCreate', nativeArgs);
640 if (native_.isFailure(result)) {
641 throw native_.getErrorObjectAndValidate(
643 ValidCreateModelWithConfigurationExceptions,
648 return new Model(result.id);
651 MachineLearningTrainer.prototype.createModel = function() {
652 var result = native_.callSync('MLTrainerModelCreate', {});
653 if (native_.isFailure(result)) {
654 throw new WebAPIException(WebAPIException.AbortError, 'Could not create model');
657 return new Model(result.id);