首页 > 其他分享 >深度学习入门笔记

深度学习入门笔记

时间:2022-12-18 20:33:16浏览次数:37  
标签:return 函数 梯度 batch 笔记 深度 np def 入门

深度学习入门笔记

编程语言和库

  • Python 3.x

  • NumPy

  • Matplotlib

常用运算

Numpy

import numpy as np

x = np.array([1.0,2.0])
y = np.arange(0,6,0.1) #以0.1为单位,生成0到6的数据
print(x.shape,x.ndim,x.dtype)
X = np.array([[1.0,2.0],
              [3.0,4.0]])
x = x.flatten() #将x转换为一维数组
x[np.array([0,1])] #获取索引为0,1的元素
x < 2 #布尔类型的array数组
Z = X.reshape() #改变多维数组的形式
G = X.dot(y) #矩阵乘法 X,y满足前行乘后列一一对应
np.argmax(x) #取出数组中的最大值的索引,将获取被赋给参数x的数组中的最大值元素的索引
batch_mask = np.random.choice(train_size,batch_size) #得到一个包含被选数据的索引的数组 batch_size是选取个数 train_size是被选数组
grad = np.zeros_like(x) # 生成和x形状相同的数组
W = np.random.randn(2,3) # 用高斯分布进行初始化 随机

Matplotlib

Matplotlib 是用于绘制图形的库,使用Matplotlib可以轻松地绘制图形和实现数据的可视化。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.image import imread

x = np.arange(0,6,0.1)
y = np.sin(x)
plt.plot(x,y,linestyle='-',color='red',lable='sin')
plt.xlabel("x") #x轴标签
plt.ylabel("y") #y轴标签
plt.xlim(-1,7) #指定x轴的范围
plt.ylim(-0.1,1.1) #指定y轴的范围
plt.title('sin & cos') #标题
plt.legend()
img = imread('lena.png')
plt.imshow(img)
plt.show()

lambda表示法

Python中定义简单的函数

f = lambda w:net.loss(x,t)

# 等同于 f(W) W是伪参数
def f(W):
    return net.loss(x,t)

常见知识点

输入层 隐藏层 输出层

权重 偏重

激活函数(activation function)

  • 阶跃函数 线性的 折跃的
  • sigmoid函数 平滑的
  • ReLU(Rectified Linear Unit)函数 非常常用的
  • identity_function(x) 输出层激活函数

维度

第一个维度对应第0维

二维数组称为矩阵(matrix)

数组的横向排列称为行(row),纵向排列称为列(column)

矩阵的第0维是列方向,第1维是行方向 axis = 1

预处理(pre-processing) 对神经网络的输入数据进行某种既定的转换称为预处理

  • 正规化(normalization)

    把数据限定到某个范围内的处理称为正规化

批处理(batch processing)

批处理对计算机的运算大有利处,可以大幅缩短每张图像的处理时间

batch_size = 100 #批数量
accuracy_cnt = 0
for i in range(0,len(x),batch_size):
    x_batch = x[i:i+batch_size]
    y_batch = predict(network,x_batch)
    p = np.argmax(y_batch,axis=1)
    accuracy_cnt += np.sum(p == t[i:i+batch_size])
print("Accuracy:" + str(float(accracy_cnt) / len(x))    

深度学习

有时也称为端到端机器学习(end-to-end machine learning)

训练数据(监督数据)用来学习 寻找最优的参数

测试数据 评价模型的泛化能力

泛化能力 指处理未被观察过的数据的能力

拟合

  • 过拟合 只对某个数据集过度拟合的状态称为过拟合(over fitting)不在训练数据中的数字图像却无法被识别的现象
  • 低拟合

损失函数(loss function)

神经网络以某个指标为线索寻找最优权重参数 这个指标就是损失函数

  • 均方误差(mean squared error)

    最小结果就是最优解

  • 交叉熵误差(cross entropy error)

    交叉熵误差的值是由正确解标签所对应的输出结果决定的

one-hot表示法 将正确解标签表示为1,其他标签表示为0的表示法

mini-batch

让损失函数实现对所有训练数据计算,最后还要除于N进行正规化

从所有训练数据中随机选取一部分数据进行训练(称为mini-batch,小批量),然后对每个mini-batch进行学习

# mini-batch版交叉熵误差
def cross_entropy_error(y, t):
    if y.ndim == 1:
        t = t.reshape(1, t.size)
 		y = y.reshape(1, y.size)
    
	batch_size = y.shape[0]
 	return -np.sum(t * np.log(y + 1e-7)) / batch_size

梯度(参数的导数)

  • 导数是负的,通过使该权重参数向正方向改变,可以减少损失函数的值
  • 相反,通过使该权重参数向负方向改变,可以减少损失函数的值

数值微分

梯度法使用梯度的信息决定前进的方向 求导数确定单减方向

numerical_diff(f, x)

来源于数值微分的英文numerical differentiation

这个函数有两个参数,即“函数f”和“传给函数f的参数x”

舍入误差(rounding error)

指因省略小数的精细部分的数值(比如,小数点第8位以后的数值)而造成最终的计算结果上的误差

计算函数f在(x + h)和(x − h)之间的差分

因为这种计算方法以x为中心,计算它左右两边的差分,所以也称为中心差分(而(x + h)和x之间的差分称为前向差分)

def numerical_diff(f, x):
    h = 1e-4 # 0.0001
    return (f(x+h) - f(x-h)) / (2*h)

偏导数

我们把这里讨论的有多个变量的函数的导数称为偏导数

def function_2(x):
    """
    x0,x1:多变量
    f(x0,x1) = x0**2 + x1**2
    """
    return x[0]**2 + x[1]**2

梯度(多变量)

由全部变量的偏导数汇总而成的向量称为梯度(gradient)

def numerical_gradient(f, x):
    h = 1e-4 # 0.0001
    grad = np.zeros_like(x) # 生成和x形状相同的数组
    
    for idx in range(x.size):
        tmp_val = x[idx]
        # f(x+h)的计算
        x[idx] = tmp_val + h
        fxh1 = f(x)
        
        # f(x-h)的计算
        x[idx] = tmp_val - h
        fxh2 = f(x)
        
        grad[idx] = (fxh1 - fxh2) / (2*h)
        x[idx] = tmp_val # 还原值
    return grad

梯度法

在梯度法中,函数的取值从当前位置沿着梯度方向前进一定距离,然后在新的地方重新求梯度,再沿着新梯度方向前进, 如此反复,不断地沿梯度方向前进。像这样,通过不断地沿梯度方向前进, 逐渐减小函数值的过程就是梯度法(gradient method)

  • 梯度下降法(gradient descent method)

    寻找最小值的梯度法

  • 梯度上升法(gradient ascent method)

    寻找最大值的梯度法

学习率

超参数

超参数需要尝试多个值,以便找到一种可以使学习顺利 进行的设定

梯度法的数学公式

η表示更新量,在神经网络的学习中,称为学习率(learning rate)。学习率决定在一次学习中,应该学习多少,以及在多大程度上更新参数。人工设置

  • 不能过大
  • 不能过小
def gradient_descent(f, init_x, lr=0.01, step_num=100):
    """
    f:function_2(x) 要进行优化的函数
    init_x:变量x数组 初始值
    lr:learning rate学习率
    step_num:梯度法的重复次数
    """
    x = init_x
    for i in range(step_num):
        grad = numerical_gradient(f, x)
        x -= lr * grad
    return x

神经网络的梯度

损失函数关于权重参数的梯度,即损失函数关于权重参数的导数

神经网络的学习

  • mini-batch

    从训练数据中随机选出一部分数据,这部分数据称为mini-batch。我们的目标是减小mini-batch的损失函数的值。

  • 计算梯度

    为了减小mini-batch的损失函数的值,需要求出各个权重参数的梯度。梯度表示损失函数的值减小最多的方向(这里的梯度是损失函数关于权重参数的)

  • 更新参数

    将权重参数沿梯度方向进行微小更新。

    超参数:学习率

  • 重复

    重复步骤1、步骤2、步骤3

    涉及到重复次数、epoch

常见函数

阶跃函数 隐藏层激活函数 线性函数 与神经网络的区别

def step_function(x):
    y = x > 0
    return y.astype(np.int)

sigmoid函数 隐藏层激活函数 非线性函数

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

ReLU函数 隐藏层激活函数 非线性函数

def relu(x):
    return np.maximum(0,x)

identity_function函数 输出层 激活函数 恒等函数 回归问题用该函数

def identity_function(x):
    return x

forward函数 从输入到输出方向的传递处理

def forward(network,x):
    W1, W2, W3 = network['W1'], network['W2'], network['W3']
 	b1, b2, b3 = network['b1'], network['b2'], network['b3']
 	a1 = np.dot(x, W1) + b1
    z1 = sigmoid(a1)
    a2 = np.dot(z1, W2) + b2
    z2 = sigmoid(a2)
    a3 = np.dot(z2, W3) + b3
    y = identity_function(a3)
    return y

predict函数 进行推理

def forward(network,x):
    W1, W2, W3 = network['W1'], network['W2'], network['W3']
 	b1, b2, b3 = network['b1'], network['b2'], network['b3']
 	a1 = np.dot(x, W1) + b1
    z1 = sigmoid(a1)
    a2 = np.dot(z1, W2) + b2
    z2 = sigmoid(a2)
    a3 = np.dot(z2, W3) + b3
    y = softmax(a3)
    return y

softmax函数 输出总和为1是softmax函数的一个重要特性 输出可以解释为“概率” 输出层 激活函数 分类问题用

不改变原来元素之间的大小关系 只是让数控制在0 ~ 1之间 总和为 1 能够视为概率

def softmax(a):
	c = np.max(a)
	exp_a = np.exp(a - c) # 溢出对策
	sum_exp_a = np.sum(exp_a)
	y = exp_a / sum_exp_a
	return y

均方误差(mean squared error)损失函数

def mean_squared_error(y,t):
    """
    y:softmax函数的输出
    t:监督数据
    """
    return 0.5 * np.sum((y-t)**2)

交叉熵误差(cross entropy error)损失函数

def cross_entropy_error(y, t):
    """
    delta:预处理 防止溢出
    y:softmax函数的输出 输出越大 交叉熵误差越小 为1时,误差为0
    """
    delta = 1e-7
    return -np.sum(t * np.log(y + delta))

标签:return,函数,梯度,batch,笔记,深度,np,def,入门
From: https://www.cnblogs.com/libuqiong/p/16990872.html

相关文章

  • ERP 学习笔记 - 生产模块
    生产模块蓝图简介      R/3PP生产计划系统是一个综合性的企业资源计划系统,包括制造执行系统的全部功能。它完整的集成各种应用领域所有业务功能,支持客户订单快速处......
  • python2项目打包rpm笔记
    python2项目打包成rpm包项目目录结构和说明#其中demo的是项目的根目录#pkg是代码逻辑目录#config是配置文件目录#main.py是项目的开始目录#Makefile是打包文件......
  • Python-核心编程-学习笔记
    >下划线标示符_xxx不用'frommoduleimport*'导入__xxx___系统定义名字__xxx类中的私有变量名>模块结构和布局(1)起始行(Unix)(2)模块......
  • Git入门教程(转载)
    考虑到CVS的一些局限性,最近和同事在公司推行Git。   其实,如果推行SVN的化,可能推行的难度会降低很多。不过lark说既然推行一个新的版本管理工具,总要花费一定的时间进......
  • 《MongoDB大数据处理权威指南》读书笔记
    我们总是喜欢拿“顺其自然”来敷衍人生道路上的荆棘坎坷,却很少承认,真正的顺其自然,其实是竭尽所能之后的不强求,而非两手一摊的不作为。--知乎  2020.08.1 mongoDB......
  • 《鸟哥的Linux私房菜-基础学习篇》读书笔记
      写在前面嗯,来这边实训,青软的孔老师给装了一个有Linux系统的虚拟机,讲了一些Linux的常识,决定去看这本书,了解一些Linux的知识 .加油生活^_^,嗯,希望以后的生活不会枯燥......
  • Git应用开发详解之Git入门指引
    Git简史官方网站:https://git-scm.com/​​Linux内核一开始使用BitKeeper来管理和维护代码。2005年,BitKeeper不再免费使用,Linux开源社区需要一套自己的版本控......
  • 【Dubbo】学习笔记
    (154条消息)Dubbo入门介绍及学习笔记总结_情話微甜的博客-CSDN博客_dubbobitlist 文章目录分布式简要说明应用架构及发展演变Dubbo和SpringCloud对比发展演变RPC简介D......
  • Git应用开发详解之Git入门指引
    Git简史官方网站:https://git-scm.com/​​Linux内核一开始使用BitKeeper来管理和维护代码。2005年,BitKeeper不再免费使用,Linux开源社区需要一套自己的版本控......
  • Git应用开发详解之Git入门指引
    Git简史官方网站:https://git-scm.com/​​Linux内核一开始使用BitKeeper来管理和维护代码。2005年,BitKeeper不再免费使用,Linux开源社区需要一套自己的版本控......