Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Função "propaga_total" não executa

Ao tentar executar a função "propaga_total" recebo dois inputs de erros, segue abaixo: Aparentemente é problema com a arquitetura, pois ao mudar a quantidade de saídas e entradas das camadas ocultas o shape do input do erro muda (posso estar falando besteira).

arquitetura = [
  {"dim_entrada":7, "dim_saida":10, "ativacao": "relu"},
  {"dim_entrada":10, "dim_saida":5, "ativacao": "relu"},
  {"dim_entrada":5, "dim_saida":1, "ativacao": "sigmoid"}
]

Primeiro input:

ValueError                                Traceback (most recent call last)
<ipython-input-106-561f110befd2> in <module>()
      1 valoresParametros = iniciaCamadas(arquitetura, seed = 99)
----> 2 yEstimado, memoria = propagaTotal(np.transpose(x), valoresParametros, arquitetura)

Segundo input:

<ipython-input-102-8b62ad79ca16> in propagaCamada(atvAnterior, pesosAtuais, bAtual, ativacao)
      1 def propagaCamada(atvAnterior, pesosAtuais, bAtual, ativacao="relu"):
      2   # calculo da entrada para a funcao de ativacao
----> 3   saidaAtual = np.dot(pesosAtuais, atvAnterior) + bAtual
      4 
      5   # selecao da funcao de ativacao

<__array_function__ internals> in dot(*args, **kwargs)

ValueError: shapes (7,10) and (7,10) not aligned: 10 (dim 1) != 7 (dim 0)

Link do colab se puderem dar uma olhada: https://colab.research.google.com/drive/1WcVv2y4-2EP-QKVOk5CBnSXpAz8AlrRE?usp=sharing

2 respostas
solução!

Olá Yago, tudo bem ? Espero que sim.

Na função iniciaCamadas os valores valoresParametros de P, estão invertidos.

Está criando um array de lenCamadaEntrada por lenCamadaSaida:

np.random.randn(lenCamadaEntrada, lenCamadaSaida) * 0.1

Quando na verdade precisamos de um array de lenCamadaSaida por lenCamadaEntrada:

np.random.randn(lenCamadaSaida, lenCamadaEntrada) * 0.1

A função iniciaCamadas final vai ficar assim:

def iniciaCamadas(arquitetura, seed = 99):
  # inicia os valores aleatorios
  np.random.seed(seed)

  # numero de camadas da rede neural
  numeroCamadas = len(arquitetura)

  # inicia alocamento de parametros
  valoresParametros = {}

  # itera nas camadas da rede
  for indice, camada in enumerate(arquitetura):
    indiceCamada = indice + 1

    # extrai o numero de nodos nas camadas
    lenCamadaEntrada = camada["dim_entrada"]
    lenCamadaSaida = camada["dim_saida"]

    # inicia os valores na matriz de pesos P
    # e o vetor de vies ou bias B
    valoresParametros['P' + str(indiceCamada)] = np.random.randn(lenCamadaSaida, lenCamadaEntrada) * 0.1
    valoresParametros['B' + str(indiceCamada)] = np.random.randn(lenCamadaSaida, 1) * 0.1

  return valoresParametros

Espero ter ajudado e qualquer duvida não hesite em perguntar.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Funcionou Igor, muito obrigado!