Ir para o conteúdo principal

TensorFlow™ no Databricks

Illustration

Placeholders

Até agora, usamos Variáveis para gerenciar nossos dados, mas há uma estrutura mais básica, o placeholder. O placeholder é apenas uma variável à qual atribuiremos dados posteriormente. Ele permite criar operações e construir o gráfico de computação sem ter nenhum dado. Na terminologia do TensorFlow, alimentamos dados no gráfico usando esses placeholders.

 

import tensorflow as tf

x = tf.placeholder("float", None)
y = x * 2

with tf.Session() as session:
    result = session.run(y, feed_dict={x: [1, 2, 3]})
    print(result)

 

Este exemplo funciona de maneira um pouco diferente dos anteriores. Vamos examiná-lo em detalhes.

Primeiro, importamos o tensorflow normalmente. Em seguida, criamos um placeholder chamado x, ou seja, um lugar na memória onde armazenaremos um valor mais tarde.

Depois, criamos um tensor chamado correspondente à multiplicação de x por 2. Observe que ainda não definimos um valor inicial para x.

Agora, temos uma operação (y) definida e podemos executá-la em uma sessão. Criamos um objeto de sessão e, em seguida, executamos apenas a variável y. Observe que, se definirmos um gráfico de operações muito maior, só poderemos executar um pequeno segmento do gráfico. Esta avaliação de subgráfico é uma das grandes vantagens do TensorFlow, e que não se encontra em muitas outras bibliotecas do mesmo tipo.

Para executar y, é preciso conhecer os valores de x. Definimos isso no argumento feed_dict da execução. Declaramos que os valores de x são [1, 2, 3]. Executamos y, que dá o resultado de [2, 4, 6].

Os placeholders não precisam ser dimensionados estaticamente. Vamos atualizar nosso programa para permitir que x assuma qualquer tamanho. Altere a definição de x para:

 

x = tf.placeholder("float", None)

 

Agora, ao definirmos os valores de x no feed_dict, podemos ter qualquer número de valores. O código ainda deve funcionar e fornecer a mesma resposta, mas agora ele também funcionará com qualquer número de valores em feed_dict.

Os placeholders também podem ter múltiplas dimensões, o que permite armazenar matrizes. No exemplo a seguir, criamos uma matriz 3 por 2 e armazenamos alguns números nela. Em seguida, usamos a mesma operação de antes para duplicar os números por elemento.

 

import tensorflow as tf

x = tf.placeholder("float", [None, 3])
y = x * 2

with tf.Session() as session:
    x_data = [[1, 2, 3],
              [4, 5, 6],]
    result = session.run(y, feed_dict={x: x_data})
    print(result)

 

A primeira dimensão do placeholder é None, o que significa que podemos ter qualquer número de linhas. A segunda dimensão é definida como 3, o que significa que cada linha precisa ter três colunas de dados.

Podemos estender isso para aceitar um número arbitrário de dimensões None . Neste exemplo, carregamos a imagem da nossa última lição e, em seguida, criamos um placeholder que armazena uma fatia dessa imagem. Essa fatia é um segmento 2D da imagem, mas cada "pixel" tem três componentes (vermelho, verde, azul). Portanto, precisamos de None para as duas primeiras dimensões, mas precisamos de 3 (embora None também funcione) para a última dimensão. Em seguida, usamos o método slice do TensorFlow para extrair um subsegmento da imagem e operar sobre ele.

 

import tensorflow as tf
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import os

# Primeiro, carregue a imagem novamente
dir_path = os.path.dirname(os.path.realpath(__file__))
filename = dir_path + "/MarshOrchid.jpg"
raw_image_data = mpimg.imread(filename)

image = tf.placeholder("uint8", [None, None, 3])
slice = tf.slice(image, [1000, 0, 0], [3000, -1, -1])

with tf.Session() as session:
    result = session.run(slice, feed_dict={image: raw_image_data})
    print(result.shape)

plt.imshow(result)
plt.show()

 

  1. Você pode encontrar outras funções para matrizes no TensorFlow na documentação oficial.
  2. Separe a imagem em quatro "cantos" e, em seguida, junte-as.
  3. Converta a imagem em escala de cinza. Para fazer isso, você pode exibir apenas um dos três canais de cores. Você também pode calcular a média dos três canais e torná-la cinza.