Advertisement
Guest User

Untitled

a guest
Jun 18th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.94 KB | None | 0 0
  1. import tensorflow as tf
  2. import numpy as np
  3. import random
  4. import matplotlib.pyplot as plt
  5. import time
  6.  
  7. def create_dataset(n_points, larghezza, altezza):
  8.  
  9.     '''
  10.    funzione per creare un insieme di punti entro un limite di altezza e larghezza.
  11.    Assieme ai punti vengono creati anche i risultati esatti per allenare la rete neurale
  12.  
  13.    1 se il punto appartiene o si trova al di sopra della retta y=x, altrimenti 0
  14.    '''
  15.  
  16.     points = []
  17.     labels = []
  18.  
  19.     random.seed(time.time())
  20.  
  21.     for i in range(n_points):
  22.         xp = random.uniform(0, larghezza)
  23.         yp = random.uniform(0, altezza)
  24.         points.append([xp,yp])
  25.  
  26.         label = 1 if yp>=xp else 0
  27.         labels.append([label])
  28.  
  29.     return np.array(points,dtype=np.float32), np.array(labels,dtype=np.float32)
  30.  
  31. #dati per l'allenamento
  32. points, labels = create_dataset(50, 100, 100)
  33. #dati per la verifica
  34. x_test, y_test = create_dataset(50, 500, 500)
  35.  
  36. #segnaposti per i dati
  37. x = tf.placeholder(tf.float32, shape=[None, 2])
  38. y = tf.placeholder(tf.float32, shape=[None, 1])
  39.  
  40. def neural_network_model(data):
  41.  
  42.     '''
  43.    funzione che definisce una rete neurale con 2 livelli intermedi e uno di output
  44.    '''
  45.  
  46.     pesi1 = tf.Variable(tf.random_normal([2, 64]), name="pesi_livello_1")
  47.     pesi2 = tf.Variable(tf.random_normal([64, 64]), name="pesi_livello_2")
  48.     pesi_output = tf.Variable(tf.random_normal([64, 1]), name="pesi_livello_output")
  49.  
  50.     layer1 = tf.matmul(data, pesi1)  #input * pesi_livello_1
  51.     layer1 = tf.nn.sigmoid(layer1)  #funzione di attivazione livello 1
  52.  
  53.     layer2 = tf.matmul(layer1, pesi2)  #output_livello_1 * pesi_livello_2
  54.     layer2 = tf.nn.sigmoid(layer2)  #funzione di attivazione livello 1
  55.  
  56.     output = tf.matmul(layer2, pesi_output)
  57.  
  58.     return output
  59.  
  60. def allena_rete_neurale(x):
  61.  
  62.     #la rete neurale calcola l'output
  63.     previsione = neural_network_model(x)
  64.     #calcolo l'errore tra l'output esatto e quello calcolato dalla rete neurale
  65.     errore = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = previsione, labels = y, name="calcola_errore"), name="errore")
  66.  
  67.     #ottimizzatore per minimizzare l'errore
  68.     ottimizzatore = tf.train.AdamOptimizer().minimize(errore)
  69.  
  70.     #numero di volte da ripetere l'allenamento
  71.     epoche = 5
  72.  
  73.     #crea una sessione necessaria per interfacciare il programma in python con tensorflow(C++)
  74.     with tf.Session() as sess:
  75.  
  76.         writer = tf.summary.FileWriter("./", sess.graph)
  77.  
  78.         #inizializza tutte le variabili
  79.         sess.run(tf.global_variables_initializer())
  80.  
  81.         for e in range(epoche):
  82.             #errore di ogni epoca
  83.             errore_epoca = 0
  84.  
  85.             #allena la rete con 50 punti alla volta
  86.             i = 0
  87.             while i < len(points):
  88.                 #punti
  89.                 data_x = points[i:i+50]
  90.                 #output esatto
  91.                 data_y = labels[i:i+50]
  92.                 #allena la rete con l'ottimizzatore e l'errore
  93.                 _, err = sess.run([ottimizzatore, errore], feed_dict={x:data_x, y:data_y})
  94.                 #somma l'errore all'errore dell'epoca
  95.                 errore_epoca += err
  96.                 i+=50  
  97.  
  98.             print('Epoca', e, '\\',epoche,'  errore:',errore_epoca)
  99.  
  100.         #calcola la correttezza e la precisione della rete neurale con dati non usati nell'allenamento
  101.         correttezza = tf.equal(tf.argmax(previsione, 1), tf.argmax(y, 1))
  102.  
  103.         precisione = tf.reduce_mean(tf.cast(correttezza, 'float'))
  104.         print('Precisione:',precisione.eval({x:x_test, y:y_test}) * 100, '%')
  105.  
  106.         writer.close()
  107.  
  108. allena_rete_neurale(x)
  109.  
  110. prediction = 0 #??????
  111.  
  112. p = []
  113. p.append(float(input("\nInserisici la coordinata X del punto:\n")))
  114. p.append(float(input("\nInserisici la coordinata Y del punto:\n")))
  115.  
  116. txt = "Sotto" if prediction == 0 else "Sopra"
  117. plt.scatter(p[0],p[1])
  118. plt.annotate(txt, (p[0],p[1]))
  119. plt.plot(range(0,100), range(0,100), color="green")
  120. plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement