Offizieller Blog https://blog.tensorflow.org/2020/05/bigtransfer-bit-state-of-art-transfer-learning-computer-vision.html
Offizieller Beispielcode (TF2, PyTorch, JAX) https://github.com/google-research/big_transfer/tree/master/colabs
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.
** URL, unter der Sie auf das vorab trainierte Modell verweisen und es erhalten können ** Die Formate h5 und npz werden im Cloud-Bucket gespeichert. Es kann anders als TF verwendet werden.
TensorFlow Hub
https://tfhub.dev/google/collections/bit/1
Cloud bucket
https://storage.googleapis.com/bit_models/
Die Bedeutung von ** S, M, L ** für das BiT-Modell ⇒ Unterschiede in trainierten Datensätzen. ** L ** ist privat.
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.
Ä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. 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
Zitiert aus dem offiziellen Blog Tabelle 2.
"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]
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.
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
Die Lernrate ist der Anfangswert. Die folgende Planung wird durchgeführt, um die Lernrate während des Lernens zu ändern.
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)
Jupyter Notebook beim Spielen mit Cats vs Dogs, das anhand des Beispielcodes verfeinert wurde.