TensorFlow™ no Databricks
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()
- Você pode encontrar outras funções para matrizes no TensorFlow na documentação oficial.
- Separe a imagem em quatro "cantos" e, em seguida, junte-as.
- 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.