一些散碎的Pytorch笔记(张量操作)

本文详细介绍了PyTorch中张量的基本概念及其常见操作方法,包括张量的创建、转换、向量与矩阵运算及张量的形状变化等,并提供了丰富的代码实例。

广义的张量可以是任何维度的,而狭义来说,一维是向量,二维是矩阵,三维及以上是张量。

  • 创建张量:a=torch.tensor(1,dtype=torch.float32)
  • tensor–>numpy:b=a.NumPy() b是numpy,但是a还是tensor
  • numpy–>tensor:c=torch.from_NumPy(b) c是tensor
  • tensor–>list :tensor.tolist()
  • list–>tensor:torch.tensor(list)
  • 单个元素的张量x转换为int:x.item()

因为支持自动梯度功能,PyTorch的变量来自包torch.autograd


1.向量操作

向量生成

  • a=torch.linspace(1.0,10.0,4) #(起点,终点,分成几份)
  • a=torch.arange(1,5) # [1,2,3,4]

向量拼接

  • b=torch.cat([v1,v2,v3]) # 小括号套中括号

元素计数

  • x=torch.numel(a)

逐元素加减乘 +/-/*

向量乘除标量 torch.div(a,2)


2.矩阵操作

torch.zeros(3,3,3) # 几个数就是几维,直接传数就行
torch.ones_like(a) #仿照现有矩阵的形状生成全0或全1的矩阵
torch.eye(3)            # 生成3*3的单位矩阵(对角线为1)
torch.t(a)               # 矩阵转置
*                              # 相同形状的矩阵对应元素相乘
torch.mm(a1,a2)/torch.matmul(a1,a2)/a1@a2 # 矩阵点积/乘法
torch.det(a)            # 求行列式的值
torch.inverse          # 矩阵求逆
torch.cat([a1,a2],0) # 矩阵拼接,0上下,1左右


3.张量操作

  • 改变形状a.view(5,5) # 直接传数就行
    • a.view(5,-1),保证5行就行
  • 张量拼接torch.cat([a1,a2],2)
    • 对于需要拼接的张量,维度数量必须相同,进行拼接的维度的尺寸可以不同,但是其它维度的尺寸必须相同。
### PyTorch CPU与GPU性能差异及其在轻薄本上的表现 对于轻薄本而言,选择使用PyTorch的CPU还是GPU版本取决于硬件配置以及具体应用场景。通常情况下,配备独立显卡(尤其是支持CUDA的NVIDIA GPU)的设备可以在处理大规模数据集或复杂模型训练时获得显著的速度提升。 #### 性能比较 当涉及到深度学习框架如PyTorch时,GPU相较于CPU具有明显优势[^2]: - **并行计算能力**:现代GPU拥有成千上万个核心单元,可以同时执行大量浮点运算;而即使是多核处理器也难以匹敌这种级别的并发度。 - **内存带宽**:专用图形芯片提供了更高的RAM访问速度,这对于频繁读取权重参数的操作尤为重要。 然而,在实际应用中并非总是如此简单直接。特别是针对轻薄型笔记本电脑来说,由于其内部空间有限,散热设计相对紧凑,因此即便内置了高性能独显也可能受到功耗墙等因素制约,从而影响最终效果。 #### 轻薄本环境下的考量因素 考虑到便携性和续航时间的要求,很多超极本书采用的是集成显卡或者是低功率版桌面级产品。这意味着即使理论上具备一定的加速潜力,但在长时间高强度负载下可能会因为温度过高而导致降频现象发生[^5]。 另外值得注意的一点是,并不是所有的任务都能从GPU得到相同程度的好处。比如简单的线性回归分析可能根本察觉不到区别;而对于卷积神经网络这类涉及矩阵乘法密集型操作的任务,则更倾向于受益于前者所提供的强大算力支持。 ```python import torch from time import perf_counter as pc device_cpu = 'cpu' if torch.cuda.is_available(): device_gpu = 'cuda' # 创建随机张量用于测试 tensor_size = (1024, 1024) test_tensor_cpu = torch.randn(tensor_size).to(device=device_cpu) if torch.cuda.is_available(): test_tensor_gpu = torch.randn(tensor_size).to(device=device_gpu) def measure_performance(operation): start_time = pc() result = operation() if not isinstance(operation, tuple) else eval(f"{operation[0]}({','.join(map(str, operation[1:]))})") end_time = pc() return round((end_time - start_time)*1e3, 4), result # 测试加法操作的时间消耗 addition_result_cpu = measure_performance(lambda : test_tensor_cpu + test_tensor_cpu) print(f'Addition on CPU took {addition_result_cpu[0]} ms') if torch.cuda.is_available(): addition_result_gpu = measure_performance(('test_tensor_gpu', '+', 'test_tensor_gpu')) print(f'Addition on GPU took {addition_result_gpu[0]} ms') ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值