当前位置: 首页 > news >正文

pytorch 中 view 和reshape的区别

 

在 PyTorch(一个流行的深度学习框架)中,

reshapeview 都是用于改变张量(tensor)形状的方法,但它们在实现方式和使用上有一些区别。下面是它们之间的主要区别:

  1. 实现方式:

    • reshape: reshape 方法创建一个新的张量,其元素与原始张量共享内存空间。这意味着改变形状后,原始张量和新的张量将共享相同的数据存储,所以在一个张量上的修改会影响到另一个张量。
    • view: view 方法并不会创建一个新的张量,而是返回一个与原始张量共享数据存储的新视图(view)。如果原始张量和新的视图张量上的元素被修改,它们会互相影响,因为它们共享相同的数据。
  2. 支持条件:

    • reshape: 可以用于任意形状的变换,但需要确保变换前后元素总数保持一致,否则会抛出错误。
    • view: 只能用于支持大小相同的变换,也就是变换前后元素总数必须保持不变。这是因为 view 并不改变数据的存储,所以必须保持数据总量不变,否则会抛出错误。
  3. 内存连续性

    • reshape: 不保证新张量在内存中的连续性,即可能导致新张量的元素在内存中的存储顺序与原始张量不同。
    • view: 如果原始张量在内存中是连续存储的,那么新视图张量也会保持连续性,否则会返回一个不连续的张量。
  4. 是否支持自动计算维度:

    • reshape: 可以通过将某个维度指定为-1,让 PyTorch 自动计算该维度的大小。
    • view: 不支持将维度指定为-1,需要手动计算新视图张量的大小。当对不连续的张量进行形状变换时,PyTorch 会自动将其复制为连续的张量,这可能会导致额外的内存开销。为了避免这种情况,你可以使用 contiguous() 方法将张量变为连续的。例如:x.contiguous().view(3, 4)
    import torch# 原始张量
    x = torch.arange(12)# 使用 reshape
    x_reshaped = x.reshape(3, 4)  # 创建一个新的形状为(3, 4)的张量
    x_reshaped[0, 0] = 100  # 修改新张量的元素会影响到原始张量
    print(x)  # 输出 tensor([100,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11])
    print(x_reshaped)  # 输出 tensor([[100,   1,   2,   3], [  4,   5,   6,   7], [  8,   9,  10,  11]])# 使用 view
    x_viewed = x.view(3, 4)  # 创建一个新的形状为(3, 4)的张量视图
    x_viewed[0, 1] = 200  # 修改视图张量的元素会影响到原始张量
    print(x)  # 输出 tensor([100, 200,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11])
    print(x_viewed)  # 输出 tensor([[100, 200,   2,   3], [  4,   5,   6,   7], [  8,   9,  10,  11]])# 使用 view 自动计算维度大小
    x_auto_viewed = x.view(3, -1)  # 可以将某个维度指定为-1,让 PyTorch 自动计算大小
    print(x_auto_viewed)  # 输出 tensor([[100, 200,   2,   3], [  4,   5,   6,   7], [  8,   9,  10,  11]])# 由于 x_auto_viewed 是连续的,所以修改它也会影响原始张量 x
    x_auto_viewed[2, 2] = 300
    print(x)  # 输出 tensor([100, 200,   2,   3,   4,   5,   6,   7,   8,   9, 300,  11])
    
http://www.lryc.cn/news/101568.html

相关文章:

  • 认识数组指针
  • SSM面试题-Spring容器的启动流程
  • Vue 3:玩一下web前端技术(八)
  • AI绘画Stable Diffusion原理之Autoencoder-Latent
  • C++核心知识点总结
  • echart折线图,调节折线点和y轴的间距(亲测可用)
  • Power BI-云端报表定时刷新--ODBC、MySQL、Oracle等其他本地数据源的刷新(二)
  • redis 淘汰策略和持久化
  • Redis学习路线(6)—— Redis的分布式锁
  • 一、创建自己的docker python容器环境;支持新增python包并更新容器;离线打包、加载image
  • 【Git】git企业开发命令整理,以及注意点
  • 使用Django自带的后台管理系统进行数据库管理的实例
  • leetcode解题思路分析(一百四十五)1254 - 1266 题
  • 使用 GORM 连接数据库并实现增删改查操作
  • kafka集群搭建(Linux环境)
  • 树莓派本地快速搭建web服务器,并发布公网访问
  • 集合中的数据结构
  • CentOS 8 错误: Error setting up base repository
  • java外观模式
  • 3秒快速打开 jupyter notebook
  • 数据安全
  • 华为nat64配置
  • 从分片传输到并行传输之大文件传输加速技术
  • mybatisPlus入门篇
  • NineData支持最受欢迎数据库PostgreSQL
  • Redis配置类
  • 【前端知识】React 基础巩固(三十六)——RTK中的异步操作
  • 33. 本地记事本
  • Android Glide预处理preload原始图片到成品resource 预加载RecyclerViewPreloader,Kotlin
  • 亚马逊云科技全新Amazon Bedrock,助力客户构建生成式AI应用