Passa al contenuto principale

TensorFlow™ su Databricks

Illustration

I segnaposti

Finora abbiamo usato le Variabili per gestire i dati, ma esiste una struttura più semplice, i segnaposto. Un segnaposto è semplicemente una variabile alla quale verranno assegnati i dati in un momento successivo. In questo modo è possibile creare le operazioni e costruire il grafo computazionale senza bisogno dei dati. Usando la terminologia di TensorFlow, procediamo poi al feed dei dati nel grafo attraverso i segnaposti.

 

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)

 

Questo esempio è leggermente diverso da quelli precedenti, analizziamolo nel dettaglio.

Come prima cosa, importiamo  TensorFlow come di consueto. Quindi creiamo un segnaposto chiamato x, cioè una locazione nella memoria in cui andremo successivamente a memorizzare un valore.

Creiamo poi un Tensor chiamato, ottenuto moltiplicando x per 2. Da notare che non abbiamo ancora definito alcun valore iniziale per x.

A questo punto abbiamo un'operazione (y) definita e la possiamo eseguire in una sessione. Creiamo un oggetto di sessione e poi eseguiamo solamente la variabile y. Questo significa che, se abbiamo definito un grafo di operazioni molto più grande, possiamo eseguire solo una piccola porzione del grafo stesso. Questo sottografo è uno dei punti di forza di TensorFlow perché in molte libre che svolgono compiti simili non è disponibile.

Per eseguire y bisogna conoscere i valori di x, che vengono definiti nell'argomento feed_dict per essere eseguiti. Qui dichiariamo che i valori di x sono [1, 2, 3]. Eseguiamo y ottenendo come risultato [2, 4, 6].

I segnaposti non devono essere dimensionati staticamente. Aggiorniamo il programma affinché x possa avere qualsiasi lunghezza. Cambiamo la definizione di x in:

 

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

 

Ora, quando definiamo i valori di x in feed_dict, possiamo avere un numero di valori qualsiasi. Il codice dovrebbe funzionare ancora e dare lo stesso risultato, ma ora funzionerà anche con qualsiasi numero di valori in feed_dict.

I segnaposti possono avere anche più dimensioni, consentendo di memorizzare array (matrici). Nell'esempio seguente creiamo una matrice 3x2 e memorizziamo alcuni numeri al suo interno, poi usiamo la stessa operazione precedente per raddoppiare i numeri, elemento per 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)

 

La prima dimensione del segnaposto è None, a indicare che possiamo avere un numero qualsiasi di righe. La seconda dimensione è fissata a 3, a indicare che ogni riga deve avere tre colonne di dati.

Possiamo estendere la matrice per prevedere qualsiasi numero di dimensioni None . In questo esempio carichiamo l'immagine della lezione precedente, quindi creiamo un segnaposto che memorizza una porzione dell'immagine. La porzione è un segmento 2D dell'immagine, ma ogni "pixel" ha tre componenti (rosso, verde e blu). Pertanto ci servirà None per le prime due dimensioni e 3 (ma andrebbe bene anche None) per l'ultima dimensione. Utilizziamo quindi il metodo slice di TensorFlow per estrarre dall'immagine un sottosegmento su cui lavorare.

 

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

# First, load the image again
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. Dai un'occhiata a tutte le altre funzioni per matrici disponibili in TensorFlow consultando la documentazione ufficiale.
  2. Suddividi l'immagine in quattro "angoli", quindi ricomponila.
  3. Converti l'immagine in scala di grigi. Per farlo puoi estrarre un unico canale di colore e visualizzarlo. Un altro modo è prendere la media dei tre canali come colore grigio.