Aprenda como criar sua própria Rede Neural para Aprendizado Profundo em poucos passos

Cover: Example of a neural network’s. The image shows an example of a neuronal unit in a neural network, illustrating its main components. In the example, these are the inputs, the weights, the bias, the summation of inputs and bias, the activation function, and the output. The activation function chosen for this example is a ReLU (Rectified Linear Unit). By BrunelloN August 12, 2021. Source: Wikimedia Commons.

Maurício Pinheiro

As redes neurais profundas (DNN) têm estado na vanguarda da revolução da inteligência artificial (IA), transformando a maneira como abordamos uma ampla gama de aplicações, desde visão computacional e processamento de linguagem natural até jogos e robótica. Com sua capacidade de aprender a partir de dados e tomar decisões complexas, as redes neurais profundas desbloquearam novos níveis de precisão e eficiência em muitas áreas da tecnologia de IA. Desde carros autônomos até recomendações personalizadas e reconhecimento de fala, o impacto das redes neurais profundas tem sido profundo e de alcance amplo, inaugurando uma nova era de máquinas inteligentes que podem analisar e entender padrões complexos em dados com precisão semelhante à humana.

Criar sua própria rede neural (NN) para aprendizado profundo é uma maneira poderosa de adquirir conhecimento e compreensão. O processo de construção de uma rede neural permite que você se envolva ativamente com os conceitos e técnicas envolvidos, levando a uma compreensão mais profunda do tópico. Seguindo nossos passos e fazendo por si mesmo, você será capaz de ganhar experiência prática e verdadeiramente aprender os detalhes das redes neurais. Orientaremos você pelo processo de construção de uma rede neural, começando por uma rede simples de uma camada (com um perceptron ou neurônio artificial) até uma rede complexa com múltiplas camadas ocultas e muitos neurônios.

Nosso foco é ajudá-lo a adquirir conhecimento e compreensão das redes neurais profundas, e forneceremos as ferramentas e recursos necessários para construir e treinar sua própria rede neural. Seguindo nossos passos e fazendo por si mesmo, você será capaz de levar sua compreensão das redes neurais profundas ao próximo nível. Juntando-se a nós nessa jornada, você descobrirá o poder de construir sua própria rede neural profunda. Também o orientaremos sobre como treinar sua rede em um post futuro, portanto, fique atento!


Passo 1) Saiba o que você está fazendo

1.1 O que é uma rede neural?

Uma rede neural é um algoritmo de aprendizado de máquina altamente avançado projetado para imitar a estrutura e função do cérebro humano. É uma rede complexa de nós ou neurônios interconectados que trabalham juntos para realizar cálculos complexos em dados de entrada. Esses neurônios são organizados em camadas, sendo cada camada responsável por processar um aspecto específico dos dados de entrada.

A ideia básica por trás de uma rede neural é modelar relações complexas entre os dados de entrada (convertidos em números reais) e a saída desejada (também números reais), ajustando os pesos e os viés da rede ao longo do tempo, para minimizar a diferença entre a saída prevista e a saída real. Esse processo é chamado de treinamento e envolve alimentar grandes quantidades de dados na rede e ajustar os pesos e os viés, usando uma técnica chamada retropropagação.

As redes neurais são altamente flexíveis e podem ser usadas para resolver uma grande variedade de problemas. Elas são capazes de aprender com diferentes tipos de dados, como imagens, texto e dados de séries temporais, e podem produzir previsões e classificações altamente precisas. Elas são utilizadas em uma ampla gama de aplicações, como visão computacional, processamento de linguagem natural, reconhecimento de fala, robótica e até mesmo composição musical.

As redes neurais podem ser consideradas como uma função não linear altamente complexa de muitas variáveis, com parâmetros ajustáveis. Elas recebem dados de entrada e produzem uma saída numérica, que pode ser convertida em uma etiqueta, frase, decisão ou qualquer outra forma de saída, dependendo da natureza do problema sendo resolvido. A saída de uma rede neural é determinada por uma combinação dos dados de entrada e dos pesos e viés da rede, que são ajustados ao longo do tempo durante o processo de treinamento para produzir resultados mais precisos.

1.2 Como funciona?

No núcleo de uma rede neural está o neurônio artificial ou perceptron, que serve como bloco de construção básico para toda a rede. O perceptron recebe entrada de uma ou mais fontes e realiza uma série de cálculos para produzir uma saída.

Mais especificamente, o perceptron toma a soma ponderada w1y1+w2y2+…+wnyn de suas entradas yi (i=1,…, n= número de entradas), adiciona um termo de bias bi ao resultado e, em seguida, passa a saída z através de uma função de ativação não linear f(z) (logística ou sigmoidal, ReLU: unidade linear retificadora, etc.). Os pesos e os viés do perceptron são os parâmetros que a rede aprende durante o treinamento, e eles determinam a importância de cada entrada na produção da saída.

Construir uma rede de neurônios envolve conectar múltiplos neurônios em uma estrutura em camadas, com cada camada de neurônios recebendo entrada da camada anterior e passando sua saída para a próxima camada. A camada de entrada da rede recebe os dados brutos de entrada, como uma imagem ou texto, e os passa pelas camadas ocultas da rede, que realizam cálculos cada vez mais complexos nos dados. A camada de saída produz a saída final da rede, como uma etiqueta de classificação ou um valor previsto (um número a ser convertido).

O processo de treinar uma rede neural envolve ajustar os pesos e bias dos perceptrons para minimizar a diferença entre a saída prevista e a saída real. Isso é tipicamente feito usando um algoritmo de otimização que ajusta iterativamente os parâmetros da rede para minimizar uma função de perda.

As redes neurais podem ter várias camadas ocultas, e a profundidade da rede se refere ao número de camadas ocultas que ela possui. Redes neurais profundas, que são redes neurais com muitas camadas ocultas, foram mostradas ser altamente eficazes na resolução de problemas complexos em uma variedade de campos, incluindo visão computacional, processamento de linguagem natural e reconhecimento de fala.

1.3 Conheça os conceitos básicos: entrada, saída, peso, viés, função de ativação.

Entrada: A entrada de uma rede neural é o dado que a rede está tentando aprender. Antes de ser alimentado na rede, é convertido em números reais. No aprendizado supervisionado, a entrada são os dados rotulados, enquanto no aprendizado não supervisionado, a entrada é composta por dados não rotulados.

Dados de entrada podem ser:

  • Dados estruturados se referem a dados que podem ser facilmente organizados, armazenados e processados em bancos de dados relacionais. Esses dados possuem um esquema ou estrutura pré-definida que permite armazená-los em tabelas com linhas e colunas. Exemplos de dados estruturados incluem números, textos, datas e valores verdadeiro/falso. Por exemplo, o nome do cliente, endereço, número de telefone e histórico de compras podem ser armazenados em um formato estruturado em um banco de dados.
  • Dados não estruturados, por outro lado, não possuem uma estrutura ou formato fixo, o que os torna difíceis de serem organizados e armazenados em bancos de dados tradicionais. Esses tipos de dados incluem texto livre, imagens, áudio e vídeo. Posts em redes sociais, e-mails e comentários de clientes são alguns exemplos de dados não estruturados que requerem técnicas de processamento de linguagem natural para extrair informações úteis.
  • Dados de séries temporais são um tipo de dados coletados ao longo do tempo e geralmente são indexados por um carimbo de data e hora. Exemplos de dados de séries temporais incluem preços de ações, dados meteorológicos e estatísticas de tráfego de websites. Em um conjunto de dados de séries temporais, cada registro representa uma medida ou observação feita em um ponto específico no tempo. A análise de dados de séries temporais envolve a identificação de padrões e tendências nos dados e a realização de previsões sobre valores futuros.
  • Dados em formato de grafo se referem a dados organizados em uma estrutura de grafo, onde os nós representam entidades e as arestas representam relacionamentos entre elas. Exemplos de dados em formato de grafo incluem redes sociais, grafos de conhecimento e compostos químicos. A análise de dados em formato de grafo envolve a identificação de padrões e relacionamentos entre nós e arestas e a realização de previsões sobre as propriedades das entidades e seus relacionamentos.

Peso: O peso associado a cada conexão entre neurônios em uma rede neural desempenha um papel fundamental na determinação do comportamento geral da rede. Em uma rede neural, cada conexão representa uma relação específica entre dois neurônios, e o peso associado a essa conexão determina a força dessa relação. O peso pode ser pensado como um fator de escala que determina o quanto a entrada de um neurônio influencia a saída do próximo neurônio na rede.

Os pesos em uma rede neural são tipicamente ajustados durante o treinamento, a fim de otimizar o desempenho da rede. Durante o treinamento, a rede é apresentada a um conjunto de entradas e saídas alvo correspondentes, e os pesos são ajustados de tal forma a minimizar a diferença entre as saídas previstas da rede e as saídas alvo. Esse processo é frequentemente referido como “aprendizagem” ou “otimização” e é tipicamente realizado usando uma técnica chamada retropropagação.

Os pesos em uma rede neural podem assumir valores positivos e negativos, sendo que os pesos positivos representam uma influência excitatória e os pesos negativos representam uma influência inibitória. A magnitude do peso determina a força da influência, sendo que pesos maiores têm uma influência mais forte na saída do neurônio.

Em geral, os pesos em uma rede neural são um aspecto fundamental da arquitetura da rede e desempenham um papel crítico na determinação do comportamento da rede. A gestão efetiva dos pesos é essencial para alcançar um bom desempenho em uma rede neural.

Bias:

Em redes neurais, o bias é um termo constante adicionado à soma ponderada de entradas antes de aplicar a função de ativação. O viés permite que a rede desloque a função de ativação para a esquerda ou direita, o que pode ser útil para alcançar a saída desejada.

Em termos mais simples, o bias atua como uma espécie de linha de base para a saída do neurônio. Sem o bias, a função de ativação passaria pela origem e a saída seria restrita à região onde os valores de entrada são maiores ou iguais a zero. Ao adicionar um termo de bias, a função de ativação é deslocada para a esquerda ou direita, permitindo uma gama mais ampla de possíveis saídas.

O bias pode ser considerado como um parâmetro aprendível na rede neural, o que significa que pode ser ajustado durante o treinamento para obter melhores resultados. Por exemplo, se a rede não estiver prevendo com precisão a saída desejada, o bias pode ser ajustado para deslocar a função de ativação e melhorar as previsões.

No geral, o bias é um componente importante no projeto e na otimização de redes neurais, permitindo uma maior flexibilidade e precisão na previsão de resultados desejados.

Soma ponderada:

Em uma rede neural, a soma ponderada (ou soma média) é uma operação fundamental que ocorre em cada neurônio artificial ou perceptron. Envolve a multiplicação das entradas do neurônio pelos respectivos pesos e a soma dos resultados juntamente com um termo de bias. A soma ponderada é então passada por uma função de ativação para produzir a saída do neurônio.

Os pesos e o viés são aprendidos durante a fase de treinamento da rede neural e desempenham um papel crucial na determinação da saída da rede. Os pesos podem ser considerados como a “importância” ou “relevância” de cada entrada para a saída do neurônio, enquanto o viés determina o “limiar” ou “bias” da resposta do neurônio.

Por exemplo, considere uma rede neural que é treinada para classificar imagens de gatos e cachorros. Cada pixel na imagem de entrada pode ser considerado como uma entrada para a rede, e cada neurônio na rede representa uma característica ou aspecto da imagem que é relevante para a tarefa de classificação. Os pesos de cada neurônio determinam quanto ele contribui para a decisão de classificação geral, enquanto o termo do viés determina o limiar geral para classificar uma imagem como um gato ou um cachorro.

A operação de soma ponderada é um componente fundamental de uma rede neural e permite que a rede aprenda padrões e relacionamentos complexos nos dados de entrada. Ao ajustar os pesos e viés dos neurônios durante o treinamento, a rede pode se adaptar a diferentes tipos de dados de entrada e melhorar seu desempenho na tarefa em questão.

Função de ativação: A função de ativação desempenha um papel crucial na determinação da saída de um neurônio em uma rede neural. É uma função matemática que recebe a soma ponderada das entradas do neurônio e aplica uma transformação não-linear a ela, produzindo a saída do neurônio.

A escolha da função de ativação pode ter um grande impacto no desempenho de uma rede neural. Uma boa função de ativação deve ser não-linear, já que funções lineares não conseguem capturar padrões complexos nos dados. Também deve ser diferenciável, já que o backpropagation, o algoritmo usado para treinar redes neurais, requer o cálculo de derivadas.

Existem muitos tipos diferentes de funções de ativação que podem ser usadas em redes neurais. Alguns dos mais comuns incluem a função sigmoid, a função ReLU, a função tangente hiperbólica e a função softmax. Cada uma dessas funções tem seus próprios pontos fortes e fracos, e a escolha da função de ativação depende do problema específico sendo resolvido e das características dos dados.

Code generated with ChatGPT

import matplotlib.pyplot as plt
import numpy as np
def logistic_function(x):
return 1 / (1 + np.exp(-x))
x = np.linspace(-10, 10, 100) # generate 100 points between -10 and 10
y = logistic_function(x) # calculate the y values
plt.plot(x, y)
plt.title(‘Logistic Function’)
plt.xlabel(‘x’)
plt.ylabel(‘f(x)’)
plt.show()

A função sigmoide é uma escolha popular de função de ativação em redes neurais. É uma função não linear que mapeia qualquer número real para um valor entre 0 e 1, o que a torna especialmente útil para problemas de classificação binária em que a saída deve ser 0 ou 1.

Uma das principais vantagens da função sigmoide é que ela é diferenciável, o que significa que pode ser usada com algoritmos de otimização baseados em gradientes, como a retropropagação, para treinar a rede. A derivada da função sigmoide também é fácil de calcular, o que a torna computacionalmente eficiente.

Outra vantagem da função sigmoide é que ela é monotonamente crescente, o que significa que a saída da função aumenta à medida que a entrada aumenta. Essa propriedade é importante para o aprendizado, pois permite que a rede aprenda e faça ajustes em seus pesos e viés de maneira consistente e previsível.

No entanto, a função sigmoide possui algumas limitações. Uma das principais limitações é que ela pode saturar, o que significa que para valores muito grandes ou muito pequenos de entrada, a derivada da função se torna muito pequena. Isso pode levar a uma aprendizagem lenta ou mesmo gradientes desvanecidos, onde os gradientes se tornam tão pequenos que a rede não consegue fazer atualizações significativas em seus pesos e viés.

Apesar dessas limitações, a função sigmoide continua sendo uma escolha popular de função de ativação em muitas redes neurais, especialmente para problemas de classificação binária em que a saída deve ser um valor entre 0 e 1.

Aqui estão alguns outros exemplos de funções de ativação comumente usadas em redes neurais:

  1. Hipérbole Tangente (tanh): A função tanh é semelhante à função sigmóide, mas sua saída varia de -1 a 1 em vez de 0 a 1. Ela também é simétrica em relação à origem, o que pode ser útil em algumas aplicações.
  2. Unidade Linear Retificada (ReLU): A função ReLU é definida como f(x) = max(0, x), o que significa que ela retorna 0 para todos os valores negativos de entrada e o valor de entrada para todos os valores positivos. A ReLU é atualmente uma das funções de ativação mais populares devido à sua simplicidade e eficácia em modelos de aprendizado profundo.
  3. Leaky ReLU: A função Leaky ReLU é uma versão modificada da função ReLU que evita o problema de “ReLU morta” permitindo uma pequena saída negativa para valores de entrada negativos. A função Leaky ReLU é definida como f(x) = max(ax, x), onde a é um número pequeno e positivo.
  4. Unidade Linear Exponencial (ELU): A função ELU é semelhante à função ReLU, mas retorna valores negativos para valores de entrada negativos, o que pode ajudar a melhorar o desempenho de modelos de aprendizado profundo. A função ELU é definida como f(x) = x se x > 0 e f(x) = alpha*(exp(x) – 1) se x <= 0, onde alpha é uma constante pequena e positiva.
  5. Softmax: A função softmax é frequentemente usada como função de ativação para a camada de saída de uma rede neural que é usada para tarefas de classificação. A função softmax mapeia os valores de entrada para uma distribuição de probabilidade sobre as classes de saída, garantindo que a soma das probabilidades seja igual a 1.

Saída: A saída de uma rede neural é o resultado produzido pela rede após processar a entrada.

Aqui estão alguns exemplos ou dados de saída (após a conversão do resultado numérico de f(z)):

  • Sistemas de IA têm uma ampla gama de aplicações, desde prever eventos futuros até realizar tarefas e tomar decisões com base em dados. Alguns exemplos de aplicações de IA incluem:
  • Previsões: sistemas de IA podem analisar conjuntos de dados grandes e usar algoritmos de aprendizado de máquina para fazer previsões sobre eventos ou resultados futuros. Por exemplo, um sistema de IA pode prever a probabilidade de um cliente abandonar um serviço com base em seus padrões de uso e comportamento.
  • Recomendações: sistemas de IA podem fornecer recomendações personalizadas aos usuários com base em seu comportamento passado, preferências e outros fatores. Por exemplo, uma plataforma de comércio eletrônico pode recomendar produtos a um usuário com base em seu histórico de compras e comportamento de navegação.
  • Classificações: sistemas de IA podem classificar dados em diferentes categorias com base em determinadas características ou atributos. Por exemplo, um algoritmo de aprendizado de máquina pode classificar e-mails como spam ou não spam com base no conteúdo do e-mail e no comportamento passado do usuário.
  • Decisões: sistemas de IA podem tomar decisões com base em dados e regras pré-definidas. Por exemplo, um sistema de IA pode ser usado para decidir se aprovar ou rejeitar um pedido de cartão de crédito com base no histórico de crédito do candidato e em outros fatores.
  • Ações: sistemas de IA podem realizar tarefas ou tomar ações com base em dados e regras pré-definidas. Por exemplo, um sistema de IA pode ser usado para controlar uma planta de produção e otimizar a produção com base em dados de sensores em tempo real e outras entradas.

1.4 As ferramentas: álgebra linear e Python

Álgebra linear e linguagens de programação são ferramentas fundamentais para trabalhar com redes neurais. A álgebra linear fornece uma maneira de representar e manipular os pesos, vieses e dados de entrada/saída da rede. Em particular, a multiplicação de matrizes é uma operação fundamental em redes neurais, pois permite o cálculo eficiente da soma ponderada e da função de ativação. Python é uma linguagem de programação amplamente utilizada para implementar redes neurais devido à sua simplicidade, flexibilidade e rico ecossistema de bibliotecas.

Python fornece uma ampla gama de bibliotecas e frameworks que facilitam a implementação de redes neurais. Por exemplo, NumPy é uma biblioteca Python para computação científica que oferece suporte a operações de array, álgebra linear e outros cálculos numéricos. É particularmente útil para trabalhar com as matrizes e vetores comumente usados em redes neurais. TensorFlow é outra biblioteca Python popular para construir e treinar redes neurais, que fornece uma interface de alto nível para definir e executar gráficos computacionais.

Para criar uma rede neural simples usando Python, vamos proceder passo a passo. Começaremos definindo as camadas de entrada e saída da rede, seguido pelos pesos e vieses da camada oculta. Em seguida, definiremos a função de ativação e calcularemos a soma ponderada das entradas. Finalmente, aplicaremos a função de ativação à soma ponderada para obter a saída da rede. Seguindo esses passos, seremos capazes de construir uma rede neural simples usando Python e álgebra linear.

Aqui está um procedimento passo a passo para instalar o Python em um computador com Windows:

  1. Acesse o site oficial do Python em https://www.python.org/downloads/
  2. Clique no botão “Download Python” que corresponde à versão do Python que você deseja instalar.
  3. Escolha o instalador apropriado para o seu sistema operacional (no caso, Windows).
  4. Depois que o instalador for baixado, clique duas vezes nele para iniciar o processo de instalação.
  5. Marque a caixa de seleção “Adicionar Python ao PATH” durante a instalação. Isso garantirá que o interpretador Python possa ser acessado de qualquer diretório no prompt de comando ou PowerShell.
  6. Siga as instruções na instalação até que ela seja concluída.
  7. Para verificar se o Python está instalado corretamente, abra o prompt de comando ou PowerShell e digite “python” (sem aspas) e pressione Enter. Você deve ver o interpretador Python iniciar e exibir o número da versão.

Isso é tudo! Agora você tem o Python instalado em seu computador com Windows e pode começar a escrever e executar código Python.


Passo 2) Um único neurônio: o perceptron não-linear

Começaremos implementando um perceptron não-linear, que é um neurônio artificial com duas entradas e uma saída. Isso já foi discutido anteriormente em nosso artigo sobre um neurônio classificador binário. No entanto, neste caso, usaremos uma função de ativação sigmoide para implementar o neurônio não-linear.

Nós estaremos usando um código gerado pelo ChatGPT para essa tarefa. Eu não vou postar as prompts (entradas) já que foram necessárias várias iterações e correções de bugs para chegar ao código ótimo. Além disso, fiz algumas edições no código baseado em referências externas.

O código (explicado pelo ChatGPT):

from numpy import * #import numpy library

#initialization
y1_inp=random.uniform(low=-1,high=+1,size=1) #random first input
y2_inp=random.uniform(low=-1,high=+1,size=1) #random second input
w1=random.uniform(low=-1,high=+1) #random weigth of the first input
w2=random.uniform(low=-1,high=+1) #random weigth of the second input
b=random.uniform(low=-1,high=+1,size=1) #random bias

z=w1*y1_inp+w2*y2_inp+b #weigthed sum

fz=(1/(1+exp(-z))) #output = activation function

print("number of inputs =",2)
print("number of outputs =",1)
print("number of layers =",2,"(one input layer + one output layer)")
print("random-generated weights w1=",w1,"w2=",w2)
print("random-generated bias b=",b)
print("weighted sum z=",z)
print("activation_function = output =",fz)

Este código inicializa um perceptron não-linear, que é um neurônio artificial com duas entradas e uma saída.

  • A biblioteca numpy é importada com a primeira linha do código.
  • As próximas linhas de código inicializam as entradas, pesos e viés com valores aleatórios. A função random.uniform do numpy é usada para gerar valores aleatórios entre -1 e +1 para as entradas e o viés, bem como para os pesos das duas entradas.
  • A soma ponderada z é então calculada multiplicando as entradas pelos seus pesos correspondentes e adicionando o viés.
  • Em seguida, a função de ativação é aplicada a z para produzir a saída do perceptron. Neste caso, é usada a função de ativação sigmoidal, que é definida como f(z) = 1 / (1 + exp(-z)).
  • O código então imprime algumas informações sobre o perceptron, incluindo o número de entradas e saídas, o número de camadas (que é 2 para este perceptron simples), os pesos e viés gerados aleatoriamente, a soma ponderada z e a saída do perceptron após aplicar a função de ativação.

Este é o nosso primeiro passo. Nosso neurônio artificial está funcionando! Os resultados de uma única execução no IDE do Python são:

number of inputs = 2
number of outputs = 1
number of layers = 1 (one neuron)
random-generated weights w1= -0.1516818220375491 w2= 0.4826939463493012
random-generated bias b= [-0.41045979]
weighted sum z= [-0.7173281]
activation_function = output = [0.32798162]

Agora que temos um único neurônio funcionando, é hora de construir a rede neural.


Passo 3) Conectando Neurônios: Construindo uma Rede Neural de Entrada/Saída de duas camadas

Agora estamos prontos para conectar neurônios e construir uma rede neural de duas camadas. A primeira camada da rede consiste em dois neurônios, cada um com uma entrada, e a camada de saída consiste em apenas mais um neurônio e a saída.

Os neurônios de entrada na primeira camada recebem duas variáveis como entrada.

from numpy import *
import matplotlib.pyplot as plt

def apply_layer(y_in,w,b):
z=dot(w,y_in)+b
return(1/(1+exp(-z)))

N0=2
N1=1

w1=random.uniform(low=-10,high=+10,size=(N1,N0))
b1=random.uniform(low=-1,high=+1,size=N1)

def apply_net(y_in):
global w1,b1
y1=apply_layer(y_in,w1,b1)
return y1

M=50
y_out=zeros((M,M))

for j1 in range(M):
for j2 in range(M):
value0=float(j1)/M-0.5
value1=float(j2)/M-0.5
y_out[j1,j2]=apply_net([value0,value1])[0]

plt.imshow(y_out,origin=’lower’,extent=(-0.5,0.5,-0.5,0.5))
plt.colorbar()
plt.show()

Este código define uma rede neural simples com duas entradas de uma única entrada e uma saída de neurônio, sem camada oculta. A rede recebe duas variáveis de entrada e aplica uma matriz de pesos e um vetor de bias para calcular o valor de saída usando a função de ativação sigmoidal.

A matriz de peso e o vetor de bias são inicializados com valores aleatórios, e a função apply_layer é usada para aplicá-los às variáveis de entrada e calcular o valor de saída usando a função de ativação sigmoidal.

A função apply_net chama apply_layer para calcular o valor de saída para uma entrada dada e retorna a saída como um valor escalar.

Por fim, um mapa de cores 2D é gerado calculando a saída da rede neural para uma grade de valores de entrada e plotando os valores resultantes usando a função imshow do Matplotlib. O eixo x e y do gráfico representam as variáveis de entrada, e a cor de cada pixel no gráfico representa o valor de saída da rede neural (o valor da função de ativação) para os valores de entrada correspondentes. O mapa de cores é mostrado usando a função plt.show().

O código implementa uma rede neural com duas camadas. A primeira camada tem dois neurônios com uma variável de entrada cada, enquanto a segunda camada tem um neurônio com uma única variável de entrada. Os pesos e bias para a rede são gerados aleatoriamente dentro de uma determinada faixa. Em vez de imprimir os valores de biases, pesos e funções de ativação, o código exibe o valor de ativação da função de saída da segunda camada como um mapa de cores, que varia em função das duas variáveis de entrada no primeiro neurônio da primeira camada.


Passo 3) Escalando

Aqui temos um exemplo de como aumentar a escala de uma rede neural utilizando funções pré-definidas. Este código constrói uma rede neural com sete camadas, sendo cinco camadas ocultas, cada uma com 50 neurônios. A primeira camada possui um neurônio com dois inputs, enquanto cada uma das camadas ocultas possui 50 neurônios. Por fim, a camada de saída possui um neurônio com 50 inputs.

Este aumento no número de camadas e neurônios permite que a rede neural capture padrões mais complexos nos dados e faça previsões mais precisas. No entanto, também requer mais recursos computacionais e dados para treinar a rede de forma eficaz.

Em geral, a capacidade de aumentar a escala de uma rede neural é um recurso poderoso que nos permite lidar com problemas mais complexos e obter melhores resultados.

O código é:

from numpy import *
import matplotlib.pyplot as plt

def apply_layer(y_in,w,b):
z=dot(w,y_in)+b
return(1/(1+exp(-z)))

N0=2
N1=50
N2=50
N3=50
N4=50
N5=50
N6=1

w1=random.uniform(low=-10,high=+10,size=(N1,N0))
b1=random.uniform(low=-1,high=+1,size=N1)

w2=random.uniform(low=-10,high=+10,size=(N2,N1))
b2=random.uniform(low=-1,high=+1,size=N2)

w3=random.uniform(low=-10,high=+10,size=(N3,N2))
b3=random.uniform(low=-1,high=+1,size=N3)

w4=random.uniform(low=-10,high=+10,size=(N4,N3))
b4=random.uniform(low=-1,high=+1,size=N4)

w5=random.uniform(low=-10,high=+10,size=(N5,N4))
b5=random.uniform(low=-1,high=+1,size=N5)

w6=random.uniform(low=-10,high=+10,size=(N6,N5))
b6=random.uniform(low=-1,high=+1,size=N6)

def apply_net(y_in):
global w1,b1,w2,b2,w3,b3,w4,b4,w5,b5,w6,b6

y1=apply_layer(y_in,w1,b1)
y2=apply_layer(y1,w2,b2)
y3=apply_layer(y2,w3,b3)
y4=apply_layer(y3,w4,b4)
y5=apply_layer(y4,w5,b5)
y6=apply_layer(y5,w6,b6)
return y6

M=50
y_out=zeros((M,M))

for j1 in range(M):
for j2 in range(M):
value0=float(j1)/M-0.5
value1=float(j2)/M-0.5
y_out[j1,j2]=apply_net([value0,value1])[0]

plt.imshow(y_out,origin=’lower’,extent=(-0.5,0.5,-0.5,0.5))
plt.colorbar()
plt.show()

Uma vez que temos parâmetros aleatórios, a RN gera um resultado diferente a cada execução. Um exemplo de saída é:

Ao modificar o código (que ainda pode ser melhorado já que sou novato em Python), podemos facilmente escalar a rede neural para acomodar qualquer número de entradas e camadas com diferentes números de neurônios. No entanto, antes de podermos usar efetivamente a rede neural para nossa tarefa desejada, precisamos treiná-la para aprender os pesos e os vieses apropriados para as entradas fornecidas e as saídas desejadas. Esse processo geralmente envolve o uso de um grande conjunto de dados de treinamento para ajustar iterativamente os pesos e vieses da rede, a fim de minimizar o erro entre as saídas previstas e as saídas reais.

O treinamento de uma rede neural pode ser um processo complexo e demorado e requer uma cuidadosa consideração de fatores como a escolha do algoritmo de otimização, o tamanho do conjunto de dados de treinamento e a arquitetura da própria rede. No entanto, com a abordagem e as ferramentas certas, as redes neurais podem ser uma ferramenta poderosa para uma ampla gama de aplicações, incluindo reconhecimento de imagens, processamento de linguagem natural e até mesmo algoritmos de jogo. Vamos escrever sobre o treinamento de uma rede neural como essas acima no futuro.

#IA #InteligênciaArtificial #DIY #FaçaVocêMesmo #RedesNeuraisProfundas #RevoluçãoAI #TutorialRedesNeurais #ExperiênciaPrática #TecnologiaAI #AprendizadoDeMáquina #AprendizadoProfundo #TreineSuaPrópriaRedeNeural #ReconhecimentoDePadrões #Python #Tutorial

Reference:

https://www.fau.tv/course/id/778


Copyright 2024 AI-Talks.org

Leave a Reply

Your email address will not be published. Required fields are marked *