Jestem nowicjuszem w TensorFlow. Jestem zdezorientowany co do różnicy między tf.placeholder
i tf.Variable
. Moim zdaniem tf.placeholder
służy do wprowadzania danych i tf.Variable
służy do przechowywania stanu danych. To wszystko co wiem.
Czy ktoś mógłby mi bardziej szczegółowo wyjaśnić swoje różnice? W szczególności, kiedy tf.Variable
i kiedy używać tf.placeholder
?
tensorflow
J.Doe
źródło
źródło
Variable
s, ale nieplaceholder
s (których wartości należy zawsze podawać).Odpowiedzi:
W skrócie, używasz
tf.Variable
zmiennych , które można trenować, takich jak wagi (W) i odchylenia (B) dla swojego modelu.tf.placeholder
służy do karmienia rzeczywistych przykładów szkoleń.W ten sposób podajesz przykłady treningu podczas szkolenia:
W
tf.variables
wyniku tego szkolenia zostaniesz przeszkolony (zmodyfikowany).Zobacz więcej na https://www.tensorflow.org/versions/r0.7/tutorials/mnist/tf/index.html . (Przykłady pochodzą ze strony internetowej.)
źródło
tensorflow
ideep learning
iAI
są.Różnica polega na tym, że wraz z
tf.Variable
deklaracją musisz podać wartość początkową. Dziękitf.placeholder
nie musisz podawać wartości początkowej i możesz ją określić w czasie wykonywania zfeed_dict
argumentem w środkuSession.run
źródło
Ponieważ obliczenia Tensora składają się z wykresów , lepiej interpretować je w kategoriach wykresów.
Weźmy na przykład prostą regresję liniową
gdzie
W
iB
oznaczają wagi i stronniczość orazX
dane wejściowe obserwacji i wynikiY
obserwacji.Oczywiście
X
iY
mają ten sam charakter (zmienne manifestacyjne), które różnią się od zmiennychW
iB
(ukrytych zmiennych).X
iY
są wartości próbek (obserwacje) i dlatego też potrzebują miejsca do obsadzenia , aW
iB
to masy i skośnym, zmienne (poprzednie wartości wpływa na drugi) na wykresie, które powinny zostać wyszkolony stosując różneX
iY
pary. Umieszczamy różne próbki dla symboli zastępczych w celu trenowania zmiennych .Musimy tylko zachować lub przywrócić do zmiennych (w punktach kontrolnych), aby zachować lub odbudować wykres z kodu.
Symbole zastępcze są najczęściej posiadaczami różnych zestawów danych (na przykład danych szkoleniowych lub danych testowych). Jednak Zmienne są przeszkoleni w procesie szkolenia do konkretnych zadań, czyli do przewidywania wyniku wejścia lub map wejść do wybranej etykiety. Pozostają takie same, dopóki nie dokonasz ponownego szkolenia lub dostrojenia modelu przy użyciu różnych lub tych samych próbek, aby często wypełniać symbole zastępcze za pomocą nagrania. Na przykład:
Symbole zastępcze są również przekazywane jako parametry do ustawiania modeli.
Jeśli zmienisz symbole zastępcze (dodasz, usuniesz, zmienisz kształt itp.) Modelu w trakcie treningu, nadal możesz ponownie załadować punkt kontrolny bez żadnych innych modyfikacji. Ale jeśli zmienne zapisane w modelu zostaną zmienione, należy odpowiednio dostosować punkt kontrolny, aby go ponownie załadować i kontynuować szkolenie (wszystkie zmienne zdefiniowane na wykresie powinny być dostępne w punkcie kontrolnym).
Podsumowując, jeśli wartości pochodzą z próbek (obserwacje, które już masz), bezpiecznie tworzysz symbol zastępczy, aby je zachować, a jeśli potrzebujesz trenowanego parametru, wykorzystaj Zmienną (po prostu ustaw, ustaw Zmienne dla żądanych wartości automatycznie korzystać z TF).
W niektórych interesujących modelach, takich jak model przenoszenia stylu , piksele wejściowe zostaną zoptymalizowane, a normalnie nazywane zmienne modelu zostaną naprawione, a następnie powinniśmy wprowadzić dane wejściowe (zwykle inicjowane losowo) jako zmienną zaimplementowaną w tym łączu.
Aby uzyskać więcej informacji, skorzystaj z tego prostego i ilustrującego dokumentu .
źródło
TL; DR
Zmienne
Symbole zastępcze
tf.placeholder_with_default
)źródło
Najbardziej oczywistą różnicą między zmienną tf.Variable i tf.placeholder jest to
Inicjalizacja zmiennych odbywa się za pomocą
sess.run(tf.global_variables_initializer())
. Również podczas tworzenia zmiennej musisz przekazać konstruktorowi jego wartość początkową,Variable()
a kiedy tworzysz zmienną, zawsze znasz jej kształt.Z drugiej strony nie można zaktualizować symbolu zastępczego. Nie należy ich także inicjalizować, ale ponieważ są obietnicą posiadania tensora, należy do nich wprowadzić wartość
sess.run(<op>, {a: <some_val>})
. I w końcu, w porównaniu do zmiennej, symbol zastępczy może nie znać kształtu. Możesz podać części wymiarów lub w ogóle nic nie podać.Istnieją inne różnice:
Ciekawe jest to, że można karmić nie tylko symbole zastępcze. Możesz podać wartość do zmiennej, a nawet stałej.
źródło
Dodając do odpowiedzi innych, wyjaśniają to również bardzo dobrze w tym samouczku MNIST na stronie internetowej Tensoflow:
źródło
x
kształt[batch size, features]
, mamy wagi od wejścia do pierwszej warstwy wielkości[features, hidden units]
i odchylenia[hidden units]
. Moje pytanie brzmi: w jaki sposób je pomnożymy? Jeśli to zrobimytf.matmul(x, w)
, dostaniemy[batch size, hidden units]
i nie możemy tegob
zrobić, ponieważ ma kształt[hidden units]
Tensorflow wykorzystuje trzy typy kontenerów do przechowywania / wykonywania procesu
Stałe: Stałe przechowują typowe dane.
zmienne: Wartości danych zostaną zmienione wraz z odpowiednimi funkcjami, takimi jak funkcja koszt.
symbole zastępcze: dane szkoleniowe / testowe zostaną przekazane do wykresu.
źródło
Przykładowy fragment:
Jak sama nazwa mówi, symbol zastępczy jest obietnicą dostarczenia wartości później, tj
Zmienne to po prostu parametry treningu (
W
(matryca),b
(stronniczość) takie same jak normalne zmienne używane w codziennym programowaniu, które trener aktualizuje / modyfikuje przy każdym uruchomieniu / kroku.Podczas gdy symbol zastępczy nie wymaga żadnej wartości początkowej, że gdy utworzysz,
x
ay
TF nie przydzieli pamięci, zamiast tego, gdy podasz symbole zastępcze wsess.run()
użyciufeed_dict
, TensorFlow przydzieli im odpowiednią wielkość pamięci (x
iy
) - to nieograniczone - ness pozwala nam podawać dane o dowolnym rozmiarze i kształcie.W skrócie :
Zmienna - jest parametrem, który trener (tj. GradientDescentOptimizer) ma aktualizować po każdym kroku.
Demo zastępcze -
Wykonanie:
co daje wynik
W pierwszym przypadku, 3 i 4,5 będą przekazywane do
a
ib
, odpowiednio, a następnie adder_node ouputting 7. W drugim przypadku nie jest to lista kanałów, pierwszy etap 1 i 2 zostanie dodana, przy 3 i 4 (a
ab
).Odpowiednie czyta:
źródło
Zmienne
Zmienna TensorFlow jest najlepszym sposobem reprezentowania wspólnego, trwałego stanu, którym manipuluje twój program. Zmienne są przetwarzane za pośrednictwem klasy tf.Variable. Wewnętrznie tf.Variable przechowuje trwały tensor. Określone operacje pozwalają na odczyt i modyfikację wartości tego tensora. Te modyfikacje są widoczne w wielu sesjach TF, więc wielu pracowników może zobaczyć te same wartości dla zmiennej TF. Przed użyciem należy zainicjować zmienne.
Przykład:
Spowoduje to utworzenie wykresu obliczeniowego. Zmienne (xiy) można zainicjować, a funkcję (f) ocenić w sesji tensorflow w następujący sposób:
Symbole zastępcze
Symbol zastępczy to węzeł (taki sam jak zmienna), którego wartość można zainicjować w przyszłości. Te węzły generują w zasadzie wartość przypisaną do nich podczas działania. Węzeł zastępczy można przypisać za pomocą klasy tf.placeholder (), do której można podać argumenty, takie jak typ zmiennej i / lub jej kształt. Symbole zastępcze są szeroko stosowane do reprezentowania zestawu danych szkoleniowych w modelu uczenia maszynowego, gdy zestaw danych szkoleniowych ciągle się zmienia.
Przykład:
Uwaga: „Brak” dla wymiaru oznacza „dowolny rozmiar”.
Bibliografia:
źródło
Myśl o
Variable
tensorflow jako o normalnych zmiennych, których używamy w językach programowania. Inicjujemy zmienne, możemy je również później modyfikować. Natomiastplaceholder
nie wymaga wartości początkowej. Symbol zastępczy po prostu przydziela blok pamięci do wykorzystania w przyszłości. Później możemy użyćfeed_dict
do wprowadzenia danychplaceholder
. Domyślnieplaceholder
ma nieograniczony kształt, co pozwala na podawanie tensorów o różnych kształtach w sesji. Możesz stworzyć ograniczony kształt, przekazując opcjonalny argument -shape, jak zrobiłem poniżej.Podczas wykonywania zadania uczenia maszynowego przez większość czasu nie jesteśmy świadomi liczby wierszy, ale (załóżmy) znamy liczbę funkcji lub kolumn. W takim przypadku możemy użyć opcji Brak.
Teraz w czasie wykonywania możemy karmić dowolną macierz 4 kolumnami i dowolną liczbą wierszy.
Również symbole zastępcze są używane do danych wejściowych (są rodzajem zmiennych, których używamy do zasilania naszego modelu), gdzie jako zmienne są parametry, takie jak wagi, które trenujemy w czasie.
źródło
Symbol zastępczy:
Symbol zastępczy to po prostu zmienna, do której przypiszemy dane w późniejszym terminie. Pozwala nam to tworzyć nasze operacje i budować wykres obliczeniowy bez potrzeby korzystania z danych. W terminologii TensorFlow za pomocą tych symboli zastępczych wprowadzamy dane do wykresu.
Wartości początkowe nie są wymagane, ale mogą mieć wartości domyślne z
tf.placeholder_with_default)
W czasie wykonywania musimy zapewnić wartość, taką jak:
Zmienna:
Przykład:
tf.Variable("Welcome to tensorflow!!!")
źródło
Odpowiedź zgodna z Tensorflow 2.0 : Koncepcja symboli zastępczych
tf.placeholder
nie będzieTensorflow 2.x (>= 2.0)
domyślnie dostępna, ponieważ domyślnym trybem wykonania jest Szybka realizacja.Możemy ich jednak użyć, jeśli zostaną użyte w
Graph Mode
(Disable Eager Execution
).Odpowiednikiem polecenia dla symbolu zastępczego TF w wersji 2.x jest
tf.compat.v1.placeholder
.Poleceniem równoważnym dla zmiennej TF w wersji 2.x jest
tf.Variable
i jeśli chcesz migrować kod z 1.x do 2.x, równoważne polecenie totf.compat.v2.Variable
.Więcej informacji na temat Tensorflow w wersji 2.0 można znaleźć na tej stronie Tensorflow.
Więcej informacji na temat migracji z wersji 1.x do 2.x można znaleźć w Przewodniku migracji.
źródło
Pomyśl o grafie obliczeniowym . Na takim wykresie potrzebujemy węzła wejściowego, aby przekazać nasze dane do wykresu. Węzły te należy zdefiniować jako symbol zastępczy w przepływie tensorowym .
Nie myśl jako ogólny program w Pythonie. Możesz napisać program w języku Python i robić wszystkie te rzeczy, które faceci wyjaśnili w innych odpowiedziach tylko przez Zmienne, ale w przypadku wykresów obliczeniowych w przepływie tensorowym, aby wprowadzić dane do wykresu, musisz zdefiniować te węzły jako symbole zastępcze.
źródło