Jakie są różnice między tymi funkcjami?
tf.variable_op_scope(values, name, default_name, initializer=None)
Zwraca menedżer kontekstu do definiowania operacji, która tworzy zmienne. Ten menedżer kontekstu sprawdza, czy podane wartości pochodzą z tego samego wykresu, zapewnia, że wykres ten jest wykresem domyślnym, i przesuwa zakres nazw i zakres zmiennych.
tf.op_scope(values, name, default_name=None)
Zwraca menedżer kontekstu do użycia podczas definiowania op. Ten menedżer kontekstu sprawdza, czy podane wartości pochodzą z tego samego wykresu, zapewnia, że wykres ten jest wykresem domyślnym, i przesuwa zakres nazw.
tf.name_scope(name)
Opakowanie do
Graph.name_scope()
korzystania z domyślnego wykresu. ZobaczGraph.name_scope()
po więcej szczegółów.
tf.variable_scope(name_or_scope, reuse=None, initializer=None)
Zwraca kontekst dla zakresu zmiennego. Zmienny zakres pozwala tworzyć nowe zmienne i udostępniać już utworzone, zapewniając kontrole, aby nie tworzyć lub dzielić się przypadkowo. Aby uzyskać szczegółowe informacje, zobacz Poradnik dotyczący zmiennych, tutaj przedstawiamy tylko kilka podstawowych przykładów.
źródło
Odpowiedzi:
Zacznijmy od krótkiego wprowadzenia do udostępniania zmiennych. Jest to mechanizm,
TensorFlow
który pozwala na dzielenie się zmiennymi dostępnymi w różnych częściach kodu bez przekazywania odniesień do zmiennej wokół.Metodę
tf.get_variable
można zastosować z nazwą zmiennej jako argumentem, aby albo utworzyć nową zmienną o takiej nazwie, albo pobrać wcześniej utworzoną. Różni się to od używaniatf.Variable
konstruktora, który będzie tworzył nową zmienną przy każdym wywołaniu (i potencjalnie doda sufiks do nazwy zmiennej, jeśli zmienna o takiej nazwie już istnieje).Do celów mechanizmu współużytkowania zmiennych wprowadzono odrębny typ zakresu (zakres zmienny).
W rezultacie otrzymujemy dwa różne typy zakresów:
tf.name_scope
tf.variable_scope
Oba zakresy mają taki sam wpływ na wszystkie operacje, jak i zmienne utworzone przy użyciu
tf.Variable
, tzn. Zakres zostanie dodany jako przedrostek do nazwy operacji lub zmiennej.Jednak zakres nazw jest ignorowany przez
tf.get_variable
. Widzimy to w następującym przykładzie:Jedynym sposobem umieszczenia zmiennej dostępnej za
tf.get_variable
pomocą zakresu jest użycie zakresu zmiennej, jak w poniższym przykładzie:To pozwala nam łatwo udostępniać zmienne w różnych częściach programu, nawet w różnych zakresach nazw:
AKTUALIZACJA
Począwszy od wersji r0.11,
op_scope
ivariable_op_scope
są zarówno przestarzała i zastąpionaname_scope
avariable_scope
.źródło
scope
metodą, która skutecznie działavariable_scope
?”.variable_scope
vsname_scope
jest potrzebne. Jeśli ktoś tworzy zmienną (w jakikolwiek sposób za pomocątf.Variable
lubtf.get_variable
), wydaje mi się bardziej naturalne, że zawsze powinniśmy być w stanie ją uzyskać, jeśli określimy zakres lub jego pełną nazwę. Nie rozumiem, dlaczego jedna ignoruje nazwę zakresu, a druga nie. Czy rozumiesz racjonalność tego dziwnego zachowania?Zarówno variable_op_scope i op_scope są obecnie przestarzałe i nie powinny być w ogóle stosowane.
W odniesieniu do pozostałych dwóch, ja też miałem problemy ze zrozumieniem różnicy między variable_scope i name_scope (wyglądały prawie tak samo) przed Starałem się wyobrazić wszystko, tworząc prosty przykład:
Tutaj tworzę funkcję, która tworzy niektóre zmienne i stałe i grupuje je w zakresach (w zależności od podanego typu). W tej funkcji wypisuję również nazwy wszystkich zmiennych. Następnie wykonuję wykres, aby uzyskać wartości wynikowych wartości i zapisać pliki zdarzeń, aby zbadać je w TensorBoard. Jeśli to uruchomisz, otrzymasz:
Podobny wzór zobaczysz, jeśli otworzysz TensorBoard (jak widzisz
b
pozascope_name
prostokątem):To daje odpowiedź :
Teraz widzisz, że
tf.variable_scope()
dodaje przedrostek do nazw wszystkich zmiennych (bez względu na to, jak je tworzysz), ops, stałe. Z drugiej stronytf.name_scope()
ignoruje zmienne utworzone,tf.get_variable()
ponieważ zakłada, że wiesz, której zmiennej i w jakim zakresie chcesz użyć.Dobra dokumentacja na temat udostępniania zmiennych mówi o tym
Ta sama dokumentacja zawiera bardziej szczegółowe informacje o tym, jak działa Zmienny zakres i kiedy jest przydatny.
źródło
Przestrzenie nazw to sposób organizowania nazw zmiennych i operatorów w sposób hierarchiczny (np. „ScopeA / scopeB / scopeC / op1”)
tf.name_scope
tworzy przestrzeń nazw dla operatorów na domyślnym wykresie.tf.variable_scope
tworzy przestrzeń nazw dla zmiennych i operatorów na domyślnym wykresie.tf.op_scope
tak samo jaktf.name_scope
, ale dla wykresu, na którym zostały utworzone określone zmienne.tf.variable_op_scope
tak samo jaktf.variable_scope
, ale dla wykresu, na którym zostały utworzone określone zmienne.Odnośniki do powyższych źródeł pomagają w jednoznacznym rozwiązaniu tego problemu z dokumentacją.
Ten przykład pokazuje, że wszystkie typy zakresów definiują przestrzenie nazw dla zmiennych i operatorów z następującymi różnicami:
tf.variable_op_scope
lubtf.variable_scope
są z nimi zgodnetf.get_variable
(ignoruje dwa inne zakresy)tf.op_scope
itf.variable_op_scope
po prostu wybierz wykres z listy określonych zmiennych, aby utworzyć zakres. Inne niż ich zachowanie równetf.name_scope
itf.variable_scope
odpowiedniotf.variable_scope
ivariable_op_scope
dodaj określony lub domyślny inicjator.źródło
Uprośćmy: po prostu użyj
tf.variable_scope
. Cytując programistę TF :Oprócz tego, że
variable_scope
jego funkcjonalność zasadniczo rozszerza funkcjename_scope
, zastanów się, jak nie grają razem tak ładnie:Trzymając się
variable_scope
tylko tego, unikniesz bólu głowy z powodu tego rodzaju niezgodności.źródło
Podobnie jak w przypadku interfejsu API r0.11
op_scope
ivariable_op_scope
oba są przestarzałe .name_scope
ivariable_scope
może być zagnieżdżony:źródło
Można myśleć je jako dwie grupy:
variable_op_scope
iop_scope
wziąć zestaw zmiennych jako wejście i są przeznaczone do tworzenia operacji. Różnica polega na tym, jak wpływają one na tworzenie zmiennych za pomocątf.get_variable
:zwróć uwagę na nazwę zmiennej
v
w dwóch przykładach.to samo dla
tf.name_scope
itf.variable_scope
:Więcej informacji na temat zakresu zmiennego można znaleźć w samouczku . Podobne pytanie zostało zadane wcześniej w przypadku przepełnienia stosu.
źródło
Z ostatniej sekcji tej strony dokumentacji tensorflow: Nazwy operacji w
tf.variable_scope()
źródło
Odpowiedź zgodna z Tensorflow 2.0 : Objaśnienia
Andrzej Pronobis
iSalvador Dali
szczegółowe informacje na temat związanych z nimi funkcjiScope
.Z omówionych powyżej funkcji zakresu, które są aktywne od teraz (17 lutego 2020 r.), Są
variable_scope
iname_scope
.Określanie wywołań zgodnych z 2.0 dla tych funkcji, które omówiliśmy powyżej, z korzyścią dla społeczności.
Funkcja w 1.x :
tf.variable_scope
tf.name_scope
Odpowiednia funkcja w 2.x :
tf.compat.v1.variable_scope
tf.name_scope
(tf.compat.v2.name_scope
jeśli migrowano z1.x to 2.x
)Aby uzyskać więcej informacji na temat migracji z wersji 1.x do wersji 2.x, zapoznaj się z niniejszym przewodnikiem migracji .
źródło