오픈튜토리얼스 8.13 ~ 8.26 머신러닝야학에서 배운
레몬에이드 판매량 예측, 보스턴 집값 예측, 붓꽃 분류를 tensorflow.js로 만들었습니다.
오픈튜토리얼스 머신러닝야학 내용은 아래 링크를 참조해 주세요!
https://opentutorials.org/course/4570
nodejs version: 12.18.3
tensorflow.js version: 2.3.0
전체 코드
const lemonadeCSV = await readCSV('./data/lemonade.csv')
// 데이터를 tensor 형태로 만들기
const temperature = []
const sales = []
for (let i = 0; i < lemonadeCSV.length; i++) {
temperature.push(Number(lemonadeCSV[i]['온도']))
sales.push(Number(lemonadeCSV[i]['판매량']))
}
const independent = tf.tensor1d(temperature)
const dependent = tf.tensor1d(sales)
independent.print()
dependent.print()
// 모델 만들기
const input = tf.input({ shape: [1] })
const output = tf.layers.dense({ units: 1 }).apply(input)
const model = tf.model({
inputs: input,
outputs: output
})
model.compile({ optimizer: tf.train.adam(), loss: tf.losses.meanSquaredError })
model.summary()
// 모델 학습
const { history: { loss: loss } } = await model.fit(independent, dependent, { epochs: 15000 })
// 마지막 loss 출력
console.log(loss[loss.length - 1])
// 판매량 예측
model.predict(tf.tensor1d([40])).print()
CSV 데이터 가져오기
tf.data.csv() 함수가 작동하지 않아 csv를 읽어오는 함수를 만들게 되었습니다. ㅠㅠ
node.js fs 모듈과 csv-parser npm 모듈을 사용하였습니다.
ReadStream을 사용하여 csv 파일을 읽고 객체 배열 형태로 값을 반환합니다.
const fs = require('fs')
const csv = require('csv-parser')
/**
*
* @param { string } csvFilePath csv 파일 주소
* 리턴값은 [{'a':'1', 'b':'2'}] 객체 배열 형태입니다.
*/
const readCSV = (csvFilePath) => {
return new Promise((resolve, reject) => {
const dataSet = []
const readStream = fs.createReadStream(csvFilePath)
readStream.pipe(csv()).on('error', () => { return reject(new Error('Error reading file')) }).on('data', (data) => { dataSet.push(data) }).on('end', () => { resolve(dataSet) })
})
}
module.exports = readCSV
데이터를 Tensor 형으로 만들기
const temperature = []
const sales = []
for (let i = 0; i < lemonadeCSV.length; i++) {
temperature.push(Number(lemonadeCSV[i]['온도']))
sales.push(Number(lemonadeCSV[i]['판매량']))
}
const independent = tf.tensor1d(temperature)
const dependent = tf.tensor1d(sales)
/*
Tensor
[20, 21, 22, 23, 24, 25]
Tensor
[40, 42, 44, 46, 48, 50]
*/
모델 만들기
tensorflow.js와 python tensorflow 다른점은 apply를 사용해 layer를 쌓고
parameter 값을 Object로 사용한다는 점입니다.
const input = tf.input({ shape: [1] })
const output = tf.layers.dense({ units: 1 }).apply(input)
const model = tf.model({
inputs: input,
outputs: output
})
model.compile({ optimizer: tf.train.adam(), loss: tf.losses.meanSquaredError })
model.summary()
model Summary :
_________________________________________________________________
Layer (type) Output shape Param #
========================================
input1 (InputLayer) [null,1] 0
_________________________________________________________________
dense_Dense1 (Dense) [null,1] 2
========================================
Total params: 2
Trainable params: 2
Non-trainable params: 0
_________________________________________________________________
모델 학습과 예측
model.fit()은 history를 반환하고 history에는 지금까지 loss 값을 가지고 있습니다.
결과:
0.015542778186500072
Tensor
[[78.7350845],]
// 모델 학습
const { history: { loss: loss } } = await model.fit(independent, dependent, { epochs: 15000 })
// 마지막 loss 출력
console.log(loss[loss.length - 1])
// 판매량 예측
model.predict(tf.tensor1d([40])).print()
가장 간단한 lemonade 판매량 예측이었습니다. 하지만 python이 아니라 javascript로 하고 자료도 많지 않아서 tensorflow.js API reference 와 튜토리얼을 보면서 했습니다.
tensorflow.js API reference 는 사용법이 자세히 나와있지 않아 구글링을 많이 하였습니다.
https://js.tensorflow.org/api/2.3.0/
'머신러닝' 카테고리의 다른 글
tensorflow.js 3) 붓꽃 분류하기 (0) | 2020.08.28 |
---|---|
tensorflow.js 2) 보스턴 집값 예측 (0) | 2020.08.27 |