CNTK - szkolenie sieci neuronowej

Tutaj zrozumiemy, jak trenować sieć neuronową w CNTK.

Trenowanie modelu w CNTK

W poprzedniej sekcji zdefiniowaliśmy wszystkie komponenty modelu uczenia głębokiego. Teraz czas go wyszkolić. Jak omówiliśmy wcześniej, możemy wytrenować model NN w CNTK przy użyciu kombinacjilearner i trainer.

Wybór osoby uczącej się i przygotowanie szkolenia

W tej sekcji będziemy definiować learner. CNTK zapewnia kilkalearnersdo wybrania z. W naszym modelu, zdefiniowanym w poprzednich sekcjach, będziemy używaćStochastic Gradient Descent (SGD) learner.

Aby wytrenować sieć neuronową, skonfigurujmy learner i trainer za pomocą następujących kroków -

Step 1 - Najpierw musimy zaimportować sgd funkcja z cntk.lerners pakiet.

from cntk.learners import sgd

Step 2 - Następnie musimy zaimportować Trainer funkcja z cntk.trainpakiet .trainer.

from cntk.train.trainer import Trainer

Step 3 - Teraz musimy stworzyć plik learner. Można go utworzyć przez wywołaniesgd funkcji wraz z podaniem parametrów modelu i wartości współczynnika uczenia się.

learner = sgd(z.parametrs, 0.01)

Step 4 - W końcu musimy zainicjować trainer. Należy podać sieć, kombinacjęloss i metric razem z learner.

trainer = Trainer(z, (loss, error_rate), [learner])

Szybkość uczenia się, która steruje szybkością optymalizacji, powinna wynosić od 0,1 do 0,001.

Wybór osoby uczącej się i przygotowanie szkolenia - pełny przykład

from cntk.learners import sgd
from cntk.train.trainer import Trainer
learner = sgd(z.parametrs, 0.01)
trainer = Trainer(z, (loss, error_rate), [learner])

Dostarczanie danych do trenera

Po wybraniu i skonfigurowaniu trenera czas na załadowanie zestawu danych. Uratowaliśmyiris zbiór danych jako plik.CSV plik i będziemy używać pakietu do zarządzania danymi o nazwie pandas aby załadować zbiór danych.

Kroki ładowania zestawu danych z pliku .CSV

Step 1 - Najpierw musimy zaimportować plik pandas pakiet.

from import pandas as pd

Step 2 - Teraz musimy wywołać funkcję o nazwie read_csv funkcję załadowania pliku .csv z dysku.

df_source = pd.read_csv(‘iris.csv’, names = [‘sepal_length’, ‘sepal_width’, 
‘petal_length’, ‘petal_width’, index_col=False)

Po załadowaniu zbioru danych musimy podzielić go na zestaw funkcji i etykietę.

Kroki, aby podzielić zbiór danych na funkcje i etykietę

Step 1- Najpierw musimy wybrać wszystkie wiersze i pierwsze cztery kolumny ze zbioru danych. Można to zrobić za pomocąiloc funkcjonować.

x = df_source.iloc[:, :4].values

Step 2- Następnie musimy wybrać kolumnę gatunku z zestawu danych tęczówki. Będziemy używać właściwości values, aby uzyskać dostęp do elementu bazowegonumpy szyk.

x = df_source[‘species’].values

Kroki, aby zakodować kolumnę gatunków do liczbowej reprezentacji wektorowej

Jak wspomnieliśmy wcześniej, nasz model oparty jest na klasyfikacji, wymaga numerycznych wartości wejściowych. Dlatego tutaj musimy zakodować kolumnę gatunków do numerycznej reprezentacji wektorowej. Zobaczmy kroki, aby to zrobić -

Step 1- Najpierw musimy utworzyć wyrażenie listy, które będzie iterować po wszystkich elementach tablicy. Następnie wyszukaj każdą wartość w słowniku label_mapping.

label_mapping = {‘Iris-Setosa’ : 0, ‘Iris-Versicolor’ : 1, ‘Iris-Virginica’ : 2}

Step 2- Następnie przekonwertuj tę przekonwertowaną wartość liczbową na jeden zakodowany wektor. Będziemy używaćone_hot działają w następujący sposób -

def one_hot(index, length):
result = np.zeros(length)
result[index] = 1
return result

Step 3 - W końcu musimy przekształcić tę przekonwertowaną listę w plik numpy szyk.

y = np.array([one_hot(label_mapping[v], 3) for v in y])

Kroki umożliwiające wykrycie nadmiernego dopasowania

Sytuacja, w której model pamięta próbki, ale nie może wydedukować reguł z próbek szkoleniowych, jest nadmiernym dopasowaniem. Wykonując następujące kroki, możemy wykryć nadmierne dopasowanie w naszym modelu -

Step 1 - Najpierw z sklearn pakiet, zaimportuj plik train_test_split funkcja z model_selection moduł.

from sklearn.model_selection import train_test_split

Step 2 - Następnie musimy wywołać funkcję train_test_split z cechami x i etykietami y w następujący sposób -

x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0-2, 
stratify=y)

Określiliśmy test_size na 0,2, aby odłożyć na bok 20% wszystkich danych.

label_mapping = {‘Iris-Setosa’ : 0, ‘Iris-Versicolor’ : 1, ‘Iris-Virginica’ : 2}

Kroki, aby przesłać zestaw szkoleniowy i zestaw walidacyjny do naszego modelu

Step 1 - Aby wytrenować nasz model, najpierw będziemy wywoływać train_minibatchmetoda. Następnie daj mu słownik, który odwzorowuje dane wejściowe na zmienną wejściową, której użyliśmy do zdefiniowania NN i związanej z nią funkcji straty.

trainer.train_minibatch({ features: X_train, label: y_train})

Step 2 - Następnie zadzwoń train_minibatch używając następującej pętli for -

for _epoch in range(10):
trainer.train_minbatch ({ feature: X_train, label: y_train})
print(‘Loss: {}, Acc: {}’.format(
trainer.previous_minibatch_loss_average,
trainer.previous_minibatch_evaluation_average))

Wprowadzanie danych do trenera - kompletny przykład

from import pandas as pd
df_source = pd.read_csv(‘iris.csv’, names = [‘sepal_length’, ‘sepal_width’, ‘petal_length’, ‘petal_width’, index_col=False)
x = df_source.iloc[:, :4].values
x = df_source[‘species’].values
label_mapping = {‘Iris-Setosa’ : 0, ‘Iris-Versicolor’ : 1, ‘Iris-Virginica’ : 2}
def one_hot(index, length):
result = np.zeros(length)
result[index] = 1
return result
y = np.array([one_hot(label_mapping[v], 3) for v in y])
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0-2, stratify=y)
label_mapping = {‘Iris-Setosa’ : 0, ‘Iris-Versicolor’ : 1, ‘Iris-Virginica’ : 2}
trainer.train_minibatch({ features: X_train, label: y_train})
for _epoch in range(10):
trainer.train_minbatch ({ feature: X_train, label: y_train})
print(‘Loss: {}, Acc: {}’.format(
trainer.previous_minibatch_loss_average,
trainer.previous_minibatch_evaluation_average))

Pomiar wydajności NN

Aby zoptymalizować nasz model NN, ilekroć przekazujemy dane przez trenera, mierzy on wydajność modelu za pomocą metryki, którą skonfigurowaliśmy dla trenera. Taki pomiar wydajności modelu NN podczas treningu odbywa się na danych uczących. Ale z drugiej strony, do pełnej analizy wydajności modelu, potrzebujemy również danych testowych.

Tak więc, aby zmierzyć wydajność modelu przy użyciu danych testowych, możemy wywołać metodę test_minibatch metoda na trainer w następujący sposób -

trainer.test_minibatch({ features: X_test, label: y_test})

Przewidywanie z NN

Po wytrenowaniu modelu uczenia głębokiego najważniejszą rzeczą jest zrobienie prognoz na jego podstawie. Aby dokonać prognozy na podstawie wyuczonego powyżej NN, możemy postępować zgodnie z podanymi krokami:

Step 1 - Najpierw musimy wybrać losową pozycję z zestawu testowego za pomocą następującej funkcji -

np.random.choice

Step 2 - Następnie musimy wybrać przykładowe dane ze zbioru testowego za pomocą sample_index.

Step 3 - Teraz, aby przekonwertować wyjście numeryczne na NN na rzeczywistą etykietę, utwórz odwrócone mapowanie.

Step 4 - Teraz użyj wybranego sampledane. Dokonaj prognozy, wywołując NN z jako funkcję.

Step 5- Teraz, kiedy otrzymasz przewidywane wyjście, weź indeks neuronu, który ma najwyższą wartość, jako wartość przewidywaną. Można to zrobić za pomocąnp.argmax funkcja z numpy pakiet.

Step 6 - Na koniec przekonwertuj wartość indeksu na prawdziwą etykietę za pomocą inverted_mapping.

Prognozowanie z NN - pełny przykład

sample_index = np.random.choice(X_test.shape[0])
sample = X_test[sample_index]
inverted_mapping = {
   1:’Iris-setosa’,
   2:’Iris-versicolor’,
   3:’Iris-virginica’
}
prediction = z(sample)
predicted_label = inverted_mapping[np.argmax(prediction)]
print(predicted_label)

Wynik

Po przeszkoleniu powyższego modelu uczenia głębokiego i uruchomieniu go uzyskasz następujący wynik -

Iris-versicolor