mercoledì 7 marzo 2018

Mandelbrot con TensorFlow

Questo esempio del calcolo dell'insieme di Mandelbrot e' compreso all'interno del tutorial di TensorFlow. Lo scopo di questo post e' di capire come e' stato inserito il calcolo ricorsivo nella logica di TensorFlow tutta indirizzata all'utilizzo di matrici

Una osservazione : stranamente il calcolo e' molto lento. Credo che il problema sia dovuto alla logica con cui e' fatto il calcolo..invece di uscire dal ciclo di calcolo per ogni punto una volta che si e' raggiunta la soglia di fuga, con questo programma il calcolo viene rieffettuato su tutta la matrice per 200 volte



La logica: invece di effettuare il calcolo usando una matrice e a celle singole
-----------------------------
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
     
#MANDELBROT SET 520x600
# crea due array di 520x600 -1.3<X<1.3 -2<Y<1
# a passo 0.005
Y, X = np.mgrid[-1.3:1.3:0.005, -2:1:0.005]

#Crea una array di numeri complessi Z moltiplicando Y per sqrt(-1) (che in 
#in numpy e' j
Z = X+1j*Y

#trasforma l'array Z in un formato tensorflow
c = tf.constant(Z.astype("complex64"))

# popola la variabile zs con x
zs = tf.Variable(c)
# popola la variabile ns con tutti gli elementi a zero 
# e delle dimensioni di c, qui ci sara' il risultato del
# della divergenza
ns = tf.Variable(tf.zeros_like(c, "float32"))

#qui viene impiegata una sessione interattiva ma si puo' sostituire il comando con
# tf.Session()
# tanto non e' necessario il debug

sess = tf.InteractiveSession()
tf.initialize_all_variables().run()

# Compute the new values of z: z^2 + x
#zs_ e' una variabile transitoria su
#cui viene calcolata la ricorsione
zs_ = zs*zs + c

# se il modulo di zs e' minore di 4 
# salvalo nella matrice not_diverged
# nella matrice not_diverged viene salvato
# il valore boolean della condizione <4
# quindi nella matrice not_diverged ci sono 
# 0 ed 1
not_diverged = tf.abs(zs_) < 4

#tf.group raggruppa piu' operazioni
#copia la matrice transitoria zs_ su zs per continuare
# l'iterazione
# aggiunge poi alla matrice inizializzata  tutta a zeri (ns)
# il contenuto della matrice dei punti che non hanno fatto
#  modulo > 4. In questo modo viene creata una mappa
#di quanti cicli su ogni cella sono necessari
step = tf.group(
  zs.assign(zs_),
  ns.assign_add(tf.cast(not_diverged, "float32"))
  )

#200 cicli di iterazione della sessione
for i in range(200): step.run()

#mosta la matrice ns come immagine
plt.imshow(ns.eval())
plt.show()

Nessun commento:

Posta un commento

Perche' investire su Unix

 Un libro trovato nel libero scambio alla Coop su cio' che poteva essere e non e' stato...interessante la storia su Unix del primo c...