Letztes Mal zeigte den Umriss und das Generierungsergebnis. Dieses Mal werde ich die Änderungen gegenüber der offiziellen Implementierung von StyleGAN2 vorstellen, um tatsächlich mit GTX1070 arbeiten zu können.
Das trainierte Modell wurde aus verschiedenen Gründen weggeblasen, deshalb möchte ich das auch zur Kenntnis nehmen!
Offizielle Implementierung von StyleGAN2
Ich habe tatsächlich mit run_training.py und training / dataset.py rumgespielt.
Die Modelldaten sind ungefähr 300 MB groß, was ziemlich schwer ist. Wenn Sie also die Speicherfrequenz nicht berücksichtigen, wird die Kapazität knapp und das Lernen endet. In meinem Fall hörte das Lernen in der Mitte auf und ich hatte es so eingestellt, dass es das Modell überschrieb, sodass es leer überschrieben wurde und das trainierte Modell für zwei Tage weggeblasen wurde. Es wird empfohlen, regelmäßig in mehreren Modellen zu speichern.
run_training.py
def run(...):
...
#Das generierte Sample wird für jeden Tick ausgegeben. ・ Das Netzwerk besteht einmal alle 5 Ticks
train.image_snapshot_ticks = 1
train.network_snapshot_ticks = 5
#Diesmal habe ich ein Modell mit einer Bildgröße von 64 erstellt
dataset_args = EasyDict(tfrecord_dir=dataset, resolution = 64)
Hier Der Speicherfehler wurde behoben
training/dataset.py
class TFRecordDataset:
def __init__(...):
...
# Load labels.
assert max_label_size == 'full' or max_label_size >= 0
#self._np_labels = np.zeros([1<<30, 0], dtype=np.float32)
self._np_labels = np.zeros([1<<20, 0], dtype=np.float32)
Wenn die GPU-Verarbeitung zu lang wird, wird die Lernaufgabe beendet. Das hat mich auch getroffen. Als Gegenmaßnahme sollte das Zeitlimit durch Festlegen des DWORD-Werts abgeschnitten werden. (Http://www.field-and-network.jp/rihei/20121028223437.php) Es wird empfohlen, es vor dem Lernen einzustellen.
Die quantitative Bewertung von GAN ist eine der schwierigen Aufgaben, aber in vielen Studien wird die Qualität des erzeugten Bildes mit einer Methode namens FID (Frechet Inception Distance) bewertet. Dies ist eine Methode zum Eingeben des Bildes des Datensatzes und des erzeugten Bildes in das Merkmalmengenextraktionsmodell und zum Berechnen des Frechet-Abstands zwischen den Verteilungen der Merkmalsmenge.
Aufgrund der Anzahl der Dimensionen der zu behandelnden multivariaten Normalverteilung ist es erforderlich, mindestens 4000 Datensätze aus dem Datensatz und dem generierten Bild vorzubereiten, und es dauert insbesondere einige Zeit, den Datensatz zu lesen. Wenn dieser Prozess weggelassen wird, verschwindet der Index, sodass ich nicht weiß, wann ich mit dem Lernen aufhören soll, damit ich ihn nicht löschen kann. Aber kann er nicht beschleunigt werden?
Da die FID in den Ergebnissen /.../metrix-fid50k.txt ausgegeben wird, müssen Sie regelmäßig überprüfen, ob der Lernvorgang reibungslos verläuft.
metrix-fid50k.txt
network-snapshot- time 19m 34s fid50k 278.0748
network-snapshot- time 19m 34s fid50k 382.7474
network-snapshot- time 19m 34s fid50k 338.3625
network-snapshot- time 19m 24s fid50k 378.2344
network-snapshot- time 19m 33s fid50k 306.3552
network-snapshot- time 19m 33s fid50k 173.8370
network-snapshot- time 19m 30s fid50k 112.3612
network-snapshot- time 19m 31s fid50k 99.9480
network-snapshot- time 19m 35s fid50k 90.2591
network-snapshot- time 19m 38s fid50k 75.5776
network-snapshot- time 19m 39s fid50k 67.8876
network-snapshot- time 19m 39s fid50k 66.0221
network-snapshot- time 19m 46s fid50k 63.2856
network-snapshot- time 19m 40s fid50k 64.6719
network-snapshot- time 19m 31s fid50k 64.2135
network-snapshot- time 19m 39s fid50k 63.6304
network-snapshot- time 19m 42s fid50k 60.5562
network-snapshot- time 19m 36s fid50k 59.4038
network-snapshot- time 19m 36s fid50k 57.2236
network-snapshot- time 19m 40s fid50k 56.9055
network-snapshot- time 19m 47s fid50k 56.5965
network-snapshot- time 19m 34s fid50k 56.5844
network-snapshot- time 19m 38s fid50k 56.4158
network-snapshot- time 19m 34s fid50k 54.0568
network-snapshot- time 19m 32s fid50k 54.0307
network-snapshot- time 19m 40s fid50k 54.0492
network-snapshot- time 19m 32s fid50k 54.1482
network-snapshot- time 19m 38s fid50k 53.3513
network-snapshot- time 19m 32s fid50k 53.8889
network-snapshot- time 19m 39s fid50k 53.5233
network-snapshot- time 19m 40s fid50k 53.9403
network-snapshot- time 19m 43s fid50k 53.1017
network-snapshot- time 19m 39s fid50k 53.3370
network-snapshot- time 19m 36s fid50k 53.0706
network-snapshot- time 19m 43s fid50k 52.6289
network-snapshot- time 19m 39s fid50k 51.8526
network-snapshot- time 19m 35s fid50k 52.3760
network-snapshot- time 19m 42s fid50k 52.7780
network-snapshot- time 19m 36s fid50k 52.3064
network-snapshot- time 19m 42s fid50k 52.4976
Wenn das Training aufgrund eines Fehlers wie mir abgebrochen wird, können Sie von dort aus mit dem Lernen beginnen, indem Sie das unter den Ergebnissen gespeicherte Netzwerk-Snapshot- *. Pkl-Modell laden. Die notwendige Beschreibung lautet wie folgt.
run_training.py
def run(...):
...
train.resume_pkl = "./results/00000-stylegan2-tf_images-1gpu-config-f/network-snapshot-00640.pkl"
train.resume_kimg = 640
train.resume_time = 150960
Für train.resume_time ist es in Ordnung, wenn Sie die Ausgabe der Berechnungszeit beim Speichern des Modells aus log.txt usw. in sec konvertieren und eingeben.
Möglicherweise kann das Transferlernen durchgeführt werden, indem ein trainiertes Modell mit derselben Methode angegeben wird. Nach dem Laden des Modells muss die Fixierung von Gewichten und anderen Details manuell eingestellt werden. Wenn Sie mit einer Aufgabe wie dieser übertragen möchten, können Sie meiner Meinung nach alles neu lernen ...
log.txt
dnnlib: Running training.training_loop.training_loop() on localhost...
...
tick 40 kimg 640.1 lod 0.00 minibatch 32 time 1d 17h 56m sec/tick 2588.1 sec/kimg 161.76 maintenance 1203.1 gpumem 5.1
Ich fiel bei 640kimg wegen mangelnder Lagerung (Weinen) Es ist zu traurig, weil der FID gut gesenkt wurde.
Der Umriss wird klarer und nicht nur die Form des Körpers, sondern auch das Gesicht beginnt sich zu reproduzieren.
Ich würde gerne die Lernergebnisse in Zukunft so schnell wie möglich sehen, aber da ich neu lerne, scheint es, dass es in naher Zukunft sein wird. Das Ergebnis wird hinzugefügt, sobald das Lernen fortschreitet.
Ich mache mir Sorgen, dass ich alle Änderungen gegenüber der ursprünglichen Implementierung eingeführt habe, daher habe ich den folgenden Code aufgelistet. Die Verwendung ist auch auf GitHub geschrieben, also bitte.
https://github.com/Takuya-Shuto-engineer/PokemonGAN
Recommended Posts