From e58b3f691cd637f1cf4bcf1760b3e05aa0c6c453 Mon Sep 17 00:00:00 2001 From: Mo Kweon Date: Sat, 25 Jun 2022 00:00:42 +0000 Subject: [PATCH] feat: add a base model to the repository --- model/ver20220624/model.json | 199 ++++++++++++++++++++++++++++++++++ model/ver20220624/weights.bin | Bin 0 -> 71044 bytes trainer/datasets.ts | 76 +++++++++++++ trainer/model.ts | 44 ++++++++ trainer/package.json | 2 +- trainer/trainer.ts | 114 ++++++------------- trainer/tsconfig.json | 2 +- 7 files changed, 357 insertions(+), 80 deletions(-) create mode 100644 model/ver20220624/model.json create mode 100644 model/ver20220624/weights.bin create mode 100644 trainer/datasets.ts create mode 100644 trainer/model.ts diff --git a/model/ver20220624/model.json b/model/ver20220624/model.json new file mode 100644 index 0000000..8593dbf --- /dev/null +++ b/model/ver20220624/model.json @@ -0,0 +1,199 @@ +{ + "modelTopology": { + "class_name": "Sequential", + "config": { + "name": "sequential_1", + "layers": [ + { + "class_name": "Dense", + "config": { + "units": 32, + "activation": "relu", + "use_bias": true, + "kernel_initializer": { + "class_name": "VarianceScaling", + "config": { + "scale": 1, + "mode": "fan_avg", + "distribution": "normal", + "seed": null + } + }, + "bias_initializer": { "class_name": "Zeros", "config": {} }, + "kernel_regularizer": null, + "bias_regularizer": null, + "activity_regularizer": null, + "kernel_constraint": null, + "bias_constraint": null, + "name": "dense_Dense1", + "trainable": true, + "batch_input_shape": [null, 512], + "dtype": "float32" + } + }, + { + "class_name": "BatchNormalization", + "config": { + "axis": -1, + "momentum": 0.99, + "epsilon": 0.001, + "center": true, + "scale": true, + "beta_initializer": { "class_name": "Zeros", "config": {} }, + "gamma_initializer": { "class_name": "Ones", "config": {} }, + "moving_mean_initializer": { "class_name": "Zeros", "config": {} }, + "moving_variance_initializer": { + "class_name": "Ones", + "config": {} + }, + "beta_regularizer": null, + "gamma_regularizer": null, + "beta_constraint": null, + "gamma_constraint": null, + "name": "batch_normalization_BatchNormalization1", + "trainable": true + } + }, + { + "class_name": "Dense", + "config": { + "units": 32, + "activation": "relu", + "use_bias": true, + "kernel_initializer": { + "class_name": "VarianceScaling", + "config": { + "scale": 1, + "mode": "fan_avg", + "distribution": "normal", + "seed": null + } + }, + "bias_initializer": { "class_name": "Zeros", "config": {} }, + "kernel_regularizer": null, + "bias_regularizer": null, + "activity_regularizer": null, + "kernel_constraint": null, + "bias_constraint": null, + "name": "dense_Dense2", + "trainable": true + } + }, + { + "class_name": "BatchNormalization", + "config": { + "axis": -1, + "momentum": 0.99, + "epsilon": 0.001, + "center": true, + "scale": true, + "beta_initializer": { "class_name": "Zeros", "config": {} }, + "gamma_initializer": { "class_name": "Ones", "config": {} }, + "moving_mean_initializer": { "class_name": "Zeros", "config": {} }, + "moving_variance_initializer": { + "class_name": "Ones", + "config": {} + }, + "beta_regularizer": null, + "gamma_regularizer": null, + "beta_constraint": null, + "gamma_constraint": null, + "name": "batch_normalization_BatchNormalization2", + "trainable": true + } + }, + { + "class_name": "Dense", + "config": { + "units": 1, + "activation": "sigmoid", + "use_bias": true, + "kernel_initializer": { + "class_name": "VarianceScaling", + "config": { + "scale": 1, + "mode": "fan_avg", + "distribution": "normal", + "seed": null + } + }, + "bias_initializer": { "class_name": "Zeros", "config": {} }, + "kernel_regularizer": null, + "bias_regularizer": null, + "activity_regularizer": null, + "kernel_constraint": null, + "bias_constraint": null, + "name": "dense_Dense3", + "trainable": true + } + } + ] + }, + "keras_version": "tfjs-layers 3.18.0", + "backend": "tensor_flow.js" + }, + "weightsManifest": [ + { + "paths": ["weights.bin"], + "weights": [ + { + "name": "dense_Dense1/kernel", + "shape": [512, 32], + "dtype": "float32" + }, + { "name": "dense_Dense1/bias", "shape": [32], "dtype": "float32" }, + { + "name": "batch_normalization_BatchNormalization1/gamma", + "shape": [32], + "dtype": "float32" + }, + { + "name": "batch_normalization_BatchNormalization1/beta", + "shape": [32], + "dtype": "float32" + }, + { + "name": "dense_Dense2/kernel", + "shape": [32, 32], + "dtype": "float32" + }, + { "name": "dense_Dense2/bias", "shape": [32], "dtype": "float32" }, + { + "name": "batch_normalization_BatchNormalization2/gamma", + "shape": [32], + "dtype": "float32" + }, + { + "name": "batch_normalization_BatchNormalization2/beta", + "shape": [32], + "dtype": "float32" + }, + { "name": "dense_Dense3/kernel", "shape": [32, 1], "dtype": "float32" }, + { "name": "dense_Dense3/bias", "shape": [1], "dtype": "float32" }, + { + "name": "batch_normalization_BatchNormalization1/moving_mean", + "shape": [32], + "dtype": "float32" + }, + { + "name": "batch_normalization_BatchNormalization1/moving_variance", + "shape": [32], + "dtype": "float32" + }, + { + "name": "batch_normalization_BatchNormalization2/moving_mean", + "shape": [32], + "dtype": "float32" + }, + { + "name": "batch_normalization_BatchNormalization2/moving_variance", + "shape": [32], + "dtype": "float32" + } + ] + } + ], + "format": "layers-model", + "generatedBy": "TensorFlow.js tfjs-layers v3.18.0", + "convertedBy": null +} diff --git a/model/ver20220624/weights.bin b/model/ver20220624/weights.bin new file mode 100644 index 0000000000000000000000000000000000000000..e41e01212ecb391a0ff6fd1fe75e149f677b70de GIT binary patch literal 71044 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 { + return tf.data + .csv(filepath, { + delimiter: '\t', + hasHeader: true, + configuredColumnsOnly: true, + columnConfigs: { + clean: { + dtype: 'int32', + isLabel: true, + }, + 문장: { + dtype: 'string', + }, + }, + }) + .mapAsync(async (data: any) => { + const out = await encoder.embed(data.xs['문장']) + return { + xs: out.flatten(), + ys: Object.values(data.ys), + } + }) + .batch(32) + .shuffle(32) +} + +/** + * 스마일게이트 데이터셋을 universal-sentence-encoder 를 통해 encoding한 tf.data.Dataset을 반환한다. + * 학습 데이터와 밸리데이션 데이터를 tf.data.Dataset 형태로 반환한다. + * + * @param encoder use.UniversalSentenceEncoder + * @returns + */ +export async function loadUnsmileTrainValidData( + encoder: use.UniversalSentenceEncoder, +): Promise<{ + trainData: tf.data.Dataset + valData: tf.data.Dataset +}> { + const trainData = await loadUnsmileData({ + filepath: getUnsmileDataUrl('train', 'v1.0'), + encoder, + }) + const valData = await loadUnsmileData({ + filepath: getUnsmileDataUrl('valid', 'v1.0'), + encoder, + }) + return { trainData, valData } +} + +/** + * 스마일게이트 데이터셋 CSV URL을 위한 도움 함수. + * + * @param type "train" or "valid" + * @param version "v1.0" + * @returns full url path + */ +function getUnsmileDataUrl(type: string, version: string): string { + return `https://raw.githubusercontent.com/smilegate-ai/korean_unsmile_dataset/main/unsmile_${type}_${version}.tsv` +} diff --git a/trainer/model.ts b/trainer/model.ts new file mode 100644 index 0000000..5c2bd4f --- /dev/null +++ b/trainer/model.ts @@ -0,0 +1,44 @@ +import * as tf from '@tensorflow/tfjs-node' +import path from 'path' + +const FILE_SCHEME = 'file://' + +/** + * 모델을 불러오거나 불러오는데 실패할 경우 새로운 모델을 생성한다. + * + * @param modelDirectoryPath 저장된 모델의 경로. 인풋 형식은 https://www.tensorflow.org/js/guide/save_load 참조 할 것. + * @returns 학습 모델을 반환 + */ +export async function getModel( + modelDirectoryPath: string, +): Promise { + try { + const modelPath = + FILE_SCHEME + + path.join(modelDirectoryPath.replace(FILE_SCHEME, ''), 'model.json') + console.info(`Trying to load a model from ${modelPath}`) + return await tf.loadLayersModel(modelPath) + } catch (e) { + console.warn(e) + console.warn(`Unable to load a model. Creating a new model`) + return tf.sequential({ + layers: [ + tf.layers.dense({ + inputDim: 512, + units: 32, + activation: 'relu', + }), + tf.layers.batchNormalization(), + tf.layers.dense({ + units: 32, + activation: 'relu', + }), + tf.layers.batchNormalization(), + tf.layers.dense({ + units: 1, + activation: 'sigmoid', + }), + ], + }) + } +} diff --git a/trainer/package.json b/trainer/package.json index 264b7b5..71bbba5 100644 --- a/trainer/package.json +++ b/trainer/package.json @@ -4,7 +4,7 @@ "description": "", "main": "index.js", "scripts": { - "build": "npx ts-node trainer.ts" + "start": "ts-node trainer.ts" }, "keywords": [], "author": "", diff --git a/trainer/trainer.ts b/trainer/trainer.ts index c6a7813..4c0dcf4 100644 --- a/trainer/trainer.ts +++ b/trainer/trainer.ts @@ -1,94 +1,52 @@ import * as use from '@tensorflow-models/universal-sentence-encoder' import * as tf from '@tensorflow/tfjs-node' -async function main() { - const encoder = await use.load() - const trainData = tf.data - .csv( - 'https://raw.githubusercontent.com/smilegate-ai/korean_unsmile_dataset/main/unsmile_train_v1.0.tsv', - { - delimiter: '\t', - hasHeader: true, - configuredColumnsOnly: true, - columnConfigs: { - clean: { - dtype: 'int32', - isLabel: true, - }, - 문장: { - dtype: 'string', - }, - }, - }, - ) - .mapAsync(async (data: any) => { - const out = await encoder.embed(data.xs['문장']) - return { - xs: out.flatten(), - ys: Object.values(data.ys), - } - }) - .batch(32) - .shuffle(32) +import path from 'path' +import { loadUnsmileTrainValidData } from './datasets' +import { getModel } from './model' - const valData = tf.data - .csv( - 'https://raw.githubusercontent.com/smilegate-ai/korean_unsmile_dataset/main/unsmile_valid_v1.0.tsv', - { - delimiter: '\t', - hasHeader: true, - configuredColumnsOnly: true, - columnConfigs: { - clean: { - dtype: 'int32', - isLabel: true, - }, - 문장: { - dtype: 'string', - }, - }, - }, - ) - .mapAsync(async (data: any) => { - const out = await encoder.embed(data.xs['문장']) - return { - xs: out.flatten(), - ys: Object.values(data.ys), - } - }) - .batch(32) - .shuffle(32) +// model will be saved into ${MODEL_DIRECTORY_PATH}/{model.json,weights.bin} +const MODEL_DIRECTORY_PATH = `file://${path.join( + __dirname, + '..', + 'model', + 'ver20220624', +)}` - const model = tf.sequential({ - layers: [ - tf.layers.dense({ - inputDim: 512, - units: 512, - activation: 'relu', - }), - tf.layers.batchNormalization(), - tf.layers.dense({ - units: 512, - activation: 'relu', - }), - tf.layers.batchNormalization(), - tf.layers.dense({ - units: 1, - activation: 'sigmoid', - }), - ], - }) +async function main() { + const encoder = await use.load() + const { trainData, valData } = await loadUnsmileTrainValidData(encoder) + const model = await getModel(MODEL_DIRECTORY_PATH) model.compile({ optimizer: tf.train.adam(), loss: tf.losses.sigmoidCrossEntropy, - metrics: [tf.metrics.binaryAccuracy], + metrics: [ + tf.metrics.binaryAccuracy, + tf.metrics.precision, + tf.metrics.recall, + ], }) - model.fitDataset(trainData, { - epochs: 5, + model.summary() + + await model.fitDataset(trainData, { + epochs: 1, validationData: valData, + callbacks: [ + tf.callbacks.earlyStopping({ + patience: 1, + }), + ], }) + + const savedResult = await model.save(MODEL_DIRECTORY_PATH) + + if (savedResult.errors) { + console.error(savedResult) + } else { + console.info(savedResult) + } } main() diff --git a/trainer/tsconfig.json b/trainer/tsconfig.json index ba64835..ce0f9e8 100644 --- a/trainer/tsconfig.json +++ b/trainer/tsconfig.json @@ -57,7 +57,7 @@ // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + "inlineSourceMap": true /* Include sourcemap files inside the emitted JavaScript. */, // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ // "newLine": "crlf", /* Set the newline character for emitting files. */