torch中的copy()和clone()

torch中的copy()和clone()

1、torch中的copy()和clone()

y = torch.Tensor(2,2):copy(x)    ---

这里写图片描述
修改y并不改变原来的x

y = x:clone()

这里写图片描述

修改y也不改变x

y = x

这里写图片描述
修改y这个时候就开始改变x了
注意,官网中Returns a clone of a tensor. The memory is copied.内存被复制,也即重新分配了一份内存个y,所以y改变x不改变,对于copy是一样的.copy允许复制的维度不一样,但是元素个数必须是相同的。
对于Python中的深浅拷贝之类的,看连接链接
Python中的拷贝来讲,例子如下
这里写图片描述

对于数字赋值和列表赋值是有很大区别的
这里写图片描述
torch中对于直接赋值的这种操作一定要小心,先看看是不是需要直接赋值,还是重新开辟一块内存来存放
2
torch中的type()函数,如果没有传入参数,表示查看Tensor的数据类型
如果传入了参数,表示将Tensor转换为想要的数据类型,数据类型由参数来指定

3 torch中的image的scale函数也是输入参数不同最后的scale方法也是不同的,参考下图说明这里写图片描述

4、torch中的Tensor所有操作例如narrow等操作,都是在原来的Tensor的基础上进行的,所以如果想要真正的复制一个Tensor就用copy和clone,如果用narrow这种操作之后经常会导致内存不连续,导致后面很多操作失效,这时候用copy和clone复制一下即可。

### PyTorch 中 `tensor.clone()` 的用法与行为 `tensor.clone()` 是 PyTorch 提供的一个方法,用于创建张量的副本。该方法返回一个新的张量对象,其数据完全独立于原始张量[^1]。以下是关于此方法的一些重要特性使用场景: #### 1. 数据复制 当调用 `clone()` 方法时,它会创建一个具有相同数据的新张量,并将其存储在内存中的新位置上。这意味着修改克隆后的张量不会影响到原来的张量。 ```python import torch original_tensor = torch.tensor([1, 2, 3]) cloned_tensor = original_tensor.clone() print(original_tensor) # 输出: tensor([1, 2, 3]) print(cloned_tensor) # 输出: tensor([1, 2, 3]) cloned_tensor[0] = 99 print(original_tensor) # 输出: tensor([1, 2, 3]) 不受影响 print(cloned_tensor) # 输出: tensor([99, 2, 3]) 被修改 ``` #### 2. 计算图保留 如果原张量需要梯度计算(即 `.requires_grad=True`),那么通过 `clone()` 创建的张量也会继承这一属性。这使得克隆后的张量可以参与反向传播过程。 ```python x = torch.tensor([1.], requires_grad=True) y = x.clone() z = y * 2 z.backward() print(x.grad) # 输出: tensor([2.]), 原始张量也接收到梯度 ``` #### 3. 设备一致性 `clone()` 方法会在相同的设备上创建新的张量实例。如果希望将张量移动到另一个设备,则需显式指定目标设备。 ```python if torch.cuda.is_available(): device = 'cuda' else: device = 'cpu' gpu_tensor = torch.tensor([1, 2, 3]).to(device).clone() print(gpu_tensor.device) # 输出当前使用的设备信息 ``` #### 4. 应用场景 - **防止意外更改**: 当传递张量作为函数参数或将张量赋值给多个变量时,为了避免无意间改变原始数据,可先对其进行克隆。 - **模型权重备份**: 在训练过程中可能需要保存某些时刻的模型状态以便后续比较或者恢复;此时可以用 `state_dict().clone()` 来实现深拷贝[^2]。 注意,在实际应用中应考虑性能开销,因为每次调用都会分配额外的内存空间来储存完整的数据副本[^3]。 --- ### 示例代码展示如何正确运用 `clone()` 下面给出一段综合性的例子说明上述要点: ```python def modify_and_compare(tensor_a): modified_copy = tensor_a.clone() modified_copy += 5 return modified_copy initial_data = torch.arange(4., dtype=torch.float32) modified_result = modify_and_compare(initial_data) assert not torch.equal(modified_result, initial_data), "Cloning failed to isolate changes" print("Original:", initial_data) # Original values remain unchanged. print("Modified Copy:", modified_result) # Modified copy reflects addition operation only on its own data. ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值