Я изучал нейронные сети у Майкла Нильсена http://neuralnetworksanddeeplearning.com/chap1.html.
В разделе ниже, чтобы обновить веса и смещения
def update_mini_batch(self, mini_batch, eta):
nabla_b = [np.zeros(b.shape) for b in self.biases]
nabla_w = [np.zeros(w.shape) for w in self.weights]
for x, y in mini_batch:
delta_nabla_b, delta_nabla_w = self.backprop(x, y)
#Zero vectors
nabla_b = [nb+dnb for nb, dnb in zip(nabla_b, delta_nabla_b)]
nabla_w = [nw+dnw for nw, dnw in zip(nabla_w, delta_nabla_w)]
self.weights = [w-(eta/len(mini_batch))*nw
for w, nw in zip(self.weights, nabla_w)]
self.biases = [b-(eta/len(mini_batch))*nb
for b, nb in zip(self.biases, nabla_b)]
def SGD(self, training_data, epochs, mini_batch_size, eta,
test_data=None):
if test_data: n_test = len(test_data)
n = len(training_data)
for j in xrange(epochs):
random.shuffle(training_data)
mini_batches = [
training_data[k:k+mini_batch_size]
for k in xrange(0, n, mini_batch_size)]
####
for mini_batch in mini_batches:
self.update_mini_batch(mini_batch, eta)
if test_data:
print "Epoch {0}: {1} / {2}".format(
j, self.evaluate(test_data), n_test)
else:
print "Epoch {0} complete".format(j)
зачем вводить нулевые векторы набла_б и nabla_w? когда они просто добавляются в dnb и dnw, которые сами по себе являются массивами numpy. Разве 0 + что-то = что-то. Зачем здесь нулевой вектор для единственного обучающего примера?
В качестве теста я удалил нулевой вектор и получил dnb и dnw отдельно, и мне не удалось увидеть какой-либо существенной разницы в обучении.
Спасибо.
Да, вы правы 0 + something = something
, но во второй итерации он будет
something +something_else = value
Итак, это происходит в следующем коде for x, y in mini_batch:
Здесь для первого minibatch
nabla_w
, nabla_b
будет 0, но для второй и последующих итераций он будет иметь некоторое значение.
давайте рассмотрим следующий код
nabla_b = [nb+dnb for nb, dnb in zip(nabla_b, delta_nabla_b)]
nabla_w = [nw+dnw for nw, dnw in zip(nabla_w, delta_nabla_w)]
в первой итерации и nabla_b
, и nabla_w
равны нулю.
но в этой итерации они обновляются из-за nb+dnb
, и поэтому nabla_b и nabla_w больше не являются просто векторами с нулями. Итак, во второй итерации nabla_b больше не является нулевым вектором
извините?, вы сомневались в использовании нулевых векторов, верно?
Теперь я понимаю, что в соответствии с тем, что мини-пакет выглядит как "" "[[V1, 3], [V2, 4], [V3, 1]]" "" .. как цикл for работает в этом? для х, у? Разве это не имело бы большего смысла в чем-то вроде [V1, 3] и т. д.?
мини-пакет будет именно таким, как вы сказали, но он находится в цикле for, поэтому на каждой итерации мы будем получать одно его значение. в случае первой итерации это будет [V1,3]. но там он был сохранен как x, y в mini_batch, что сделает x = v1 и y = 3 в первой итерации. значения просто распаковать.
Блин, я только что понял. Я чувствую себя очень глупо. Большое спасибо !
Большой. Это очень хорошее руководство для начала. Сделай это
Я понимаю, что здесь x, y = [вектор, значение] и update_mini_batch вызывается, как для mini_batch в mini_batches: self.update_mini_batch (mini_batch) Для каждого примера обучения он инициирует нулевой вектор.