Torch教程(1)-Tensor

Torch是一个基于Lua的科学计算框架,广泛用于机器学习,以其高效和灵活性著称。Tensor是其核心,可表示任意维度数组,支持多种操作如复制、查询、初始化等。Torch的Tensor操作高效,因为它们共享内存,但可通过copy()或clone()复制。此外,Torch提供了丰富的构造函数和基本操作,如resize()、narrow()、select()等,便于在内存管理和计算中进行矩阵操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Torch是一个广泛支持机器学习算法的科学计算框架。易于使用且高效,主要得益于一个简单的和快速的脚本语言LuaJIT,和底层的C / CUDA实现。
核心特征的总结:
1. 一个强大的n维数组
2. 很多实现索引,切片,移调transposing的例程
3. 惊人的通过LuaJIT的C接口
4. 线性代数例程
5. 神经网络,并基于能量的模型
6. 数值优化例程
7. 快速高效的GPU支持
8. 可嵌入,可移植到iOS,Android和FPGA的后台
Torch目标是让你通过极其简单过程、最大的灵活性和速度建立自己的科学算法。Torch有一个在机器学习领域大型生态社区驱动库包,包括计算机视觉软件包,信号处理,并行处理,图像,视频,音频和网络等,基于Lua社区建立。Torch被Facebook人工智能研究实验室和位于伦敦的谷歌DeepMind大量使用。
我最近在学习torch,在学习的过程中,把学习的内容,总结为博客,在方便自己的同时,也能够分享给真正喜欢编程,喜欢计算机视觉的同行。

Tensor 介绍

Tensor是Torch中最基础的类,是网络基本的数据单元。在Torch7中,一个Tensor可以是任意维度的,维度数目可以通过LongStorage来设定,可以通过dim()或者nDimension()方法获取Tensor的维度,可以用size()获取所有的维度。例如:

x=torch.Tensor(1,2,3,2)
s=torch.LongStorage(5)
s[1] = 2                                                                      s[2] =2
s[3] = 2                                                                     s[4] = 4                                                                    s[5] = 1
print(x:nDimension()) # 5
x:size()
2
2
2
4
1
[torch.LongStorage of size 5]

在CNN网络中,Tensor一般来说是一个四维的数组,分别是batchSize, channel,width,height。在Torch中,数组的下标从1开始,到size()结束,这点和c/c++/java这些语言不同。访问Tensor的内容,可以直接使用下标的方式,或者使用Storage()函数。storage是Torch的一种访问内存的基本方式,有点类似C语言的数据类型。相关细节,参考文档here
以一个三维的Tensor为例:

 th> x = torch.Tensor(5,5,5)
                                                                      [0.0001s] 
th> x[3][4][5]
2.1723719562371e-153    
                                                                      [0.0001s] 
th> x:storage()[x:storageOffset()+(3-1)*x:stride(1)+(4-1)*x:stride(2)+(5-1)*x:stride(3)]
2.1723719562371e-153    

storageOffset返回Tensor第一个位置(1),stride(i)返回第i维的长度。第二种方式,可以这样理解,storage()操作以后,在内存中本质是一维的数组结构,用相对于第一个位置的偏置,进行访问。*注意的是,在Tensor中同一行的元素总是连续的。*Tensor构造函数是不进行初始化值的,需要手动初始化。

th> x=torch.Tensor(4,5)                                                                   [0.0001s] 
th> i = 0                                                                     [0.0000s] 
th> x:apply(function()
..> i=i+1
..> return i
..> end)
  1   2   3   4   5
  6   7   8   9  10
 11  12  13  14  15
 16  17  18  19  20
[torch.DoubleTensor of size 4x5]                                                                     [0.0230s]  
th> x
  1   2   3   4   5
  6   7   8   9  10
 11  12  13  14  15
 16  17  18  19  20
[torch.DoubleTensor of size 4x5]                                                                    [0.0002s]   
th> x:stride()
 5
 1
[torch.LongStorage of size 2]

Torch中,Tensor主要有ByteTensor(无符号char),CharTensor(有符号),ShortTensor(shorts), IntTensor(ints), LongTensor(longs), FloatTensor(floats), DoubleTensor(doubles),默认存放为double类型,如果需要特别指出,通过torch.setdefaulttensortype()方法进行设定。例如torch.setdefaulttensortype(‘torch.FloatTensor’)。
在Torch中,所有的Tensor都共享同一个变量的内存,也就是说所有的操作都是在同一块内存上操作,这样的好处就是减少了内存复制所需要的时间,提高了运行速度,缺点也很明显,就是同一块内存的数据不能够持久,如果需要内存复制,可以使用copy()或者clone()方法。从下面的例子,可以看出这点:

th> x=torch.Tensor(2,2)
                                                                      [0.0001s] 
th> i = 0
                                                                      [0.0000s] 
th> x:apply(function()
..> i = i+1
..> return i
..> end)
 1  2
 3  4
[torch.DoubleTensor of size 2x2]

                                                                      [0.0002s] 
th> y = torch.Tensor(x)
                                                                      [0.0001s] 
th> y
 1  2
 3  4
[torch.DoubleTensor of size 2x2]

                                                                      [0.0002s] 
th> y:zero()
 0  0
 0  0
[torch.DoubleTensor of size 2x2]

                                                                      [0.0202s] 
th> x
 0  0
 0  0
[torch.DoubleTensor of size 2x2]

Tensor 基本函数

构造函数

Tensor构造函数,创建新的tensor,分配内存,但是不进行初始化值,tensor的值是随机产生的。Tensor主要有以下几种构造函数:

  • torch.Tensor() 空构造函数
  • torch.Tensor(tensor) 拷贝构造函数,但是这里共享了同一块内存。
  • torch.Tensor(sz1[,sz2[, sz3[, sz4]]]]) 创建4维的Tensor
  • torch.Tensor(sizes,[strides]) 使用longStorage方法创建任意维度的Tensor 。x=torch.Tensor(torch.LongStorage({4,4,3,2}))
  • torch.Tensor(table) torch.Tensor({ {1,2,3,4}, {5,6,7,8}})。
  • torch.Tensor(storage, [storageOffset, sizes, [strides]])
th> s=torch.Storage(10):fill(1)
                                                                      [0.0001s] 
th> x=torch.Tensor(s,1,torch
<think>我们使用torch.rand()函数来生成0到1之间的均匀分布的随机张量。 例如,生成一个2x3的张量:tensor = torch.rand(2, 3) 注意:torch.rand()生成的是[0, 1)区间内的随机数(包括0,不包括1)。 如果需要生成其他形状,只需在括号内指定维度即可。 另外,如果用户需要整数随机数,可以使用torch.randint(),但这里要求0到1之间的随机数,通常是浮点数,所以用rand即可。 根据引用[3]中提到的torch.poisson是生成泊松分布的随机数,不适用于这里。我们只需要均匀分布。 因此,代码示例: ```python import torch # 生成一个3x3的0到1之间的随机张量 random_tensor = torch.rand(3, 3) print(random_tensor) ``` 输出将类似于: tensor([[0.1234, 0.5678, 0.9012], [0.3456, 0.7890, 0.2345], [0.6789, 0.0123, 0.4567]]) 注意:每次运行结果都会不同,因为是随机的。 如果用户需要指定设备,比如在GPU上生成,可以加上device参数,例如: ```python device = torch.device("cuda" if torch.cuda.is_available() else "cpu") random_tensor = torch.rand(3, 3, device=device) ``` 另外,引用[1]提到PyTorch可以在XLA设备(如TPU)上运行,使用torch_xla包。如果用户使用TPU,可以这样: ```python import torch_xla.core.xla_model as xm device = xm.xla_device() random_tensor = torch.rand(3, 3, device=device) ``` 但一般情况下,用户使用CPU或CUDA即可。 因此,我们根据用户需求,提供生成0到1随机张量的方法。</think>在 PyTorch 中生成 0 到 1 之间的随机张量非常简单,可以使用 `torch.rand()` 函数。以下是详细说明和示例: ### 解决方案 ```python import torch # 生成指定形状的随机张量(0到1之间均匀分布) random_tensor = torch.rand(size) # size 是张量维度,例如 (3, 3) ``` ### 完整示例 ```python import torch # 示例1: 生成3x3的随机矩阵 tensor_3x3 = torch.rand(3, 3) print("3x3 随机张量:\n", tensor_3x3) # 示例2: 生成5个元素的随机向量 tensor_1d = torch.rand(5) print("\n5元素随机向量:", tensor_1d) # 示例3: 生成特定设备上的张量(如GPU) device = "cuda" if torch.cuda.is_available() else "cpu" tensor_gpu = torch.rand(2, 2, device=device) print("\nGPU上的随机张量:", tensor_gpu) ``` ### 关键特性 1. **均匀分布**:`torch.rand()` 生成 `[0, 1)` 区间内的均匀分布随机数 2. **设备支持**:可通过 `device` 参数指定生成在 CPU/GPU/TPU 上(引用[1]) 3. **形状灵活**:支持任意维度如 `(,)`(标量)、`(d,)`(向量)、`(h,w)`(矩阵)等 ### 其他相关函数 | 函数 | 描述 | 范围 | |------|------|------| | `torch.rand_like(input)` | 生成与输入张量相同形状的随机数 | `[0, 1)` | | `torch.randn()` | 标准正态分布随机数 | $(-\infty, +\infty)$ | | `torch.randint()` | 整数随机数 | `[low, high)` | > 注意:所有随机数生成函数都支持设置随机种子确保可复现性: > ```python > torch.manual_seed(42) # 设置随机种子 > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值