Почему моя нейронная сеть дает правильные результаты после обратного распространения, но не на новых входах? - PullRequest
0 голосов
/ 26 февраля 2020

Я пробовал свои силы в нейронных сетях, и ниже приведен простой пример, который использует сигмовидную функцию для вывода 1 (или числа, действительно близкого), если число нечетное, и 0, если число четное. После обучения нейронной сети вывод правильный. Когда вводятся новые значения, вывод равен нулю. Почему выходной ноль?

import numpy as np

inputs = np.array([9, 45, 62, 87, 88, 49]) 
outputs = np.array([1, 1, 0, 1, 0, 1]) # 1 for odd 0 for even
weights = np.random.random(()) # weights are initialized as random.
lr = 0.1 # learning rate

mw  = np.dot(inputs, weights)

def sigmoid(x, deriv=False):
  if deriv == True:
    return sigmoid(x) * (1 - sigmoid(x)) # derivative of sigmoid 
  else:
    return 1 / (1 + np.exp(-x))

z = sigmoid(mw)
print("Results before training: {}".format(z)) 
# Results before backpropagation with random value as weight


for x in range(20000): # training loop
  error = (z - outputs)
  adjustments = sigmoid(z, deriv=True) * error * inputs
  weights = weights - lr * adjustments 
# readjusting the weights to minimize error

# After the training loop with the readjusted weights

new_mw = (weights * inputs)  
new_z = sigmoid(new_mw) # sigmoid of new weights * input
print("New results after training:{}".format(new_z)) # -> [1, 1, 0, 1, 0, 1]

def think(x, weights):
    print("New situation: {}".format(x))
    xw = np.dot(x, weights)
    print("New results after thinking: {}".format(sigmoid(xw)))


x = np.array([2, 4, 6, 7, 17, 53]) #array of new test data


think(x, weights) # -> 0.0

1 Ответ

2 голосов
/ 27 февраля 2020

Невозможное решение

Нет никакого возможного веса (одиночного! По крайней мере, в вашем коде), который привел бы к тому, что ваша функция могла бы выводить 1 (или число ДЕЙСТВИТЕЛЬНО близко), если число нечетное, и 0, если число четное.

Возможно, что во время обучения он узнает отношение, которое он должен вывести близко к 1 для больших чисел и 0 для меньших чисел, поскольку это, вероятно, лучшее, что он может сделать с одним мультипликативом вес. Глядя на ваши тренировочные данные, может оказаться, что граница где-то около 50 или 60, что приведет к тому, что все ваши тестовые образцы будут равны 0, потому что они маленькие - я sh - но вы могли бы (и, возможно, должны!) Чтобы проиллюстрировать это, нарисуйте график для всех значений вашей изученной функции, скажем, от 1 до 100.

Стоит потратить некоторое время на размышления, почему вы считаете, (г), что некоторый вес в f(x) = sigmoid(x * [trainable weight]) приведет к функции, которая отличает четные числа от нечетных. Если это не очевидно, построение выученной функции может быть информативным.

...