[PYTHON] BigTransfer (BiT) Feinabstimmung

Von hier aus werden die für die BiT-Feinabstimmung erforderlichen Informationen (der Ort, den ich beim Spielen verwendet / untersucht habe) extrahiert und auf Japanisch zusammengefasst.

Text

Modellname Datensatz
BiT-S ILSVRC-2012 (1.3M images)
BiT-M ImageNet-21k (14M images)
BiT-L JFT (300M images)
ResNet Anzahl der Parameter (ungefähre Anzahl)
R50x1 23M
R101x1 42M
R50x3 211M
R101x3 381M
R152x4 928M

Der folgende Code bestätigt die Anzahl der Parameter.

import tensorflow as tf
import tensorflow_hub as tfhub
model = tfhub.KerasLayer('https://tfhub.dev/google/bit/s-r50x1/1')
print(sum(tf.math.reduce_prod(w.shape).numpy() for w in model.weights))

BiT-HyperRule

Eine heuristische Methode zur Feinabstimmung von BiT. "Wenn Sie dies verwenden, werden Sie sich auf einen Schlag gut fühlen."

Natürlich kann eine Hyper-Parameter-Suche Ihnen ein besseres Modell liefern. Es ist die Kosten wert.

Abhängig von der Bildgröße des Datensatzes → Größe ändern, Schnittgröße

Ändern Sie die Größe und schneiden Sie sie zufällig auf die angegebene Größe mit der Bildgröße des Datensatzes zu. Die Korrespondenztabelle stammt aus dem offiziellen Blog Table1. BigTransfer (BiT): State-of-the-art transfer learning for computer vision; Table1 Fügen Sie gleichzeitig zufällig eine Links-Rechts-Umkehrung ein. Sie müssen nur die Größe der Validierungsdaten ändern.

Ich frage mich, ob TF2 eine solche Atmosphäre haben wird.

def augmentation(image, label):
    image = tf.cast(image, tf.float32) / 255.0
    image = tf.image.resize(image, [512, 512], method=tf.image.ResizeMethod.BILINEAR)
    image = tf.image.random_flip_left_right(image)
    image = tf.image.random_crop(image, [480, 480, 3])
    return image, label

ds_train: tf.data.Dataset
ds_train = (ds_train
            .shuffle(1024)
            .repeat()
            .map(augmentation, tf.data.experimental.AUTOTUNE)
            .batch(64)
            .prefetch(tf.data.experimental.AUTOTUNE))

Note

――Ich denke, die Bildgröße ist möglicherweise spärlich ... ――Ich habe den öffentlichen Quellcode gelesen, aber die Größe wurde einheitlich geändert, sodass Sie sich darüber keine Sorgen machen müssen. ――Wenn Sie sich nur um einen Teil Sorgen machen, filtern Sie ihn heraus. (Ich habe versucht, es in der Bonusprobe zu entfernen)

--Datenerweiterung, die je nach Aufgabe nicht durchgeführt wird, da sie sich vom richtigen Antwortetikett unterscheidet. --Zählen von Objekten ⇒ Zufälliges Zuschneiden ist NG

Abhängig von der Anzahl der Datensatzproben → Anzahl der Lernschritte, Verwechslung

Zitiert aus dem offiziellen Blog Tabelle 2. BigTransfer (BiT): State-of-the-art transfer learning for computer vision; Table2

"Grenzen" wird für die nachfolgende Planung der Lernrate verwendet.

if dataset_size < 20 * 10 ** 3:
    schedule_len, boundaries = 500, [200, 300, 400]
elif 20 * 10 ** 3 <= dataset_size < 500 * 10 ** 3:
    schedule_len, boundaries = 10000, [3000, 6000, 9000]
else:
    schedule_len, boundaries = 20000, [6000, 12000, 18000]

Wie MixUp

Referenz: https://github.com/google-research/big_transfer/blob/master/input_pipeline_tf2_or_jax.py#L118

import tensorflow_probability as tfp

def mixup(image, label):
    beta_dist = tfp.distributions.Beta(0.1, 0.1)  # alpha=0.1
    beta = tf.cast(beta_dist.sample([]), tf.float32)
    image = (beta * image + (1 - beta) * tf.reverse(image, axis=[0]))
    label = (beta * label + (1 - beta) * tf.reverse(label, axis=[0]))
    return image, label

Ändern Sie die Argumente entsprechend. Für diese Funktion ist der Zeitpunkt für die Anpassung an den Datensatz ** nach dem Mini-Batch batch () **.

Da MixUp beteiligt ist, sollte das Label ein One-Hot-Vektor sein.

Übrigens wird der obige Code durch "tf.reverse" mit einem Datensatz verwechselt, der sich symmetrisch von der Mitte im Stapel befindet. Unten finden Sie ein Beispiel für 16 Chargen. Es ist oben links [0] und unten rechts [15] verwechselt. MixUp Cat-Dog

Chargengröße = 512

Wenn kein Speicher möglich ist, können Sie ihn verringern.

Im TF2-Beispielcode werden die Lernrate und die Anzahl der Schritte entsprechend der Stapelgröße angepasst. ・ ・ In anderen Beispielen wird dies jedoch nicht durchgeführt. Ich habe die Anzahl der Schritte beim Ändern der Lernrate nicht geändert, bin mir aber nicht sicher, warum.

batch_size = 64
schedule_len = schedule_len * 512 / batch_size
lr = 0.003 * batch_size / 512

Optimierungsalgorithmus = SGD

Die Lernrate ist der Anfangswert. Die folgende Planung wird durchgeführt, um die Lernrate während des Lernens zu ändern.

Planung der Lernrate

Wenn der Lernfortschritt 30%, 60%, 90% der Gesamtzahl erreicht, wird die Lernrate um $ \ frac {1} {10} $ abgeschwächt.

Im offiziellen Beispielcode ist er nicht streng durch 30%, 60%, 90% getrennt. Wenn beispielsweise die Anzahl der Proben weniger als 20.000 beträgt, beträgt sie 0,003 bis zu 200 Schritten und 0,0003 zwischen 201 und 300 Schritten.

lr_schedule = tf.keras.optimizers.schedules.PiecewiseConstantDecay(
    boundaries=boundaries, values=[lr, lr * 1e-1, lr * 1e-2, lr * 1e-3])

optimizer = tf.keras.optimizers.SGD(learning_rate=lr_schedule, momentum=0.9)

Bonus

Jupyter Notebook beim Spielen mit Cats vs Dogs, das anhand des Beispielcodes verfeinert wurde.

Recommended Posts

BigTransfer (BiT) Feinabstimmung
Verschiedene Feinabstimmungen mit Mobilenet v2
[Kaggle] Klassifizieren Sie Darmkrebs [Feinabstimmung]
[PyTorch] CPU vs. GPU vs. TPU [Feinabstimmung]
Ich habe versucht, CNN mit Resnet fein abzustimmen