CNTK - Treinamento da Rede Neural
Aqui, vamos entender sobre o treinamento da Rede Neural em CNTK.
Treinando um modelo em CNTK
Na seção anterior, definimos todos os componentes do modelo de aprendizado profundo. Agora é hora de treiná-lo. Como discutimos anteriormente, podemos treinar um modelo NN em CNTK usando a combinação delearner e trainer.
Escolher um aluno e configurar o treinamento
Nesta seção, iremos definir o learner. CNTK fornece várioslearnersescolher a partir de. Para nosso modelo, definido nas seções anteriores, estaremos usandoStochastic Gradient Descent (SGD) learner.
Para treinar a rede neural, vamos configurar o learner e trainer com a ajuda das seguintes etapas -
Step 1 - Primeiro, precisamos importar sgd função de cntk.lerners pacote.
from cntk.learners import sgd
Step 2 - Em seguida, precisamos importar Trainer função de cntk.trainpacote .trainer.
from cntk.train.trainer import Trainer
Step 3 - Agora, precisamos criar um learner. Pode ser criado invocandosgd função junto com o fornecimento de parâmetros do modelo e um valor para a taxa de aprendizagem.
learner = sgd(z.parametrs, 0.01)
Step 4 - Por fim, precisamos inicializar o trainer. Deve ser fornecida a rede, a combinação doloss e metric juntamente com o learner.
trainer = Trainer(z, (loss, error_rate), [learner])
A taxa de aprendizagem que controla a velocidade da otimização deve ser um pequeno número entre 0,1 e 0,001.
Escolhendo um aluno e configurando o treinamento - Exemplo completo
from cntk.learners import sgd
from cntk.train.trainer import Trainer
learner = sgd(z.parametrs, 0.01)
trainer = Trainer(z, (loss, error_rate), [learner])
Alimentando dados para o treinador
Depois de escolher e configurar o treinador, é hora de carregar o conjunto de dados. Nós salvamos oiris conjunto de dados como um.CSV arquivo e usaremos o pacote de wrangling de dados chamado pandas para carregar o conjunto de dados.
Etapas para carregar o conjunto de dados do arquivo .CSV
Step 1 - Primeiro, precisamos importar o pandas pacote.
from import pandas as pd
Step 2 - Agora, precisamos invocar a função chamada read_csv função para carregar o arquivo .csv do disco.
df_source = pd.read_csv(‘iris.csv’, names = [‘sepal_length’, ‘sepal_width’,
‘petal_length’, ‘petal_width’, index_col=False)
Depois de carregar o conjunto de dados, precisamos dividi-lo em um conjunto de recursos e um rótulo.
Etapas para dividir o conjunto de dados em recursos e rótulo
Step 1- Primeiro, precisamos selecionar todas as linhas e as primeiras quatro colunas do conjunto de dados. Isso pode ser feito usandoiloc função.
x = df_source.iloc[:, :4].values
Step 2- Em seguida, precisamos selecionar a coluna de espécies do conjunto de dados da íris. Estaremos usando a propriedade values para acessar o subjacentenumpy array.
x = df_source[‘species’].values
Etapas para codificar a coluna de espécies em uma representação vetorial numérica
Como discutimos anteriormente, nosso modelo é baseado na classificação, requer valores de entrada numéricos. Portanto, aqui precisamos codificar a coluna de espécies em uma representação vetorial numérica. Vamos ver as etapas para fazer isso -
Step 1- Primeiro, precisamos criar uma expressão de lista para iterar sobre todos os elementos do array. Em seguida, execute uma pesquisa no dicionário label_mapping para cada valor.
label_mapping = {‘Iris-Setosa’ : 0, ‘Iris-Versicolor’ : 1, ‘Iris-Virginica’ : 2}
Step 2- Em seguida, converta este valor numérico convertido em um vetor codificado de um ponto. Estaremos usandoone_hot funcionar da seguinte forma -
def one_hot(index, length):
result = np.zeros(length)
result[index] = 1
return result
Step 3 - Por fim, precisamos transformar essa lista convertida em um numpy array.
y = np.array([one_hot(label_mapping[v], 3) for v in y])
Etapas para detectar overfitting
A situação, quando seu modelo lembra das amostras, mas não pode deduzir regras das amostras de treinamento, é overfitting. Com a ajuda das etapas a seguir, podemos detectar overfitting em nosso modelo -
Step 1 - Primeiro, de sklearn pacote, importe o train_test_split função do model_selection módulo.
from sklearn.model_selection import train_test_split
Step 2 - Em seguida, precisamos invocar a função train_test_split com os recursos xe rótulos y da seguinte forma -
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0-2,
stratify=y)
Especificamos um test_size de 0,2 para reservar 20% dos dados totais.
label_mapping = {‘Iris-Setosa’ : 0, ‘Iris-Versicolor’ : 1, ‘Iris-Virginica’ : 2}
Etapas para alimentar o conjunto de treinamento e o conjunto de validação para nosso modelo
Step 1 - Para treinar nosso modelo, primeiro, vamos invocar o train_minibatchmétodo. Em seguida, forneça um dicionário que mapeie os dados de entrada para a variável de entrada que usamos para definir o NN e sua função de perda associada.
trainer.train_minibatch({ features: X_train, label: y_train})
Step 2 - Em seguida, ligue train_minibatch usando o seguinte for loop -
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))
Alimentando dados para o treinador - exemplo completo
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))
Medindo o desempenho de NN
Para otimizar nosso modelo NN, sempre que passamos dados pelo treinador, ele mede o desempenho do modelo por meio da métrica que configuramos para o treinador. Tal medida de desempenho do modelo NN durante o treinamento é nos dados de treinamento. Mas, por outro lado, para uma análise completa do desempenho do modelo, precisamos usar dados de teste também.
Portanto, para medir o desempenho do modelo usando os dados de teste, podemos invocar o test_minibatch método no trainer como segue -
trainer.test_minibatch({ features: X_test, label: y_test})
Fazendo previsão com NN
Depois de treinar um modelo de aprendizado profundo, o mais importante é fazer previsões usando isso. Para fazer a previsão do NN treinado acima, podemos seguir os passos dados−
Step 1 - Primeiro, precisamos escolher um item aleatório do conjunto de teste usando a seguinte função -
np.random.choice
Step 2 - Em seguida, precisamos selecionar os dados de amostra do conjunto de teste usando sample_index.
Step 3 - Agora, para converter a saída numérica para o NN em um rótulo real, crie um mapeamento invertido.
Step 4 - Agora, use o selecionado sampledados. Faça uma previsão invocando o NN z como uma função.
Step 5- Agora, uma vez que você obteve a saída prevista, pegue o índice do neurônio que tem o valor mais alto como o valor previsto. Isso pode ser feito usando onp.argmax função do numpy pacote.
Step 6 - Por último, converta o valor do índice no rótulo real usando inverted_mapping.
Fazendo previsões com NN - exemplo completo
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)
Resultado
Depois de treinar o modelo de aprendizado profundo acima e executá-lo, você obterá o seguinte resultado -
Iris-versicolor