CNTK - Criando a primeira rede neural
Este capítulo irá desenvolver a criação de uma rede neural no CNTK.
Construir a estrutura da rede
A fim de aplicar os conceitos do CNTK para construir nosso primeiro NN, vamos usar o NN para classificar as espécies de flores de íris com base nas propriedades físicas de largura e comprimento da sépala e largura e comprimento da pétala. O conjunto de dados que usaremos usando conjunto de dados de íris que descreve as propriedades físicas de diferentes variedades de flores de íris -
- Comprimento da sépala
- Largura sépala
- Comprimento da pétala
- Largura da pétala
- Classe ie iris setosa ou iris versicolor ou iris virginica
Aqui, estaremos construindo um NN regular chamado NN feedforward. Vamos ver as etapas de implementação para construir a estrutura do NN -
Step 1 - Primeiro, importaremos os componentes necessários, como nossos tipos de camada, funções de ativação e uma função que nos permite definir uma variável de entrada para nosso NN, da biblioteca CNTK.
from cntk import default_options, input_variable
from cntk.layers import Dense, Sequential
from cntk.ops import log_softmax, relu
Step 2- Depois disso, vamos criar nosso modelo usando a função sequencial. Uma vez criado, iremos alimentá-lo com as camadas que desejamos. Aqui, vamos criar duas camadas distintas em nosso NN; um com quatro neurônios e outro com três neurônios.
model = Sequential([Dense(4, activation=relu), Dense(3, activation=log_sogtmax)])
Step 3- Por fim, para compilar o NN, vamos vincular a rede à variável de entrada. Possui uma camada de entrada com quatro neurônios e uma camada de saída com três neurônios.
feature= input_variable(4)
z = model(feature)
Aplicando uma função de ativação
Existem muitas funções de ativação para escolher e escolher a função de ativação certa definitivamente fará uma grande diferença no desempenho de nosso modelo de aprendizado profundo.
Na camada de saída
Escolhendo um activation função na camada de saída dependerá do tipo de problema que vamos resolver com nosso modelo.
Para um problema de regressão, devemos usar um linear activation function na camada de saída.
Para um problema de classificação binária, devemos usar um sigmoid activation function na camada de saída.
Para o problema de classificação multi-classe, devemos usar um softmax activation function na camada de saída.
Aqui, vamos construir um modelo para prever uma das três classes. Isso significa que precisamos usarsoftmax activation function na camada de saída.
Na camada oculta
Escolhendo um activation função na camada oculta requer alguma experimentação para monitorar o desempenho para ver qual função de ativação funciona bem.
Em um problema de classificação, precisamos prever a probabilidade de uma amostra pertencer a uma classe específica. É por isso que precisamos de umactivation functionisso nos dá valores probabilísticos. Para alcançar este objetivo,sigmoid activation function pode nos ajudar.
Um dos principais problemas associados à função sigmóide é o problema do gradiente de desaparecimento. Para superar esse problema, podemos usarReLU activation function que cobre todos os valores negativos a zero e funciona como um filtro de passagem para valores positivos.
Escolha uma função de perda
Uma vez que temos a estrutura para nosso modelo NN, devemos otimizá-lo. Para otimizar, precisamos de umloss function. Ao contrárioactivation functions, temos muito menos funções de perda para escolher. No entanto, a escolha de uma função de perda dependerá do tipo de problema que vamos resolver com nosso modelo.
Por exemplo, em um problema de classificação, devemos usar uma função de perda que pode medir a diferença entre uma classe prevista e uma classe real.
função de perda
Para o problema de classificação, vamos resolver com nosso modelo NN, categorical cross entropya função de perda é a melhor candidata. No CNTK, é implementado comocross_entropy_with_softmax que pode ser importado de cntk.losses pacote, como segue -
label= input_variable(3)
loss = cross_entropy_with_softmax(z, label)
Métricas
Com a estrutura para nosso modelo NN e uma função de perda para aplicar, temos todos os ingredientes para começar a fazer a receita para otimizar nosso modelo de aprendizado profundo. Mas, antes de nos aprofundarmos nisso, devemos aprender sobre métricas.
cntk.metrics
CNTK tem o pacote denominado cntk.metricsa partir do qual podemos importar as métricas que vamos usar. Enquanto estamos construindo um modelo de classificação, estaremos usandoclassification_error matric que irá produzir um número entre 0 e 1. O número entre 0 e 1 indica a porcentagem de amostras previstas corretamente -
Primeiro, precisamos importar a métrica de cntk.metrics pacote -
from cntk.metrics import classification_error
error_rate = classification_error(z, label)
A função acima realmente precisa da saída do NN e do rótulo esperado como entrada.