Próbuję wprowadzić Adversarial NN, która wymaga "zamrożenia" jednej lub drugiej części wykresu podczas naprzemiennych mini-treningów. To znaczy. tam dwa podsieci G i D."Zamroź" niektóre zmienne/zakresy w tensorflow: stop_gradient vs przekazywanie zmiennych w celu zminimalizowania
G(Z) -> Xz
D(X) -> Y
którym funkcje straty G
zależy D[G(Z)], D[X]
.
Najpierw muszę wyszkolić parametry w D z ustawionymi wszystkimi parametrami G, a następnie parametry w G z parametrami w D ustalonym. Funkcja utraty w pierwszym przypadku będzie funkcją straty ujemnej w drugim przypadku, a aktualizacja będzie musiała być zastosowana do parametrów pierwszej lub drugiej podsieci.
Widziałem, że funkcja tensorflow ma tf.stop_gradient
. Dla celu przyuczenia D (poniżej) podsieci można używać tej funkcji do blokowania przepływu gradient do
Z -> [ G ] -> tf.stop_gradient(Xz) -> [ D ] -> Y
The tf.stop_gradient
bardzo krótko opatrzone bez przykład w linii (i przykład seq2seq.py
zbyt długo i nie tak łatwe do odczytania), ale wygląda na to, że musi zostać wywołany podczas tworzenia wykresu. Czy to oznacza, że jeśli chcę zablokować/odblokować przepływ gradientowy w naprzemiennych partiach, muszę ponownie utworzyć i ponownie zainicjować model wykresu?
Wygląda również na to, że nie można zablokować gradientu przepływającego przez sieć G (w górę) za pomocą tf.stop_gradient
, prawda?
Jako alternatywę zobaczyłem, że można przekazać listę zmiennych do wywołania optymalizatora jako opt_op = opt.minimize(cost, <list of variables>)
, co byłoby łatwym rozwiązaniem, gdyby można było uzyskać wszystkie zmienne w zakresach każdej podsieci. Czy można uzyskać <list of variables>
dla pliku tf.scope?
Używam tego przepisu do treningu, a kiedy sprawdzam wykres w "tensorboardzie", widzę podwojenie mojego wykresu, np. Otrzymuję 'gradienty' i' gradient_1_1'. Czy oczekiwano wyniku? –