Ostatnia aktualizacja 17 kwietnia 2020 r.
Warstwy splotowe to główne elementy konstrukcyjne używane w konwolucyjnych sieciach neuronowych.
Splot to proste zastosowanie filtru na wejściu, które powoduje aktywację. Wielokrotne stosowanie tego samego filtru na wejściu skutkuje mapą aktywacji zwaną mapą cech, wskazującą lokalizacje i siłę wykrytej cechy w danych wejściowych, takich jak obraz.
Innowacja splotu neuronowego sieci to zdolność do automatycznego uczenia się dużej liczby filtrów równolegle specyficznych dla zbioru danych szkoleniowych w ramach ograniczeń wynikających z konkretnego problemu z modelowaniem predykcyjnym, takiego jak klasyfikacja obrazu. Rezultatem są wysoce specyficzne cechy, które można wykryć w dowolnym miejscu na obrazach wejściowych.
W tym samouczku dowiesz się, jak działają konwolucje w konwolucyjnej sieci neuronowej.
Po ukończeniu tego samouczka, dowiesz się:
- Konwolucyjne sieci neuronowe stosują filtr do danych wejściowych, aby utworzyć mapę cech, która podsumowuje obecność wykrytych funkcji na wejściu.
- Filtry mogą być wykonane ręcznie , takich jak detektory liniowe, ale innowacją w konwolucyjnych sieciach neuronowych jest uczenie się filtrów podczas uczenia w kontekście konkretnego problemu z prognozowaniem.
- Jak obliczyć mapę cech dla jedno- i dwuwymiarowych warstwy w konwolucyjnej sieci neuronowej.
Rozpocznij swój projekt z moją nową książką Deep Learning for Computer Vision, w tym samouczki krok po kroku i pliki z kodem źródłowym Pythona dla wszystkich przykładów.
Zaczynajmy.
Delikatny Wprowadzenie do warstw konwolucyjnych w sieciach neuronowych uczenia głębokiego
Zdjęcie: mendhak, niektóre prawa zastrzeżone.
Omówienie samouczka
Ten samouczek jest podzielony na cztery części; są to:
- Konwolucja w konwolucyjnych sieciach neuronowych
- Konwolucja w wizji komputerowej
- Moc wyuczonych filtrów
- Przykład praktyczny Warstwy konwolucyjne
Chcesz uzyskać wyniki z głębokim uczeniem dla widzenia komputerowego?
Weź moje bezpłatny 7-dniowy szybki kurs e-mailowy (z przykładowym kodem).
Kliknij, aby się zarejestrować, a także otrzymać bezpłatną wersję kursu w formacie PDF.
Pobierz DARMOWY mini- Kurs
Konwolucja w konwolucyjnych sieciach neuronowych
Konwolucyjna sieć neuronowa, w skrócie CNN, to wyspecjalizowany typ modelu sieci neuronowej przeznaczony do pracy z dwuwymiarowymi danymi obrazu, chociaż można ich używać z danymi jednowymiarowymi i trójwymiarowymi.
Centralnym elementem splotowej sieci neuronowej jest warstwa splotowa, która nadaje sieci nazwę. Ta warstwa wykonuje operację zwaną „konwolucją”.
W kontekście splotowej sieci neuronowej, splot jest operacją liniową, która polega na pomnożeniu zestawu wag na wejściu, podobnie jak w tradycyjnej sieć neuronowa. Biorąc pod uwagę, że technika została zaprojektowana do dwuwymiarowego wprowadzania danych, mnożenie jest wykonywane między tablicą danych wejściowych a dwuwymiarową tablicą wag, zwaną filtrem lub jądrem.
Filtr jest mniejszy niż dane wejściowe i typ mnożenia zastosowanego między fragmentem wielkości filtra wejścia a filtrem to iloczyn skalarny. Iloczyn skalarny jest mnożeniem elementarnym między fragmentem wejściowym i filtrem o rozmiarze filtra, które jest następnie sumowane, co zawsze daje jedną wartość. Ponieważ daje w wyniku pojedynczą wartość, operacja jest często nazywana „iloczynem skalarnym”.
Użycie filtru mniejszego niż dane wejściowe jest zamierzone, ponieważ pozwala na zastosowanie tego samego filtru (zestawu wag) mnożone przez tablicę wejściową wiele razy w różnych punktach na wejściu. W szczególności filtr jest stosowany systematycznie do każdej nakładającej się części lub obszaru wielkości filtra danych wejściowych, od lewej do prawej, od góry do dołu.
To systematyczne stosowanie tego samego filtru na obrazie jest potężnym pomysłem . Jeśli filtr jest przeznaczony do wykrywania określonego typu cechy na wejściu, wówczas zastosowanie tego filtru systematycznie na całym obrazie wejściowym daje filtrowi możliwość odkrycia tej cechy w dowolnym miejscu obrazu. Ta możliwość jest powszechnie nazywana niezmienniczością translacji, np. ogólne zainteresowanie tym, czy funkcja jest obecna, a nie gdzie była obecna.
Niezmienność lokalnego tłumaczenia może być bardzo przydatną właściwością, jeśli bardziej zależy nam na czy jakaś funkcja jest obecna, niż dokładnie tam, gdzie się znajduje.Na przykład, ustalając, czy obraz zawiera twarz, nie musimy znać lokalizacji oczu z dokładnością do piksela, wystarczy wiedzieć, że po lewej stronie twarzy znajduje się oko, a po prawej boku twarzy.
– Strona 342, Deep Learning, 2016.
Wynik pomnożenia filtra przez tablicę wejściową jeden raz to pojedyncza wartość. Ponieważ filtr jest nakładany wielokrotnie na tablicę wejściową, wynikiem jest dwuwymiarowa tablica wartości wyjściowych, które reprezentują filtrowanie danych wejściowych. W związku z tym dwuwymiarowa tablica wyjściowa z tej operacji nazywana jest „mapą obiektów”.
Po utworzeniu mapy obiektów możemy przekazać każdą wartość z mapy obiektów przez nieliniowość, taką jak ReLU, podobnie jak robimy to dla danych wyjściowych w pełni połączonej warstwy.
Przykład filtru Zastosowane do dwuwymiarowych danych wejściowych w celu utworzenia mapy funkcji
Jeśli pochodzisz z pola cyfrowego przetwarzania sygnałów lub pokrewnej dziedziny matematyki, możesz rozumieć operację splotu na macierzy jako coś innego . W szczególności filtr (jądro) jest odwracany przed zastosowaniem na wejściu. Technicznie rzecz biorąc, splot, jak opisano w przypadku korzystania ze splotowych sieci neuronowych, jest w rzeczywistości „korelacją krzyżową”. Niemniej w uczeniu głębokim jest nazywany operacją „splotu”.
Wiele bibliotek uczenia maszynowego wdraża korelację krzyżową, ale nazywa to konwolucją.
– Strona 333, Deep Learning, 2016.
Podsumowując, mamy dane wejściowe, takie jak obraz wartości pikseli, i mamy filtr, który jest zestawem wag, a filtr jest systematycznie stosowany do danych wejściowych w celu utworzenia mapy cech .
Konwolucja w wizji komputerowej
Idea zastosowania operacji splotu do danych obrazu nie jest nowa ani unikalna dla konwolucyjnych sieci neuronowych; jest to powszechnie stosowana technika w wizji komputerowej.
W przeszłości filtry były projektowane ręcznie przez ekspertów komputerowych, a następnie nakładane na obraz w celu uzyskania mapy cech lub wyniku zastosowania filtra, a następnie analiza obrazu jest w jakiś sposób łatwiejsza.
Na przykład poniżej znajduje się ręcznie wykonany filtr 3 × 3 elementów do wykrywania pionowych linii:
1
2
3
|
0,0, 1,0, 0,0
0,0, 1,0, 0,0
0,0, 1,0, 0,0
|
Stosowanie tego filtru do pliku image spowoduje, że mapa obiektów będzie zawierała tylko pionowe linie. Jest to detektor linii pionowej.
Możesz to zobaczyć na podstawie wartości wagi w filtrze; wszelkie wartości pikseli na środkowej linii pionowej zostaną aktywowane pozytywnie, a wartości po obu stronach zostaną aktywowane negatywnie. Systematyczne przeciąganie tego filtra przez wartości pikseli na obrazie może podświetlić tylko piksele linii pionowych.
Można również utworzyć detektor linii poziomej i zastosować go również do obrazu, na przykład:
1
2
3
|
0,0, 0,0, 0,0
1.0, 1.0, 1.0
0.0, 0.0, 0.0
|
Połączenie wyników z obu filtrów, np połączenie obu map obiektów spowoduje wyróżnienie wszystkich linii obrazu.
Można zaprojektować zestaw dziesiątek, a nawet setek innych małych filtrów, aby wykrywać inne cechy obrazu.
Innowacyjność stosowania operacji splotu w sieci neuronowej polega na tym, że wartości filtru to wagi, których należy się nauczyć podczas uczenia sieci.
Sieć nauczy się, jakie typy funkcji należy wyciąg z wejścia. W szczególności, ucząc się przy stochastycznym spadku gradientu, sieć jest zmuszona nauczyć się wyodrębniać z obrazu cechy, które minimalizują straty dla określonego zadania, do którego rozwiązania jest szkolona sieć, np. wyodrębnij cechy, które są najbardziej przydatne do klasyfikowania obrazów jako psy lub koty.
W tym kontekście widać, że jest to potężny pomysł.
Potęga wyuczonych filtrów
Nauka pojedynczego filtra specyficznego dla zadania uczenia maszynowego to potężna technika.
Jednak splotowe sieci neuronowe osiągają znacznie więcej w praktyce .
Wiele filtrów
Konwolucyjne sieci neuronowe nie uczą się ani jednego filtru; w rzeczywistości uczą się wielu funkcji równolegle dla danego wejścia.
Na przykład często warstwa splotowa uczy się równolegle od 32 do 512 filtrów dla danego wejścia.
Daje to modelowi 32, a nawet 512 różne sposoby wyodrębniania cech z danych wejściowych lub wiele różnych sposobów zarówno „uczenia się widzenia”, jak i po treningu, wiele różnych sposobów „widzenia” danych wejściowych.
Ta różnorodność pozwala na specjalizację np nie tylko linie, ale konkretne linie widoczne w Twoich danych treningowych.
Wiele kanałów
Kolorowe obrazy mają wiele kanałów, zazwyczaj po jednym dla każdego kanału koloru, np. czerwony, zielony, i niebieski.
Z punktu widzenia danych oznacza to, że pojedynczy obraz dostarczony jako dane wejściowe do modelu to w rzeczywistości trzy obrazy.
Filtr musi zawsze mieć tę samą liczbę kanałów jako wejście, często określane jako „głębokość”. Jeśli obraz wejściowy ma 3 kanały (np. Głębia 3), to filtr zastosowany do tego obrazu musi również mieć 3 kanały (np. Głębia 3). W tym przypadku filtr 3 × 3 faktycznie miałby postać 3x3x3 lub dla wierszy, kolumn i głębokości. Niezależnie od głębokości wejścia i głębokości filtra, filtr jest nakładany na dane wejściowe za pomocą operacji iloczynu skalarnego, która daje pojedynczą wartość.
Oznacza to, że jeśli warstwa splotowa ma 32 filtry, te 32 filtry są nie tylko dwuwymiarowe dla dwuwymiarowego wejścia obrazu, ale są również trójwymiarowe, mając określone wagi filtrów dla każdego z trzech kanałów. Jednak każdy filtr daje w wyniku pojedynczą mapę obiektów. Co oznacza, że głębokość wyniku zastosowania warstwy splotowej z 32 filtrami wynosi 32 dla 32 utworzonych map obiektów.
Wiele warstw
Warstwy splotowe są stosowane nie tylko do danych wejściowych. , np nieprzetworzone wartości pikseli, ale można je również zastosować do wyjścia innych warstw.
Układanie warstw splotowych umożliwia hierarchiczną dekompozycję danych wejściowych.
Weź pod uwagę, że filtry, które działają bezpośrednio na surowych wartościach pikseli nauczy się wyodrębniać cechy niskiego poziomu, takie jak linie.
Filtry działające na wyjściu warstw pierwszego wiersza mogą wyodrębniać cechy, które są kombinacjami cech niższego poziomu, takie jak cechy, które składają się z wielu linii, aby wyrazić kształty.
Ten proces trwa, dopóki bardzo głębokie warstwy nie wyodrębnią twarzy, zwierząt, domów itd.
To jest dokładnie to, co widzimy w praktyce. Abstrakcji cech do wysokich i wyższych rzędów wraz ze wzrostem głębokości sieci.
Przykład praktyczny warstw splotowych
Biblioteka głębokiego uczenia Keras zapewnia zestaw warstw splotowych.
Możemy lepiej zrozumieć operację splotu, patrząc na kilka sprawdzonych przykładów z wymyślonymi danymi i ręcznie wykonanymi filtrami.
W tej sekcji przyjrzymy się zarówno jednowymiarowej warstwie splotu, jak i przykład dwuwymiarowej warstwy splotu, aby zarówno ukonkretnić operację splotu, jak i zapewnić praktyczny przykład użycia warstw Keras.
Przykład warstwy splotu 1D
Możemy zdefiniować wymiarowe dane wejściowe, które mają osiem elementów, wszystkie mają wartość 0,0, z dwoma elementami w środku i wartościami 1,0.
1
|
|
Dane wejściowe dla Keras muszą być trójwymiarowe dla warstwy splotu 1D.
Pierwszy wymiar odnosi się do każdej próbki wejściowej; w tym przypadku mamy tylko jedną próbkę. Drugi wymiar odnosi się do długości każdej próbki; w tym przypadku długość wynosi osiem. Trzeci wymiar odnosi się do liczby kanałów w każdej próbce; w tym przypadku mamy tylko jeden kanał.
Dlatego tablica wejściowa będzie miała kształt.
1
2
3
|
# define input dane
data = asarray ()
data = data.reshape (1, 8, 1)
|
Zdefiniujemy model, który oczekuje, że próbki wejściowe będą miały kształt.
Model będzie miał pojedynczy filtr z kształt o szerokości 3 lub trzech elementów. Keras określa kształt filtru jako rozmiar_kernela.
1
2
3
|
# create model
model = Sequential ()
model.add (Conv1D (1, 3, input_shape = (8, 1)))
|
Domyślnie filtry w warstwie konwolucyjnej są inicjalizowane z przypadkowymi wagami. W tym wymyślonym przykładzie ręcznie określimy wagi dla pojedynczego filtra. Zdefiniujemy filtr, który jest w stanie wykrywać uderzenia, czyli wysoką wartość wejściową otoczoną niskimi wartościami wejściowymi, tak jak zdefiniowaliśmy w naszym przykładzie wejściowym.
Trzyelementowy filtr, który zdefiniujemy, wygląda następująco:
1
|
|
Warstwa konwolucyjna ma również wartość wejściową odchylenia, która również wymaga wagi, którą ustawimy na zero.
Dlatego możemy zmusić wagi naszej jednowymiarowej warstwy splotowej do użycia naszego ręcznie stworzonego filtru w następujący sposób:
Wagi muszą być określone w at trójwymiarowa struktura pod względem rzędów, kolumn i kanałów. Filtr ma jeden wiersz, trzy kolumny i jeden kanał.
Możemy pobrać wagi i potwierdzić, że zostały ustawione poprawnie.
1
2
|
# potwierdź, że zostały zapisane
print (model.get_weights ())
|
Wreszcie możemy zastosować pojedynczy filtr do naszych danych wejściowych.
Możemy to osiągnąć, wywołując w modelu funkcję Predict (). Spowoduje to bezpośrednie zwrócenie mapy cech: jest to wynik systematycznego stosowania filtru w sekwencji wejściowej.
1
2
3
|
# zastosuj filtr do danych wejściowych
yhat = model.predict (data)
print (yhat )
|
Łącząc to wszystko razem, kompletny przykład to wymienione poniżej.
Uruchomienie przykładu najpierw wypisuje wagi sieci; to jest potwierdzenie, że nasz ręcznie wykonany filtr został ustawiony w modelu zgodnie z oczekiwaniami.
Następnie filtr jest stosowany do wzorca wejściowego, a mapa elementów jest obliczana i wyświetlana. Na podstawie wartości mapy cech widać, że wypukłość została wykryta poprawnie.
1
2
3
4
5
6
7
8
9
10
|
],
],
]], dtype = float32), tablica (, dtype = float32)]
]]
|
Przyjrzyjmy się bliżej temu, co się tutaj wydarzyło.
Przypomnijmy, że dane wejściowe to ośmioelementowy wektor o wartościach:.
Najpierw trzyelementowy filtr został zastosowany do pierwszych trzech wejść wstaw, obliczając iloczyn skalarny (operator „.”), co dało pojedynczą wartość wyjściową na mapie cech równą zero.
1
2
|
z numpy import asarray
print (asarray (). dot (asarray ()))
|
W naszym ręcznym przykładzie wygląda to następująco:
1
|
. = 0
|
Filtr został następnie przesunięty wzdłuż jednego elementu sekwencję wprowadzania i proces powtórzono; w szczególności ten sam filtr został zastosowany do sekwencji wejściowej przy indeksach 1, 2 i 3, co również spowodowało zerowy wynik na mapie obiektów.
1
|
. = 0
|
Jesteśmy systematyczni, więc znowu filtr jest przesuwany wzdłuż jeszcze jednego elementu wejścia i stosowany do wejścia pod indeksami 2, 3 i 4. Tym razem wyjście ma wartość jeden na mapie cech. Wykryliśmy tę funkcję i odpowiednio aktywowaliśmy.
1
|
. = 1
|
Proces jest powtarzany, dopóki nie obliczymy całego mapa funkcji.
1
|
|
Zauważ, że mapa obiektów ma sześć elementów, podczas gdy nasze dane wejściowe mają osiem elementów. Jest to artefakt tego, jak filtr został zastosowany do sekwencji wejściowej. Istnieją inne sposoby zastosowania filtru do sekwencji wejściowej, która zmienia kształt wynikowej mapy obiektów, na przykład wypełnienie, ale nie będziemy omawiać tych metod w tym poście.
Możesz sobie wyobrazić, że z różnymi dane wejściowe, możemy wykryć cechę z mniejszą lub większą intensywnością i przy różnych wagach w filtrze, tak że wykrylibyśmy różne cechy w sekwencji wejściowej.
Przykład warstwy konwolucyjnej 2D
Możemy rozszerzyć przykład wykrywania wypukłości z poprzedniej sekcji do detektora linii pionowej na obrazie dwuwymiarowym.
Ponownie , możemy ograniczyć dane wejściowe, w tym przypadku do kwadratowego obrazu wejściowego o wymiarach 8 × 8 pikseli z pojedynczym kanałem (np. w skali szarości) z jedną pionową linią pośrodku.
1
2
3
4
5
6
7
8
|
|
Dane wejściowe do warstwy Conv2D muszą być czterowymiarowe.
Pierwszy wymiar definiuje próbki; w tym przypadku jest tylko jedna próbka. Drugi wymiar określa liczbę wierszy; w tym przypadku osiem. Trzeci wymiar określa liczbę kolumn, znowu osiem w tym przypadku, a na końcu liczbę kanałów, która w tym przypadku wynosi jeden.
Dlatego dane wejściowe muszą mieć kształt czterowymiarowy lub w tym przypadku.
Zdefiniujemy Conv2D z pojedynczym filtrem, tak jak zrobiliśmy to w poprzedniej sekcji z przykładem Conv1D.
Filtr będzie dwuwymiarowy i kwadratowy o kształcie 3 × 3. Warstwa będzie oczekiwać, że próbki wejściowe będą miały kształt lub.
1
2
3
|
# create model
model = Sequential ()
model.add (Conv2D (1, (3,3), input_shape = (8, 8, 1)))
|
Zdefiniujemy branżę filtr detektora linii do wykrywania pojedynczej pionowej linii w naszych danych wejściowych.
Filtr wygląda następująco:
1
2
3
|
0, 1, 0
0, 1, 0
0, 1, 0
|
Możemy to zaimplementować w następujący sposób:
Wreszcie zastosuj filtr do obrazu wejściowego, co spowoduje powstanie mapy obiektów, na której spodziewalibyśmy się wykrycia pionowej linii w obrazie wejściowym.
1
2
|
# zastosuj filtr do danych wejściowych
yhat = model.predict (data)
|
Kształt wyjściowej mapy obiektów będzie czterowymiarowy wraz z kształtem. Będziemy wykonywać pojedynczą partię i mamy jeden filtr (jeden filtr i jeden kanał wejściowy), dlatego kształt wyjściowy to. Możemy w następujący sposób wydrukować zawartość mapy pojedynczych obiektów:
1
2
3
|
for r in range (yhat.shape):
# drukuj każdą kolumnę w wierszu
print (for c in range ( yhat.shape)])
|
Łączenie tego wszystkiego razem pełny przykład znajduje się poniżej.
Uruchomienie przykładu jako pierwsze potwierdza, że ręcznie wykonany filtr został poprawnie zdefiniowany w wagach warstw
Następnie drukowana jest obliczona mapa obiektów. Ze skali liczb możemy zobaczyć, że rzeczywiście filtr wykrył pojedynczą pionową linię z silną aktywacją na środku mapy obiektów.
Przyjrzyjmy się bliżej temu, co zostało obliczone.
Najpierw filtr został zastosowany w lewym górnym rogu obrazu lub fragmentu obrazu składającego się z elementów 3 × 3. Technicznie rzecz biorąc, obszar obrazu jest trójwymiarowy z jednym kanałem, a filtr ma takie same wymiary. Nie możemy tego zaimplementować w NumPy za pomocą funkcji dot (), zamiast tego musimy użyć funkcji tensordot (), abyśmy mogli odpowiednio zsumować wszystkie wymiary, na przykład:
To obliczenie daje pojedynczą wartość wyjściową 0,0, np. funkcja nie została wykryta. To daje nam pierwszy element w lewym górnym rogu mapy obiektów.
Ręcznie wyglądałoby to następująco:
1
2
3
|
0, 1, 0 0, 0, 0
0, 1, 0. 0, 0, 0 = 0
0, 1, 0 0, 0, 0
|
Filtr jest przesuwany o jedną kolumnę w lewo i proces jest powtarzany. Ponownie funkcja nie jest wykrywana.
1
2
3
|
0, 1, 0 0, 0, 1
0, 1, 0. 0, 0, 1 = 0
0, 1, 0 0, 0, 1
|
Jeszcze jeden ruch w lewo do następnej kolumny i funkcja zostaje wykryta po raz pierwszy, co skutkuje silną aktywacją.
1
2
3
|
0, 1, 0 0, 1, 1
0, 1, 0. 0, 1, 1 = 3
0, 1, 0 0, 1, 1
|
Ten proces jest powtarzany, aż krawędź filtra oprze się o krawędź lub ostatnią kolumnę obrazu wejściowego. Daje to ostatni element w pierwszym pełnym wierszu mapy obiektów.
1
|
|
Następnie filtr przesuwa się o jeden wiersz w dół i z powrotem do pierwszej kolumny, a proces jest powiązany od lewej do prawej, dając drugi wiersz mapy obiektów. I dalej, aż dolna część filtra spocznie na dolnym lub ostatnim wierszu obrazu wejściowego.
Ponownie, podobnie jak w poprzedniej sekcji, widzimy, że mapa cech to macierz 6 × 6, mniejsza niż obraz wejściowy 8 × 8 ze względu na ograniczenia w zastosowaniu filtru do obrazu wejściowego.
Dodatkowe informacje
Ta sekcja zawiera więcej zasobów na ten temat, jeśli jesteś chcąc wejść głębiej.
Posty
- Awaryjny kurs konwolucyjnych sieci neuronowych do uczenia maszynowego
Książki
- Rozdział 9: Sieci konwolucyjne, Deep Learning, 2016.
- Rozdział 5: Deep Learning for Computer Vision, Deep Learning with Python, 2017.
API
- Keras Convolutional Layers API
- numpy.asarray API
Podsumowanie
W tym samouczku odkryłeś jak działają konwolucje w konwolucyjnych sieciach neuronowych.
W szczególności dowiedziałeś się:
- Konwolucyjne sieci neuronowe stosują filtr na wejściu aby utworzyć mapę cech, która podsumowuje obecność wykrytych obiektów na wejściu.
- Filtry mogą być wykonywane ręcznie, na przykład detektory liniowe, ale innowacją w konwolucyjnych sieciach neuronowych jest nauczenie się filtrów podczas szkolenia w kontekście konkretnego problemu z prognozowaniem.
- Jak obliczyć mapa cech dla jedno- i dwuwymiarowych warstw konwolucyjnych w konwolucyjnej sieci neuronowej.
Masz jakieś pytania?
Zadaj pytania w komentarzach poniżej, a ja najlepiej odpowiedzieć.
Opracuj modele uczenia głębokiego dla wizji już dziś!
Opracuj własne modele wizji w kilka minut
… za pomocą zaledwie kilku linijek kodu Pythona
Dowiedz się, jak to zrobić w moim nowym ebooku:
Deep Learning for Computer Vision
Zawiera samouczki do samodzielnej nauki na tematy takie jak:
klasyfikacja, wykrywanie obiektów (yolo i rcnn), rozpoznawanie twarzy (vggface i facenet) , przygotowanie danych i wiele więcej …
Wreszcie wprowadź głębokie uczenie do swoich projektów wizji
Pomiń akademików. Tylko wyniki.
Zobacz, co jest w środku