Aula 06 - Tensor Flow - Variáveis, Placeholders e Grafos

Meu github:

https://github.com/toticavalcanti

Documentação oficial do TensorFlow:

https://www.tensorflow.org/

Link para o notebook da aula:

notebook-da-aula

Se gostarem do conteúdo dêem um joinha 👍 na página do Código Fluente no Facebook

Link do código fluente no Pinterest

Aproveito para deixar meus link de afiliados:

Hostinger

Digital Ocean

One.com

Toti:

https://www.youtube.com/channel/UCUEtjLuDpcOvR3mIUr-viOA

Backing track / Play-along:

https://www.youtube.com/channel/UCT3TryVMqTqYBjf5g5WAHfA

Código Fluente

https://www.youtube.com/channel/UCgn-O-88XBAwdG9gUWkkb0w

Putz!

https://www.youtube.com/channel/UCZXop2-CECwyFYmHbhnAkAw

Fiquem a vontade para me adicionar ao linkedin.

Aula 06 - Tensor Flow - Redes Neurais - Variáveis, Placeholders e Grafos

Placeholder

Um placeholder é um nó vazio que precisa receber um valor, que pode ser uma feature, labels, etc. Para então poder computar a saída.

Variável

Uma variável é um valor mutável de parâmetro do grafo que representa a rede, por exemplo, os pesos das conexões.

Grafo

Um grafo, é a representação da rede, é uma variável global, conectando variáveis e placeholders de operações.

Placeholder


class Placeholder():
  def __init__(self):
    self.output_nodes = []
    _default_graph.placeholders.append(self)
A classe Placeholder inicia o output_nodes como uma lista vazia em seu construtor e se adiciona a lista placeholders da variável global _default_graph com o append.

Variable


class Variable():
  def __init__(self, initial_value = None):
    self.value = initial_value
    self.output_nodes = []
    
    _default_graph.variables.append(self)
A classe Variable pode receber um valor inicial, o valor inicial, ou seja, o que chegar em initial_value, será atribuído ao value da instância da classe Variable. O output_node dela é declarado como uma lista vazia, e ela se adiciona na lista de variáveis do grafo, isto é, em _default_graph.variables fazendo o append dela mesma na lista de variáveis do grafo.

Grafo

Agora vamos criar o grafo como uma variável global.

class Grafo():
  def __init__(self):
    self.operations = []
    self.placeholders = []
    self.variables = []

  def set_as_default(self):
    global _default_graph
    _default_graph = self
O que o grafo basicamente faz é conectar placeholders e variáveis a operações. Ele acompanha todos eles através das listas operations, placeholders e variables. O método set_as_default() é para definir o Grafo como global e as outras classes (Variable e Placeholder) poderem acessar o _default_graph. O _default_graph = self é para poder ser acessado, isto é, instanciado pelo main. Vamos modificar a classe Operations adicionando as operações ao Grafo global que representa a rede:

class Operation():
  #construtor
  def __init__(self, input_nodes = []):
    self.input_nodes = input_nodes
    # a lista vazia vai ser substituída 
    # pela classe que irá extender Operation
    # ou seja as operações
    self.output_nodes = []

    # para cada nó no input_nodes
    # ponha essa operação na lista
    # output_nodes daquele nó
    for node in input_nodes:
      node.output_nodes.append(self)

    _default_graph.operations.append(self)
  # O pass é porque o compute é apenas um método de espaço
  # reservado e será substituído pelo método específico (soma, multiplica...)
  def compute(self):
    pass

Exemplo de uso

z = Ax + b A = 10 b = 1 z = 10x + 1 O z guarda o valor retornado pela fórmula Ax + b. O x na fórmula é um placeholder. A e b são variáveis. O valor de z vai depender do placeholder que a gente passar para o x. Então, se você passar para ele uma operação de adição, ou de multiplicação, ou de... o resultado da computação será diferente.

Instanciando um grafo

Vamos instanciar um objeto grafo e inicializar ele como variável global.

g = Graph()
g.set_as_default()
E temos duas variáveis

A = Variable(10)
b = Variable(1)
O x é um Placeholder, e não sabemos seu valor, ele será fornecido pelo usuário.

x = Placeholder()
Na fórmula z = Ax + b  temos duas operações, a multiplicação de A por x e a soma do resultado com o b. Então vamos utilizar a operação multiply() primeiro.

y = multiply(A, x)
E o resultado final vamos guardar em z.

z = add(y, b)

Ordem de operações

Na aula que vem, vamos criar a função traversePostOrder() que servirá para garantir que a computação ocorra na ordem certa. Ela vai percorrer os nós do grafo na ordem certa e portanto fazer a computação correta. Vamos também criar a classe Session que é quem vai executar de fato o grafo.

Isso nós vamos ver na próxima!

\o/ e até lá.

notebook-da-aula

Ficamos por aqui e até a próxima.

Meu github:

https://github.com/toticavalcanti

Se gostarem do conteúdo dêem um joinha 👍 na página do Código Fluente no Facebook

Link do código fluente no Pinterest

Novamente deixo meus link de afiliados:

Hostinger

Digital Ocean

One.com

Obrigado, até a próxima e bons estudos. ;)