Pytorch学习笔记-Basic Data Type基本数据类型

本文详细介绍了PyTorch中处理Tensor时的一些最佳实践,包括避免直接使用`.numpy()`和`.from_numpy()`来转换数据,以及如何利用`with torch.no_grad():`防止构建计算图。此外,讨论了`torch.Tensor`与`torch.tensor()`的区别,以及何时使用`.data`和`.item()`来更新数据。还提到了`.is_contiguous()`和`.contiguous()`的作用,解释了`.reshape()`和`.view()`的区别,强调了在处理非连续Tensor时的注意事项。内容涵盖了内存优化和Tensor操作的要点,对于理解和提升PyTorch代码效率有很大帮助。

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

  • 少用tensor.numpy()来查看tensor的np.ndarray格式数据,共享内存,修改torch.tensor对应的np.ndarray也会被改动

  • 少用torch.from_numpy()来生成torch.tensor,共享内存,修改原始np.ndarray,其生成的torch.tensor也会被修改

  • 如果是希望防止跟踪历史(以及使用内存),可以将代码块放在 with torch.no_grad(): 内,这个做法在使用一个模型进行评估的时候非常有用,因为模型会包含一些带有 requires_grad=True 的训练参数,但实际上并不需要它们的梯度信息

  • torch.Tensor()torch.FloatTensor()的别称,是一种数据类;而torch.tensor()是构造tensor的函数

  • 数据有些更新步骤(如loss累计、weight更新等)应该用tensor.datatensor.item()(当且仅当tensor只包含一个scalar的时候可以用item()调用值)取出python number后计算,因为如果用tensor间的直接运算内存会加大,该操作会被放入计算图中

    • item()比较适合在loss上使用

      total_loss += loss.item()
      
  • tensor.is_contiguous()返回tensor在存储中是否连续,并不是所有tensor都会以连续存储的方式被存在memory中。若tensor不是连续存储的,可以通过t = tensor.contiguous()来返回一个tensor的连续存储的copy

    • StackOverflow上关于contiguous()问题

    • 为什么要有tensor.is_contiguous()这个判断?

      • Pytorch中的有些操作并没有返回真实tensor的copy,而只是与原始tensor共享内存,用indices的形式来获取tensor中的元素,如narrow(), view(), expand() and transpose()
      • Pytorch提供tensor.data_ptr()来返回tensor首元素的内存地址
      • Python提供tensor.storage()来返回tensor存储区地址
  • 讲一下tensor.reshape()tensor.view()的区别:

    张量操作中经常涉及如reshape、transpose(用于调换axis顺序)等操作,但是Pytorch对reshape操作提供了两种方法tensor.view()tensor.reshape()(Numpy也提供了reshape()view()但是好像view()很少用,两者区别跟Pytorch里面比较相似)

    TensorFlow和Pytorch等深度学习的框架对数据都采用了tensor这个概念,大部分操作涉及reshape、transpose、elementwise乘法(Hadamard product)、某个axis的乘法,tensor的相关操作其实很多,可以参考TG Kolda的Tensor Decompositions and Applications

    • 相同点是都能重新调整tensor的形状
    • view()有点类似数据库中的视图,并没有生成新的tensor数据,只是基于原始tensor的一种视图,与原始数据共享内存,修改view()生成的tensor也会对原始tensor内容进行修改
    • 差异:view只适合对满足连续性条件(contiguous)的tensor进行操作,而reshape同时还可以对不满足连续性条件的tensor进行操作,具有更好的鲁棒性。view能干的reshape都能干,如果view不能干就可以用reshape来处理。在满足tensor连续性条件时,tensor.reshape返回的结果与tensor.view()相同,否则返回的结果与tensor.contiguous().view()相同,事先不能保证返回的是view()的结果还是copy后的结果(可以检查存储地址)
    • PyTorch:view() 与 reshape() 区别详解
    • What’s the difference between reshape and view in pytorch?
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值