O ile wiem, Variable
jest to domyślna operacja tworzenia zmiennej i get_variable
jest używana głównie do dzielenia wagi.
Z jednej strony są ludzie, którzy sugerują użycie get_variable
zamiast prymitywnej Variable
operacji, gdy potrzebujesz zmiennej. Z drugiej strony widzę po prostu jakiekolwiek użycie get_variable
w oficjalnych dokumentach i prezentacjach TensorFlow.
Dlatego chcę poznać kilka praktycznych zasad, jak prawidłowo używać tych dwóch mechanizmów. Czy są jakieś „standardowe” zasady?
python
tensorflow
Lifu Huang
źródło
źródło
Odpowiedzi:
Zalecałbym zawsze używać
tf.get_variable(...)
- ułatwi to refaktoryzację kodu, jeśli chcesz udostępniać zmienne w dowolnym momencie, np. W ustawieniu multi-gpu (zobacz przykład CIFAR z wieloma gpu). Nie ma w tym żadnych wad.Czysty
tf.Variable
to niższy poziom; w pewnym momencietf.get_variable()
nie istniał, więc część kodu nadal używa metody niskiego poziomu.źródło
tf.Variable
ztf.get_variable
wszędzie. To wtedy, gdy chcę zainicjować zmienną za pomocą tablicy numpy, nie mogę znaleźć czystego i wydajnego sposobu zrobienia tego, tak jak to robiętf.Variable
. Jak to rozwiązujesz? Dzięki.tf.Variable jest klasą i istnieje kilka sposobów tworzenia tf.Variable, w tym
tf.Variable.__init__
itf.get_variable
.tf.Variable.__init__
: Tworzy nową zmienną o wartości początkowej .tf.get_variable
: Pobiera istniejącą zmienną z tymi parametrami lub tworzy nową. Możesz także użyć inicjatora.Bardzo przydatne jest używanie inicjatorów, takich jak
xavier_initializer
:Więcej informacji tutaj .
źródło
Variable
właściwie mam na myśli używanie jego__init__
. Ponieważget_variable
jest to tak wygodne, zastanawiam się, dlaczego większość kodu TensorFlow, którą widziałem, używaVariable
zamiastget_variable
. Czy są jakieś konwencje lub czynniki, które należy wziąć pod uwagę przy wyborze między nimi? Dziękuję Ci!tf.Variable()
, możemy zainicjować go jako losową wartość z obciętego rozkładu normalnego. Oto mój przykładw1 = tf.Variable(tf.truncated_normal([5, 50], stddev = 0.01), name = 'w1')
. Jaki byłby to odpowiednik? jak mam to powiedzieć, że chcę obciętego normalnego? Powinienem po prostu zrobićw1 = tf.get_variable(name = 'w1', shape = [5,50], initializer = tf.truncated_normal, regularizer = tf.nn.l2_loss)
?tf.truncated_normal_initializer()
aby uzyskać pożądany wynik.Mogę znaleźć dwie główne różnice między jednym a drugim:
Po pierwsze,
tf.Variable
zawsze tworzy nową zmienną, podczas gdytf.get_variable
pobiera istniejącą zmienną z określonymi parametrami z wykresu, a jeśli nie istnieje, tworzy nową.tf.Variable
wymaga określenia wartości początkowej.Ważne jest, aby wyjaśnić, że funkcja
tf.get_variable
poprzedza nazwę z bieżącym zakresem zmiennej w celu sprawdzenia ponownego wykorzystania. Na przykład:Ostatni błąd asercji jest interesujący: dwie zmienne o tej samej nazwie w tym samym zakresie mają być tą samą zmienną. Ale jeśli przetestujesz nazwy zmiennych
d
ie
zdasz sobie sprawę, że Tensorflow zmienił nazwę zmienneje
:źródło
d.name
ie.name
, właśnie natknąłem się na ten dokument TensorFlow na temat operacji nazewnictwa wykresów tensorowych, który to wyjaśnia:If the default graph already contained an operation named "answer", the TensorFlow would append "_1", "_2", and so on to the name, in order to make it unique.
Inna różnica polega na tym, że jedna jest w
('variable_store',)
kolekcji, a druga nie.Zobacz kod źródłowy :
Zilustruję to:
Wyjście:
źródło