Redes neurais - este é um tópico que causa grande interesse e desejo de compreendê-lo. Mas, infelizmente, não se presta a todos. Quando você vê volumes de literatura obscura, perde o desejo de estudar, mas ainda deseja acompanhar o que está acontecendo.
No final, pareceu-me que não há melhor maneira de descobrir do que apenas pegar e criar seu próprio projeto pequeno.
Você pode ler o plano de fundo da letra expandindo o texto ou pode pular isso e ir diretamente para a
descrição da rede neural.Qual é o objetivo de fazer seu projeto.Prós:
- Você entende melhor como os neurônios são organizados
- Você entende melhor como trabalhar com bibliotecas existentes
- Aprendendo algo novo em paralelo
- Agrade seu Ego, criando algo de sua preferência
Contras:
- Você está criando uma bicicleta, provavelmente pior do que as existentes
- Ninguém se importa com o seu projeto.
A escolha do idioma.Na hora de escolher a linguagem, eu conhecia C ++ mais ou menos e estava familiarizado com o básico do Python. É mais fácil trabalhar com neurônios em Python, mas o C ++ sabia melhor e não há paralelização de cálculos mais fácil que o OpenMP. Portanto, escolhi C ++, e a API para Python, para não incomodar, criará um
giro que funcione no Windows e Linux. (
Um exemplo de como criar uma biblioteca Python a partir do código C ++)
Aceleração OpenMP e GPU.No momento, o OpenMP versão 2.0 está instalado no Visual Studio, no qual há apenas aceleração da CPU. No entanto, a partir da versão 3.0, o OpenMP também oferece suporte à aceleração da GPU, enquanto a sintaxe das diretivas não é complicada. Resta apenas aguardar até que o OpenMP 3.0 seja suportado por todos os compiladores. Enquanto isso, por simplicidade, apenas a CPU.
Meu primeiro ancinho.Há o seguinte ponto no cálculo do valor de um neurônio: antes de calcularmos a função de ativação, precisamos adicionar a multiplicação de pesos pelos dados de entrada. Como aprender a fazer isso na universidade: antes de somar um grande vetor de pequenos números, ele deve ser classificado em ordem crescente. Então aqui. Nas redes neurais, além de diminuir a velocidade do programa N vezes, isso não dá nada. Mas percebi isso apenas quando já havia testado minha rede no MNIST.
Colocando um projeto no GitHub.Não sou o primeiro a postar minha criação no GitHub. Mas na maioria dos casos, seguindo o link, você vê apenas um monte de código com a inscrição em README.md
"Esta é minha rede neural, observe e estude" . Para ser melhor que os outros, pelo menos nisso, ele descreveu mais ou menos o
arquivo README.md e preencheu o
Wiki . A mensagem é simples -
preencha o Wiki. Uma observação interessante: se o título no Wiki no GitHub estiver escrito em russo, a
âncora desse título não funcionará.
LicençaQuando você cria seu pequeno projeto, uma licença é novamente uma maneira de agradar seu ego. Aqui está um
artigo interessante sobre o que é uma licença. Optei pelo
APACHE 2.0 .
Descrição da rede.
Características
A principal vantagem da minha biblioteca é a criação de uma rede com uma linha de código.
É fácil ver que em camadas lineares o número de neurônios em uma camada é igual ao número de parâmetros de entrada na próxima camada. Outra afirmação óbvia - o número de neurônios na última camada é igual ao número de valores de saída da rede.
Vamos criar uma rede que receba três parâmetros na entrada, que possui três camadas com 5, 4 e 2 neurônios.
import foxnn nn = foxnn.neural_network([3, 5, 4, 2])
Se você observar a figura, poderá ver: os 3 primeiros parâmetros de entrada, depois uma camada com 5 neurônios, depois uma camada com 4 neurônios e, finalmente, a última camada com 2 neurônios.

Por padrão, todas as funções de ativação são sigmóides (eu gosto mais delas).
Se desejado, em qualquer camada pode ser alterada para outra função.
Os recursos de ativação mais populares estão disponíveis. nn.get_layer(0).set_activation_function("gaussian")
Conjunto de treinamento fácil de criar. O primeiro vetor são os dados de entrada, o segundo vetor são os dados de destino.
data = foxnn.train_data() data.add_data([1, 2, 3], [1, 0])
Treinamento em rede:
nn.train(data_for_train=data, speed=0.01, max_iteration=100, size_train_batch=98)
Ativando a otimização:
nn.settings.set_mode("Adam")
E um método para obter apenas o valor da rede:
nn.get_out([0, 1, 0.1])
Um pouco sobre o nome do método.Separadamente, get traduz como obter e out significa saída . Eu queria obter o nome " dê o valor de saída " e consegui. Só mais tarde notei que acabou saindo . Mas é mais divertido e decidiu sair.
Teste
Já se tornou uma tradição não escrita testar todas as redes baseadas no
MNIST . E eu não fui exceção. Todo o código com comentários pode ser encontrado
aqui .
Cria uma amostra de treinamento: from mnist import MNIST import foxnn mndata = MNIST('C:download/') mndata.gz = True imagesTrain, labelsTrain = mndata.load_training() def get_data(images, labels): train_data = foxnn.train_data() for im, lb in zip(images, labels): data_y = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Crie uma rede: três camadas, 784 parâmetros para entrada e 10 para saída: nn = foxnn.neural_network([784, 512, 512, 10]) nn.settings.n_threads = 7
Nós treinamos: nn.train(data_for_train=train_data, speed=0.001, max_iteration=10000, size_train_batch=98)
O que aconteceu:
Em cerca de 10 minutos (apenas aceleração da CPU), é possível obter uma precisão de 75%. Com a otimização do Adam, é possível obter 88% de precisão em 5 minutos. No final, consegui alcançar uma precisão de 97%.
As principais desvantagens (já existem planos de revisão):- No Python, ainda não foram cometidos erros, ou seja, em python, o erro não será interceptado e o programa simplesmente sairá com um erro.
- Embora o treinamento seja indicado em iterações, e não em épocas, como é habitual em outras redes.
- Sem aceleração de GPU
- Ainda não existem outros tipos de camadas.
- Precisamos fazer o upload do projeto para o PyPi.
Para uma pequena conclusão do projeto, este artigo estava faltando. Se pelo menos dez pessoas estiverem interessadas e jogarem, já haverá uma vitória. Bem-vindo ao meu
github .
PS: Se você precisar criar algo próprio para descobrir, não tenha medo e crie.