百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

深度学习中的NumPy基础(深度学习epoch越高越好吗)

ztj100 2024-11-11 15:14 13 浏览 0 评论

NumPy 或 Numeric Python 是一个开放源码的 Python 库,它使复杂的数值操作变得容易。与机器学习和深度学习应用工作涉及复杂的数字操作与大量的数据集。与纯 Python 实现相比,NumPy 使得实现这些操作相对简单和有效。


从核心上说,NumPy 实现了Python(n 维数组)数据结构,类似于常规的 Python 列表。大多数编程语言只有数组的概念。Python 实现了列表,它作为数组工作,但是有区别。


常规 Python 列表和 NumPy 的一个关键区别是,Python 列表可以包含各种数据类型。相反,NumPy 数组只能包含相同数据类型的对象。换句话说,数据结构是同构的。虽然这看起来似乎是一个负面因素,但它允许 NumPy 操作更快,因为它们在进行计算时可以避免转换和约束。


你为什么要关心 NumPy,为什么特别关心深度学习?


在本文中,我将介绍几个特定的用例,但是与其他 Python 数据结构相比,NumPy 最重要的特性之一是速度。比使用常规的 Python 列表数量级更快。由于 NumPy 函数是在 C 中实现的,除了使执行速度更快,还使 NumPy 能够分解大型作业并并行执行多个作业。深度学习涉及处理大型数据集,当处理大型数据集时,NumPy 数组是一种有效的技术。


创建 NumPy 数组


有几种不同的方法可以创建 NumPy 数组,一种简单的方法是使用 array()函数创建它们。

#import NumPy
import numpy as np

#create a NumPy array
a = np.array([1,2,3])

#check the shape of the array
a.shape

#get the dimensions 
a.dim

此外,您可以直接从标准的 Python 列表创建。Numpy 数组是智能的。如果将 Python 列表传递给 array()函数,它将自动执行操作并返回 Numpy 数组。您不需要首先显式地转换为 NumPy 数组。

#python List
my_list = [1,2,3,4,5]

#creating a NumPy array from a list
np.array(my_list)

还可以使用 Pandas 的函数.to_numpy()将 Pandas DataFrame 转换为 NumPy 数组

#import Pandas
import pandas as pd

#create a DataFrame
df = pd.DataFrame({"A":[1, 2],"B":[3, 4]})

#convert DataFrame to NumPy array
df.to_numpy()

需要注意的是,由于 NumPy 数组只能包含相同数据类型的元素。默认情况下,在转换 DataFrame 时,返回数组的 dtype 将是 DataFrame 中所有类型的公共 dtype。


NumPy Loves Math


NumPy 数组专门用于处理数学问题。这个库包含了一些数学辅助函数,这些函数可以让你在不需要自己快速写入的情况下完成这些计算。


比较流行的例子包括 sqrt()函数用于求平方根,log()函数用于计算 log,tanh()函数用于计算双曲正切,通常用于深层神经网络中的激活函数。


a = np.array([1,2,3])


#get the square root
np.sqrt(a)


#get log
np.log(a)


#find the tanh
np.tanh(a)

线性代数


NumPy 的 linalg 子模块中有几个内置的线性代数算法可供使用。


一个常用的线性代数函数是 norm() ,一个用来计算向量长度的函数,也称为向量范数或向量大小。在机器学习和深度学习应用中,向量范数作为一种规范化技术被用来解决过度填充问题。NumPy 的 linalg 子模块具有计算向量范数的 norm()函数。

a = np.array([1,2,3])


#getting a norm of the vector
np.linalg.norm(a)

在学习线性代数时,经常会遇到数学上的错误。有些数学运算是不允许的。处理这些错误的一个优雅的方法是使用 linalg.LinAlgError 异常处理,一个从 Python 的异常类派生的通用异常类。


例如,如果我们尝试对一个奇异的矩阵求逆,这个操作是不允许的,并抛出一个错误。

x=np.ones((2,2))


np.linalg.inv(x) #this will throw an error


#exception handling using LinAlgError
try:
    np.linalg.inv(x)
except np.linalg.LinAlgError:
    print("Linear Algebra Error")

这些线性代数函数可以计算多个矩阵的结果,如果它们堆放在同一个数组上。


广播


NumPy 进行算术计算的基本特征之一是通过广播。广播允许不同形状和大小的 NumPy 数组之间进行操作。


广播是通过比较数组的维度来工作的,广播的有效性主要有两个规则。


  • 维度相等,或者
  • 其中一个维度是1

  • 在 NumPy 中执行元素级操作(如向 np.array 添加标量)时,实际上是在进行广播。

    x = np.ones((2,2))
    y = np.ones((3,2,1))
    a = np.ones((2,3,3))
    
    
    x+y #Broadcasting will work; trailing dimensions match
    x+a #Broadcasting will fail; trailing dimensions do not match
    y = np.ones((3,2,1))

    NumPy 和 Matrices


    NumPy 的真正潜力来自与矩阵相关的工作。Numpy 支持各种易于使用的方法,用于执行标准矩阵操作,如点乘、转置、获得对角线等。


    特别是计算度量的点积矩阵乘法,是深度学习中的一项常见任务,尤其是在处理卷积神经网络时。NumPy 函数 dot()计算两个度量的点积。在 NumPy 的后续版本中,还可以使用@运算符计算点积。

    x = np.array([[1,2],[3,4]])
    y = np.array([[5,6],[7,8]])
    
    
    #dot product with dot()
    x.dot(y)
    
    
    #dot product with @
    x@y

    深度学习中接下来两个常用的矩阵运算是逆矩阵和转置矩阵。


    让我们先来看一下求逆。什么是求逆?一个数乘以它的倒数等于1。重要的是要记住,并不是所有的矩阵都有一个逆矩阵,在这种情况下,你会得到一个错误。可以使用 linalg.inv()函数得到矩阵的逆。

    x = np.array([[1, 2], [3, 4]])
    
    
    #getting the inverse
    np.linalg.inv(x)

    矩阵的转置是一个将矩阵翻转过其对角线的算子。也就是说,它切换矩阵的行和列索引。在 NumPy 中,您可以得到带有 T 的矩阵的转置。

    x = np.array([[1, 2], [3, 4]])
    
    
    #getting the transpose
    x.T

    在深度学习中,特征矢量在实现降维方法时非常有用,比如主成分分析方法(PCA)。


    可以使用 linalg.eignvals()函数计算向量或矩阵的特征值。

    x = np.array([[1, 2], [3, 4]])
    
    
    #getting the eigenvectors
    np.linalg.eigvals(x)

    在处理矩阵时,必须记住不要使用 NumPy 类中的矩阵函数,而是使用规则数组。


    改变形状


    在使用深度学习时,您经常会遇到需要更改数组或矩阵形状的情况。可以使用 reshape()函数重新定义 NumPy 数组的形状。该函数返回具有新形状的新 NumPy 数组。

    x = np.array([[1, 2], [3, 4]])
    
    #Reshape 2X2 to 4X1
    x.reshape(4,1)

    如果需要更改原始 NumPy 数组的形状,可以使用 resize()函数。它的工作方式类似于 reshape()函数,但是更改原始对象而不是创建新对象。

    x = np.array([[1, 2], [3, 4]]
    
    
    #Resize the original array 2X2 to 4X1
    x.resize(4,1)

    Flattening 是另一个标准的深度学习操作,用于将数据或输入传递到神经网络的不同层。NumPy 的 flatten()函数将展开一个 ndarray。

    x = np.array([[1, 2], [3, 4]]
    
    
    #flatten the array
    x.flatten()

    除了使用 flatten()之外,还可以使用 ravel()方法来做同样的事情。flatten()和 ravel()之间的区别是,ravel()可以直接与常规列表一起使用,并返回 NumPy 数组。

    x_list = [[1, 2],[3, 4]]
    
    
    #flatten a list
    np.ravel(x_list)

    改形的一种形式是向数组添加一个新维度。例如,您可以通过添加带有关键字的新维度 newaxis。

    
    y = np.array([1,2,3,4,5])
    
    #add a new dimension
    y[:,np.newaxis]

    另一种重塑 NumPy 数组的方法是使用函数拆分它。该函数接受并返回基于指定索引或部分的子数组。

    x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8])
    
    #split array into 3 sections
    np.split(x,3)

    用 NumPy 生成数据


    NumPy 为数值操作提供了一个强大的工具包; 然而,NumPy 也可以生成数据。


    单位矩阵是一个任意阶的正方形矩阵,其中1是主对角线,0是所有其他位置的数据。NumPy 函数创建指定顺序的单位矩阵。

    #generate a identity matrix 5
    np.identity(5)

    在深度学习中,你会遇到需要一个0 & 1矩阵的情况。NumPy 有方便创建该矩阵的函数 zeros()和 ones() ,您可以使用它们来生成全 0 或全 1 矩阵。

    #generate a 2X3 matrix of 0s
    np.zeros((2,3))
    
    
    #generate a 2X3 matrix of 1s
    np.ones((2,3))

    使用 NumPy 的 random.rand()函数,可以创建由随机数元素组成的指定顺序的数组。

    #generate a 2X3 matrix of random numbers
    np.random.rand(2,3)
    
    
    #generate a 2X3 matrix of random integers
    np.random.randint(2,3)

    注意,如果您想要随机整数,可以使用 random.randint()函数来获得一个带有随机整数的 NumPy 数组。


    上面讨论的数据生成方法可以与它们的 _like 方法一起使用,比如类似于zeros_like,ones_like 生成数组,它采用作为参数传递给函数的数组的形状。

    x = np.array([[1, 2],[3, 4]])
    
    
    #generate a matrix of 1s based on dimensions of x 
    np.ones_like(x)

    换句话说,当使用函数的 _like 时,我们不指定形状,而是传递一个现有的 NumPy 数组。生成的 NumPy 数组采用传递的数组的形状。


    总结性思考


    在这篇文章中,我介绍了所有开始深度学习所必要的 NumPy 知识。NumPy 的内容比这里介绍的要多,但是我们在这里介绍的内容应该足以开始在您的深度学习项目中使用 NumPy。当你开始深度学习项目的工作时,你会遇到需要你使用额外技术和学习更多的情况。

    相关推荐

    Vue 技术栈(全家桶)(vue technology)

    Vue技术栈(全家桶)尚硅谷前端研究院第1章:Vue核心Vue简介官网英文官网:https://vuejs.org/中文官网:https://cn.vuejs.org/...

    vue 基础- nextTick 的使用场景(vue的nexttick这个方法有什么用)

    前言《vue基础》系列是再次回炉vue记的笔记,除了官网那部分知识点外,还会加入自己的一些理解。(里面会有部分和官网相同的文案,有经验的同学择感兴趣的阅读)在开发时,是不是遇到过这样的场景,响应...

    vue3 组件初始化流程(vue组件初始化顺序)

    学习完成响应式系统后,咋们来看看vue3组件的初始化流程既然是看vue组件的初始化流程,咋们先来创建基本的代码,跑跑流程(在app.vue中写入以下内容,来跑流程)...

    vue3优雅的设置element-plus的table自动滚动到底部

    场景我是需要在table最后添加一行数据,然后把滚动条滚动到最后。查网上的解决方案都是读取html结构,暴力的去获取,虽能解决问题,但是不喜欢这种打补丁的解决方案,我想着官方应该有相关的定义,于是就去...

    Vue3为什么推荐使用ref而不是reactive

    为什么推荐使用ref而不是reactivereactive本身具有很大局限性导致使用过程需要额外注意,如果忽视这些问题将对开发造成不小的麻烦;ref更像是vue2时代optionapi的data的替...

    9、echarts 在 vue 中怎么引用?(必会)

    首先我们初始化一个vue项目,执行vueinitwebpackechart,接着我们进入初始化的项目下。安装echarts,npminstallecharts-S//或...

    无所不能,将 Vue 渲染到嵌入式液晶屏

    该文章转载自公众号@前端时刻,https://mp.weixin.qq.com/s/WDHW36zhfNFVFVv4jO2vrA前言...

    vue-element-admin 增删改查(五)(vue-element-admin怎么用)

    此篇幅比较长,涉及到的小知识点也比较多,一定要耐心看完,记住学东西没有耐心可不行!!!一、添加和修改注:添加和编辑用到了同一个组件,也就是此篇文章你能学会如何封装组件及引用组件;第二能学会async和...

    最全的 Vue 面试题+详解答案(vue面试题知识点大全)

    前言本文整理了...

    基于 vue3.0 桌面端朋友圈/登录验证+60s倒计时

    今天给大家分享的是Vue3聊天实例中的朋友圈的实现及登录验证和倒计时操作。先上效果图这个是最新开发的vue3.x网页端聊天项目中的朋友圈模块。用到了ElementPlus...

    不来看看这些 VUE 的生命周期钩子函数?| 原力计划

    作者|huangfuyk责编|王晓曼出品|CSDN博客VUE的生命周期钩子函数:就是指在一个组件从创建到销毁的过程自动执行的函数,包含组件的变化。可以分为:创建、挂载、更新、销毁四个模块...

    Vue3.5正式上线,父传子props用法更丝滑简洁

    前言Vue3.5在2024-09-03正式上线,目前在Vue官网显最新版本已经是Vue3.5,其中主要包含了几个小改动,我留意到日常最常用的改动就是props了,肯定是用Vue3的人必用的,所以针对性...

    Vue 3 生命周期完整指南(vue生命周期及使用)

    Vue2和Vue3中的生命周期钩子的工作方式非常相似,我们仍然可以访问相同的钩子,也希望将它们能用于相同的场景。...

    救命!这 10 个 Vue3 技巧藏太深了!性能翻倍 + 摸鱼神器全揭秘

    前端打工人集合!是不是经常遇到这些崩溃瞬间:Vue3项目越写越卡,组件通信像走迷宫,复杂逻辑写得脑壳疼?别慌!作为在一线摸爬滚打多年的老前端,今天直接甩出10个超实用的Vue3实战技巧,手把...

    怎么在 vue 中使用 form 清除校验状态?

    在Vue中使用表单验证时,经常需要清除表单的校验状态。下面我将介绍一些方法来清除表单的校验状态。1.使用this.$refs...

    取消回复欢迎 发表评论: