Завершить Flappy Bird(1) с помощью tf.js

искусственный интеллект глубокое обучение
Завершить Flappy Bird(1) с помощью tf.js

"Это 10-й день моего участия в ноябрьском испытании обновлений, ознакомьтесь с подробностями события:Вызов последнего обновления 2021 г."

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

<script src="https://cdn.jsdelivr.net/npm/p5@1.4.0/lib/p5.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.0.4/dist/tf.min.js"></script>

Обучение с подкреплением обычно используется в играх, чтобы позволить агентам играть в игры.Поскольку игровая среда относительно проста и фиксирована, она подходит для изучения обучения с подкреплением.

Идеи дизайна

Здесь мы разрабатываем нейронную сеть, входные данные — это не изображение, а данные изображения в виде вектора, и затем это может отражать информацию о состоянии текущей игры (5-мерный вектор, конкретная информация может относиться к входному содержимому ниже ), а затем пройти через скрытый слой (нейроны из 8 единиц составляют скрытый слой) и вывести вероятности повышения и понижения. проблема классификации

001.png

входить

  • птица y (координата y)
  • y vel (скорость по оси Y)
  • расстояние от верхней трубы до ближайшего верхнего положения трубы
  • Положение нижней трубы от ближайшей нижней трубы
  • х расстояние от трубы
let inputs = [];
inputs[0] = this.y / height;
inputs[1] = closest.top / height;
inputs[2] = closest.bottom / height;
inputs[3] = closest.x / width;
inputs[4] = this.velocity / 10;

002.png

На самом деле, идеально вводить изображение, а затем извлекать признаки изображения с помощью сверточной нейронной сети.

вывод

Выведите вероятность того, что два действия будут вниз и вверх соответственно.

  • вниз
  • вверх
if (output[0] > output[1]) {
    this.up();
}

Код

Импорт tensorflow.js

tf.memory()
{unreliable: true, reasons: Array(1), numTensors: 1000, numDataBuffers: 1000, numBytes: 66000}

Создать nn.js

this.brain = new NeuralNetwork(5, 8, 2);

Здесь конструктор получает 3 параметра как a, b, c, которые представляют количество входных, скрытых слоев и выходных узлов соответственно.

class NeuralNetwork{
    constructor(a,b,c){
        
    }
}
class NeuralNetwork{
    constructor(a,b,c){
        this.input_nodes = a;
        this.hidden_nodes = b;
        this.output_nodes = c;
    }
}

Определить модель

Далее создайте модельthis.createModel(), используемый для создания модели, здесь сtf.sequentialЧтобы создать контейнер последовательности, если вы использовали keras, вы должны быть знакомы с этим API.

class NeuralNetwork{
    constructor(a,b,c){
        this.input_nodes = a;
        this.hidden_nodes = b;
        this.output_nodes = c;

        this.createModel();
    }

    createModel(){
        this.model = tf.sequential()
    }
}

определить скрытый слой

    createModel(){
        this.model = tf.sequential();
        const hiddn = tf.layers.dense({
            units:this.hidden_nodes,
            inputShape:[this.input_nodes],
            activation:'sigmoid'
        })
        this.model.add(hiddn)
    }

Здесь скрытый слой определяется как полностью связанный слой,tf.layers.denseполучает объект,

  • Единицы: укажите количество нейронов в этом слое
  • inputShape: количество входных узлов
  • активация: укажите функцию активации

Если вы не знакомы с нейронными сетями, функция активации заключается в добавлении нелинейных преобразований между слоями нейронной сети.

Определите выходной слой

const output = tf.layers.dense({
    units:this.output_nodes,
    activation:'softmax'
});
this.model.add(output)

предсказывать

Во время прогнозирования компоненты необходимы для преобразования объектов массива JavaScript в тензорные тензоры тензорного потока,

predict(inputs){
    const xs = tf.tensor2d([inputs]);
    const ys = this.model.predict(xs);
    const outputs = ys.dataSync();
    console.log(outputs);
    return outputs;

}