First, input range from -1 to 1 instead of 0 to 1. Below is the code that normalize input value on this range.
def Normalize( A, minmax, interval ) :
N = []
scale = math.fabs( interval[1] - interval[0] )
offset = interval[0]
for i in range(A.shape[1]) :
minv = minmax[0,i]
maxv = minmax[1,i]
N.append( [ (((float(a)-minv)/(maxv-minv))*scale + offset)
for a in A[:,i] ] )
return np.matrix( N ).getT()
Forward propagation with sigmoid neuron can be coded as below. Here X is the input vector and HN is the weight for Hidden Neurons - nerons after input. And ON is the weight of output neuron. Here
def ForwardPropagation( X, HN, ON ) :
Z = np.dot( HN, X )
H = [ (1/(1+math.exp(-zi))) for zi in Z ]
Z = np.dot( ON, H )
O = [ (1/(1+math.exp(-zi))) for zi in Z ]
return H, O
Backward propagation can be expressed in matrix form as below. H and O is output from above ForwardPropagation and T is the output observed and nu is training rate.
def BackwardPropagation( X, HN, ON, H, O, T, nu ) :
D1 = [ yi*(1-yi)*(ti-yi) for yi,ti in zip(O,T) ]
D2 = [ hi*(1-hi)*pi for hi, pi in zip(H, np.dot(ON.T,D1))]
ON += nu * np.dot(np.matrix(D1).T, np.matrix(H))
HN += nu * np.dot(np.matrix(D2).T, np.matrix(X).T )
return HN, ON
With steel plate database - as from previous blog - below is a code to run a epoch ( running through all example to train ).
Examples = np.array(LoadTrainingExamples( 'faults.txt', '\t' ))
Examples = Examples[ range(0,346) ] # 0-345 rows is for classification 27,28 column
A = Examples[:, range(4,27)] # attributes - exclude 0-3 column as it is x,y position
minmax = np.vstack( (A.min(0),A.max(0)) );
A = Normalize( A, minmax, [-1,1] )
N = A.shape[1] # number of attributes - input vector length
C = Examples[:, [27,28] ]
M = C.shape[1] # number of output - output vector length
HN = 0.01 * np.ones( [N,N] ) # 0.01 for initial weight
ON = 0.01 * np.ones( [M,N] )
for Ai,Ci in zip( A,C) :
H, O = ForwardPropagation( Ai.T, HN, ON )
HN, ON = BackwardPropagation( Ai.T, HN, ON, H, O, Ci, 0.1)
When running above with 200 epoch, the error rate goes below 1%. Below is a graph shows how the error rates changes as ANN is get trained.
Though when running with all 7 attributes, it doesn't get trained well as below graph shows.
No comments:
Post a Comment