Алгоритм обратного распространения python - PullRequest
0 голосов
/ 26 сентября 2019

Для класса 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, но если я перейду кболее низкая скорость обучения (которая требуется для выполнения задания) не сходится.

...