Melhore seu modelo de deep learning e rede neural – Blue</>Dev
Home » Cloud Inteligência Artificial
Prashant Sharma Posted On 2 de abril de 2019
Refine seu modelo de rede neural usando algumas técnicas conhecidas de aprendizado de máquina (parte 2).
Como parte da minha própria aprendizagem, continuação da Parte 1 e tentando melhorar o nosso modelo de rede neural, vamos usar algumas das técnicas de aprendizado de máquina bem conhecidas, mencionadas no TensorFlow.
No artigo anterior, vimos alguns problemas com o nosso treinamento. Aqui, vamos abordá-los e ver se nossos resultados melhoram à medida que avançamos.
Problemas observados na solução anterior
Considera-se que um modelo se ajusta (overfit) quando ele executa com grande precisão os dados de treinamento (dados usados para treinar o modelo), mas quando avaliado contra um conjunto de dados de teste ou invisível, ele apresenta um desempenho ruim. Isso acontece porque nosso modelo superou os dados.
A precisão do treinamento, se superior à precisão do teste, é um indicador claro desse fenômeno. Felizmente, existem algumas técnicas disponíveis para resolver isso.
Primeiro, observe o tamanho do modelo, ou seja, o número de unidades. Se o modelo utilizado for muito maior do que o problema em questão, é mais provável que ele aprenda os recursos/padrões que não são relevantes para o problema e portanto se adaptem aos dados de treinamento. Um modelo maior não irá generalizar bem, e um modelo menor irá enquadrar os dados.
Tomando o modelo em nosso artigo anterior como uma linha de base, avaliaremos o resultado de reduzir o tamanho e aumentar o tamanho no desempenho do modelo. Os seguintes modelos foram experimentados e comparados:
-[ código | Python | inicio ]-
baseline_model = keras.models.Sequential([
keras.layers.Flatten(input_shape = ( maxsize_w, maxsize_h , 1)),
keras.layers.Dense(128, activation=tf.nn.sigmoid),
keras.layers.Dense(16, activation=tf.nn.sigmoid),
bigger_model2 = keras.models.Sequential([
keras.layers.Dense(1024, activation=tf.nn.relu),
bigger_model1 = keras.models.Sequential([
smaller_model1 = keras.models.Sequential([
-[ código | Python | fim ]-
Para determinar o modelo ideal, plotamos a função de perda dos dados de validação em relação ao número de epochs.
1. Comparação de modelos menores, maiores e de linha de base.
2. Comparação de modelos maiores, maiores2 e de base.
Nestes gráficos, vemos que a perda de validação (sparse_categorical_crossentropy) é quase similar para modelos maiores e maiores2 e melhor que modelos menores e de linha de base. Então, vamos em frente e selecionamos esses modelos sobre o nosso modelo de base para futuros ajustes.
Número de epochs
O número de epochs desempenha um papel importante em evitar o overfitting e o desempenho geral do modelo. Nos gráficos de comparação plotados na seção acima, observamos que a função de perda para os dados de validação atinge um mínimo e em treinamentos posteriores, aumenta novamente, enquanto a função de perda dos dados de treinamento diminui ainda mais. Isso é exatamente o que significa overfitting; o modelo aprende padrões específicos para o conjunto de dados e não generaliza bem, portanto, é melhor com dados de treinamento do que com dados de validação. Temos que parar antes que o modelo sobrecarregue os dados. Portanto, no caso acima, o valor de 40 é o ideal.
Regularização L1 e L2
O efeito de aplicar a regularização de L2 é adicionar algum ruído aleatório às camadas. O gráfico abaixo mostra o efeito de aplicar isso em nosso modelo.
Usando o Dropout
A biblioteca Keras fornece uma camada de abandono, um conceito introduzido no Dropout: Uma maneira simples de impedir que as redes neurais tenham Overfitting (JMLR 2014). Uma consequência da adição de uma camada de dropout é que o tempo de treinamento aumenta e se o dropout é alto, underfitting.
Modelos após aplicar as camadas de dropout:
A imagem a seguir mostra o efeito da aplicação da regularização de dropout.
Durante uma execução, o modelo maior não convergiu de forma alguma, mesmo depois de 250 epochs. Este é um dos efeitos colaterais da aplicação da regularização de dropout.
Falta de dados de treinamento
Com apenas 26 ou mais exemplos de treinamento, fizemos algo razoavelmente bom. Mas, para o processamento de imagens, existem várias técnicas de aumento de dados, aplicando alguma distorção à imagem original e gerando mais dados. Por exemplo, para cada imagem de entrada, podemos ter uma imagem com coloração invertida adicionada ao nosso conjunto de dados. Para conseguir isso, a função load_image_dataset da Parte 1 é modificada da seguinte forma (também é possível adicionar uma imagem rotacionada aleatoriamente para cada imagem original):
# invert_image if true, also stores an invert color version of each image in the training set.
def load_image_dataset(path_dir, maxsize, reshape_size, invert_image=False):
for file in glob.glob("*.jpg"):
img = jpeg_to_8_bit_greyscale(file, maxsize)
inv_image = 255 – img # Generate a invert color image of the original.
if re.match('chihuahua.*', file):
images.append(img.reshape(reshape_size))
images.append(inv_image.reshape(reshape_size))
elif re.match('muffin.*', file):
return (np.asarray(images), np.asarray(labels))
Os efeitos de adicionar imagens com coloração invertida e rotacionar imagens aleatoriamente no treinamento com o dropout são as seguintes. O tamanho do conjunto de dados aumentou 3X.
O resultado indica que isso piorou o overfit dos dados.
Nota: Para aumento de dados, o Keras fornece um utilitário integrado, keras.preprocessing.image.ImageDataGenerator, que não será abordado aqui.
Outra maneira de superar o problema de dados mínimos de treinamento é usar um modelo pré-treinado e aumentá-lo com um novo exemplo de treinamento. Essa abordagem é chamada de aprendizado de transferência. Como o TensorFlow e o Keras fornecem um bom mecanismo para salvar e carregar modelos, isso pode ser facilmente alcançado, mas fora do escopo aqui.
Em outros testes com diferentes modelos e funções de ativação, os melhores resultados foram observados usando sigmóide como função de ativação e uma camada de dropout em nosso modelo base. Desempenho semelhante foi observado com a função de ativação relu, mas com sigmóide, a curva foi mais suave. E como o tamanho da imagem foi reduzido para 50×50, melhorou o tempo de treinamento sem afetar o desempenho dos modelos.
Além do que citamos acima, eu também testei um modelo CNN multicamada no estilo VGG e várias variações de modelos CNN, mas de alguma forma os resultados foram bastante ruins com ele.
A imagem a seguir mostra o gráfico dos resultados dos três modelos.
Modelo de base usado:
baseline_model.compile(optimizer=keras.optimizers.Adam(lr=0.001),
metrics=['accuracy','sparse_categorical_crossentropy'])
-[ saída de tela | inicio ]-
– 0s – loss: 0.0217 – acc: 1.0000 – sparse_categorical_crossentropy: 0.0217 – val_loss: 0.2712 – val_acc: 0.9286 – val_sparse_categorical_crossentropy: 0.2712
– 0s – loss: 0.0224 – acc: 1.0000 – sparse_categorical_crossentropy: 0.0224 – val_loss: 0.2690 – val_acc: 0.9286 – val_sparse_categorical_crossentropy: 0.2690
-[ saída de tela | fim ]-
Em seguida, gostaria de melhorar meus conhecimentos sobre redes no estilo CNN e VGG para reconhecimento de imagens e usos ainda mais avançados de redes neurais.