Früher oder später muss dies geschehen
Früher oder später wird der Front-End-Entwickler es leid, mit seinen Frameworks zu spielen, seine Kollegen zu belästigen - das Backend, es wird müde, Devops zu spielen, und er beginnt, sich mit maschinellem Lernen zu befassen, Daten sind Wissenschaft und das ist alles. Glücklicherweise trägt jeder zweite Kurs für diejenigen, die die Website betreten möchten, dazu bei und schreit auf allen Plattformen, wie einfach es ist. Auch ich hatte es satt, Daten aus der Datenbank in die API und dann von der API in Tabellen und Formulare zu übertragen, und beschloss, einen Kurzurlaub zu machen und meine Frontend-Fähigkeiten im maschinellen Lernen anzuwenden. Glücklicherweise gibt es Leute wie Daniel Shiffman und Charlie Gerard , die durch ihr Beispiel helfen, nicht aufzuhören, was sie begonnen haben, nachdem sie die ersten Seiten mit mathematischen Formeln gesehen haben.
Wenn wir ein wenig zurückgehen und uns den Titel ansehen, werden wir sehen, dass ich nicht aus Büchern kopieren und High-Tech-Wörter werfen werde, um zu erklären, was ich getan habe.
Ich bin mir fast sicher, dass sich jeder, der den Ausdruck „maschinelles Lernen“ hört, ein Bild vorstellt, in dem viele, viele Neuronen in mehreren Schichten und alle miteinander verflochten sind. Das ist also kein Zufall. Genau aus diesem Grund wurde maschinelles Lernen konzipiert, um das menschliche Gehirn und seine neuronalen Netze in digitaler Form zu implementieren.
? , . , , . - , , , . , , .
. , , - , . - () .
, ? , - , ( , , ).
- , - . .
- . . . .
“ ” - , , , , .
, . , , , . , -, , .
, , . , 0.1*X1 (W1 == 0.1) X1. (, , , , , , -1 1). , 10 . , , 1*X2 (W2 == 1).
, . , .
, , -? , ( - ). f() = . - input , - output , f, - .
, . input X output . , - , , , , .
, , , , - i .
label . , , - 3, label = “ ”, , . , , , .
. “ !” . -, , , ?
, . , ?
thecodingtrain, . , .
, . .
, , ( ). .
? , . - , . . . , , .
, . score, .
. , , () , , , , . , , , .
, , , raid shadow legends. dino game google chrome. , , ?
Dino game
p5.js. , , . 5 : setup, , ; draw - , , .
? , , , . , , .
- , , . . .
class Cactus {
constructor() {}
}
class Dino {
constructor() {}
}
, - - ( - , ), . ? , , , - GameObject, onTick, . , , . .
...
onTick(cb = () => { }) {
cb(this);
}
...
, , . , , , .
(, , ). , . , : - , , , , , , . , , .
switch (this.state) {
case DinoStateEnum.run: break;
case DinoStateEnum.jump: {
this.currH += this.jumpSpeed;
if (this.currH == this.maxH) {
this.state = DinoStateEnum.fall;
}
break;
}
case DinoStateEnum.fall: {
this.currH -= this.jumpSpeed;
if (this.currH == 0) {
this.state = DinoStateEnum.run;
}
break;
}
}
, . , . . .
function updateCactuses() {
const copy = cactuses.slice();
for (let i = 0; i < copy.length; i++) {
let c = copy[i];
c.onTick(cactus => {
drawCactus(cactus)
cactus.currDistance -= dinoVelocitySlider.value();
if (cactus.currDistance + cactusW < initialDinoW && !cactus.passDinoPosition) {
updateDinoScore()
cactus.passDinoPosition = true;
}
if (cactus.currDistance < 0) {
cactuses.splice(i, 1);
}
})
}
}
tensorflowjs , - . , . .
<script
src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@2.0.0/dist/tf.min.js">
</script>
<script>
tf.setBackend('cpu') // tf
</script>
, ? . : . , ?
, . , , . - . , . , , , . , .
, . . , . , ?
, - . , , . ( , , , ).
, , . ? .
? - 200-300 , . , (best score) , , . , . . ().
, , , .
.
- .
C - .
- , .
, :
T .
.
.
, .
4 .
8 . 2, : .
:
createModel() {
const model = tf.sequential();
const hiddenLayer = tf.layers.dense({
units: this.hidden_nodes, // - (8)
inputShape: [this.input_nodes], // - (4)
activation: "sigmoid" //
});
model.add(hiddenLayer);
const outputLayer = tf.layers.dense({
units: this.output_nodes, // - (2)
activation: "sigmoid"
});
model.add(outputLayer);
return model;
}
sequential() . , . - , . . , sigmoid.
, , - , tensorflow .
, . , .
predict(inputs) {
return tf.tidy(() => {
const xs = tf.tensor([inputs]); // ( )
const ys = this.model.predict(xs); //
const output = ys.dataSync(); //
return output;
});
}
tensorflow , tensor ( ) , , , , tidy.
, tensorflow , , . , , . ( , ). 2, 2 . , , , , . , output[0] > output[1], .
dino npc.
- , , .
, - .
function drawDino(dino) {
if (dino.isDead) return;
if (dino.state != DinoStateEnum.run) {
// ,
image(dino2, initialDinoW, initialDinoH - dino.currH, dinoW, dinoH); // 5
} else if (iteration % 7 == 0)
//
image(dino1, initialDinoW, initialDinoH, dinoW, dinoH);
else
image(dino2, initialDinoW, initialDinoH, dinoW, dinoH);
}
. , , , , , . .
function updateGenerationIfNeeded() {
if (dinos.every(d => d.isDead)) {
cactuses = [];
dinoVelocitySlider.value(initDinoVelocity);
dinos = newGeneration(dinos)
}
}
, , . , . .
, , . , .
: .
mutate(rate) {
tf.tidy(() => {
const weights = this.model.getWeights(); //
const mutatedWeights = [];
for (let i = 0; i < weights.length; i++) {
let tensor = weights[i]; // -
let shape = weights[i].shape;
let values = tensor.dataSync().slice();
for (let j = 0; j < values.length; j++) {
if (Math.random() < rate) { //
let w = values[j];
values[j] = w + this.gaussianRandom(); // -1 1
}
}
let newTensor = tf.tensor(values, shape);
mutatedWeights[i] = newTensor;
}
this.model.setWeights(mutatedWeights); //
});
}
, . . e . fitness ( ).
const calculateFitness = (dinos) => {
let sum = 0;
dinos.map(d => sum += d.score)
dinos.map(d => d.fitness = d.score / sum)
}
. . ( ), , .
:
const pickOne = (dinos) => { // fitness
let index = 0;
let r = Math.random();
while (r > 0) {
r = r - dinos[index].fitness;
index++;
}
index--;
let dino = dinos[index] // - , rate
const dinoBrain = dino.brain.copy();
dinoBrain.mutate(0.2) //
let newDino = new Dino(dinoBrain) //
return newDino;
}
. , . , , .
for (let i = 0; i < TOTAL; i++) {
newDinos.push(pickOne(oldDinos));
}
console.log(currentGeneration++);
return newDinos;
P.S. , welcome to PR's. v_hadoocken