Как я могу установить смещение и изменить функцию Sigmoid на ReLU в ANN? - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь создать модель прогнозирования данных через искусственные нейронные сети.Следующий код является частью кода ANN на основе Python, созданного во многих книгах.Кроме того, коэффициент ошибок между прогнозируемым значением и фактическим значением не достигает уровня ниже 19%.Я попытался увеличить количество скрытых слоев, но это не сильно повлияло на частоту появления ошибок.Я думаю, что это, вероятно, ограничение функции сигмоида, а не смещение.Я месяц осматривался и выяснил, как построить ReLU и Bias, но не смог найти диапазон Bias и ReLU.

Q1 = Как мне преобразовать Sigmoid в ReLU и Q2 = как добавить Biasк моему коду?

Q3 = Кроме того, если я изменю сигмоид на ReLU, должен ли я сделать свой набор данных диапазоном 0,0 ~ 1,0?Это потому, что функция Sigmoid принимает диапазон данных 0,0 ~ 1,0, но я не знаю, какой диапазон позволяет ReLU.

Извините, чтобы задать элементарный вопрос.

class neuralNetwork:
# initialize the neural network
def __init__(self, input_nodes, hidden_nodes, output_nodes, learning_rate):

#
    self.inodes = input_nodes
    self.hnodes = hidden_nodes
    self.onodes = output_nodes

    # link weight matrices, wih and who
    self.wih = numpy.random.normal(0.0, pow(self.hnodes, -0.5), (self.hnodes, self.inodes))
    self.who = numpy.random.normal(0.0, pow(self.onodes, -0.5), (self.onodes, self.hnodes))

    # learning rate
    self.lr = learning_rate

    # activation function is the sigmoid function
    self.activation_function = lambda x: scipy.special.expit(x)

    pass

# train the neural network
def train(self, inputs_list, targets_list):
    # convert inputs list to 2d array
    inputs = numpy.array(inputs_list, ndmin=2).T
    targets = numpy.array(targets_list, ndmin=2).T

    # calculate signals into hidden layer
    hidden_inputs = numpy.dot(self.wih, inputs)
    # calculate the signals emerging from hidden layer
    hidden_outputs = self.activation_function(hidden_inputs)

    # calculate signals into final output layer
    final_inputs = numpy.dot(self.who, hidden_outputs)
    # calculate the signals emerging from final output layer
    final_outputs = self.activation_function(final_inputs)

    # output layer error is the (target - actual)
    output_errors = targets - final_outputs
    # hidden layer error is the output_errors, split by weights, recombined at hidden nodes
    hidden_errors = numpy.dot(self.who.T, output_errors)

    # update the weights for the links between the hidden and output layers
    self.who += self.lr*numpy.dot((output_errors*final_outputs*(1.0-final_outputs)), numpy.transpose(hidden_outputs))
    # update the weights for the links between the input and output layers
    self.wih += self.lr*numpy.dot((hidden_errors*hidden_outputs*(1.0-hidden_outputs)), numpy.transpose(inputs))

    pass

# query the neural network
def query(self, inputs_list) :

    inputs = numpy.array(inputs_list, ndmin=2).T

    # convert hidden list to 2d array
    hidden_inputs = numpy.dot(self.wih, inputs)
    # calculate signals into hidden layer
    hidden_outputs = self.activation_function(hidden_inputs)


    final_inputs = numpy.dot(self.who, hidden_outputs)
    final_outputs = self.activation_function(final_inputs)
    return final_outputs        
    pass

1 Ответ

0 голосов
/ 21 декабря 2018

Ваш вопрос слишком широкий, и в основе ReLU vs sigmoid лежит множество концепций.

Но вкратце:
Сигмоид Насыщать и убивать градиенты (посмотрите на Градиентный спуск ) Сигмоид не центрируется по нулю, поскольку выход сигмоида равен 0<output<1.Я вижу, что для сигмоида вы используете scipy, но для ReLU это просто.Relu определяется следующей функцией

f(x) = max(0,x)

Это означает, что если значение ввода больше нуля, возвращаемое значение, в противном случае возвращаем 0. И ReLU предпочтительнее для скрытых слоев и другие, как softmax для выходных слоев.

Я бы сказал, выглядят разные функции активации и зачем нам нужны функции активации в нейронной сети.Как сигмоид убивает градиенты и почему они медленно сходятся.

Q1 = Как мне преобразовать сигмоид в ReLU и Q2 = как добавить смещение в мой код?
просто напишите метод нана основе описанной выше функции ReLU и обновите следующую строку

self.activation_function = max(0,x) # instead of lambda x: scipy.special.expit(x)

Q3 = Кроме того, если я изменю сигмоид на ReLU, должен ли я установить диапазон набора данных в диапазоне 0,0 ~ 1,0?Это связано с тем, что функция Sigmoid принимает диапазон данных 0,0 ~ 1,0, но я не знаю, какой диапазон позволяет ReLU.

Ответ на этот вопрос зависит от вашей сети и ваших данных, но даВы нормализуете данные.И нет такого диапазона, в который вам нужно вносить данные. Потому что для ReLU: если input меньше нуля, он вернет 0, а если input => = 0, он вернет input.Так что нет такого диапазона, как в сигмовидной. Ответ на этот вопрос

Если вы хотите посмотреть, как работает ReLU и как его можно использовать, следующий подробный пример поможет, хотя эти примеры написаны с использованием framework (PyTorch) для построения сети и обучения..

...