Как отладить модель tennsflow.js, которая не изучается, с обучением самообслуживанию в браузере, контекст webgl потерял возможный обгорание ноутбука - PullRequest
0 голосов
/ 26 июня 2019

Я хочу создать ИИ, который будет хорошо играть в сокобан, я использую MCTS и нейронные сети, вдохновленные LeelaZero . Я использую tenorflow.js для самостоятельной игры и тренировок, так что это легко, и я могу отлаживать и учиться быстрее. Вот краткий обзор моего кода:

function loadWeights() {
  return tf.loadLayersModel('indexeddb://model');
}

function saveWeights(model) {
  model.save("indexeddb://model");
}

function MakeNetwork() {
  const hiddenNodes = 8,
        inputNodes = 58;

  return tf.sequential({
    layers: [
      tf.layers.conv2d({
        filters: 128,
        kernelSize: 3,
        strides: 1,
        activation: 'relu',
        inputShape: [inputNodes, 8, 8],
      }),
      tf.layers.conv2d({
        filters: 256,
        kernelSize: 3,
        strides: 1,
        activation: 'relu',
      }),
      tf.layers.conv2d({
        filters: 256,
        kernelSize: 3,
        strides: 1,
        activation: 'relu',
      }),
      tf.layers.flatten(),
      tf.layers.dense({
        units: 100,
        activation: 'relu'
      }),
      tf.layers.dense({
        units: 4,
        activation: 'softmax'
      })
    ]
  });
}

const kInputPlanes = 58;

function train(model, data) {
  model.compile({
    optimizer: 'sgd',
    loss: 'meanSquaredError',
    metrics: ['accuracy']
  });

  let xsBuffer = tf.buffer([data.length, kInputPlanes, 8, 8]);

  fillWithData(xsBuffer.values, data);

  xsBuffer = xsBuffer.toTensor();


  let xs,
      vYs = fillWithData(data);

  xs = xsBuffer.reshape([-1, kInputPlanes, 8, 8]),
  vYs = tf.tensor1d(vYs);

  return model.fit(xs, vYs).then(hs => {
    saveWeights(model);
  });

}

function Network(model) {

  let output;

  this.compute = (data) => {
    const buffer = tf.buffer([data.length, kInputPlanes, 8, 8]);

    fillWithData(buffer.values);

    let xs = buffer.toTensor();
    xs = xs.reshape([-1, kInputPlanes, 8, 8]);

    output = model.predict(input);
  }

  this.predict = (sample) => {
    output.dataSync()[sample);
  };
}


function Search(model) {
  const tree = {},
        data = {},
        network = new Network(model);

  this.run = () => {
    makeData(data);
    network.compute(data);
    const prediction = network.predict(0);
    tree = improveTree(prediction);
  };

  this.getTrainingData = () => {
    return makeTrainingData(tree);
  };

}


function MainApi() {
  loadWeights().catch(e => {
    saveWeights(weights);
  });

  return {
    train() {
      return loadWeights().then(model => {
        const data = getTrainingData();
        return train(model, data);
      });
    },
    selfPlay() {
      loadWeights().then(model => {
        const search = new Search(model);
        search.run();
        const data = search.getTrainingData();
        writeTrainingData(data);
      });
    }
  };
}

Проблема в том, что ИИ не учится, и я не могу отладить свой прогресс. Я вижу, что MCTS работает, видя, что ИИ избегает простых потерь позиций, но часть нейронной сети не работает. ИИ не становится лучше.

Что может быть не так с моим кодом, и как я могу отладить мой прогресс?

Кроме того, это занимает много времени для самостоятельной игры и тренировок, в основном я устанавливаю порог в 30 секунд на ход и играю в 100 игр, для завершения требуется не менее 15 минут. Тогда тренировка тоже занимает 10-15 минут. Иногда я получаю webgl context lost ошибка. Я беспокоюсь, что мой ноутбук сломается.

Опасно ли постоянно использовать мой ноутбук для этих вычислений в браузере, как если бы мой ноутбук был поврежден?

...