반응형
05-14 20:55
Today
Total
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
관리 메뉴

개발하는 고라니

[Tensorflow.js] 모델 만들기 본문

Programming/Tensorflow.js

[Tensorflow.js] 모델 만들기

조용한고라니 2021. 1. 9. 15:20
반응형

모델을 만들려면 다음과 같은 단계를 거친다.

 

1) 과거의 데이터 준비하기

2) 모델의 모양 만들기

3) 데이터로 모델을 학습(Fit)하기 

4) 모델 이용하기

 

* Tensorflow.js를 이용하는 방법은 1. script cdn을 가져와서 이용하거나, 2. NPM으로 설치하는 방법이 있다.

<1> 스크립트 태그 이용

<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@2.0.0/dist/tf.min.js"></script>

<2> npm install

npm install //npm 설치
npm install @tensorflow/tfjs //tensorflow.js 설치

# 1 과거의 데이터 준비하기

과거의 데이터는 예를 들어 길에서 음료를 판매하는데, 과거 온도에 따른 음료 판매량을 기록한 것을 준비한다. 온도와 판매량을 보면 대략 온도 * 2 = 판매량 이라는 식을 도출해낼 수 있다.

온도(원인) 20 21 22 23 24
판매량(결과) 40 42 44 46 48
let temperature = [20, 21, 22, 23, 24]; 
let product = [40, 42, 44, 46, 48]; 

그러나 텐서플로는 배열을 그대로 사용하지 못한다. 'Tensor'라는 것으로 변환해주어야 사용할 수가 있다.

let cause = tf.tensor(temperature); //독립 변수
let result = tf.tensor(product);    //종속 변수

# 2 모델의 모양 만들기

let X = tf.input({shape: [1]}); //원인이 1개(온도) 이므로 []안의 값이 1
let Y = tf.layers.dense({units: 1}).apply(X); //결과가 1개(음료) 이므로 값이 1

let model = tf.model({inputs: X, outputs: Y});
let compileParam = {optimizer: tf.train.adam(), loss: tf.losses.meanSquaredError};
                         
model.compile(compileParam); //현재 모델은 빈 껍데기 이다.
                        

# 3 데이터로 모델을 학습하기

//Fit 하기 (갖고있는 데이터를 모델에 적용하기)

let fitParam = {epochs:3000} //원인과 결과에 대해 n번 학습시킬 것 인지 (클수록 좋은 결과를 만듬)

//fit()을 하면 모델이 형성됨 (우리가 예상하는 온도 * 2 = 판매량)
model.fit(원인data, 결과data, fitParam).then(function(result) {

});

# 4 모델 이용하기

let fitParam = {epochs:100};
model.fit(cause, result, fitParam).then(function(result) {
	
    //모델 이용하기
    let nextTemperature = [15, 16, 17, 18, 19];                              //다음 주 온도
    let nextCause = tf.tensor(nextTemperature, [nextTemperature.length, 1]); //다음 주 원인
    let nextResult = model.predict(nextCause);                               //다음 주 결과
    
    nextResult.print(); //console에 출력
});

# Whole Code </>

<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@2.0.0/dist/tf.min.js"></script>
    <script>
    	//1. 과거의 데이터 준비
        let temperature = [20, 21, 22, 23, 24];
        let product = [40, 42, 44, 46, 48];

        let cause = tf.tensor(temperature);
        let result = tf.tensor(product);

		//2. 모델의 모양 만들기
        let X = tf.input({shape: [1]}); //원인이 1개(온도) 이므로 []안의 값이 1
        let Y = tf.layers.dense({units: 1}).apply(X); //결과가 1개(음료) 이므로 값이 1

        let model = tf.model({inputs: X, outputs: Y});
        let compileParam = {optimizer: tf.train.adam(), loss: tf.losses.meanSquaredError};
        model.compile(compileParam);

		//3. 데이터로 모델 만들기
        let fitParam = {epochs:3000};
        model.fit(cause, result, fitParam).then(function(result) {
            
            //4.모델 이용하기
            let nextTemperature = [15, 16, 17, 18, 19];                              //다음 주 온도
            let nextCause = tf.tensor(nextTemperature, [nextTemperature.length, 1]); //다음 주 원인
            let nextResult = model.predict(nextCause);                               //다음 주 결과
            
            nextResult.print(); //console에 출력
        });
    </script>

VS Code의 Live Server로 작동하고 개발자 도구의 console에서 결과를 보면 다음과 같다.

Tensor [[29.1135578], [30.9353714], [32.7571831], [34.5789986], [36.4008102]]

값을 보면, 예상한 결과와 조금 다르다. 이는 학습이 완벽하지 않기 때문이다. 반복 학습의 횟수인 'epochs'의 값을 높이면 온도 x 2 = 판매량에 매우 근접해질 것이다.

 

* epoch = 10000일 때

Tensor [[30.0862007], [32.0763092], [34.0664177], [36.0565262], [38.0466347]]

# epoch에 따른 모델의 정확도 시각화

위에서 fitParam = {epochs:3000}을 주었다. 이는 단순히 반복 횟수만 전달한 것인데, 이 뒤에 콜백함수를 인자로 주어 현재 몇 번 반복이 되고있고, 모델의 정확도를 출력해주는 고마운 기능이 있다.

//MSE
let fitParam = {epochs:10000
    , callbacks:{
    onEpochEnd: function(epoch, logs) {
    console.log('epoch', epoch, logs);
    }
}};

//RMSE
let fitParam = {epochs:5000
    , callbacks:{
    onEpochEnd: function(epoch, logs) {
    console.log('epoch', epoch, 'RMSE =>', Math.sqrt(logs.loss));
    }
}};

이것을 모델의 fit() 함수 인자로 넘기면 브라우저 콘솔에서 다음과 같은 것을 확인할 수 있다.

epoch : 현재 반복학습 횟수

loss : 얼마나 잘 학습됬는가? (0에 가까울 수록 best)

 

원인 결과 모델의 예측 값 차이(예측값 - 실제값) 차이^2
1 10 7 -3 9
2 10 10 0 0
3 10 13 3 9

위 코드에서 let compileParam 을 지정할 때 loss: tf.losses.meanSquaredError로 지정을 한 것?

* Mean Squared Error(MSE) : 평균 제곱 오차

loss = (9 + 0 + 9) / 3 = 6

 

* Root Mean Squared Error (RMSE) : 평균 제곱근 오차

loss = 루트( (9 + 0 + 9) / 3 = 6 ) = 2.449

 

 

<본 포스팅은 '생활코딩'의 Tensorflow.js 수업을 진행하며 작성됩니다.>

opentutorials.org/course/4628/29708

반응형

'Programming > Tensorflow.js' 카테고리의 다른 글

[Tensorflow.js] 모델 Save & Load  (0) 2021.01.09
[Tensorflow.js] 선행 학습된 Model  (0) 2021.01.09
Comments