Exercícios Resolvidos de Ponteiros e funções

Ver Teoria

Enunciado

Rede Neural é um famoso modelo de Machine Learning, que consiste em utilizar diversos neurônios artificiais para efetuar previsões. De forma muito simplificada, um neurônio artificial efetua uma soma de todas suas entradas, e o resultado dessa soma é aplicado em uma Função de Ativação. As funções de ativação podem ser de vários tipos, mas duas muito famosas são a ReLU e a Sigmoide.

Considere um neurônio que receba 2 entradas, faça uma função n e u r o n i o que receba como parâmetro as duas entradas e uma função de ativação, e como retorno dê o resultado do neurônio.

Para construir as funções de ativação utilize as expressões:

R e L U : e s p a c o r e l u x = 0 ,     x < 0 x ,     x ≥ 0   S i g m o i d : e s p s i g x = 1 1 + e - x   N e u r o n i o : a a n e u r o n i o x 1 ,   x 2 = f u n ç ã o A t i v a ç ã o x 1 + x 2  

Para fins de simulação utilize os seguintes valores: x 1 = 0.7593 e x 2 = - 0.1560

Passo 1

Eita olha o tamanho do textão dessa questão. Parece até a prova do ENEM. Mas ta tranquilo, vem comigo que eu te mostro como fazer.

O que a questão está pedindo de fato é que a gente faça três funções. Uma função deve efetuar o cálculo da ReLU, a segunda função efetua o cálculo da Sigmoide.

Já a terceira função simula o neurônio da rede, e ela possui três parâmetros, os valores x 1 e x 2 e o terceiro parâmetro deve ser o ponteiro para uma função.

E depois que a gente construir as funções, dentro da nossa m a i n a gente vai executar as funções.

Mas antes de fazer tudo isso, vamos começar com o cabeçalho do programa

Passo 2

Certo, então primeiro vamos desenvolver as funções

Vamos começar desenvolvendo a função ReLU. Essa é uma função composta, se o valor de x for menor que zero, então o resultado é 0 . Se o valor de x for maior que zero, então o resultado é igual ao próprio valor de x . A gente pode traduzir isso em uma condição i f - e l s e da seguinte forma:

S E   x < 0   E N T Ã O   r e l u = 0 S E   N Ã O a a a a a a a r e l u = x

Em termos de código, essa função deve ser do tipo f l o a t e receber uma única entrada do tipo f l o a t . O código fica da seguinte forma:

Passo 3

Agora vamos desenvolver a função sigmoide. Vamos criar uma função que execute a seguinte expressão:

s i g x = 1 1 + e - x

Pra desenvolver essa expressão vamos criar uma função do tipo f l o a t que recebe um único parâmetro do tipo f l o a t também. O código é:

Passo 4

O próximo passo é desenvolver a função n e u r o n i o . Primeiro de tudo precisamos determinar os parâmetros. Vamos receber dois valores do tipo f l o a t x 1 e x 2 . A função de ativação também será recebida como um parâmetro, então o terceiro parâmetro da função n e u r o n i o é um ponteiro para a função de ativação * f u n c a o A t i v a c a o

O corpo da função neurônio vai efetuar uma soma dos parâmetros x 1 e x 2 . Então criamos uma variável chamada s o m a que armazena o resultado de x 1 + x 2 .

Em seguida precisamos aplicar o resultado da soma na função de ativação. Por isso, agora você tem que lembrar que o ponteiro de uma função é um apelido para função original. Por isso podemos fazer a expressão:

f u n c a o A t i v a c a o s o m a ;

E assim conseguimos executar a função apontada pelo ponteiro f u n c a o A t i v a c a o . Então vamos armazenar o resultado da f u n c a o A t i v a c a o ( s o m a ) numa variável chamada r e s u l t a d o

E pra concluir a função vamos retornar o valor guardado em r e s u l t a d o

Passo 5

Com as nossas funções prontas podemos construir a nossa m a i n

A questão nos diz para utilizar os seguintes valores x 1 = 0.7593 e x 2 = - 0.1560 como entrada do nosso neurônio, então vamos declará-los no início da m a i n ( )

A questão pede que a gente execute o neurônio duas vezes, da primeira vez com a função relu, e da segunda vez com a função sigmoide. Então vamos declarar duas variáveis para guardar estes resultados.

O próximo passo é executar os neurônios. Vamos executar a função n e u r o n i o passando como parâmetro os valores x 1 e x 2 e a função r e l u , e guardamos o resultado na variável r e s _ r e l u . Em seguida fazemos o mesmo, mas passando a função s i g m o i d como parâmetro e guardando o resultado na variável r e s _ s i g .

E pra finalizar a questão, é só a gente utilizar a função c o u t para mostrar os resultados

Executando o programa, teremos o seguinte resultado:

Resposta