Как я могу применить обратное распространение при уклоне?
Это часть моего кода, написанного Python, многослойной нейронной сетью. Эта модель хорошо работает без смещения. Тем не менее, многие люди сказали, что модель NN должна иметь смещение. Я пытаюсь обновить мою модель, добавив смещение и обновив обратное распространение ошибки с помощью смещения. Как видите, я добавил весовую инициализацию смещения (** **). Тем не менее, я понятия не имею, как я могу сделать распространение ошибки обратно, когда я рассмотрел смещение. У вас есть представление об этой проблеме? Подводя итог моим вопросам. 1. Как я могу рассчитать ошибку смещения?
hidden_errors2 = numpy.dot(self.who.T, output_errors)
hidden_errors = numpy.dot(self.whh2.T, hidden_errors2)
Как я могу обновить вес смещения?
self.who + = self.lrnumpy.dot ((output_errors final_outputs * (1.0-final_outputs)), numpy.transpose (hidden_outputs2)) self.whh2 + = self.lr * numpy.dot ((hidden_errors2 * hidden_outputs2 * (1.0 -hidden_outputs2)), numpy.transpose (hidden_outputs)) self.wih + = self.lrnumpy.dot ((hidden_errors hidden_outputs * (1.0-hidden_outputs)), numpy.transpose (входные данные))
Это часть кода NN.
================================================== ==============================
класс nn: def init(self, входные узлы, hiddennodes, hiddennodes2, выходные узлы, скорость обучения, biasinput, biashidden, biashidden2): self.inodes = inputnodes self.hnodes = скрытые узлы self.hnodes2 = hiddennodes2 self.onodes = outputnodes
**self.binodes = biasinput
self.bhnodes = biashidden
self.bhnodes2 = biashidden2**
self.wih = numpy.random.normal(0.0, pow(self.hnodes, -0.5), (self.hnodes, self.inodes))
self.whh2 = numpy.random.normal(0.0, pow(self.hnodes2, -0.5), (self.hnodes2, self.hnodes))
self.who = numpy.random.normal(0.0, pow(self.onodes, -0.5), (self.onodes, self.hnodes2))
**self.bwih = numpy.random.normal(0.0, pow(self.hnodes, -0.5), (self.hnodes, self.binodes))
self.bwhh2 = numpy.random.normal(0.0, pow(self.hnodes2, -0.5), (self.hnodes2, self.bhnodes))
self.bwho = numpy.random.normal(0.0, pow(self.onodes, -0.5), (self.onodes, self.bhnodes2))**
self.lr = learningrate
self.activation_function = lambda x: scipy.special.expit(x)
pass
def train(self, inputs_list, targets_list):
inputs = numpy.array(inputs_list, ndmin=2).T
targets = numpy.array(targets_list, ndmin=2).T
hidden_inputs = numpy.dot(self.wih, inputs)+self.bwih
hidden_outputs = self.activation_function(hidden_inputs)
hidden_inputs2 = numpy.dot(self.whh2, hidden_outputs)+self.bwhh2
hidden_outputs2 = self.activation_function(hidden_inputs2)
final_inputs = numpy.dot(self.who, hidden_outputs2)+self.bwho
final_outputs = self.activation_function(final_inputs)
output_errors = targets - final_outputs
hidden_errors2 = numpy.dot(self.who.T, output_errors)
hidden_errors = numpy.dot(self.whh2.T, hidden_errors2)
self.who += self.lr*numpy.dot((output_errors*final_outputs*(1.0-final_outputs)), numpy.transpose(hidden_outputs2))
self.whh2 += self.lr*numpy.dot((hidden_errors2*hidden_outputs2*(1.0-hidden_outputs2)), numpy.transpose(hidden_outputs))
self.wih += self.lr*numpy.dot((hidden_errors*hidden_outputs*(1.0-hidden_outputs)), numpy.transpose(inputs))
pass