#!/bin/python3 import numpy as np import random cicli = 59990 hidden_layer = 1 epsilon = 0.01 def fdt(x,deriv=False): if(deriv==True): return (1-np.tanh(x)**2) return np.tanh(x) def error_func(output): e=0 for i in range(len(output)): e += (output[i]-Y[i])**2 return 0.5*e #input data X = np.array([[0,1], # primo input [0,1], [1,1], [1,1]]) #output data Y = np.array([[0], [0], [1], [1]]) np.random.seed(1) #per avere sempre lo stesso #sinapsi tra input e Perceptron di output syn0 = 0.1*(2*np.random.random((2,hidden_layer)) -1) #print(syn0) #2x1 # fase forward l0 = X l1 = fdt(np.dot(l0,syn0)) #output layer hidden, 4x4 4 esempi, 4 neuroni di output for i in range(cicli): print(str(int(100*i/cicli))+"---------------------------------------") #% sul numero totale di cicli # fase forward old_error = error_func(l1) #fase backward #calcolo delta_nu delta_nu = Y - l1 #print(syn0[:,0]) sum = 0 for nu in range(len(X)): #ciclo tra gli esempi sum += epsilon*(delta_nu[nu]*fdt(np.dot(X[nu],syn0),True))*X[nu] #print(sum) syn0[:,0] += sum l1 = fdt(np.dot(l0,syn0)) #output layer hidden, 4x4 4 esempi, 4 neuroni di output current_error = error_func(l1) print(old_error - current_error) if (np.linalg.norm(sum) < 10**-8): print("Very low variation in weight-space - exiting") print("delta_w :"+str(np.linalg.norm(sum))) break if (error_func(l1) < 0.001): print("Very low error - exiting") break if (abs(current_error - old_error) < 10**-8): print("Very low error variation - exiting") break print("Error: "+str(error_func(l1))) for i in range(len(np.transpose(l1))): print(np.transpose(l1)[i]) #for i in range(cicli): #l1 = fdt(np.dot(l0, syn0)) #print(l1) #l2 = fdt(np.dot(l1, syn1)) #print(l2)