Przywitaj się z „Hello, World”,

1. Zanim zaczniesz

Dzięki temu ćwiczeniu poznasz podstawowe informacje na temat systemów uczących się (ML), w których zamiast programować reguły dla języka obcego (np. Java lub C++), utworzysz system wytrenowany na podstawie danych, aby wywnioskować reguły, które określają zależności między liczbami.

Rozważ następujący problem: tworzysz system wykonujący rozpoznawanie aktywności dla śledzenia aktywności fizycznej. Możesz mieć dostęp do informacji o szybkości, z jaką człowiek chodzi, i próbować wywnioskować na podstawie tej prędkości swoją aktywność z zastosowaniem warunków.

cc3628d9a1547597.png

if(speed<4){
  status=WALKING;
}

Możesz rozszerzyć ten okres na inny warunek.

f2cc3929221107b8.png

if(speed<4){
    status=WALKING;
} else {
    status=RUNNING;
}

W końcowym warunku możesz podobnie wykryć jazdę na rowerze.

Aeb282cf03d5cff.png

if(speed<4){
    status=WALKING;
} else if(speed<12){
    status=RUNNING;
} else {
    status=BIKING;
}

Zastanów się, co się dzieje, gdy chcesz uwzględnić jakąś aktywność, np. golfa. Utworzenie reguły określającej aktywność jest mniej oczywiste.

fc772abb6fee2804.png

// Now what?

Napisanie programu, który rozpoznaje tę grę, jest bardzo trudne. Co robisz? Aby rozwiązać ten problem, możesz użyć systemów uczących się.

Wymagania wstępne

Zanim rozpoczniesz te ćwiczenia z programowania, przygotuj się do:

  • Solidna znajomość Pythona
  • Podstawowe umiejętności programistyczne

Czego się nauczysz:

  • Podstawy systemów uczących się

Co stworzysz

  • Twój pierwszy model systemów uczących się

Czego potrzebujesz

Jeśli model ML nie został jeszcze przez Ciebie utworzony za pomocą TensorFlow, możesz wykorzystać Colaboratory – środowisko przeglądarki zawierające wszystkie wymagane zależności. Kod do reszty ćwiczeń z programowania znajdziesz w Colab.

Jeśli używasz innego środowiska IDE, upewnij się, że masz zainstalowany Pythona. Potrzebujesz też TensorFlow i biblioteki NumPy. Dowiedz się więcej o TensorFlow. Zainstaluj NumPy tutaj

2. Co to są systemy uczące się?

Weź pod uwagę tradycyjny sposób tworzenia aplikacji przedstawiony na tym diagramie:

C72f871306134e45.png

Wyrażasz zgodę na reguły w języku programowania. Działają na podstawie danych, a Twój program zapewnia odpowiedzi**.** W przypadku wykrywania aktywności reguły (napisany przez Ciebie kod do definiowania typów aktywności) bazują na danych (prędkość ruchu osoby), aby uzyskać odpowiedź: wartość zwracaną przez funkcję służącą do określania stanu aktywności użytkownika (może chodzić, biegać, jeździć na rowerze lub wykonywać inne czynności).

Proces wykrywania stanu aktywności przez ML jest bardzo podobny – tylko osie są różne.

9B85a337ee816e1b.png

Zamiast definiować reguły i wyrażać je w swoim języku programowania, podajesz odpowiedzi (zwykle nazywane etykietami) wraz z danymi, a komputer określa reguły decydujące o relacji między odpowiedziami i danymi. Scenariusz wykrywania aktywności może na przykład wyglądać tak:

6ff58697a85931f4.png

Zbierasz dużo danych i oznaczasz je etykietami, by móc np. powiedzieć „"Tak wygląda piesza” i „Tak wygląda bieganie”." Następnie komputer może wywnioskować na podstawie danych, które określają różne wzorce wskazujące na konkretną aktywność.

Oprócz alternatywnej metody programowania takich scenariuszy daje też możliwość otwierania nowych scenariuszy, np. golfa, który byłby możliwy wcześniej niż tradycyjne podejście do programowania oparte na regułach.

W tradycyjnym programowaniu kod jest kompilowany do postaci binarnej, która zwykle jest nazywana programem. W systemie ML element utworzony na podstawie danych i etykiet jest nazywany modelem.

Jeśli wrócisz do tego diagramu:

53ff9e2cb511936e.png

W rezultacie otrzymasz taki model, który będzie używany w czasie działania w ten sposób:

693430bb4d7fa001.png

Model przekazuje część danych, a model wykorzystuje reguły wywnioskowane z trendu, aby utworzyć prognozę, np. „"Te dane wyglądają jak spacery”"„Wygląda na to, że jedziesz na rowerze”."

3. Utwórz pierwszy model ML

Przyjrzyjmy się poniższym zestawom cyfr. Czy widzisz związek między nimi?

X:

-1

0

1

2

3

4

T:

-2

1

4

7

10

13

Można zauważyć, że wartość X zwiększa się o 1, gdy czytasz od lewej do prawej, a wartość Y wzrasta o 3. Załóżmy, że wartość Y jest równa 3X plus lub minus. Następnie przyjrzysz się 0 w X i zauważysz, że Y ma wartość 1, a Ty generujesz związek Y=3X+1.

To prawie tak samo jak kod do wytrenowania modelu do wykrywania wzorców w danych!

Spójrz na kod, aby to zrobić.

Jak wytrenujesz sieć neuronową tak, by wykonywała równoważne zadanie? Wykorzystano! Jeśli podasz ten plik z zestawem znaków X's i Y&#39s, będzie on w stanie określić relację między nimi.

Importy

Zacznij importowanie. W tym celu importujesz TensorFlow i wywołujesz go tf, aby ułatwić sobie korzystanie z niego.

Następnie zaimportuj bibliotekę o nazwie numpy, która reprezentuje Twoje dane w łatwy i szybki sposób.

Schemat definiowania sieci neuronowej jako zbioru warstw sekwencyjnych nazywa się keras, więc ją zaimportuj.

import tensorflow as tf
import numpy as np
from tensorflow import keras

Definiowanie i kompilowanie sieci neuronowej

Następnie utwórz najprostszą sieć neuronową. Ma jedną warstwę, warstwę składa się z jednego neuronu, a kształt wejściowy to tylko jedna wartość.

model = tf.keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])])

Napisz kod, by skompilować swoją sieć neuronową. W tym celu musisz określić 2 funkcje – loss i optimizer.

W tym przykładzie wiesz, że zależność między liczbami to Y=3X+1.

Gdy komputer próbuje się tego nauczyć, wydaje się zgadywanie, np. Y=10X+10. Funkcja loss mierzy zgadywane odpowiedzi na podstawie prawidłowych odpowiedzi i zmierza, jak dobrze.

Model używa funkcji optimizer, aby zgadywać. Na podstawie wyniku utraty danych próbuje ona zminimalizować stratę. W tym momencie może to wyglądać tak: Y=5X+5. To nadal słaba sytuacja, ale wyniki zbliżały się do właściwego (strata jest mniejsza).

Model powtarza tę liczbę dla liczby epoki, którą wkrótce zobaczysz.

Najpierw wyjaśnij, jak używać mean_squared_error do straty i zjazdu gradientowego sosnowego(sgd) w przypadku optymalizatora. Nie musisz jeszcze znać zasad działania matematyki, ale wiesz, że działają.

Z czasem nauczysz się różnych funkcji związanych z utratą i optymalizatorem w różnych sytuacjach.

model.compile(optimizer='sgd', loss='mean_squared_error')

Podawanie danych

Potem prześlij plik danych. W tym przypadku trzeba wykorzystać sześć zmiennych X i Y z wcześniejszych. Widać, że istnieje między nimi relacja Y=3X+1, gdzie X to -1, Y to -2.

Biblioteka Pythona o nazwie NumPy zapewnia wiele struktur danych typu tablicy do tego celu. Określ wartości jako tablicę w NumPy za pomocą np.array[].

xs = np.array([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0], dtype=float)
ys = np.array([-2.0, 1.0, 4.0, 7.0, 10.0, 13.0], dtype=float)

Masz teraz cały kod potrzebny do zdefiniowania sieci neuronowej. Kolejnym krokiem jest wytrenowanie modelu i sprawdzenie, czy zna wzorce między tymi liczbami, a następnie użycie ich do utworzenia modelu.

4. Trenowanie sieci neuronowej

Proces trenowania sieci neuronowej, w którym uczy się zależności między punktami X i Y&#39, znajduje się w wywołaniu model.fit. To miejsce, gdzie ta pętla przechodzi przez pętlę przed zgadywaniem, mierzy skuteczność czy zły (strata) albo używa optymalizatora do wymyślania kolejnych przypuszczeń. Będzie to miało wpływ na określoną przez Ciebie liczbę epok. Gdy uruchomisz ten kod, dla każdej epoki zostanie wydrukowana strata.

model.fit(xs, ys, epochs=500)

Możesz na przykład zobaczyć, że w pierwszych okresach epoki wartość straty jest duża, ale z każdym krokiem maleje.

f110d5abed07c1b9.png

Wraz z postępem trenowania strata jest bardzo mała.

81CA5e71298b414b.png

Gdy trenowanie jest zakończone, strata jest bardzo mała, co pokazuje, że nasz model świetnie rozumie zależności między wartościami.

12b187014b639fd.png

Prawdopodobnie nie potrzebujesz wszystkich 500 epoki i możesz eksperymentować z różnymi kwotami. Jak widać na przykładzie, strata jest niewielka, choć wynosi ona tylko 50 epoków, więc to wystarczy.

5. Używanie modelu

Masz model, który został wytrenowany, aby nauczyć się relacji między X i Y. Możesz użyć metody model.predict, aby ustawić Y dla wcześniej nieznanego X. Jeśli na przykład X ma wartość 10, co Twoim zdaniem będzie Y? Zgadnij, zanim uruchomisz ten kod:

print(model.predict([10.0]))

Myślisz, że tak było po 31, ale okazało się, że nieco się skończyły. Dlaczego uważasz, że tak?

Sieci neuronowe radzą sobie z prawdopodobieństwem, więc obliczyły, że istnieje bardzo duże prawdopodobieństwo, że związki między X i Y to Y=3X+1. Nie ma jednak pewności, że obejmuje ona tylko sześć punktów danych. Wynik jest bardzo zbliżony do 31, ale niekoniecznie 31.

Podczas pracy z sieciami neuronowymi ten wzorzec będzie się powtarzał. Prawie zawsze będziesz radzić sobie z prawdopodobieństwami, a nie z pewnością. Wymaga też trochę kodowania, aby określić wynik na podstawie prawdopodobieństwa, zwłaszcza w przypadku klasyfikacji.

6. Gratulacje

Uwierzyliśmy Ci, że większość zagadnień związanych z systemami uczącymi się została omówiona w bardziej złożonych scenariuszach. Udało Ci się wytrenować sieć neuronową tak, aby rozpoznała relację między dwoma zbiorami liczb, definiując sieć. Zdefiniowano zestaw warstw (w tym przypadku tylko jeden) zawierających neurony (w tym przypadku tylko jedną), które następnie skompilowano z funkcją utraty danych i optymalizatorem.

Zbiór sieci, funkcja straty i optymalizator przeprowadza proces odgadywania relacji między liczbami, pomiar ich skuteczności, a następnie generowanie nowych parametrów dla nowych wniosków. Więcej informacji znajdziesz na stronie TensorFlow.org.

Więcej informacji

Aby dowiedzieć się więcej o tym, jak systemy uczące się i TensorFlow mogą pomóc w modelu rozpoznawania obrazów, przejdź do artykułu o tworzeniu modelu wizualnego komputera za pomocą TensorFlow.