关于大模型学习中遇到的1

来源:网络

深度学习框架是什么意思

软件工具

深度学习框架是一种软件工具,它的主要目的是为了简化和加速深度学习模型的开发、训练和部署过程。深度学习框架通过提供一个高级的编程接口和一系列工具,使得开发者能够在更高层次上进行抽象定义,而不是直接处理底层的计算细节。这可以减少开发和调试时间,同时也能提高模型的准确性、性能和可扩展性。

深度学习框架通常包含以下功能:

  • 神经网络结构的构建:允许开发者设计和搭建各种类型的深度神经网络(如卷积神经网络、循环神经网络等)。
  • 数据处理和管理:支持数据的读取、预处理、清洗和加载等功能。
  • 模型训练:支持不同类型的损失函数、优化器和评估策略,以便进行模型训练。
  • 模型部署:允许将训练好的模型迁移到实际的生产环境中,可能涉及到模型压缩、服务化和集成到现有系统等工作。

此外,深度学习框架还具备一些其他特性,比如能够屏蔽底层硬件的复杂性和繁琐性,从而让用户能够更容易地利用机器资源,完成个性化的任务。目前市场上存在许多不同的深度学习框架,如TensorFlow、PyTorch、Keras等,它们各有特色,适用于不同的场景和技术需求


Numpy简单介绍

1.Numpy是什么

很简单,Numpy是Python的一个科学计算的库,提供了矩阵运算的功能,其一般与Scipy、matplotlib一起使用。其实,list已经提供了类似于矩阵的表示形式,不过numpy为我们提供了更多的函数。如果接触过matlab、scilab,那么numpy很好入手。 在以下的代码示例中,总是先导入了numpy:(通用做法import numpu as np 简单输入)

2. 多维数组

多维数组的类型是:numpy.ndarray。

使用numpy.array方法

以list或tuple变量为参数产生一维数组:

以list或tuple变量为元素产生二维数组或者多维数组:

numpy数据类型设定与转换

numpy ndarray数据类型可以通过参数dtype 设定,而且可以使用astype转换类型,在处理文件时候这个会很实用,注意astype 调用会返回一个新的数组,也就是原始数据的一份拷贝。

numpy索引与切片

index 和slicing :第一数值类似数组横坐标,第二个为纵坐标

涉及改变相关问题,我们改变上面y是否会改变x?这是特别需要关注的!

通过上面可以发现改变y会改变x ,因而我们可以推断,y和x指向是同一块内存空间值,系统没有为y 新开辟空间把x值赋值过去。

如上所示:当将一个标量赋值给切片时,该值会自动传播整个切片区域,这个跟列表最重要本质区别,数组切片是原始数组的视图,视图上任何修改直接反映到源数据上面。

思考为什么这么设计? Numpy 设计是为了处理大数据,如果切片采用数据复制话会产生极大的性能和内存消耗问题。

假如说需要对数组是一份副本而不是视图可以如下操作:

再看下对list 切片修改

这里设计到python 中深浅拷贝,其中切片属于浅拷贝

多维数组索引、切片

布尔型索引

这种类型在实际代码中出现比较多,关注下。

上面展示通过布尔值来设置值的手段。

数组文件输入输出

在跑实验时经常需要用到读取文件中的数据,其实在numpy中已经有成熟函数封装好了可以使用

将数组以二进制形式格式保存到磁盘,np.save 、np.load 函数是读写磁盘的两个主要函数,默认情况下,数组以未压缩的原始二进制格式保存在扩展名为.npy的文件中

存取文本文件:

文本中存放是聚类需要数据,直接可以方便读取到numpy array中,省去一行行读文件繁琐。

np.savetxt 执行相反的操作,这两个函数在跑实验加载数据时可以提供很多便利!!!

使用numpy.arange方法

使用numpy.linspace方法

例如,在从1到10中产生20个数:

使用numpy.zeros,numpy.ones,numpy.eye等方法可以构造特定的矩阵

获取数组的属性

合并数组

使用numpy下的vstack(垂直方向)和hstack(水平方向)函数:

看一下这两个函数有没有涉及到浅拷贝这种问题:

通过上面可以知道,这里进行是深拷贝,而不是引用指向同一位置的浅拷贝。

深拷贝数组

数组对象自带了浅拷贝和深拷贝的方法,但是一般用深拷贝多一些:

基本的矩阵运算

转置:

numpy.linalg模块中有很多关于矩阵运算的方法:

特征值、特征向量:


深度学习基础之三分钟轻松搞明白tensor到底是个啥

pytorch 和tensorflow 中最重要的概念就是tensor了,tensorflow 这个框架的名字中很直白,就是tensor的流动,所以学习深度学习的第一课就是得搞懂tensor到底是个什么东西了,今天就来学习下

1.tensor到底是啥

tensor 即“张量”(翻译的真难理解,破概念)。实际上跟numpy数组、向量、矩阵的格式基本一样。但是是专门针对GPU来设计的,可以运行在GPU上来加快计算效率。

在PyTorch中,张量Tensor是最基础的运算单位,与NumPy中的NDArray类似,张量表示的是一个多维矩阵。不同的是,PyTorch中的Tensor可以运行在GPU上,而NumPy的NDArray只能运行在CPU上。由于Tensor能在GPU上运行,因此大大加快了运算速度。

一句话总结:一个可以运行在gpu上的多维数据而已

 x = torch.zeros(5)

复制

调试看下这个东西到底在内存中是什么,都有哪些属性。

2.tensor的创建

tensor 概念再怎么高级也只是一个数据结构而已,一个类,怎么创建这个对象,有下面几种方式。

  • 直接创建

pytorch 提供的创建tensor的方式

torch.tensor(data, dtype=None, device=None,requires_grad=False)

复制

data - 可以是list, tuple, numpy array, scalar或其他类型

dtype - 可以返回想要的tensor类型

device - 可以指定返回的设备

requires_grad - 可以指定是否进行记录图的操作,默认为False

快捷方式创建

t1 = torch.FloatTensor([[1,2],[5,6]])

复制

  • 从numpy中获得数据

numpy是开发中常用的库,所以怎么将numpy中的数据给到tensor中,这个pytorch也提供了接口,很方便

torch.from_numpy(ndarry)

复制

注:生成返回的tensor会和ndarry共享数据,任何对tensor的操作都会影响到ndarry,反之亦然

内置的tensor创建方式

  • torch.empty(size)返回形状为size的空tensor
  • torch.zeros(size)全部是0的tensor
  • torch.zeros_like(input)返回跟input的tensor一个size的全零tensor
  • torch.ones(size)全部是1的tensor
  • torch.ones_like(input)返回跟input的tensor一个size的全一tensor
  • torch.arange(start=0, end, step=1)返回一个从start到end的序列,可以只输入一个end参数,就跟python的range()一样了。实际上PyTorch也有range(),但是这个要被废掉了,替换成arange了
  • torch.full(size, fill_value)这个有时候比较方便,把fill_value这个数字变成size形状的张量
  • torch.randn(5) 随机一个生成一个tensor

3、tensor转换

tensor数据的转换在开发中也是常用的,看下常用的两种转换方式

tensor 转为numpy

a = torch.ones(5)
print(a)
b = a.numpy()
print(b)

复制

tensor 转为list

data = torch.zeros(3, 3)
data = data.tolist()
print(data)

复制

4、张量的运算

维度提升

tensor的broadcasting是不同维度之间进行运算的一种手段,和不同的数据类型进行运算时的原则差不多,比如整型和float 进行运算的时候,将数据往精度更高的数据类型进行提升,tensor的维度扩张也是类似。

方法:

遍历所有的维度,从尾部维度开始,每个对应的维度大小要么相同,要么其中一个是 1,要么其中一个不存在。不存在则扩展当前数据,可以看到下图红框部分,就数据进行了扩展

    a = torch.zeros(2, 3)
    b = torch.ones(3)
    print(a)
    print(b)
    print(a + b)

复制

验证下结果,可以看到最后的结果都是1:

三维张量

# 3行4列深度为2
const3 = tf.constant([
[[1,2],[3,4],[5,6],[7,8]],
[[11, 12], [13, 14], [15, 16], [17, 18]],
[[21, 22], [23, 24], [25, 26], [27, 28]]
],tf.float16)
shape = (3,4,2)

四维张量

# 3行4列深度为2
const3 = tf.constant([
#第一个3行4列深度为2的三维张量
[[[1,2],[3,4],[5,6],[7,8]],
[[11, 12], [13, 14], [15, 16], [17, 18]],
[[21, 22], [23, 24], [25, 26], [27, 28]]],
#第二个3行4列深度为2的三维张量
[[[1,2],[3,4],[5,6],[7,8]],
[[11, 12], [13, 14], [15, 16], [17, 18]],
[[21, 22], [23, 24], [25, 26], [27, 28]]]
],tf.float16)
shape = (2,3,4,2)

 

总结:和不同数据类型相加时精度提升一个道理,这里是维度的提升

加法

y = t.rand(2, 3)        # 使用[0,1]均匀分布构建矩阵
z = t.ones(2, 3)        # 2x3 的全 1 矩阵

# 3 中加法操作等价
print(y + z)            ### 加法1
t.add(y, z)             ### 加法2

复制

减法

a = t.randn(2, 1)
b = t.randn(2, 1)
print(a)
### 等价操作
print(a - b)
print(t.sub(a, b))
print(a)        ### sub 后 a 没有变化

复制

乘法

矩阵的乘法大学的时候都学过,我们简单复习下,交叉相乘,理解原理就行,因为多维度的矩阵乘法更复杂,还是pytorch提供了支持

t.mul(input, other, out=None):矩阵乘以一个数

t.matmul(mat, mat, out=None):矩阵相乘

t.mm(mat, mat, out=None):基本上等同于 matmul

a=torch.randn(2,3)
b=torch.randn(3,2)
### 等价操作
print(torch.mm(a,b))        # mat x mat
print(torch.matmul(a,b))    # mat x mat
### 等价操作
print(torch.mul(a,3))       # mat 乘以 一个数
print(a * 3)

复制

其他的一些运算

pytorch还支持更多的运算,这些运算就不一一介绍了,在使用的时候测试一下就知道结果了

t.div(input, other, out=None):除法

t.pow(input, other, out=None):指数

t.sqrt(input, out=None):开方

t.round(input, out=None):四舍五入到整数

t.abs(input, out=None):绝对值

t.ceil(input, out=None):向上取整

t.clamp(input, min, max, out=None):把 input 规范在 min 到 max 之间,超出用 min 和 max 代替,可理解为削尖函数

t.argmax(input, dim=None, keepdim=False):返回指定维度最大值的索引

总结

tensor是深度学习的基础,也是入门的,可以简单的理解为一个多维的数据结构,并且内置了一些特殊运算,你品,你细品,这似乎没什么复杂的,常规操作而已,稳住,不慌,我们能赢,看透了本质就没什么难的了。

  • 24
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值