Реализуя поведение шлюза NAND с помощью персептрона Розенблатта, я тестировал влияние изменения скорости обучения и того, сколько эпох на самом деле должно сойтись. Но изменение значения не оказало влияния, и алгоритм всегда сходился после 5 эпох.
Это моя реализация:
import numpy as np
import matplotlib.pyplot as plt
n_inputs = 2
epochs = 10 # the loop is written to break once the algorithm converged so this represents max epochs
#binary inputs
training_inputs = np.array([[1,0,0],[1,0,1],[1,1,0],[1,1,1]])
#bipolar inputs
#training_inputs = np.array([[1,-1,-1],[1,-1,1],[1,1,-1],[1,1,1]])
d = np.array([1,1,1,-1])
l_rate = [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9]
for learning_rate in l_rate:
print('\n====================================\n')
print('Learning Rate: ',learning_rate)
w = np.zeros(n_inputs+1)
previous_w = np.zeros(n_inputs+1)
conv_epoch = 0
for i in range(epochs):
for inputs, targets in zip(training_inputs, d):
v_i = np.dot(inputs,w)
if v_i > 0:
y_i = 1
elif v_i == 0:
y_i = 0
elif v_i < 0:
y_i = -1
w = w + learning_rate*(targets - y_i)*inputs
#logging the weights after each epoch and comparing it to the previous epoch's weights
print('------------------------')
print('end of epoch: ',i+1)
print('weights: ', w)
print('previous weights: ', previous_w)
conv = np.array_equal(previous_w, w) #compare to previous epoch's weights to check for convergence
print('Converged: ',conv)
if(conv):
if (conv_epoch==0):
conv_epoch = i #it converged at the previous epoch
print('weights: ', w)
print('Converged at epoch: ',conv_epoch)
print('------------------------')
break #after it converged no need to continue with the remaining epochs
print('------------------------')
print()
previous_w = w
это влияет на характер входов -1 и 1 или что-то не так с моим кодом. Я тестирую его как с двоичными, так и с биполярными входами.