-
少用
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.data
或tensor.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-
为什么要有
tensor.is_contiguous()
这个判断?- Pytorch中的有些操作并没有返回真实tensor的copy,而只是与原始tensor共享内存,用indices的形式来获取tensor中的元素,如
narrow()
,view()
,expand()
andtranspose()
- Pytorch提供
tensor.data_ptr()
来返回tensor首元素的内存地址 - Python提供
tensor.storage()
来返回tensor存储区地址
- Pytorch中的有些操作并没有返回真实tensor的copy,而只是与原始tensor共享内存,用indices的形式来获取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?
Pytorch学习笔记-Basic Data Type基本数据类型
最新推荐文章于 2024-10-13 10:46:52 发布
