독립변수가 1개 이상인 경우 각 가중치와 bias를 도출하는 방법을 연습하는데 자주 사용되는 보스턴 집값 예측을 시도해보자.
* csv 로드는 생략하고, 임시적으로 하드코드된 값을 data, label로 사용했습니다.
다수의 독립변수 혹은 다수의 종속변수를 학습하는 방법
어려울 것 없습니다. model을 설계할 때 shape와 units 부분만 잘 설정해주면 됩니다.
1. 종속 변수가 1개 일 때
y = w1 * x + w2 * x + w3 * x + .... + b(bias)
const input = [
[0.00632, 18, 2.31, 0, 0.538, 6.575, 65.2, 4.09, 1, 296, 15.3, 396.9, 4.98],
[0.02731, 0, 7.07, 0, 0.469, 6.421, 78.9, 4.9671, 2, 242, 17.8, 396.9, 9.14],
];
const output = [[24], [21.6]];
const data = tf.tensor(input);
const label = tf.tensor(output);
// 모델의 모양을 만듭니다.
const X = tf.input({ shape: [13] }); // lf 객체. 인자가 13개이므로 shape가 13
const Y = tf.layers.dense({ units: 1 }).apply(X); // lf 객체. 도출하고자 하는 값이 1개이므로 units이 1
const bostenPredictModel = tf.model({ inputs: X, outputs: Y }); // e 객체
bostenPredictModel.compile({
optimizer: tf.train.adam(),
loss: tf.losses.meanSquaredError,
});
bostenPredictModel
.fit(data, label, {
epochs: 100,
callbacks: {
onEpochEnd: (epoch, logs) => {
console.log(epoch, `RMSE : ${Math.sqrt(logs.loss)}`);
},
},
})
.then((info) => {
console.log(`${info.params.epochs} epochs end`);
// 기존의 데이터를 학습된 모델에 적용해보자
const predictedOutput = bostenPredictModel.predict(data);
predictedOutput.print();
// 그래서, weight와 bias가 얼마일까?
// weight. [[]] 꼴이라서 flatten도 해줬습니다.
console.log(bostenPredictModel.getWeights()); // [tensor, tensor] 반환. 첫번째가 weight, 두번재가 bias
console.log(bostenPredictModel.getWeights()[0].arraySync().flat(1)); // 인자가 13개이므로 weight도 각 인자마다 있음. 13개 나왔다.
// bias. [[]] 꼴이라서 flatten도 해줬습니다.
console.log(bostenPredictModel.getWeights()[1].arraySync().flat(1)); // bias
});
bostenPredictModel.save("file://bostonHousePriceModel");
// weight
[
0.12533149123191833,
0.2648714780807495,
-0.2906801402568817,
0.5849127769470215,
0.3225283622741699,
-0.028211046010255814,
-0.1197289228439331,
0.039950039237737656,
-0.166207954287529,
-0.4216156005859375,
-0.10838966816663742,
-0.12131930887699127,
0.3065573275089264
]
// bias
[ 0.09450627863407135 ]
2. 종속 변수가 n개 일 때 (단, n > 1)
y1 = w1 * x + w2 * x + w3 * x + .... + b1(bias)
y2 = p1 * x + p2 * x + p3 * x + .... + b2(bias)
const input = [
[0.00632, 18, 2.31, 0, 0.538, 6.575, 65.2, 4.09, 1, 296, 15.3, 396.9],
[0.02731, 0, 7.07, 0, 0.469, 6.421, 78.9, 4.9671, 2, 242, 17.8, 396.9],
];
const output = [
[4.98, 24],
[9.14, 21.6],
];
const data = tf.tensor(input);
const label = tf.tensor(output);
// 모델의 모양을 만듭니다.
const X = tf.input({ shape: [12] }); // lf 객체. 인자가 12개이므로 shape가 12
const Y = tf.layers.dense({ units: 2 }).apply(X); // lf 객체. 도출하고자 하는 값이 2개이므로 units이 2
const bostenPredictModel = tf.model({ inputs: X, outputs: Y }); // e 객체
bostenPredictModel.compile({
optimizer: tf.train.adam(),
loss: tf.losses.meanSquaredError,
});
bostenPredictModel
.fit(data, label, {
epochs: 100,
callbacks: {
onEpochEnd: (epoch, logs) => {
console.log(epoch, `RMSE : ${Math.sqrt(logs.loss)}`);
},
},
})
.then((info) => {
console.log(`${info.params.epochs} epochs end`);
// 기존의 데이터를 학습된 모델에 적용해보자
const predictedOutput = bostenPredictModel.predict(data);
predictedOutput.print();
// 그래서, weight와 bias가 얼마일까?
// weight. [[]] 꼴이라서 flatten도 해줬습니다.
console.log(bostenPredictModel.getWeights()); // [tensor, tensor] 반환. 첫번째가 weight, 두번재가 bias
console.log(bostenPredictModel.getWeights()[0].arraySync().flat(1)); // weight 12ro
// bias. [[]] 꼴이라서 flatten도 해줬습니다.
console.log(bostenPredictModel.getWeights()[1].arraySync().flat(1)); // bias 2개
});
bostenPredictModel.save("file://bostonHousePriceModel");
// weight
[
-0.2027554214000702, -0.11651809513568878,
0.26918986439704895, -0.7158120274543762,
-0.11411768943071365, 0.3003372848033905,
0.6883830428123474, 0.4574829638004303,
-0.12360836565494537, -0.12176607549190521,
0.4210634231567383, -0.23562391102313995,
-0.19957087934017181, -0.0455106757581234,
-0.03411664813756943, 0.32321736216545105,
-0.29748883843421936, 0.49638521671295166,
0.17137129604816437, 0.5320171117782593,
-0.3485310971736908, -0.033017393201589584,
-0.04199247434735298, 0.36597976088523865
]
// bias
[ -0.06923295557498932, -0.09571678191423416 ]
'🤖 ML in browser > 🧱 TensorFlow.js' 카테고리의 다른 글
deep learning POC (0) | 2021.01.08 |
---|---|
TensorFlow.js 찍먹하기 (0) | 2021.01.08 |