卷积神经网络基础(七)

#王者杯·14天创作挑战营·第1期#

7.3 误差反向传播法的梯度确认

我们现在学习了两种求梯度的方法,一种是基于数值微分的方法,另一种是解析性地求解数学式的方法。后者通过使用误差反向传播法,即使存在大量参数,也可以高效计算梯度。之后我们就使用误差反向传播法而不再通过数值微分进行求解。

那么,数值微分存在的意义是什么呢?

实际上,我们在缺人误差反向传播法的实现是否正确时就会用到数值微分。因为其实现较为简单,而且一般情况下不会出现错误。误差反向传播则计算复杂,很容易出错,确认二者计算的结果是否一致的操作称为 “梯度确认”。其代码实现如下:

import sys,os
sys.path.append(os.pardir)
import numpy as np
from dataset.mnist import load_mnist
from two_layer_net import TwoLayerNet

#读入数据
(x_train, t_train),(x_test, t_test) = \load_mnist(normalize=True, one_hot_label = True)
network = TwoLayerNet(input_size = 784, hidden_size = 50, out_size = 10)
x_batch = x_train[:3]
t_batch = t_train[:3]

grad_numerical = network.numerical_gradient(x_batch, t_batch)
grad_backprop = network.gradient(x_batch, t_batch)

#求各个权重的绝对误差的平均值
for key in grad_numerical.keys():
    diff = np.average(np.abs(grad_backprop[key] - grad_numerical[key]))
    print(key + ":" + str(diff))

最初 我们读入mnist数据集,使用其中的一部分,确认数值微分求出的梯度和误差反向传播法求出的梯度的误差。误差的计算方法是求各个权重参数中对应元素的差的绝对值,并求其平均值。运行上面的代码后,会输出下面的结果。

b1: 9.70418809871e -13

w2: 8.41139039497e -13

b2: 1.1945999745e -10

w1: 2.223246644e -13

从结果可以看出, 数值微分和误差反向传播法的梯度误差很小,第一层只有9.7e-13,这样我们就知道误差反向传播法求出的梯度是正确的,实现无误。

一般来说,数值微分和误差反向传播法的梯度误差不会等于0,因为计算机计算精度有限(通常是32位),实现正确的话这个误差值一般是一个很小很小的数,无线接近于0,但不会到0.如果这个值很大,则说明误差反向传播法的实现存在错误。

7.4 使用误差反向传播法的学习

接下来,我们再看一下使用误差反向传播法的神经网络学习。和之前的实现相比,不同之处仅在于使用误差反向传播法求梯度这一个地方。这里只展示代码:

import sys, os
sys.path.append(os.pardir)
import numpy as np
from dataset.mnist import load_mnist 
from two_layer_net import TwoLayerNet

# 读入数据
(x_train, t_train), (x_test,t_test) = \  load_mnist(normalize=True, one_hot_label=True)

network = TwoLayerNet(input_size = 784, hiddent_size=59, output_size = 10)

iters_num = 10000
train_size = x_train.shape[0]
batch_size = 100
learning_rate = 0.1
train_loss_list = []
train_acc_list = []
test_acc_list = []

iter_per_epoch = max(train_size / batch_size, 1)

for i in range(iters_num):
    batch_mask = np.random.choice(train_size, batch_size)
    x_batch = x_train[batch_mask]
    t_batch = t_train[bacth_mask]

    # 通过误差反向传播法求梯度
    grad = network.gradient(x_batch, t_batch)

    # 更新
    for key in ('W1','b1','W2','b2'):
        network.params[key] -= learning_rate * grad[key]    

    loss = network.loss(x_batch, t_batch)
    train_loss_list.append(loss)

    if i % iter_per_epoch == 0:
        train_acc = network.accuracy(x_train, t_train)
        test_acc = network.accuracy(x_test, t_test)
        train_acc_list.append(train_acc)
        test_acc_list.append(test_acc)
        print(train_acc, test_acc)
        

在本章节中,我们将计算过程可视化,称为计算图,并使用计算图介绍了神经网络中的误差反向传播法,以层为单位实现了神经网络中的处理。我们学过的层有ReLU、Softmax-with-Loss层、Affine层、Softmax层等等,这些层都实现了forward和backward方法,将数据进行正向传播和反向传播,高效计算权重参数的梯度。通过层进行模块化,神经网络可以自由地组装层,构建不同的神经网络。

本章节所学内容可以总结如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值