基于Python的深度学习入门------梯度法神经网络学习

通过学习阅读图灵图书的《深度学习入门》,对梯度法的深度学习的个人理解如下:

神经网络的学习步骤:

步骤一.从训练数据中随机选出一部分数据,成为mini-batch。训练的目标就是减小mini-batch的损失函数的值;

步骤二.对损失函数求各个权重参数的偏导数,即梯度。梯度即表示损失函数的值减少最多的方向;

步骤三.将权重参数沿梯度方向进行微小更新;

步骤四.重复步骤1,2,3

 

结合上面的学习步骤,具体的任务如下:

准备:开始实例化神经网络类,确定开始设定的权重参数,使用高斯分布的随机数进行初始化;设置合适的学习率和循环次数

步骤一:选取mini-batch时,采用随机数选择;

步骤二:求梯度时,首先确定清楚是对损失函数求各个偏重参数的偏导数,损失函数loss(self, x, t)常用交叉熵误差cross_entropy_error(y, t),而交叉熵误差函数的参数为神经网络输出y和监督数据t;而y需要调用预测函数predict(self, x),预测函数主要实现神经元矩阵与权重函数矩阵的点乘加上偏置参数,隐藏层的激活函数为sigmoid()函数,输出层为softmax()函数。求梯度时的函数的参数为:损失函数,权重参数,输出权重参数的梯度;

2层神经网络的类如下

class TwoLayerNet:

    def __init__(self, input_size, hidden_size, output_size, weight_init_std=0.01):
        # 初始化权重
        self.params = {}
        self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size)
        self.params['b1'] = np.zeros(hidden_size)
        self.params['W2'] = weight_init_std * np.random.randn(hidden_size, output_size)
        self.params['b2'] = np.zeros(output_size)

    def predict(self, x):
        W1, W2 = self.params['W1'], self.params['W2']
        b1, b2 = self.params['b1'], self.params['b2']

        a1 = np.dot(x, W1) + b1
        z1 = sigmoid(a1)
        a2 = np.dot(z1, W2) + b2
        y = softmax(a2)

        return y

    # x:输入数据, t:监督数据
    def loss(self, x, t):
        y = self.predict(x)

        return cross_entropy_error(y, t)

    def accuracy(self, x, t):
        y = self.predict(x)
        y = np.argmax(y, axis=1)
        t = np.argmax(t, axis=1)

        accuracy = np.sum(y == t) / float(x.shape[0])
        return accuracy

    # x:输入数据, t:监督数据
    def numerical_gradient(self, x, t):
        loss_W = lambda W: self.loss(x, t)

        grads = {}
        grads['W1'] = numerical_gradient(loss_W, self.params['W1'])
        grads['b1'] = numerical_gradient(loss_W, self.params['b1'])
        grads['W2'] = numerical_gradient(loss_W, self.params['W2'])
        grads['b2'] = numerical_gradient(loss_W, self.params['b2'])

        return grads

步骤三:更新权重参数

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

步骤四:从第一步开始,重新随机选择mini-batch,应用上一轮更新后的权重参数,求梯度,再次更新。。。准备工作中设置了循环次数。

 

以上为个人学习理解,能力有限,错误之处欢迎各位朋友批评指正!一起学习!

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值