[深度学习入门]PyTorch深度学习[Numpy基础](上)

目录

  • 一、前言
  • 二、Numpy概述
  • 三、生成Numpy数组
    • 3.1 从已有数据中创建数组
    • 3.2 利用random模块生成数组
    • 3.3 创建特定形状的多维数组
    • 3.4 利用arange和linspace函数生成数组
  • 四、获取元素
  • 五、Numpy的算术运算
    • 5.1 对应元素相乘
    • 5.2 点积运算
  • 六、后记


本文的目标受众
机器学习深度学习感兴趣的同学或从业人员,和对PythonPyTorchTensorFlow等感兴趣并希望能再提升一下自己技术的相关人员。

一、前言

  人工智能时代,人工智能的核心就是深度学习。但目前深度学习的框架有很多,像TensorFlowPyTorchFastAI等等,它们都各有各的优缺点。那该选择什么框架进行深度学习的快速入门呢
  如果你是个小白,或是和我一样因为时间所迫没工夫全部学完再开始动手,那么我建议选择PyTorch。在有了一定的基础之后,我们可以学习一些其他的架构,比如TensorFlowCNTK等。
   为什么首推PyTorch呢? 原因有以下几点:
  (1)PyTorch需要手动定义网络层、参数更新等关键的步骤 ,这非常有助于帮助我们快速理解深度学习的核心。而Keras框架虽然也非常简单且容易上手,但封装粒度很粗隐藏了很多关键步骤,往往我们搭完了神经网络对整个的流程还一知半解。
  (2)PyTorch是动态计算图,其用法更贴近 Python。并且,PyTorch 与 Python共用了许多Numpy的命令,可以降低学习的门槛,比 TensorFlow更容易上手
  (3)PyTorch的动态图机制在调试方面非常方便如果计算图运行出错,马上可以跟踪问题。PyTorch的调试与Python的调试一样,通过断点检查就可以高效解决问题
  其余还有开源项目多插件适配等优点,不一一列举了。
  前文回顾:[数据分析大全]基于Python的数据分析大全——Numpy基础
  下面继续开始本文的Numpy部分相关讲解


二、Numpy概述

  在机器学习和深度学习中,图像、声音、文本等输入数据最终都要转换为数组或矩阵。如何有效地进行数组和矩阵的运算?这就需要充分利用Numpy
   为什么是Numpy?实际上,Python本身含有列表(list)和数组(array),但对于大数据来说,这些结构是有很多不足。由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针。例如为了保存一个简单的[1,2,3],都需要有3个指针和3个整数对象。对于数值运算来说,这种结构显然比较浪费内存和 CPU等宝贵资源
  至于array对象,它可以直接保存数值,和C语言的一维数组比较类似。但是由于它不支持多维,在上面的函数也不多,因此也不适合做数值运算
  Numpy是数据科学的通用语言,而且与PyTorch关系非常密切,它是科学计算、深度学习的基石。


三、生成Numpy数组

  Numpy是 Python 的外部库不在标准库中。因此,若要使用它,需要先导入Numpy

import numpy as np

  导入 Numpy后,可通过np.+Tab键查看可使用的函数,如果对其中一些函数的使用不是很清楚,还可以在对应函数+?,再运行,就可以很方便地看到如何使用函数的帮助信息
  输入np.然后按Tab键,将出现如下界面:
请添加图片描述
  运行如下命令,便可查看函数abs的详细帮助信息

np.abs?

  Numpy 不但强大,而且还非常友好。下面将介绍Numpy的一些常用方法,尤其是与机器学习深度学习相关的一些内容。
  Numpy封装了一个新的数据类型 ndarray (N-dimensional Array),它是一个多维数组对象。该对象封装了许多常用的数学运算函数,方便我们做数据处理、数据分析等。
  那么,如何生成ndarray呢
  这里介绍生成ndarray的几种方式,如从已有数据中创建利用random创建创建特定形状的多维数组利用arange、linspace函数生成等。


3.1 从已有数据中创建数组

  直接对 Python的基础数据类型(如列表、元组等)进行转换来生成 ndarray :
  (1)将列表转换成 ndarray :

import numpy as np
lstl =[3.14,2.17,0,1,2]
ndl = np.array(lst1)
print(ndl)
# [3.142.17 0. 1. 2. ]
print(type(ndl))
# <class 'nurmpy.ndarray'>

  (2)嵌套列表可以转换成多维 ndarray :

import numpy as np
lst2 = [[3.14,2.1701,2],[1,23,4,5]]
nd2 = np.array(lst2)
print(nd2)
# [[3.14 2.17 0. 1. 2. ]
# [1. 2. 3. 4. 5. ]]
print(type(nd2))
# <class " numpy.ndarray' >

  如果把上面示例中的列表换成元组,也同样适用。


3.2 利用random模块生成数组

  在深度学习中,我们经常需要对一些参数进行初始化,因此为了更有效地训练模型,提高模型的性能。有些初始化还需要满足一定的条件,如满足正态分布均匀分布等。
  这里介绍了几种常用的方法,如下表所示,列举了np.random模块常用的函数

函数描述
np.random.random生成0到1之间的随机数
np.random.uniform生成均匀分布的随机数
np.random.randn生成标准正态的随机数
np.random.randint生成随机的整数
np.random.normal生成正态分布
np.random.shuffle随机打乱顺序
np.random.seed设置随机数种子
random_sample生成随机的浮点数

  下面来看一些函数的具体使用

import numpy as npnd3 =np.random.random([3,3])
print (nd3)
#[[0.43007219 0.87135582 0.45327073]
# [0.7929617 0.06584697 0.82896613]
# [0.62518386 0.70709239 0.75959122]]
print("nd3的形状为:",nd3.shape)
# nd3的形状为:(3,3)

  为了每次生成同一份数据,可以指定一个随机种子使用shuffle函数打乱生成的随机数

import numpy as np
np.random.seed(123)
nd4 = np.random.randn(2,3)
print(nd4)
np.random.shuffle(nd4)
print("随机打乱后数据:")print (nd4)
print(type(nd4))

  输出结果:

[[-1.0856306 0.99734545  0.2829785][-1.50629471 -0.57860025 1.65143654]]

  随机打乱后数据:

[[-1.50629471 -0.57860025 1.65143654][-1.0856306 0.99734545 0.2829785]]

3.3 创建特定形状的多维数组

  参数初始化时,有时需要生成一些特殊矩阵,如全是0或1的数组或矩阵,这时我们可以利用np.zerosnp.onesnp.diag来实现,如下表所示:

函数描述
np.zeros((3,4))创建3×4的元素全为0的数组
np.ones((3,4))创建3×4的元素全为1的数组
np.empty( (2,3))创建2×3的空数组,空数据中的值并不为0,而是未初始化的垃圾值
np.zeros_like(ndarr)以 ndarr相同维度创建元素全为0数组
np.ones_like(ndarr)以ndarr相同维度创建元素全为1数组
np.empty_like(ndarr)以ndarr相同维度创建空数组
np.eye(5)该函数用于创建一个5×5的矩阵,对角线为1,其余为0
np.full((3,5),666)创建3×5的元素全为666的数组,666为指定值

  下面通过几个示例说明:

import numpy as np
# 生成全是0的3x3矩阵
nd5 = np.zeros([3,3])
#生成与nd5形状一样的全0矩阵
#np .zeros_like(nd5)
#生成全是1的3x3矩阵
nd6 = np. ones([3,3])
#生成3阶的单位矩阵
nd7 = np.eye(3)
#生成3阶对角矩阵
nd8 = np.diag([1,2,3])
print(nd5)
#[[O. 0. 0.]
# [0. 0. 0.]
# [0. 0. 0.]]
print(nd6)
#[[1. 1. 1.]
# [1. 1. 1.]
# [1. 1. 1.]]
print(nd7)
#[[1. 0. 0.]
# [0. 1. 0.]
# [0. 0. 1.]]
print(nd8)
# [[1 0 0]
# [0 2 0]
# [0 0 3]]

  有时还可能需要把生成的数据暂时保存起来,以备后续使用。

import numpy as npnd9 =np.random.random([5,5])
np.savetxt(×=nd9, fname='./testl.txt')
nd10 = np.loadtxt('./test1.txt ')
print(ndl0)

  输出结果:

[[0.41092437 0.5796943 0.13995076 0.40101756 0.62731701]
[0.32415089 0.24475928 0.69475518 0.5939024 0.63179202]
[0.44025718 0.08372648 0.71233018 0.42786349 0.2977805]
[0.49208478 0.74029639.0.35772892 0.41720995 0.65472131]
[0.37380143 0.23451288 0.98799529 0.76599595 0.77700444]]

3.4 利用arange和linspace函数生成数组

  arange是numpy模块中的函数,其格式为:

arange([start,]stop[,step,],dtype=None)

  其中,start与 stop 用来指定范围,step用来设定步长。在生成一个ndarray时,start 默认为0步长 step 可为小数。Python有个内置函数range,其功能与此类似。

import numpy as npprint(np.arange (10))
#[0 1 2 3 4 5 6 7 8 9]
print(np.arange(0,10))
#[0 1 2 3 4 5 6 7 8 9]
print(np.arange(1,4,0.5))
#[ 1. 1.5 2. 2.5 3. 3.5]
print(np.arange(9,-1,-1))
#[9 8 7 6 5 4 3 2 1 0]

  linspace也是numpy模块中常用的函数,其格式为:

np.linspace(start,stop,num=50,endpoint=True,retstep=False,dtype=None)

  linspace可以根据输入的指定数据范围以及等份数量,自动生成一个线性等分向量
  其中, endpoint(包含终点)默认为True,等分数量num默认为50。如果将retstep设置为True,则会返回一个带步长的ndarray

import numpy as np
print (np .linspace(0,1,10))
#[0. 0.11111111 0.222222220.33333333 0.44444444 0.55555556 0.666666670.77777778 0.88888889 1. ]

  值得一提的是,这里并没有像我们预期的那样,生成0.1,0.2,…1.0这样步长为0.1的ndarray这是因为linspace必定会包含数据起点和终点,那么其步长则为(1-0) /9 =0.11111111。如果需要产生0.1,0.2…,1.0这样的数据,只需要将数据起点0修改为0.1即可。
  除了上面介绍到的arangelinspaceNumpy还提供了logspace函数该函数的使用方法与linspace的使用方法一样,读者不妨自己动手试一下。


四、获取元素

  第三节中我们了解了生成ndarray的几种方法。那在数据生成后,如何读取我们所需要的数据呢?接下来将介绍几种常用获取数据的方法

import numpy as np
np.random.seed(2019)
nd11 = np.random.random([10])
#获取指定位置的数据,获取第4个元素
ndl1[3]
#截取一段数据
ndl1[3:6]
#截取固定间隔数据
ndl1[1:6:2]
#倒序取数nd11[::-2]
#截取一个多维数组的一个区域内数据
ndl2=np.arange(25).reshape([5,5])
nd12[1:3,1:3]
#截取一个多维数组中,数值在一个值域之内的数据ndl2[(ndl2>3)&(ndl2<10)]
#截取多维数组中,指定的行,如读取第2,3行
nd12[[1,2]]        #或nd12[1:3,:]
#截取多维数组中,指定的列,如读取第2,3列
nd12[:,1:3]

  如果对上面这些获取方式还不是很清楚,没关系,下面则将通过图形的方式来进一步说明,如下图所示:
  左边为表达式,右边为表达式获取的元素。注意,不同的边界,表示不同的表达式
在这里插入图片描述
  获取数组中的部分元素除了通过指定索引标签来实现外,还可以通过使用一些函数来实现,如通过random.choice函数从指定的样本中随机抽取数据

import numpy as np
from numpy import random as nr
a=np.arange(1,25,dtype=float)
cl=nr.choice(a,size=(3,4)) 
#size指定输出数组形状
c2=nr.choice(a,size=(3,4), replace=False) 
#replace缺省为True,即可重复抽取
#下式中参数p指定每个元素对应的抽取概率,缺省为每个元素被抽取的概率相同。
3=nr.choice(a,size=(3,4),p=a/np.sum(a))
print("随机可重复抽取")
print(c1)
print("随机但不重复抽取")
print(c2)
print("随机但按制度概率抽取")
print(c3)

  打印结果:

# 随机可重复抽取
[[7. 22. 19. 21.]
[ 7. 5. 5. 5. ]
[7. 9.22. 12.]]
# 随机但不重复抽取
[[21. 9. 15. 4.]
[23. 2. 3. 7.]
[13. 5. 6. 1.]]
# 随机但按制度概率抽取
[[15. 19. 24. 8.]
[5. 22. 5. 14.]
22. 13. 17. 1]

五、Numpy的算术运算

  在机器学习和深度学习中,涉及大量的数组或矩阵运算,本节我们将重点介绍两种常用的运算。一种是对应元素相乘,又称为逐元乘法 (Element-Wise Product),运算符为np.multiply( ),或*。另一种是点积或内积元素,运算符为np.dot( )


5.1 对应元素相乘

  对应元素相乘(Element-Wise Product)是两个矩阵中对应元素乘积np.multiply函数用于数组或矩阵对应元素相乘,输出与相乘数组或矩阵的大小一致,其格式如下:

numpy.multiply(x1,,x2,/,out=None,*,where=True,casting='same_kind',order='K',dtype-None,subok=True[,signature,extobj])

  其中x1、x2之间的对应元素相乘遵守广播规则,Numpy的广播规则会在下一篇文章——Numpy基础(下)中介绍。以下我们通过一些示例来进一步说明。

A=np.array([[l,2][-l,4]])
B=np.array([[2,0],[3,4]])
A*B
# 结果如下:
array([[2,0],[-316]])
# 或另一种表示方法np.multiply(A,B)#运算结果也是
array([[2,0],[-3,16]])

  矩阵A和B的对应元素相乘,由下图直观表示。
在这里插入图片描述
  Numpy数组不仅可以和数组进行对应元素相乘,还可以和单一数值(或称为标量)进行运算。运算时,Numpy数组中的每个元素都和标量进行运算,其间会用到广播机制(下一篇文章中将会详细讲解)。

print (A*2.0)print(A/2.0)

  输出结果为:

[ [2. 4.]
[-2. 8.]]
[[0.5 1]
[-0.5 2. ]]

  由此,推广后,数组通过一些激活函数后,输出与输入形状一致

X=np.random.rand(2,3)
def softmoid(x):return 1/(1+np.exp(-x))
def relu(x):return np.maximum(0,x)
def softmax(x) :return np.exp(x)/np.sum(np.exp(X))print("输入参数x的形状:",X.shape)
print("激活函数softmoid输出形状:",softmoid(x) .shape)
print("激活函数relu输出形状:", relu(X).shape)
print("激活函数softmax输出形状:",softmax(X).shape)

  输出结果:

输入参数x的形状:(23)
激活函数softmoid输出形状:(2,3)
激活函数relu输出形状:(2,3)
激活函数softmax输出形状:(23)

5.2 点积运算

  点积运算(Dot Product)又称为内积,在 Numpy用np.dot表示,其一般格式为:

numpy.dot(a,b,out=None)

  以下通过一个示例来说明dot的具体使用方法及注意事项。

X1=np.array([[1,2],[3,4]])
x2=np.array([[56,7],[8,9,10]])
x3=np.dot(X1,X2)
print(X3)

  输出结果:

[[21 2427][47 5461]]

  以上运算,可用下图表示。
在这里插入图片描述
  在上图中,矩阵X1和矩阵X2进行点积运算,其中X1和X2对应维度(即X1的第2个维度与X2的第1个维度)的元素个数必须保持一致。此外,矩阵X3的形状是由矩阵XI的行数与矩阵X2的列数构成的


六、后记

  本篇文章主要讲解了Numpy概述、生成Numpy数组、获取元素和Numpy的算术运算的内容。因为要写的内容太多,就拆为上下篇了。这几天会把Numpy基础的下篇也放出来的。
  感谢各位读者朋友们长期以往的支持!非常感谢!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/33445.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++进阶 智能指针

本篇博客简介&#xff1a;介绍C中的智能指针 智能指针 为什么会存在智能指针内存泄露内存泄漏定义内存泄漏的危害如何检测内存泄漏如何避免内存泄漏 智能指针的使用及其原理RAII设计一个智能指针C官方的智能指针 定制删除器智能指针总结 为什么会存在智能指针 我们首先来看下面…

Spring5 AOP 默认使用 JDK

这是博主在使用dubbo实现远程过程调用的时候遇到的问题&#xff1a; 我们如果在服务提供者类上加入Transactional事务控制注解后&#xff0c;服务就发布不成功了。原因是事务控制的底层原理是为服务提供者类创建代理对象&#xff0c;而默认情况下Spring是基于JDK动态代理方式创…

SpringBoot 整合Swagger2

一、Swagger简介 Swagger是一套开源工具和规范&#xff0c;用于设计、构建和文档化RESTful Web服务。它允许开发人员定义API的各个方面&#xff0c;并生成易于理解的API文档和交互式API探索界面。同时&#xff0c;Swagger还提供代码生成工具&#xff0c;可自动生成与API交互的客…

MySQL和钉钉单据接口对接

MySQL和钉钉单据接口对接 数据源系统:钉钉 钉钉&#xff08;DingTalk&#xff09;是阿里巴巴集团打造的企业级智能移动办公平台&#xff0c;是数字经济时代的企业组织协同办公和应用开发平台。钉钉将IM即时沟通、钉钉文档、钉闪会、钉盘、Teambition、OA审批、智能人事、钉工牌…

dingding机器人

“自定义机器人”只支持消息发送&#xff0c;自动回复需要“企业内部机器人” 消息发送 import requests import jsonres requests.post(https://oapi.dingtalk.com/robot/send?access_token036a339axxx,data json.dumps({"text": {"content":"h…

医疗保健中的 NLP:实体链接

一、说明 HEalthcare和生命科学行业产生大量数据&#xff0c;这些数据是由合规性和监管要求&#xff0c;记录保存&#xff0c;研究论文等驱动的。但随着数据量的增加&#xff0c;搜索用于研究目的的必要文件和文章以及数据结构成为一个更加复杂和耗时的过程。例如&#xff0c;如…

消息队列(11) - 通信协议的设计

目录 通信协议设计代码实现 通信协议设计 对于我们客户端与服务器之间的通信协议我们约定如下&#xff1a; 具体的协议设计: 之后我们传递的参数也是这些 关于 type其实是在描述当前这个请求 、 响应是在调用那个API 约定如下 对于channel ,是tcp链接中的一个逻辑上的链接,…

策略模式实战应用

场景 假设做了个卖课网站&#xff0c;会员等级分为月vip、年vip、终生vip&#xff0c;每个等级买课的优惠力度不一样&#xff0c;传统的写法肯定是一堆的 if-else&#xff0c;现在使用策略模式写出代码实现 代码实现 策略模式的核心思想就是对扩展开放&#xff0c;对修改关闭…

应用案例|基于三维机器视觉的机器人纸箱拆码垛应用解决方案

Part.1 项目背景 在现代物流和制造行业中&#xff0c;纸箱的拆码垛操作是一项重要且频繁的任务。传统的纸箱拆码垛工作通常由人工完成&#xff0c;这种方式存在劳动强度大、生产效率低以及人为操作容易导致错误等问题&#xff0c;严重影响物料的安全运输和质量。为了满足物流行…

大模型“瘦身”进手机 下一个iPhone时刻将至?

一股“端侧大模型”浪潮正在涌来。华为、高通等芯片巨头正探索将AI大模型植入端侧&#xff0c;让手机实现新一代物种进化。 相比ChatGPT、Midjourney等AI应用依赖云端服务器提供服务&#xff0c;端侧大模型主打在本地实现智能化。它的优势在于能够更好地保护隐私&#xff0c;同…

有没有推荐的golang的练手项目?

前言 下面是github上的golang项目&#xff0c;适合练手&#xff0c;可以自己选择一些项目去练习&#xff0c;整理不易&#xff0c;希望能多多点赞收藏一下&#xff01;废话少说&#xff0c;我们直接进入正题>>> 先推荐几个教程性质的项目&#xff08;用于新手学习、巩…

RS-232标准

目录 1、概述2、RS-232接口的特点3、RS-232接口协议【仿真】 1、概述 RS-232接口是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是“数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换…

Hadoop理论及实践-HDFS读写数据流程(参考Hadoop官网)

NameNode与DataNode回顾 主节点和副本节点通常指的是Hadoop分布式文件系统&#xff08;HDFS&#xff09;中的NameNode和DataNode。 NameNode&#xff08;主节点&#xff09;&#xff1a;NameNode是Hadoop集群中的一个核心组件&#xff0c;它负责管理文件系统的命名空间和元数据…

arcgis pro 3.0.2 安装及 geemap

arcgis pro 3.0.2 安装及 geemap arcgis pro 3.0.2 安装 arcgis pro 3 版本已经很多了&#xff0c;在网上找到资源就可以进行安装 需要注意的是&#xff1a;有的文件破解文件缺少&#xff0c;导致破解不成功。 能够新建地图就是成功了&#xff01; geemap安装 1.需要进行环…

Python web实战之Django 的 WebSocket 支持详解

关键词&#xff1a;Python, Django, WebSocket, Web 如何使用 Django 实现 WebSocket 功能&#xff1f;本文将详细介绍 WebSocket 的概念、Django 的 WebSocket 支持以及如何利用它来创建动态、响应式的 Web 应用。 1. WebSocket 简介 1.1 什么是 WebSocket&#xff1f; 在 W…

【果树农药喷洒机器人】Part7:静态PWM变量喷药实验

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

【编程指南】ES2016到ES2023新特性解析一网打尽

ES2016 Array.prototype.includes() Array.prototype.includes 方法&#xff1a; 这个方法用于检查数组是否包含特定元素&#xff0c;如果包含则返回 true&#xff0c;否则返回 false // 我有一个水果篮子 const fruitBasket [apple, banana, orange, grape];// 我要检查篮…

pycharm配置conda虚拟环境

&#x1f4d5;作者简介&#xff1a;热编程的贝贝&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步健身&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于贝贝的日常汇报系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏深度学习、…

iOS开发-实现二维码扫一扫Scan及识别图片中二维码功能

iOS开发-实现二维码扫一扫Scan及识别图片中二维码功能 在iOS开发中&#xff0c;会遇到扫一扫功能&#xff0c;扫一扫是使用摄像头扫码二维码或者条形码&#xff0c;获取对应二维码或条形码内容字符串。通过获得的字符串进行跳转或者打开某个页面开启下一步的业务逻辑。 https…

RFID工业识别技术:供应链智能化的科技颠覆

RFID工业识别技术&#xff0c;作为物联网的先锋&#xff0c;正在供应链管理领域展现着前所未有的科技颠覆。从物料追踪到库存管理&#xff0c;再到物流配送&#xff0c;RFID技术以其高效的数据采集和智能的自动化处理&#xff0c;彻底改变着传统供应链的运营方式。 RFID在物料追…