Demo entry 6637642

Musik-Generator

   

Submitted by anonymous on Sep 04, 2017 at 17:54
Language: PHP. Code size: 10.4 kB.

<?php
    $anzahl_lstm_neuronen = 256;
    $anzahl_ebenen = 4;
    $anzahl_trainings_einheiten = 1000;
    $lern_rate = 0.01;
    $sequenz_laenge = 400;


    set_time_limit(0);
    $trainings_daten = implode("\n", file("input.txt"));
    $woerterbuch = array_flip(array_values(array_unique(str_split($trainings_daten))));



    function zu_one_hot($string, $woerterbuch) {
        $beispiel_one_hot = array_fill(0, sizeof($woerterbuch), 0);
        $one_hot = array_fill(0, strlen($string), $beispiel_one_hot);
        for ($i = 0; $i < strlen($string); $i = $i + 1) {
            $stelle_mit_neuem_wert = $woerterbuch[$string[$i]];
            $one_hot[$i][$stelle_mit_neuem_wert] = 1;
        }
        return $one_hot;
    }

    function daten_in_richtiger_groesse_bekommen($trainings_daten, $woerterbuch, $sequenz_laenge, $anfang, $y=False) {
        $anfang = $anfang % sizeof($trainings_daten);
        if (($anfang + $sequenz_laenge) > (sizeof($trainings_daten) - 1)) {
            $anfang = 0;
        }
        $string = "";
        for ($i = 0; $i < $sequenz_laenge; $i = $i + 1) {
            if ($y) {
                $string = $string . $trainings_daten[$anfang + $i + 1];
            } else {
                $string = $string . $trainings_daten[$anfang + $i];
            }
        }
        return zu_one_hot($string, $woerterbuch);
    }

    function sigmoid($x, $steigung=False) {
        if (is_array($x)) {
            $ausgabe_array = array();
            for ($i=0; $i < sizeof($x);$i = $i + 1) {
                $ausgabe_array[$i] = sigmoid($x[$i]);
            }
            return $ausgabe_array;
        } else {
            if ($steigung) {
                return $x * (1 - $x);
            } else {
                return 1 / (1 + pow(M_E, -$x));
            }
        }
    }

    function softmax($x, $steigung=False) {
        if ($steigung) {
            $ergebnisse = array();
            for ($i = 0; $i < sizeof($x); $i = $i + 1) {
                $ergebnisse[$i] = $x[$i] * (1 - $x[$i]);
            }
        } else {
            $summe = 0;
            $ergebnisse = array();
            for ($i = 0; $i < sizeof($x); $i = $i + 1) {
                $ergebnisse[$i] = pow(M_E, $x[$i]);
                $summe = $summe + $ergebnisse[$i];
            }
            for ($i = 0; $i < sizeof($x); $i++) {
                $ergebnisse[$i] = $ergebnisse[$i] / $summe;
            }
        }
        return $ergebnisse;
    }

    function ergebnis_berechnen($x, $m, $b, $lstm, $softmax=False) {
        $ergebnis = array_fill(0, sizeof($m[0]), 0);
        for ($i = 0; $i < sizeof($m[0]); $i = $i + 1) {
            for ($i2 = 0; $i2 < sizeof($x); $i2 = $i2 + 1) {
                $ergebnis[$i] = $ergebnis[$i] + $x[$i2] * $m[$i2][$i];
            }
            if (!$softmax) {
                $ergebnis[$i] = sigmoid($ergebnis[$i] + $b[$i] + $lstm[$i] * $m[sizeof($m) - 1][$i]);
            }
        }
        if (!$softmax) {
            return $ergebnis;
        } else {
            return softmax($ergebnis);
        }
    }

    function lstm_berechnen($x, $m) {
        $ergebnis = array_fill(0, sizeof($m[0]), 0);
        for ($i = 0; $i < sizeof($m[0]); $i = $i + 1) {
            for ($i2 = 0; $i2 < sizeof($x); $i2 = $i2 + 1) {
                $ergebnis[$i] = $ergebnis[$i] + $x[$i2] * $m[$i2][$i];
            }
        }
        return $ergebnis;
    }

    function fehler_berechnen($y, $y_, $durchschnitt=False) {
        if ($durchschnitt) {
            $fehler = 0;
            for ($i = 0; $i < sizeof($y); $i = $i + 1) {
                $fehler = $fehler + abs($y_[$i] * log($y[$i]));
            }
            return $fehler / sizeof($y);
        } else {
            if (is_array($y_[0])) {
                $fehler = array_fill(0, sizeof($y_), 0);
                for ($i = 0; $i < sizeof($y_); $i = $i + 1) {
                    for ($i2 = 0; $i2 < sizeof($y); $i2 = $i2 + 1) {
                        $fehler[$i] = $fehler[$i] + $y[$i2] * $y_[$i][$i2];
                    }
                }
            } else {
                $fehler = array();
                for ($i = 0; $i < sizeof($y); $i = $i + 1) {
                    $fehler[$i] = $y_[$i] * log($y[$i]);
                }
            }
            return $fehler;
        }
    }

    $ebenen = array();
    $lstm = array("alte_versteckte_zustaende" => array_fill(0, $anzahl_ebenen, array_fill(0, $anzahl_lstm_neuronen, 0)), "versteckte_zustaende" => array_fill(0, $anzahl_ebenen, array_fill(0, $anzahl_lstm_neuronen, 0)), "steigungen" => array_fill(0, $anzahl_ebenen - 1, array_fill(0, $anzahl_lstm_neuronen, array_fill(0, $anzahl_lstm_neuronen, 1))), "m" => array_fill(0, $anzahl_ebenen - 1, array_fill(0, $anzahl_lstm_neuronen, array_fill(0, $anzahl_lstm_neuronen, 1))));

    for ($i = 0; $i < $anzahl_ebenen; $i = $i + 1) {
        if ($i == 0) {
            $ebenen[0] = array("m" => array_fill(0, sizeof($woerterbuch), array_fill(0, $anzahl_lstm_neuronen, 1)), "b" => array_fill(0, $anzahl_lstm_neuronen, 0));
        } elseif ($i == ($anzahl_ebenen - 1)) {
            $ebenen[$i] = array("m" => array_fill(0, $anzahl_lstm_neuronen, array_fill(0, sizeof($woerterbuch), 1)), "b" => array_fill(0, sizeof($woerterbuch), 0));
        } else {
            $ebenen[$i] = array("m" => array_fill(0, $anzahl_lstm_neuronen, array_fill(0, $anzahl_lstm_neuronen, 1)), "b" => array_fill(0, $anzahl_lstm_neuronen, 0));
        }
    }
    $anfang = 0;
    for ($trainings_schritt = 0; $trainings_schritt < $anzahl_trainings_einheiten; $trainings_schritt = $trainings_schritt + 1) {
        $x = daten_in_richtiger_groesse_bekommen($trainings_daten, $woerterbuch, $sequenz_laenge, $anfang);
        $y_ = daten_in_richtiger_groesse_bekommen($trainings_daten, $woerterbuch, $sequenz_laenge, $anfang);
        for ($sequenz = 0; $sequenz < $sequenz_laenge; $sequenz = $sequenz + 1) {
            $ergebnisse = array();
            $steigungen = array();
            $fehler = array();

            for ($i = 0; $i < sizeof($ebenen); $i = $i + 1) {
                if ($i == 0) {
                    $ergebnisse[0] = ergebnis_berechnen($x[$sequenz], $ebenen[0]["m"], $ebenen[0]["b"], $lstm["versteckte_zustaende"][0]);
                    $lstm["alte_versteckte_zustaende"][0] = $lstm["versteckte_zustaende"][0];
                    $lstm["versteckte_zustaende"][0] = lstm_berechnen($ergebnisse[0], $lstm["m"][0]);
                    $steigungen[$i] = sigmoid($ergebnisse[$i], True);
                } elseif ($i == sizeof($ebenen) - 1) {
                    $ergebnisse[$i] = ergebnis_berechnen($ergebnisse[$i - 1], $ebenen[$i]["m"], $ebenen[$i]["b"], $lstm["versteckte_zustaende"][$i], True);
                    $steigungen[$i] = softmax($ergebnisse[$i], True);

                } else {
                    $ergebnisse[$i] = ergebnis_berechnen($ergebnisse[$i - 1], $ebenen[$i]["m"], $ebenen[$i]["b"], $lstm["versteckte_zustaende"][$i]);
                    $lstm["alte_versteckte_zustaende"][$i] = $lstm["versteckte_zustaende"][$i];
                    $lstm["versteckte_zustaende"][$i] = lstm_berechnen($ergebnisse[$i], $lstm["m"][$i]);
                    $steigungen[$i] = sigmoid($ergebnisse[$i], True);
                }
            }

            $anpassung = array();
            for ($ebene = sizeof($ebenen) - 1; $ebene > -1; $ebene = $ebene - 1) {
                if ($ebene == sizeof($ebenen) - 1) {
                    $fehler[$ebene] = fehler_berechnen($ergebnisse[$ebene], $y_[$sequenz]);
                } else {
                    $fehler[$ebene] = fehler_berechnen($anpassung, $ebenen[$ebene + 1]["m"]);
                }
                for ($i = 0; $i < sizeof($ebenen[$ebene]["m"][0]); $i = $i + 1) {
                    $anpassung[$i] = $fehler[$ebene][$i] * $steigungen[$ebene][$i] * $lern_rate;
                    for ($i2 = 0; $i2 < sizeof($ebenen[$ebene]["m"]); $i2 = $i2 + 1) {
                        if ($ebene == 0) {
                            $ebenen[$ebene]["m"][$i2][$i] = $ebenen[$ebene]["m"][$i2][$i] + $anpassung[$i] * $x[$sequenz][$i2];
                        } else {
                            $ebenen[$ebene]["m"][$i2][$i] = $ebenen[$ebene]["m"][$i2][$i] + $anpassung[$i] * $ergebnisse[$ebene - 1][$i2];
                        }
                        if ($ebene != 3) {
                            $lstm["m"][$ebene][$i2][$i] = $lstm["m"][$ebene][$i2][$i] + $anpassung[$i] * $lstm["alte_versteckte_zustaende"][$ebene][$i2];
                        }
                    }
                }
                for ($i = 0; $i < sizeof($ebenen[$ebene]["b"]); $i = $i + 1) {
                    $ebenen[$ebene]["b"][$i] = $ebenen[$ebene]["b"][$i] + $anpassung[$i];
                }
            }
            $lstm["versteckte_zustaende"] = array_fill(0, $anzahl_ebenen, array_fill(0, $anzahl_lstm_neuronen, 0));
            if (($sequenz + 1) % 1 == 0) {
                echo "Sequenz " . ($sequenz + 1) . " von $sequenz_laenge von Schritt ". ($trainings_schritt + 1) . " von " . $anzahl_trainings_einheiten. " mit Fehlerwert: " . fehler_berechnen($ergebnisse[sizeof($ebenen) - 1], $y_[$sequenz], True) . " erfolgreich durchgef&uuml;hrt.<br>";
            }
            $anfang = $anfang + $sequenz_laenge;
        }
        echo "Schritt " . ($trainings_schritt + 1) . " wurde erfolgreich durchgef&uuml;hrt.<br>";
    }
    for ($i = 0; $i < sizeof($ebenen); $i = $i + 1) {
        if ($i == 0) {
            $ergebnisse[0] = ergebnis_berechnen(zu_one_hot("X", $woerterbuch)[0], $ebenen[0]["m"], $ebenen[0]["b"], $lstm["versteckte_zustaende"][0]);
            $lstm["versteckte_zustaende"][0] = $ergebnisse[0];
        } elseif ($i == sizeof($ebenen) - 1) {
            $ergebnisse[$i] = ergebnis_berechnen(zu_one_hot("X", $woerterbuch)[0], $ebenen[0]["m"], $ebenen[0]["b"], $lstm["versteckte_zustaende"][$i], True);
        } else {
            $ergebnisse[$i] = ergebnis_berechnen($ergebnisse[$i - 1], $ebenen[$i]["m"], $ebenen[$i]["b"], $lstm["versteckte_zustaende"][$i]);
            $lstm["versteckte_zustaende"][$i] = $ergebnisse[$i];
        }
    }
    var_dump($ergebnisse);
?>

This snippet took 0.02 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).