Theano - Szybki przewodnik
Czy opracowałeś modele uczenia maszynowego w Pythonie? Wtedy oczywiście znasz zawiłości w opracowywaniu tych modeli. Rozwój jest zwykle powolnym procesem, który wymaga godzin i dni mocy obliczeniowej.
Tworzenie modelu uczenia maszynowego wymaga wielu obliczeń matematycznych. Zwykle wymagają one obliczeń arytmetycznych, zwłaszcza dużych macierzy o wielu wymiarach. Obecnie używamy sieci neuronowych zamiast tradycyjnych technik statystycznych do tworzenia aplikacji do uczenia maszynowego. Sieci neuronowe muszą być trenowane z wykorzystaniem ogromnej ilości danych. Szkolenie odbywa się w partiach danych o rozsądnej wielkości. Zatem proces uczenia się jest iteracyjny. Tak więc, jeśli obliczenia nie są wykonywane wydajnie, uczenie sieci może zająć kilka godzin lub nawet dni. W związku z tym optymalizacja kodu wykonywalnego jest wysoce pożądana. I właśnie to zapewnia Theano.
Theano to biblioteka Pythona, która pozwala definiować wyrażenia matematyczne używane w uczeniu maszynowym, optymalizować te wyrażenia i oceniać je bardzo wydajnie poprzez zdecydowane wykorzystanie procesorów graficznych w krytycznych obszarach. W większości przypadków może konkurować z typowymi pełnymi implementacjami C.
Theano zostało napisane w laboratorium LISA z zamiarem zapewnienia szybkiego rozwoju wydajnych algorytmów uczenia maszynowego. Jest wydany na licencji BSD.
W tym samouczku nauczysz się korzystać z biblioteki Theano.
Theano można zainstalować w systemach Windows, MacOS i Linux. Instalacja we wszystkich przypadkach jest banalna. Zanim zainstalujesz Theano, musisz zainstalować jego zależności. Poniżej znajduje się lista zależności -
- Python
- NumPy - wymagane
- SciPy - wymagane tylko w przypadku rzadkiej macierzy i funkcji specjalnych
- BLAS - zapewnia standardowe bloki konstrukcyjne do wykonywania podstawowych operacji na wektorach i macierzach
Opcjonalne pakiety, które możesz zainstalować w zależności od potrzeb to:
- nos: żeby uruchomić zestaw testów Theano
- Sfinks - Do dokumentacji budowlanej
- Graphiz i pydot - do obsługi grafiki i obrazów
- Sterowniki NVIDIA CUDA - wymagane do generowania / wykonywania kodu GPU
- libgpuarray - wymagane do generowania kodu GPU / CPU na urządzeniach CUDA i OpenCL
Omówimy kroki instalacji Theano w systemie MacOS.
Instalacja MacOS
Aby zainstalować Theano i jego zależności, użyj pipz wiersza poleceń w następujący sposób. To są minimalne zależności, których będziemy potrzebować w tym samouczku.
$ pip install Theano $ pip install numpy
$ pip install scipy $ pip install pydot
Musisz również zainstalować narzędzie programistyczne wiersza poleceń OSx za pomocą następującego polecenia -
$ xcode-select --install
Pojawi się następujący ekran. Kliknij naInstall przycisk, aby zainstalować narzędzie.
Po pomyślnej instalacji na konsoli zostanie wyświetlony komunikat o powodzeniu.
Testowanie instalacji
Po pomyślnym zakończeniu instalacji otwórz nowy notatnik w Anaconda Jupyter. W komórce kodu wprowadź następujący skrypt Pythona -
Przykład
import theano
from theano import tensor
a = tensor.dscalar()
b = tensor.dscalar()
c = a + b
f = theano.function([a,b], c)
d = f(1.5, 2.5)
print (d)
Wynik
Uruchom skrypt i powinieneś zobaczyć następujące dane wyjściowe -
4.0
Zrzut ekranu wykonania jest pokazany poniżej w celu szybkiego odniesienia -
Jeśli otrzymasz powyższy wynik, instalacja Theano zakończyła się pomyślnie. Jeśli nie, postępuj zgodnie z instrukcjami debugowania na stronie pobierania Theano, aby rozwiązać problemy.
Co to jest Theano?
Po pomyślnym zainstalowaniu Theano, spróbujmy najpierw zrozumieć, czym jest Theano? Theano to biblioteka Pythona. Pozwala definiować, optymalizować i oceniać wyrażenia matematyczne, zwłaszcza te, które są używane w tworzeniu modelu uczenia maszynowego. Samo Theano nie zawiera żadnych predefiniowanych modeli ML; po prostu ułatwia jego rozwój. Jest to szczególnie przydatne w przypadku tablic wielowymiarowych. Bezproblemowo integruje się z NumPy, który jest podstawowym i szeroko stosowanym pakietem do obliczeń naukowych w Pythonie.
Theano ułatwia definiowanie wyrażeń matematycznych używanych w programowaniu ML. Takie wyrażenia zwykle obejmują arytmetykę macierzy, różnicowanie, obliczenia gradientowe i tak dalej.
Theano najpierw buduje cały wykres obliczeniowy dla twojego modelu. Następnie kompiluje go w wysoce wydajny kod, stosując kilka technik optymalizacji na wykresie. Skompilowany kod jest wstrzykiwany do środowiska wykonawczego Theano przez specjalną operację o nazwiefunctiondostępne w Theano. Wykonujemy tofunctionpowtarzalne trenowanie sieci neuronowej. Czas szkolenia jest znacznie skrócony w porównaniu z użyciem czystego kodowania w Pythonie lub nawet pełnej implementacji C.
Teraz zrozumiemy proces rozwoju Theano. Zacznijmy od tego, jak zdefiniować wyrażenie matematyczne w Theano.
Rozpocznijmy naszą podróż po Theano od zdefiniowania i oceny trywialnego wyrażenia w Theano. Rozważmy następujące trywialne wyrażenie, które dodaje dwa skalary -
c = a + b
Gdzie a, b są zmiennymi i cjest wynikiem wyrażenia. W Theano zdefiniowanie i ocena nawet tego trywialnego wyrażenia jest trudne.
Rozumiemy kroki, aby ocenić powyższe wyrażenie.
Importowanie Theano
Najpierw musimy zaimportować bibliotekę Theano do naszego programu, co robimy za pomocą następującej instrukcji -
from theano import *
Zamiast importować poszczególne pakiety, użyliśmy * w powyższej instrukcji, aby uwzględnić wszystkie pakiety z biblioteki Theano.
Deklarowanie zmiennych
Następnie zadeklarujemy zmienną o nazwie a używając następującego oświadczenia -
a = tensor.dscalar()
Plik dscalarmetoda deklaruje dziesiętną zmienną skalarną. Wykonanie powyższej instrukcji tworzy zmienną o nazwieaw kodzie programu. Podobnie stworzymy zmiennąb używając następującego oświadczenia -
b = tensor.dscalar()
Definiowanie wyrażenia
Następnie zdefiniujemy nasze wyrażenie działające na tych dwóch zmiennych a i b.
c = a + b
W Theano wykonanie powyższej instrukcji nie powoduje skalarnego dodania dwóch zmiennych a i b.
Definicja funkcji Theano
Aby ocenić powyższe wyrażenie, musimy zdefiniować funkcję w Theano w następujący sposób -
f = theano.function([a,b], c)
Funkcja functionprzyjmuje dwa argumenty, pierwszy argument to wejście do funkcji, a drugi to jej wyjście. Z powyższej deklaracji wynika, że pierwszy argument jest typu tablica składająca się z dwóch elementówa i b. Wynikiem jest jednostka skalarna o nazwiec. Do tej funkcji będzie się odnosić nazwa zmiennejf w naszym dalszym kodzie.
Wywołanie funkcji Theano
Wywołanie funkcji f jest wykonywane za pomocą następującej instrukcji -
d = f(3.5, 5.5)
Dane wejściowe funkcji to tablica składająca się z dwóch skalarów: 3.5 i 5.5. Wynik wykonania jest przypisywany do zmiennej skalarnejd. Aby wydrukować zawartośćd, użyjemy print oświadczenie -
print (d)
Wykonanie spowodowałoby wartość d do wydrukowania na konsoli, czyli w tym przypadku 9.0.
Pełna lista programów
Pełna lista programów znajduje się tutaj w celu szybkiego odniesienia -
from theano import *
a = tensor.dscalar()
b = tensor.dscalar()
c = a + b
f = theano.function([a,b], c)
d = f(3.5, 5.5)
print (d)
Wykonaj powyższy kod, a zobaczysz wynik jako 9.0. Zrzut ekranu jest pokazany tutaj -
Omówmy teraz nieco bardziej złożony przykład, który oblicza mnożenie dwóch macierzy.
Obliczymy iloczyn skalarny dwóch macierzy. Pierwsza macierz ma wymiar 2 x 3, a druga ma wymiar 3 x 2. Macierze, których użyliśmy jako dane wejściowe, i ich iloczyn są tutaj wyrażone -
$$ \ begin {bmatrix} 0 & -1 & 2 \\ 4 & 11 & 2 \ end {bmatrix} \: \ begin {bmatrix} 3 & -1 \\ 1 & 2 \\ 35 & 20 \ end {bmatrix} = \ begin {bmatrix} 11 i 0 \\ 35 i 20 \ end {bmatrix} $$Deklarowanie zmiennych
Aby napisać wyrażenie Theano dla powyższego, najpierw deklarujemy dwie zmienne reprezentujące nasze macierze w następujący sposób -
a = tensor.dmatrix()
b = tensor.dmatrix()
Dmatrix to typ macierzy dla par. Zauważ, że nigdzie nie określamy rozmiaru matrycy. Zatem te zmienne mogą reprezentować macierze o dowolnym wymiarze.
Definiowanie wyrażenia
Aby obliczyć iloczyn skalarny, użyliśmy wbudowanej funkcji o nazwie dot w następujący sposób -
c = tensor.dot(a,b)
Wynik mnożenia jest przypisywany do zmiennej macierzowej o nazwie c.
Definicja funkcji Theano
Następnie definiujemy funkcję, tak jak we wcześniejszym przykładzie, w celu oceny wyrażenia.
f = theano.function([a,b], c)
Zauważ, że dane wejściowe funkcji to dwie zmienne a i b, które są typu macierzowego. Wyjście funkcji jest przypisane do zmiennejc który automatycznie byłby typu macierzowego.
Wywołanie funkcji Theano
Teraz wywołujemy funkcję za pomocą następującej instrukcji -
d = f([[0, -1, 2], [4, 11, 2]], [[3, -1],[1,2], [6,1]])
Dwie zmienne w powyższej instrukcji to tablice NumPy. Możesz jawnie zdefiniować tablice NumPy, jak pokazano tutaj -
f(numpy.array([[0, -1, 2], [4, 11, 2]]),
numpy.array([[3, -1],[1,2], [6,1]]))
Po d jest obliczane, wypisujemy jego wartość -
print (d)
Na wyjściu zobaczysz następujące dane wyjściowe -
[[11. 0.]
[25. 20.]]
Pełna lista programów
The complete program listing is given here:
from theano import *
a = tensor.dmatrix()
b = tensor.dmatrix()
c = tensor.dot(a,b)
f = theano.function([a,b], c)
d = f([[0, -1, 2],[4, 11, 2]], [[3, -1],[1,2],[6,1]])
print (d)
Tutaj pokazano zrzut ekranu wykonywania programu -
Z powyższych dwóch przykładów można było zauważyć, że w Theano tworzymy wyrażenie, które jest ostatecznie oceniane za pomocą Theano function. Theano wykorzystuje zaawansowane techniki optymalizacji, aby zoptymalizować wykonanie wyrażenia. Aby zwizualizować wykres obliczeniowy, Theano udostępnia plikprinting pakiet w swojej bibliotece.
Symboliczny wykres dodawania skalarnego
Aby zobaczyć wykres obliczeniowy dla naszego programu do dodawania skalarnego, użyj biblioteki drukowania w następujący sposób -
theano.printing.pydotprint(f, outfile="scalar_addition.png", var_with_name_simple=True)
Po wykonaniu tej instrukcji plik o nazwie scalar_addition.pngzostanie utworzony na twoim komputerze. Zapisany wykres obliczeniowy jest wyświetlany tutaj do szybkiego odniesienia -
Pełna lista programów do wygenerowania powyższego obrazu znajduje się poniżej -
from theano import *
a = tensor.dscalar()
b = tensor.dscalar()
c = a + b
f = theano.function([a,b], c)
theano.printing.pydotprint(f, outfile="scalar_addition.png", var_with_name_simple=True)
Symboliczny wykres dla mnożnika macierzy
Teraz spróbuj utworzyć wykres obliczeniowy dla naszego mnożnika macierzy. Pełna lista dotycząca generowania tego wykresu znajduje się poniżej -
from theano import *
a = tensor.dmatrix()
b = tensor.dmatrix()
c = tensor.dot(a,b)
f = theano.function([a,b], c)
theano.printing.pydotprint(f, outfile="matrix_dot_product.png", var_with_name_simple=True)
Wygenerowany wykres jest pokazany tutaj -
Złożone wykresy
W przypadku większych wyrażeń wykresy obliczeniowe mogą być bardzo złożone. Oto jeden taki wykres zaczerpnięty z dokumentacji Theano -
Aby zrozumieć działanie Theano, ważne jest, aby najpierw poznać znaczenie tych wykresów obliczeniowych. Z tym zrozumieniem poznamy znaczenie Theano.
Dlaczego Theano?
Patrząc na złożoność wykresów obliczeniowych, będziesz teraz w stanie zrozumieć cel rozwoju Theano. Typowy kompilator zapewniłby lokalną optymalizację w programie, ponieważ nigdy nie traktuje całego obliczenia jako pojedynczej jednostki.
Theano wdraża bardzo zaawansowane techniki optymalizacji, aby zoptymalizować pełny wykres obliczeniowy. Łączy aspekty algebry z aspektami optymalizującego kompilatora. Część wykresu można skompilować do kodu języka C. W przypadku powtarzających się obliczeń szybkość oceny jest krytyczna i Theano spełnia ten cel, generując bardzo wydajny kod.
Teraz, gdy już zrozumiałeś podstawy Theano, zacznijmy od różnych typów danych dostępnych do tworzenia wyrażeń. Poniższa tabela zawiera częściową listę typów danych zdefiniowanych w Theano.
Typ danych | Typ Theano |
---|---|
Bajt | bscalar, bvector, bmatrix, brow, bcol, btensor3, btensor4, btensor5, btensor6, btensor7 |
16-bitowe liczby całkowite | wscalar, wvector, wmatrix, wrow, wcol, wtensor3, wtensor4, wtensor5, wtensor6, wtensor7 |
32-bitowe liczby całkowite | iscalar, ivector, imatrix, irow, icol, itensor3, itensor4, itensor5, itensor6, itensor7 |
64-bitowe liczby całkowite | lscalar, lvector, lmatrix, lrow, lcol, ltensor3, ltensor4, ltensor5, ltensor6, ltensor7 |
pływak | fscalar, fvector, fmatrix, frow, fcol, ftensor3, ftensor4, ftensor5, ftensor6, ftensor7 |
podwójnie | dscalar, dvector, dmatrix, drow, dcol, dtensor3, dtensor4, dtensor5, dtensor6, dtensor7 |
złożony | cscalar, cvector, cmatrix, crow, ccol, ctensor3, ctensor4, ctensor5, ctensor6, ctensor7 |
Powyższa lista nie jest wyczerpująca i czytelnik jest odsyłany do dokumentu tworzenia tensorów, aby uzyskać pełną listę.
Podam teraz kilka przykładów tworzenia zmiennych różnych rodzajów danych w Theano.
Skalarny
Aby skonstruować zmienną skalarną, użyłbyś składni -
Składnia
x = theano.tensor.scalar ('x')
x = 5.0
print (x)
Wynik
5.0
Jednowymiarowa tablica
Aby utworzyć jednowymiarową tablicę, użyj następującej deklaracji -
Przykład
f = theano.tensor.vector
f = (2.0, 5.0, 3.0)
print (f)f = theano.tensor.vector
f = (2.0, 5.0, 3.0)
print (f)
print (f[0])
print (f[2])
Wynik
(2.0, 5.0, 3.0)
2.0
3.0
Jeśli zrobisz f[3] wygeneruje błąd indeksu poza zakresem, jak pokazano tutaj -
print f([3])
Wynik
IndexError Traceback (most recent call last)
<ipython-input-13-2a9c2a643c3a> in <module>
4 print (f[0])
5 print (f[2])
----> 6 print (f[3])
IndexError: tuple index out of range
Dwuwymiarowa tablica
Aby zadeklarować dwuwymiarową tablicę, użyłbyś następującego fragmentu kodu -
Przykład
m = theano.tensor.matrix
m = ([2,3], [4,5], [2,4])
print (m[0])
print (m[1][0])
Wynik
[2, 3]
4
5-wymiarowa tablica
Aby zadeklarować tablicę 5-wymiarową, użyj następującej składni -
Przykład
m5 = theano.tensor.tensor5
m5 = ([0,1,2,3,4], [5,6,7,8,9], [10,11,12,13,14])
print (m5[1])
print (m5[2][3])
Wynik
[5, 6, 7, 8, 9]
13
Możesz zadeklarować tablicę trójwymiarową przy użyciu typu danych tensor3 zamiast tensor5, 4-wymiarowa tablica wykorzystująca typ danych tensor4i tak dalej do tensor7.
Konstruktory w liczbie mnogiej
Czasami możesz chcieć utworzyć zmienne tego samego typu w jednej deklaracji. Możesz to zrobić, używając następującej składni -
Składnia
from theano.tensor import * x, y, z = dmatrices('x', 'y', 'z')
x = ([1,2],[3,4],[5,6])
y = ([7,8],[9,10],[11,12])
z = ([13,14],[15,16],[17,18])
print (x[2])
print (y[1])
print (z[0])
Wynik
[5, 6]
[9, 10]
[13, 14]
W poprzednim rozdziale, omawiając typy danych, utworzyliśmy i wykorzystaliśmy zmienne Theano. Aby powtórzyć, użylibyśmy następującej składni do utworzenia zmiennej w Theano -
x = theano.tensor.fvector('x')
W tym zestawieniu stworzyliśmy zmienną xwektora typu zawierającego 32-bitowe liczby zmiennoprzecinkowe. Nazywamy go również jakox. Nazwy są ogólnie przydatne do debugowania.
Aby zadeklarować wektor 32-bitowych liczb całkowitych, należy użyć następującej składni -
i32 = theano.tensor.ivector
Tutaj nie podajemy nazwy zmiennej.
Aby zadeklarować trójwymiarowy wektor składający się z 64-bitowych liczb zmiennoprzecinkowych, należy użyć następującej deklaracji -
f64 = theano.tensor.dtensor3
W poniższej tabeli wymieniono różne typy konstruktorów wraz z ich typami danych -
Konstruktor | Typ danych | Wymiary |
---|---|---|
fvector | float32 | 1 |
ivector | int32 | 1 |
fscalar | float32 | 0 |
fmatrix | float32 | 2 |
ftensor3 | float32 | 3 |
dtensor3 | float64 | 3 |
Możesz użyć ogólnego konstruktora wektorowego i jawnie określić typ danych w następujący sposób -
x = theano.tensor.vector ('x', dtype=int32)
W następnym rozdziale dowiemy się, jak tworzyć wspólne zmienne.
Często trzeba by tworzyć zmienne, które są współużytkowane przez różne funkcje, a także między wieloma wywołaniami tej samej funkcji. Aby zacytować przykład, podczas uczenia sieci neuronowej tworzysz wektor wag w celu przypisania wagi każdej rozważanej funkcji. Ten wektor jest modyfikowany w każdej iteracji podczas uczenia sieci. W związku z tym musi być globalnie dostępny dla wielu wywołań tej samej funkcji. Dlatego w tym celu tworzymy wspólną zmienną. Zazwyczaj Theano przenosi takie współdzielone zmienne do GPU, o ile taka jest dostępna. Przyspiesza to obliczenia.
Składnia
Tworzysz wspólną zmienną, używając następującej składni -
import numpy
W = theano.shared(numpy.asarray([0.1, 0.25, 0.15, 0.3]), 'W')
Przykład
Tutaj tworzona jest tablica NumPy składająca się z czterech liczb zmiennoprzecinkowych. Aby ustawić / pobrać plikW wartość, której użyłbyś następującego fragmentu kodu -
import numpy
W = theano.shared(numpy.asarray([0.1, 0.25, 0.15, 0.3]), 'W')
print ("Original: ", W.get_value())
print ("Setting new values (0.5, 0.2, 0.4, 0.2)")
W.set_value([0.5, 0.2, 0.4, 0.2])
print ("After modifications:", W.get_value())
Wynik
Original: [0.1 0.25 0.15 0.3 ]
Setting new values (0.5, 0.2, 0.4, 0.2)
After modifications: [0.5 0.2 0.4 0.2]
Theano functiondziała jak haczyk do interakcji z symbolicznym grafem. Symboliczny wykres jest kompilowany w wysoce wydajny kod wykonawczy. Osiąga to poprzez restrukturyzację równań matematycznych, aby je przyspieszyć. Kompiluje niektóre części wyrażenia do kodu języka C. Przenosi niektóre tensory do GPU i tak dalej.
Wydajny, skompilowany kod jest teraz podawany jako dane wejściowe do Theano function. Kiedy wykonujesz Theanofunction, przypisuje wynik obliczeń określonym przez nas zmiennym. Typ optymalizacji można określić jako FAST_COMPILE lub FAST_RUN. Jest to określone w zmiennej środowiskowej THEANO_FLAGS.
Theano function jest deklarowana przy użyciu następującej składni -
f = theano.function ([x], y)
Pierwszy parametr [x] to lista zmiennych wejściowych i drugi parametr y to lista zmiennych wyjściowych.
Po zrozumieniu podstaw Theano, zacznijmy kodowanie Theano od trywialnego przykładu.
Theano jest bardzo przydatne w szkoleniu sieci neuronowych, gdzie musimy wielokrotnie obliczać koszt i gradienty, aby osiągnąć optimum. W przypadku dużych zbiorów danych wymaga to intensywnych obliczeń. Theano robi to skutecznie dzięki wewnętrznej optymalizacji grafu obliczeniowego, który widzieliśmy wcześniej.
Stwierdzenie problemu
Teraz nauczymy się, jak używać biblioteki Theano do trenowania sieci. Weźmiemy prosty przypadek, w którym zaczniemy od zestawu danych czterech funkcji. Obliczamy sumę tych cech po zastosowaniu określonej wagi (ważności) do każdej cechy.
Celem szkolenia jest taka modyfikacja wag przypisanych każdej funkcji, aby suma osiągnęła docelową wartość 100.
sum = f1 * w1 + f2 * w2 + f3 * w3 + f4 * w4
Gdzie f1, f2, ... to wartości funkcji i w1, w2, ... są ciężarkami.
Pozwólcie, że kwantyfikuję przykład, aby lepiej zrozumieć stwierdzenie problemu. Przyjmiemy początkową wartość 1,0 dla każdej cechy i weźmiemy w1 równa się0.1, w2 równa się 0.25, w3 równa się 0.15, i w4 równa się 0.3. Nie ma określonej logiki w przypisywaniu wartości wag, to tylko nasza intuicja. Zatem początkowa suma jest następująca -
sum = 1.0 * 0.1 + 1.0 * 0.25 + 1.0 * 0.15 + 1.0 * 0.3
Jakie sumy 0.8. Teraz będziemy nadal modyfikować przypisanie wagi, aby suma zbliżała się do 100. Bieżąca wartość wynikowa0.8 jest daleko od naszej pożądanej wartości docelowej 100. W terminach uczenia maszynowego definiujemy costjako różnica między wartością docelową a bieżącą wartością wyjściową, zwykle podniesiona do kwadratu, aby zwiększyć błąd. Zmniejszamy ten koszt w każdej iteracji, obliczając gradienty i aktualizując nasz wektor wag.
Zobaczmy, jak ta cała logika jest implementowana w Theano.
Deklarowanie zmiennych
Najpierw deklarujemy nasz wektor wejściowy x w następujący sposób -
x = tensor.fvector('x')
Gdzie x jest jednowymiarową tablicą wartości zmiennoprzecinkowych.
Definiujemy skalar target zmienna, jak podano poniżej -
target = tensor.fscalar('target')
Następnie tworzymy tensor odważników W z wartościami początkowymi, jak omówiono powyżej -
W = theano.shared(numpy.asarray([0.1, 0.25, 0.15, 0.3]), 'W')
Definiowanie wyrażenia Theano
Teraz obliczamy wynik za pomocą następującego wyrażenia -
y = (x * W).sum()
Zauważ, że w powyższym oświadczeniu x i Wsą wektorami, a nie prostymi zmiennymi skalarnymi. Teraz obliczamy błąd (koszt) za pomocą następującego wyrażenia -
cost = tensor.sqr(target - y)
Koszt jest różnicą do kwadratu między wartością docelową a bieżącą wydajnością.
Aby obliczyć gradient, który mówi nam, jak daleko jesteśmy od celu, używamy wbudowanego grad metoda w następujący sposób -
gradients = tensor.grad(cost, [W])
Aktualizujemy teraz weights wektor, przyjmując współczynnik uczenia się równy 0.1 w następujący sposób -
W_updated = W - (0.1 * gradients[0])
Następnie musimy zaktualizować nasz wektor wag przy użyciu powyższych wartości. Robimy to w następującym oświadczeniu -
updates = [(W, W_updated)]
Definiowanie / wywoływanie funkcji Theano
Na koniec definiujemy plik function w Theano, aby obliczyć sumę.
f = function([x, target], y, updates=updates)
Aby wywołać powyższą funkcję określoną liczbę razy, tworzymy plik for pętla w następujący sposób -
for i in range(10):
output = f([1.0, 1.0, 1.0, 1.0], 100.0)
Jak wspomniano wcześniej, wejściem do funkcji jest wektor zawierający wartości początkowe dla czterech cech - przypisujemy wartość 1.0do każdej funkcji bez konkretnego powodu. Możesz przypisać różne wybrane wartości i sprawdzić, czy funkcja ostatecznie jest zbieżna. W każdej iteracji wydrukujemy wartości wektora wagi i odpowiadające mu dane wyjściowe. Pokazuje to poniższy kod -
print ("iteration: ", i)
print ("Modified Weights: ", W.get_value())
print ("Output: ", output)
Pełna lista programów
Pełną listę programów przedstawiono tutaj w celach informacyjnych -
from theano import *
import numpy
x = tensor.fvector('x')
target = tensor.fscalar('target')
W = theano.shared(numpy.asarray([0.1, 0.25, 0.15, 0.3]), 'W')
print ("Weights: ", W.get_value())
y = (x * W).sum()
cost = tensor.sqr(target - y)
gradients = tensor.grad(cost, [W])
W_updated = W - (0.1 * gradients[0])
updates = [(W, W_updated)]
f = function([x, target], y, updates=updates)
for i in range(10):
output = f([1.0, 1.0, 1.0, 1.0], 100.0)
print ("iteration: ", i)
print ("Modified Weights: ", W.get_value())
print ("Output: ", output)
Po uruchomieniu programu zobaczysz następujące dane wyjściowe -
Weights: [0.1 0.25 0.15 0.3 ]
iteration: 0
Modified Weights: [19.94 20.09 19.99 20.14]
Output: 0.8
iteration: 1
Modified Weights: [23.908 24.058 23.958 24.108]
Output: 80.16000000000001
iteration: 2
Modified Weights: [24.7016 24.8516 24.7516 24.9016]
Output: 96.03200000000001
iteration: 3
Modified Weights: [24.86032 25.01032 24.91032 25.06032]
Output: 99.2064
iteration: 4
Modified Weights: [24.892064 25.042064 24.942064 25.092064]
Output: 99.84128
iteration: 5
Modified Weights: [24.8984128 25.0484128 24.9484128 25.0984128]
Output: 99.968256
iteration: 6
Modified Weights: [24.89968256 25.04968256 24.94968256 25.09968256]
Output: 99.9936512
iteration: 7
Modified Weights: [24.89993651 25.04993651 24.94993651 25.09993651]
Output: 99.99873024
iteration: 8
Modified Weights: [24.8999873 25.0499873 24.9499873 25.0999873]
Output: 99.99974604799999
iteration: 9
Modified Weights: [24.89999746 25.04999746 24.94999746 25.09999746]
Output: 99.99994920960002
Zauważ, że po czterech iteracjach dane wyjściowe to 99.96 i po pięciu iteracjach jest 99.99, który jest bliski naszej pożądanej wartości docelowej 100.0.
W zależności od pożądanej dokładności, możesz bezpiecznie stwierdzić, że sieć jest szkolona w 4 do 5 iteracjach. Po zakończeniu treningu odszukaj wektor wag, który po 5 iteracjach przyjmuje następujące wartości -
iteration: 5
Modified Weights: [24.8984128 25.0484128 24.9484128 25.0984128]
Możesz teraz użyć tych wartości w swojej sieci do wdrożenia modelu.
Budowanie modelu uczenia maszynowego obejmuje intensywne i powtarzalne obliczenia z udziałem tensorów. Wymagają one intensywnych zasobów obliczeniowych. Ponieważ zwykły kompilator zapewnia optymalizacje na poziomie lokalnym, generalnie nie generuje kodu szybkiego wykonywania.
Theano najpierw tworzy wykres obliczeniowy dla całego obliczenia. Ponieważ cały obraz obliczeń jest dostępny jako pojedynczy obraz podczas kompilacji, kilka technik optymalizacji można zastosować podczas wstępnej kompilacji i właśnie to robi Theano. Przebudowuje wykres obliczeniowy, częściowo konwertuje go na C, przenosi wspólne zmienne do GPU i tak dalej, aby wygenerować bardzo szybki kod wykonywalny. Skompilowany kod jest następnie wykonywany przez Theanofunctionktóry działa tylko jako punkt zaczepienia do wstrzykiwania skompilowanego kodu do środowiska wykonawczego. Theano udowodniło swoje kwalifikacje i jest szeroko akceptowane zarówno w środowisku akademickim, jak i w przemyśle.