Ich werde Ihnen zeigen, wie Sie den zufälligen Startwert mit Tensorflow 2.x
( tf.keras
) reparieren.
Den für den Test verwendeten Code finden Sie hier (https://github.com/tokusumi/tf-keras-random-seed).
Bei der Entwicklung des maschinellen Lernens gibt es Anforderungen wie "Ich möchte das Lernen reproduzierbar machen" und "Ich möchte den Anfangswert des Modells zum Testen festlegen". Da der Unterschied im Anfangswert des Gewichts das Lernergebnis beeinflusst, scheint die Festlegung des Anfangswertes zur Lösung dieser Probleme beizutragen.
Zufallszahlen werden verwendet, um den Anfangswert des Gewichts zu generieren. Zufallszahlen werden basierend auf Zufallszahlen-Seeds generiert. Standardmäßig verfügt TensorFlow über einen variablen zufälligen Startwert. Daher wird jedes Mal ein Modell mit einem anderen Anfangswert generiert. Daher möchten wir diesmal die Reproduzierbarkeit verbessern, indem wir den Zufallszahlen-Seed festlegen.
Zusätzlich zu TensorFlow korrigieren wir auch die Startwerte für die integrierten Funktionen von NumPy und Python. Zusammenfassend können die folgenden festen Zufallszahlenfunktionen implementiert werden.
import tensorflow as tf
import numpy as np
import random
import os
def set_seed(seed=200):
tf.random.set_seed(seed)
# optional
# for numpy.random
np.random.seed(seed)
# for built-in random
random.seed(seed)
# for hash seed
os.environ["PYTHONHASHSEED"] = str(seed)
Es wird wie folgt verwendet. Wenn jedoch der feste zufällige Startwert von TensorFlow ausreicht, ersetzen Sie "set_seed" durch "tf.random.set_seed".
set_seed(0)
toy_model = tf.keras.Sequential(
tf.keras.layers.Dense(2, input_shape=(10,))
)
#Einige Verarbeitung...
#Reproduzieren Sie das Modell
set_seed(0)
reproduced_toy_model = tf.keras.Sequential(
tf.keras.layers.Dense(2, input_shape=(10,))
)
reproduced_toy_model
hat den gleichen Anfangswert (des Gewichts) wie das zuvor generierte Modell toy_model
. Mit anderen Worten, es wurde reproduziert.
Wenn Sie "set_seed" nicht verwenden, haben "reproducible_toy_model" und "toy_model" völlig unterschiedliche Anfangswerte, was die Reproduzierbarkeit beeinträchtigt.
Zusätzlich zu tf.keras.Sequential
können Sie auch die Functional API und SubClass verwenden.
Lassen Sie uns herausfinden, wie Sie den zufälligen Startwert (set_seed
) ein wenig mehr korrigieren können.
tf.random.set_seed
Das Verhalten von tf.random.set_seed
braucht ein wenig Aufmerksamkeit.
Versuchen Sie nach der Verwendung von "tf.random.set_seed" zunächst, eine Funktion zu verwenden, die Zufallszahlen ("tf.random.uniform": Zufallsstichprobenwerte aus einer gleichmäßigen Verteilung) mehrmals verwendet.
tf.random.set_seed(0)
tf.random.uniform([1]) # => [0.29197514]
tf.random.uniform([1]) # => [0.5554141] (Verschiedene Werte!)
tf.random.uniform([1]) # => [0.1952138] (Verschiedene Werte!!)
tf.random.uniform([1]) # => [0.17513537](Verschiedene Werte!!!)
Für jeden wurden unterschiedliche Werte ausgegeben. Es scheint, dass es keine Reproduzierbarkeit gibt, wie sie ist. Verwenden Sie jedoch erneut "tf.random.set_seed" wie folgt.
tf.random.set_seed(0)
tf.random.uniform([1]) # => [0.29197514](A)
tf.random.uniform([1]) # => [0.5554141] (B)
tf.random.set_seed(0)
tf.random.uniform([1]) # => [0.29197514](Reproduktion von A.)
tf.random.uniform([1]) # => [0.5554141] (Reproduktion von B.)
Auf diese Weise wird die Ausgabe beginnend an der Stelle reproduziert, an der "tf.random.set_seed" aufgerufen wird (obwohl "tf.random.uniform" eine Funktion ist, die einen Wert zufällig ausgibt).
Wenn Sie beispielsweise "tf.random.set_seed" aufrufen, bevor Sie eine Modellinstanz erstellen (mithilfe der sequentiellen, funktionalen API oder Unterklasse), hat das generierte Modell jedes Mal den gleichen Anfangswert.
TensorFlow verfügt über Ebenen und Funktionen, mit denen Sie Seed als Argument übergeben können.
Ich denke jedoch, dass die explizite Angabe des Initialisierungsarguments, das an Layer oder Layer übergeben werden soll, keine sehr realistische Methode ist, wenn das Modell wächst.
Darüber hinaus gibt es einige, die nur dann gut funktionieren, wenn das diesmal eingeführte tf.random.set_seed
zusammen verwendet wird.
Selbst wenn es nur wenige Stellen gibt, die Sie reparieren möchten, versuchen Sie es zuerst mit "tf.random.set_seed".
In TensorFlow 2.x (tf.keras) können Sie "tf.random.set_seed" verwenden, um den zufälligen Startwert zu korrigieren.
Insbesondere wird es möglich sein, jedes Mal ein Modell mit demselben anfänglichen Gewichtswert zu erzeugen, so dass eine Verbesserung der Reproduzierbarkeit erwartet werden kann.
Ref