Dernière fois a montré le contour et le résultat de la génération. Cette fois, je présenterai les changements de l'implémentation officielle de StyleGAN2 afin de travailler réellement avec GTX1070.
Le modèle entraîné a été époustouflé pour diverses raisons, alors j'aimerais également en prendre note!
Implémentation officielle de StyleGAN2
En fait, j'ai joué avec run_training.py et training / dataset.py.
Les données du modèle sont d'environ 300 Mo, ce qui est assez lourd, donc si vous ne tenez pas compte de la fréquence de stockage, la capacité sera épuisée et l'apprentissage se terminera. Dans mon cas, l'apprentissage s'est arrêté au milieu et je l'avais réglé pour écraser le modèle, il a donc été écrasé vide et le modèle entraîné pendant deux jours a été époustouflé. Il est recommandé d'enregistrer régulièrement plusieurs modèles.
run_training.py
def run(...):
...
#L'échantillon généré est sorti pour chaque tick ・ Le réseau est une fois tous les 5 ticks
train.image_snapshot_ticks = 1
train.network_snapshot_ticks = 5
#Cette fois, j'ai créé un modèle avec une taille d'image de 64
dataset_args = EasyDict(tfrecord_dir=dataset, resolution = 64)
Ici Correction de l'erreur de mémoire
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)
De plus, si le traitement GPU devient trop long, la tâche d'apprentissage sera supprimée. J'ai également été frappé par cela. En guise de contre-mesure, il semble que le délai d'expiration doit être coupé en définissant la valeur DWORD. (Http://www.field-and-network.jp/rihei/20121028223437.php) Il est recommandé de le régler avant d'apprendre.
L'évaluation quantitative du GAN est l'une des tâches difficiles, mais dans de nombreuses études, la qualité de l'image générée est évaluée par une méthode appelée FID (Frechet Inception Distance). Il s'agit d'une méthode de saisie de l'image de l'ensemble de données et de l'image générée dans le modèle d'extraction de quantité de caractéristiques et de calcul de la distance de Frechet entre les distributions de la quantité de caractéristiques.
En raison du nombre de dimensions de la distribution normale multivariée à traiter, il est nécessaire de préparer au moins 4000 ensembles de données à partir de l'ensemble de données et de l'image générée, et il faut du temps pour lire l'ensemble de données en particulier. Si ce processus est omis, l'index disparaîtra, donc je ne sais pas quand arrêter l'apprentissage, donc je ne peux pas l'effacer, mais est-ce quelque chose qui ne peut pas être accéléré?
Étant donné que le FID est affiché dans les résultats /.../metrix-fid50k.txt, vous devrez vérifier régulièrement si l'apprentissage se déroule correctement.
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
Si la formation s'arrête en raison d'une erreur comme moi, vous pouvez commencer à apprendre à partir de là en chargeant le modèle network-snapshot- *. Pkl enregistré sous les résultats. La description nécessaire est la suivante.
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
Pour train.resume_time, il n'y a pas de problème si vous convertissez la sortie du temps de calcul lorsque le modèle est enregistré à partir de log.txt etc. en sec et entrez-la.
Peut-être que l'apprentissage par transfert peut être effectué en spécifiant un modèle entraîné en utilisant la même méthode. Il est nécessaire de régler manuellement la fixation des poids et d'autres détails après le chargement du modèle. Si vous souhaitez transférer avec une tâche comme celle-ci, je sens que vous pouvez tout réapprendre ...
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
Je suis tombé à 640kimg faute de rangement (pleurs) C'est trop triste car le FID a bien été abaissé.
Le contour se précise et non seulement la forme du corps mais aussi le visage commencent à se reproduire.
J'aimerais voir les résultats d'apprentissage dans le futur le plus tôt possible, mais comme je réapprends, il semble que ce sera dans un proche avenir. Le résultat sera ajouté dès que l'apprentissage progressera.
Je crains d'avoir introduit toutes les modifications par rapport à l'implémentation d'origine, j'ai donc répertorié le code ci-dessous. L'utilisation est également écrite sur GitHub, alors s'il vous plaît.
https://github.com/Takuya-Shuto-engineer/PokemonGAN
Recommended Posts