enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

函数实现

对于一个函数f(x0,x1)=x0的平方+x1的平方
偏导数可以这样实现:

def function_2(x):return x[0]**2 + x[1]**2#或者return np.sum(x**2)+

梯度可以这样实现:


def _numerical_gradient_no_batch(f, x):h = 1e-4 # 0.0001grad = np.zeros_like(x)for idx in range(x.size):tmp_val = x[idx]x[idx] = float(tmp_val) + hfxh1 = f(x) # f(x+h)x[idx] = tmp_val - h fxh2 = f(x) # f(x-h)grad[idx] = (fxh1 - fxh2) / (2*h)x[idx] = tmp_val # 还原值return grad

def numerical_gradient(f, X):参数f为函数,x为NumPy数组,该函数对NumPy数组X的各个元素求数值微分
现在用它来求(3,4)处的梯度:

numerical_gradient(function_2,np.array([3.0,4.0])

梯度指示的方向是各点处函数值减小最多的方向。

梯度法

机器学习主要任务是在学习时寻找最优参数,神经网也必须在学习时找到最优参数(权重和偏置)这里的最优参数是损失函数取最小值时的函数,通过巧妙地使用梯度来寻找函数最小值的方法就是梯度法。
函数的极小值最小值以及被称为鞍点的地方梯度为0.
通过不断沿着梯度方向前进,逐渐减小函数值过程就是梯度法,寻找最小值的梯度法称为梯度下降法,寻找最大值的梯度法称为梯度上升法。一般,神经网络(深度学习)中,梯度法主要是梯度下降法。

python实现梯度下降法:

import numpy as np
import matplotlib.pylab as pltdef _numerical_gradient_no_batch(f, x):h = 1e-4  # 0.0001grad = np.zeros_like(x)for idx in range(x.size):tmp_val = x[idx]x[idx] = float(tmp_val) + hfxh1 = f(x)  # f(x+h)x[idx] = tmp_val - hfxh2 = f(x)  # f(x-h)grad[idx] = (fxh1 - fxh2) / (2 * h)x[idx] = tmp_val  # 还原值return graddef numerical_gradient(f, X):if X.ndim == 1: #ndim返回的是数组的维度,返回的只有一个数,该数即表示数组的维度。return _numerical_gradient_no_batch(f, X)else:grad = np.zeros_like(X)for idx, x in enumerate(X):grad[idx] = _numerical_gradient_no_batch(f, x)return graddef gradient_descent(f, init_x, lr=0.01, step_num=100):x = init_xx_history = []for i in range(step_num):x_history.append( x.copy() )grad = numerical_gradient(f, x)x -= lr * gradreturn x, np.array(x_history)def function_2(x):return x[0]**2 + x[1]**2init_x = np.array([-3.0, 4.0])lr = 0.1
step_num = 20
x, x_history = gradient_descent(function_2, init_x, lr=lr, step_num=step_num)plt.plot( [-5, 5], [0,0], '--b')
plt.plot( [0,0], [-5, 5], '--b')
plt.plot(x_history[:,0], x_history[:,1], 'o')plt.xlim(-3.5, 3.5)
plt.ylim(-4.5, 4.5)
plt.xlabel("X0")
plt.ylabel("X1")
plt.show()


init_x = np.array([-3.0, 4.0]) :设置初始值为(-3,4) 最终寻找的结果很接近0
def gradient_descent(f, init_x, lr=0.01, step_num=100):
第二个参数是初始值,第三个参数是学习率,第四个是梯度法的重复次数,使用这个函数求函数的极小值,顺利的话还可以求最小值
其中lr过小或者过大都会无法得到好的结果
当lr为10:
lr
当lr为1e-8:

像学习率这样的参数成为超参数。相对于神经网络的权重参数是通过训练数据和学习算法自动获得的,学习率这样的超参数则是**人工设定的,**一般超参数需要尝试多个值,以便找到一种可以使学习顺利进行的设定。

神经网络的梯度

这里的梯度是指损失函数关于权重参数的梯度.
神经网络的学习的实现使用的是前面介绍过的mini-batch学习,即从训练数据中随机选择一部分数据(称为mini-batch),再以这些mini-batch为对象,使用梯度法更新参数的过程
common.functions.py:

import numpy as npdef identity_function(x):return xdef step_function(x):return np.array(x > 0, dtype=np.int)def sigmoid(x):return 1 / (1 + np.exp(-x))    def sigmoid_grad(x):return (1.0 - sigmoid(x)) * sigmoid(x)def relu(x):return np.maximum(0, x)def relu_grad(x):grad = np.zeros(x)grad[x>=0] = 1return graddef softmax(x):if x.ndim == 2:x = x.Tx = x - np.max(x, axis=0)y = np.exp(x) / np.sum(np.exp(x), axis=0)return y.T x = x - np.max(x) # 溢出对策return np.exp(x) / np.sum(np.exp(x))def mean_squared_error(y, t):return 0.5 * np.sum((y-t)**2)def cross_entropy_error(y, t):if y.ndim == 1:t = t.reshape(1, t.size)y = y.reshape(1, y.size)# 监督数据是one-hot-vector的情况下,转换为正确解标签的索引if t.size == y.size:t = t.argmax(axis=1)batch_size = y.shape[0]return -np.sum(np.log(y[np.arange(batch_size), t] + 1e-7)) / batch_sizedef softmax_loss(X, t):y = softmax(X)return cross_entropy_error(y, t)

common.gradient.py:

import numpy as npdef _numerical_gradient_1d(f, x):h = 1e-4 # 0.0001grad = np.zeros_like(x)for idx in range(x.size):tmp_val = x[idx]x[idx] = float(tmp_val) + hfxh1 = f(x) # f(x+h)x[idx] = tmp_val - h fxh2 = f(x) # f(x-h)grad[idx] = (fxh1 - fxh2) / (2*h)x[idx] = tmp_val # 还原值return graddef numerical_gradient_2d(f, X):if X.ndim == 1:return _numerical_gradient_1d(f, X)else:grad = np.zeros_like(X)for idx, x in enumerate(X):grad[idx] = _numerical_gradient_1d(f, x)return graddef numerical_gradient(f, x):h = 1e-4 # 0.0001grad = np.zeros_like(x)it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])while not it.finished:idx = it.multi_indextmp_val = x[idx]x[idx] = float(tmp_val) + hfxh1 = f(x) # f(x+h)x[idx] = tmp_val - h fxh2 = f(x) # f(x-h)grad[idx] = (fxh1 - fxh2) / (2*h)x[idx] = tmp_val # 还原值it.iternext()   return grad

enumerate函数:

list(enumerate(seasons))
[(0, ‘Spring’), (1, ‘Summer’), (2, ‘Fall’), (3, ‘Winter’)]

实现一个二层神经网络的类:


from common.functions import *
from common.gradient import numerical_gradientclass 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): #进行识别(推理) 参数X是图像数据W1, W2 = self.params['W1'], self.params['W2']b1, b2 = self.params['b1'], self.params['b2']a1 = np.dot(x, W1) + b1z1 = sigmoid(a1)a2 = np.dot(z1, W2) + b2y = softmax(a2)return y# x:输入数据, t:监督数据def loss(self, x, t): #计算损失函数的值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 gradsdef gradient(self, x, t):#计算权重参数的梯度 numerical_gradient的高速版 W1, W2 = self.params['W1'], self.params['W2']b1, b2 = self.params['b1'], self.params['b2']grads = {}batch_num = x.shape[0]# forwarda1 = np.dot(x, W1) + b1z1 = sigmoid(a1)a2 = np.dot(z1, W2) + b2y = softmax(a2)# backwarddy = (y - t) / batch_numgrads['W2'] = np.dot(z1.T, dy)grads['b2'] = np.sum(dy, axis=0)da1 = np.dot(dy, W2.T)dz1 = sigmoid_grad(a1) * da1grads['W1'] = np.dot(x.T, dz1)grads['b1'] = np.sum(dz1, axis=0)return grads

params[‘W1’]:第一层的权重
params[‘b1’] 第一层的偏置
grads :保存梯度的字典型变量(numerical_gradient的返回值)

笔记2深度学习 梯度和梯度法相关推荐

  1. 深度学习入门之PyTorch学习笔记:深度学习介绍

    深度学习入门之PyTorch学习笔记:深度学习介绍 绪论 1 深度学习介绍 1.1 人工智能 1.2 数据挖掘.机器学习.深度学习 1.2.1 数据挖掘 1.2.2 机器学习 1.2.3 深度学习 第 ...

  2. ScalersTalk 机器学习小组第 21 周学习笔记(深度学习-10)

    ScalersTalk 机器学习小组第 21 周学习笔记(深度学习-10) Scalers点评:机器学习小组是成长会的内部小组,这是成长会机器学习小组第21周学习笔记,也是深度学习第10次的复盘笔记 ...

  3. 学习笔记:深度学习(3)——卷积神经网络(CNN)理论篇

    学习时间:2022.04.10~2022.04.12 文章目录 3. 卷积神经网络CNN 3.1 卷积神经网络的概念 3.1.1 什么是CNN? 3.1.2 为什么要用CNN? 3.1.3 人类的视觉 ...

  4. 读书笔记:深度学习进阶-自然语言处理(俗称鱼书二)

    文章目录 前言 一.神经网络的复习 二.自然语言和单词的分布式表示 2.1什么是自然语言处理 2.2同义词词典 2.3基于计数的方法 2.3.1基于python的语料库的预处理 2.3.2单词的分布式 ...

  5. 学习笔记:深度学习(6)——基于深度学习的语言模型

    学习时间:2022.04.22~2022.04.25 文章目录 5. 基于深度学习的语言模型 5.1 从NNLM到词嵌入 5.1.1 神经网络语言模型 NNLM 5.1.2 基于循环神经网络的语言模型 ...

  6. 黄海广博士的机器学习个人笔记及深度学习笔记

    想要下载黄海广博士的机器学习个人笔记及深度学习笔记的请复制下面链接 https://download.csdn.net/download/wgllovemother/10447758 备注:有想下载  ...

  7. 【长篇博文】Docker学习笔记与深度学习环境的搭建和部署(二)

    长篇博文记录学习流程不容易,请关注.转发.点赞.评论,谢谢! 上一篇文章:Docker学习笔记与深度学习环境的搭建和部署(一) 文章末尾附加nvidia455.23.cuda11.1.cudnn8.0 ...

  8. 22张精炼图笔记,深度学习专项学习必备

    作者 | DL&CV_study9 编辑 | Elle 来源 | CSDN 博客 本文为人工智能学习笔记记录. [深度学习基础篇] 一.深度学习基本概念 监督学习:所有输入数据都有确定的对应输 ...

  9. 吴恩达深度学习代码_吴恩达深度学习笔记(58)-深度学习框架Tensorflow

    TensorFlow 有很多很棒的深度学习编程框架,其中一个是TensorFlow,很期待帮助你开始学习使用TensorFlow,我想在这个笔记中向你展示TensorFlow程序的基本结构,然后让你自 ...

最新文章

  1. 生信分析-TBtools绘制热图
  2. ifstream java_C ifstream将读取一些值然后停止
  3. $(document).ready、body.Onload()和 $(window).load的区别
  4. 阿里大数据分析与应用(part2)--大数据分析的流程与常用技术
  5. ux的重要性_颜色在UX中的重要性
  6. 喜马拉雅 xm文件转m4a_喜马拉雅电台、课程语音如何转成文字?
  7. java gpio_单片机基础——使用GPIO输出点亮一个LED灯
  8. 电路制版工作笔记001---印刷电路板的制作过程
  9. 微信小程序之 Classify(商品属性分类)
  10. 在centos上运行neural_artistic_style 风格转换
  11. openSUSE 跨版本升级
  12. 项目管理甘特图模板_甘特图简易制作流程
  13. teigha开发从入门到精通(3)-- 编译drawings sdk示例
  14. Ubuntu安装mysql-8.0.20-linux-glibc2.12-i686.tar.xz 步骤
  15. 在web页面打开pdf文件并打印
  16. 硬盘MBR格式转换GPT,简单方法,你会吗?
  17. STATA进行回归分析时,自变量是分类变量,如何设置哑变量?
  18. 高并发下restTemplate的错误分析
  19. 局域网即时通讯软件_无线局域网中,安卓手机和电脑的资源如何实现互传互访?...
  20. 强化学习经典应用环境-Atari 2600游戏合集

热门文章

  1. (转载)GET和POST两种基本请求方法的区别
  2. python编码注释和平台注释_python注释是什么意思
  3. 加到service中无效_Dataway让SpringBoot不需要Controller、Service、DAO、Mapper
  4. 【小白学习PyTorch教程】六、基于CIFAR-10 数据集,使用PyTorch 从头开始​​构建图像分类模型
  5. 【机器学习算法专题(蓄力计划)】十二、机器学习中KNN算法
  6. sklearn线性回归
  7. 四、CSS知识总结(下篇)
  8. java进阶之路学习笔记
  9. GPLinker:基于GlobalPointer的事件联合抽取
  10. 泛化性乱弹:从随机噪声、梯度惩罚到虚拟对抗训练