- Today
- Total
개발하는 고라니
[Tensorflow.js] 모델 만들기 본문
모델을 만들려면 다음과 같은 단계를 거친다.
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 수업을 진행하며 작성됩니다.>
'Programming > Tensorflow.js' 카테고리의 다른 글
[Tensorflow.js] 모델 Save & Load (0) | 2021.01.09 |
---|---|
[Tensorflow.js] 선행 학습된 Model (0) | 2021.01.09 |