Aula 06 - Tensor Flow - Variáveis, Placeholders e Grafos
Meu github:
Documentação oficial do TensorFlow:
Link para o 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:
Toti:
Backing track / Play-along:
Código Fluente
Putz!
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á.
Ficamos por aqui e até a próxima.
Meu github:
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:
Obrigado, até a próxima e bons estudos. ;)