点击上方,选择星标或置顶,每天给你送干货!
作者:云不见 链接:https://blog.csdn.net/Walk_OnTheRoad/article/details/107837003 编辑:王萌 澳门城市大学(深度学习冲鸭公众号) 此笔记是基于《深度学习入门》这本书的重点知识汇总。 接着 《深度学习入门:基于Python的理论与实现》学习笔记(1)继续学习笔记的记载。 目录: 梯度 神经网络的梯度 学习算法的实现步骤: mini-batch的实现(为了提高学习的效率!) 利用误差反向传播法求梯度(高速) 加法节点的反向传播 乘法节点的反向传播 log对数的反向传播 指数e的反向传播 激活函数层反向传播的实现 1、Relu层的反向传播 2、sigmoid函数的反向传播 Affine层的反向传播 3、Softmax-with-Loss层的反向传播 误差反向传播法的实现 使用误差反向传播法的神经网络的学习 本文重点知识点:阅读大概需要20分钟
跟随小博主,每天进步一丢丢
- 梯度
- 神经网络计算梯度的实现(利用数值微分)
- 学习算法的实现步骤
- 利用误差反向传播法求梯度(更高速)
- 激活函数层反向传播的实现
- 利用误差反向传播法实现两层神经网络的学习
- 寻找函数的最小值
- 通过数值微分计算梯度。梯度下降的地方,就是函数在变小的地方。直到梯度下降为0,这个函数的局部最小值也就找到啦。
def gradient_descent(f, init_x, lr=0.01, step_num=100): # step_num为更新次数
x = init_x
for i in range(step_num):
grad = numerical_gradient(f, x)
x -= lr * grad
return x
缺点: 但是通过数值微分计算梯度比较费时间,之后介绍的误差反向传播法会更高效。
神经网络的梯度 即求损失函数L关于权重参数的梯度
图 损失函数L关于权重参数w的数值微分法计算梯度
以下是利用数值微分求梯度,实现简单神经网络的代码:
import sys, os
sys.path.append(os.pardir)
import numpy as np
from common.functions import softmax, cross_entropy_error
from common.gradient import numerical_gradient
class simpleNet:
def __init__(self):
self.W = np.random.randn(2,3) # 用高斯分布进行初始化(正态分布)
def predict(self, x):
return np.dot(x, self.W)
def loss(self, x, t):
z = self.predict(x)
y = softmax(z)
loss = cross_entropy_error(y, t)
return loss
学习算法的实现步骤 也就是梯度下降法逐渐更新函数的过程
- 前提神经网络存在合适的权重和偏置,调整权重和偏置以便拟合训练数据的过程称为“学习”。
- 步骤1(mini-batch)从训练数据中随机选出一部分数据,这部分数据称为mini-batch。我们的目标是减小mini-batch的损失函数的值。
- 步骤2(计算梯度)为了减小mini-batch的损失函数的值,需要求出各个权重参数的梯度。梯度表示损失函数的值减小最多的方向。
- 步骤3(更新参数)将权重参数沿梯度方向进行微小更新。
- 步骤4(重复)重复步骤1、步骤2、步骤3。
import sys, os
sys.path.append(os.pardir)
from common.functions import *
from common.gradient import numerical_gradient
class TwoLayerNet:
def __init__(self, input_size, hidden_size, output_size,
weight_init_std=0.01):
# 1、初始化权重
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'] &#