본문으로 바로가기

독립변수가 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

darren, dev blog
블로그 이미지 DarrenKwonDev 님의 블로그
VISITOR 오늘 / 전체