1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- # Mandelbrot example
- # Import libraries for simulation
- import tensorflow as tf
- import numpy as np
- # Imports for visualization
- import PIL.Image
- from cStringIO import StringIO
- from IPython.display import clear_output, Image, display
- import scipy.ndimage as nd
- def DisplayFractal(a, fmt='jpeg'):
- """Display an array of iteration counts as a
- colorful picture of a fractal."""
- a_cyclic = (6.28*a/20.0).reshape(list(a.shape)+[1])
- # orig parameters
- # img = np.concatenate([10+20*np.cos(a_cyclic),
- # 30+50*np.sin(a_cyclic),
- # 155-80*np.cos(a_cyclic)], 2)
- img = np.concatenate([95+25*np.cos(a_cyclic+1.21),
- 20+155*np.sin(a_cyclic),
- #155-80*np.cos(a_cyclic)], 2)
- 155-8*np.cos(a_cyclic)], 2)
- img[a==a.max()] = 0
- a = img
- a = np.uint8(np.clip(a, 0, 255))
- f = StringIO()
- image = PIL.Image.fromarray(a)
- image.show()
- image.save(f, fmt)
- display(Image(data=f.getvalue()))
- sess = tf.InteractiveSession()
- # Use NumPy to create a 2D array of complex numbers on [-2,2]x[-2,2]
- Y, X = np.mgrid[-1.3:1.3:0.005, -2:1:0.005]
- Z = X+1j*Y
- #Now we define and initialize TensorFlow tensors.
- xs = tf.constant(Z.astype("complex64"))
- zs = tf.Variable(xs)
- ns = tf.Variable(tf.zeros_like(xs, "float32"))
- tf.initialize_all_variables().run()
- # Compute the new values of z: z^2 + x
- zs_ = zs*zs + xs
- # Have we diverged with this new value?
- not_diverged = tf.complex_abs(zs_) < 4
- # Operation to update the zs and the iteration count.
- #
- # Note: We keep computing zs after they diverge! This
- # is very wasteful! There are better, if a little
- # less simple, ways to do this.
- #
- step = tf.group(
- zs.assign(zs_),
- ns.assign_add(tf.cast(not_diverged, "float32"))
- )
- for i in range(200): step.run()
- # Let's see what we've got.
- DisplayFractal(ns.eval())
|