Для класса I требуется создать нейронную сеть, использующую обратное распространение, чтобы решить «проблему нечетной четности» (независимо от того, имеют ли биты 4-битного числа четное / нечетное количество 1 с).Нам необходимо использовать сеть с 4 входами, 4 узлами на первом уровне и одним выходным узлом на втором уровне.
Моя проблема в том, что мой алгоритм сводится навсегда, и, будучи новичком в python, я не знаю, как это исправить.Я не знаю, пропускаю ли я ключевую концепцию или мой код просто не очень хорошо написан, но я разместил свое решение ниже:
def logistic(x):
return 1 / (1 + np.exp(-x))
num_inputs = 5
#create weights for each hidden layer
hl1_weights = [r.randint(1,100)/100 * ((-1) ** r.randint(1,2)) for i in range(num_inputs)]
hl2_weights = [r.randint(1,100)/100 * ((-1) ** r.randint(1,2)) for i in range(num_inputs)]
hl3_weights = [r.randint(1,100)/100 * ((-1) ** r.randint(1,2)) for i in range(num_inputs)]
hl4_weights = [r.randint(1,100)/100 * ((-1) ** r.randint(1,2)) for i in range(num_inputs)]
hl_weights = [hl1_weights,hl2_weights,hl3_weights,hl4_weights]
#create weights for ouput layer
ol_weights = [r.randint(1,100)/100 * ((-1) ** r.randint(1,2)) for i in range(num_inputs)]
#outputs
outputs_l1 = [0,0,0,0,1]
output_l2 = 0
#logistics
logistics_l1 = [0,0,0,0,1]
logistic_l2 = 0
#deltas
deltas_l1 = [0,0,0,0]
delta_l2 = 0
#input data
df = create_df()
lrs = [.5 - .05 * i for i in range(10)]
lr = .5
#for lr in lrs:
notAllNumsWithin5Percent = True
epochs = 0
iterations = 0
while notAllNumsWithin5Percent:
aNumNotWithin5Percent = False
summation = 0
iterations += 1
for x in range(len(df)):
epochs+=1
curr_input = df.iloc[x,:-1]
actual = df.iloc[x,-1]
#feed forward
for i in range(4):
output = logistic(np.dot(curr_input, hl_weights[i]))
logistics_l1[i] = output
outputs_l1[i] = output#1 if output > 0.5 else -1
logistic_l2 = logistic(np.dot(outputs_l1, ol_weights))
output_l2 = 1 if logistic_l2 > 0.5 else -1
#back_prop
#deltas
delta_l2 = logistic_l2 * (1 - logistic_l2) * (actual - logistic_l2)
for j in range(4):
deltas_l1[j] = logistics_l1[j] * (1 - logistics_l1[j]) * ol_weights[j] * delta_l2
#weight update
for i in range(5):
ol_weights[i] = ol_weights[i] + lr * delta_l2 * logistics_l1[i]
for j in range(4):
for i in range(5):
hl_weights[j][i] = hl_weights[j][i] + lr * deltas_l1[j] * curr_input[i]
if abs(actual - logistic_l2) > .05 : aNumNotWithin5Percent = True
summation += abs(actual - logistic_l2)
if iterations % 1000 == 0: print(summation)
notAllNumsWithin5Percent = aNumNotWithin5Percent
print('epochs for learning rate of ' + str(lr) + ': ' + str(epochs))
оно в конечном итоге сходится для скорости обучения .5, но если я перейду кболее низкая скорость обучения (которая требуется для выполнения задания) не сходится.