关注"AI机器学习与深度学习算法"公众号选择"星标"公众号,原创干货,第一时间送达

从数组、列表对象创建

Numpy Array 数组和 Python List 列表是 Python 程序中间非常重要的数据载体容器,很多数据都是通过 Python 语言将数据加载至 Array 数组或者 List 列表容器,再转换到 Tensor 类型。(为了方便描述,后面将 Numpy Array 数组称为数组,将 Python List 列表称为列表。)

PyTorch 从数组或者列表对象中创建 Tensor 有四种方式:

  • torch.Tensor
  • torch.tensor
  • torch.as_tensor
  • torch.from_numpy
>>> import torch>>> import numpy as np>>> array = np.array([1, 2, 3])>>> list = [4, 5, 6]# 方式一:使用torch.Tensor类>>> tensor_array_a = torch.Tensor(array)>>> tensor_list_a = torch.Tensor(list)>>> print(isinstance(tensor_array_a, torch.Tensor)      , tensor_array_a.type())True torch.FloatTensor

>>> print(isinstance(tensor_list_a, torch.Tensor)      , tensor_list_a.type())True torch.FloatTensor

# 方式二:使用torch.tensor函数>>> tensor_array_b = torch.tensor(array)>>> tensor_list_b = torch.tensor(list)>>> print(isinstance(tensor_array_b, torch.Tensor)      , tensor_array_b.type())True torch.LongTensor

>>> print(isinstance(tensor_list_b, torch.Tensor)      , tensor_list_b.type())True torch.LongTensor

# 方式三:使用torch.as_tensor函数>>> tensor_array_c = torch.as_tensor(array)>>> tensor_list_c = torch.as_tensor(list)>>> print(isinstance(tensor_array_c, torch.Tensor)      , tensor_array_c.type())True torch.LongTensor

>>> print(isinstance(tensor_list_c, torch.Tensor)      , tensor_list_c.type())True torch.LongTensor

# 方式四:使用torch.from_numpy函数>>> tensor_array_d = torch.from_numpy(array)# tensor_list_d = torch.from_numpy(list) error code

>>> print(isinstance(tensor_array_d, torch.Tensor)      , tensor_array_d.type())True torch.LongTensor# print(isinstance(tensor_list_d, torch.Tensor)#       , tensor_list_d.type())

通过上面代码的执行结果可以简单归纳出四种创建 Tensor 方式的差异:

  • 只有 torch.Tensor 是类,其余的三种方式都是函数;
  • torch.Tensor、torch.tensor 和 torch.as_tensor 三种方式可以将数组和列表转换为 Tensor,但是 torch.from_numpy 只能将数组转换为 Tensor(为 torch.from_numpy 函数传入列表,程序会报错);
  • 从程序的输出结果可以看出,四种方式最终都将数组或列表转换为 Tensor(使用 isinstance 返回的结果都为 True),「但是转换后的 Tensor 数据类型却有所不同,在上一小节区分 torch.Tensor 和 torch.tensor 的时候提到过,当接收数据内容时,torch.Tensor 创建的 Tensor 会使用默认的全局数据类型,而 torch.tensor 创建的 Tensor 会使用根据传入数据推断出的数据类型。」 可以通过 torch.get_default_dtype() 来获取当前的全局数据类型,也可以通过 torch.set_default_dtype(torch.XXXTensor) 来设置当前环境默认的全局数据类型;
>>> import torch>>> import numpy as np>>> array = np.array([1, 2, 3])>>> print(array)int64

# 获取当前全局环境的数据类型>>> print(torch.get_default_dtype())torch.float32

# 方式一:使用torch.Tensor类>>> tensor_array_a = torch.Tensor(array)>>> print(tensor_array_a.type())torch.FloatTensor

# 方式二:使用torch.tensor函数>>> tensor_array_b = torch.tensor(array)>>> print(tensor_array_b.type())torch.LongTensor

# 设置当前全局环境的数据类型为torch.DoubleTensor>>> torch.set_default_tensor_type(torch.DoubleTensor)>>> tensor_array_a = torch.Tensor(array)>>> print(tensor_array_a.type())torch.DoubleTensor

>>> tensor_array_b = torch.tensor(array)>>> print(tensor_array_b.type())torch.LongTensor

「PyTorch 默认的全局数据类型为 torch.float32,因此使用 torch.Tensor 类创建 Tensor 的数据类型和默认的全局数据类型一致,为 torch.FloatTensor,而使用 torch.tensor 函数创建的 Tensor 会根据传入的数组和列表中元素的数据类型进行推断,此时 np.array([1, 2, 3]) 数组的数据类型为 int64,因此使用 torch.tensor 函数创建的 Tensor 的数据类型为 torch.LongTensor。」 使用 torch.set_default_tensor_type(torch.DoubleTensor) 更改了默认的全局数据类型之后,使用 torch.Tensor 生成的 Tensor 数据类型会变成更改后的数据类型,而使用 torch.tensor 函数生成的 Tensor 数据类型依然没有改变,「当然可以在使用 torch.tensor 函数创建 Tensor 的时候指定 dtype 参数来生成指定类型的 Tensor。」

PyTorch 提供了这么多方式从数组和列表中创建 Tensor。一般来说,不推荐使用 torch.Tensor 类,因为不仅可以为 torch.Tensor 传入数据还可以传入形状(torch.tensor 只能传入数据,这样单一的功能可以防止出错),当为 torch.Tensor 传入形状时会生成指定形状且包含未初始化数据的 Tensor,如果忘记替换掉这些未初始化的值,直接输入到神经网络中,可能会让神经网络输出 NAN 或者 INF。「如果不考虑性能的话,推荐使用 torch.tensor。如果考虑性能,推荐使用 torch.as_tensor(torch.from_numpy 只能接受数组类型),因为使用 torch.as_tensor 生成的 tensor 会和数组共享内存,从而节省内存的开销。」

Tips:

  1. 增添了自己的理解与看法

  2. 龙良曲深度学习与PyTorch入门实战:https://study.163.com/course/introduction/1208894818.htm

【PyTorch入门笔记】简单回归案例

【PyTorch入门笔记】简单回归案例实战

【PyTorch入门笔记】手写数字问题

【PyTorch入门笔记】基本数据类型

【机器学习入门笔记】11-9 SVM思想解决回归问题

【机器学习入门笔记】什么是决策树?

pytorch list转tensor_PyTorch入门视频笔记从数组、列表对象中创建Tensor相关推荐

  1. 接收list对象_PyTorch入门视频笔记从数组、列表对象中创建Tensor

    关注"AI机器学习与深度学习算法"公众号选择"星标"公众号,原创干货,第一时间送达 从数组.列表对象创建 Numpy Array 数组和 Python List ...

  2. Altium Designer入门学习笔记4:PCB设计中各层的含义

    Altium Designer入门学习笔记4:PCB设计中各层的含义 阻焊层:solder mask,是指板子上要上绿油的部分:因为它是负片输出,所以实际上有solder mask的部分实际效果并不上 ...

  3. Java 虚拟机学习笔记 | 类加载过程和对象的创建流程

    前言 创建对象是 Java 语言绕不开的话题,那么对象是如何创建出来的呢?我们今天就来聊一聊.对象创建第一步就是检查类是否加载,而类的加载又牵扯到类的加载过程.如果单说对象的创建而绕开类的加载过程,感 ...

  4. Vue学习笔记(2) 在html文件中创建Vue实例,并使用http-vue-loader注册单文件组件

    本篇博客基于Vue2.x 官方文档:https://cn.vuejs.org/v2/guide/instance.html 最近和同学合作一个设备信息管理的小项目,而同学找的模板不是前后端分离的 因此 ...

  5. 01 移动的通信制式(点点入门,视频+笔记)

    我是森森,近期想一点点的录制一套安卓的入门教程,这是第一节课,移动通信的制式. 点击打开课程视频 这个G其实是generation的缩写,就是代的意思.3G就是第三代通信技术,4G就是第四代通信技术. ...

  6. dalvik虚拟机与Java区别_05 Android---java虚拟机跟dalvik虚拟机的区别(从01开始点点入门,视频+笔记)...

    大家好,我是森森 这节课我简单给大家介绍一下java虚拟机跟安卓系统虚拟机的区别.可能时间太晚了,有点不在状态,也有点紧张,大家见谅. 05java虚拟机跟dalvik虚拟机的区别 这篇文章重点写一写 ...

  7. 【笔记】学习雷神SpringBoot2零基础入门视频笔记1

    目标 :在网页显示 Holle Spring boot 1. pom.xml  的配置:(pom.xml在项目根目录) 注:配置时在这里一直出错 原因是org.springframework.boot ...

  8. Expression Bland 入门视频(五) 了解对象面板和属性面板

    描述:本节大概的了解一下 Bland 中的对象面板和属性面板,当然你也可以忽略过去,在后面的例题中会时刻的操作这两个面板,届时我们会有更真实的认识. 录制的视频没有经过加工,内容也是天马行空,只适合一 ...

  9. 韩顺平php视频笔记51-52 数组的概念 创建 遍历

    什么是数组:可以用于存放多个数据的数据类型 数组入门案例 优化 数组的一个函数count(数组名) 增加了程序灵活性 数组创建方式1 这与java c等区别很大 实例 改进:使用foreach遍历数组

最新文章

  1. 求1-2+3-4+5......99的所有数的和
  2. 印象笔记电脑版使用技巧_我的印象笔记使用手册(2020)
  3. 12. Java NIO DatagramChannel 数据报通道
  4. mysql分布式安装可靠读写案列图解,高并发下的分布式锁-mysql篇
  5. arduinowifi.send怎么获取响应_Vue3.0 响应式原理 (一)
  6. Byobu:打造多任务的Terminal
  7. 华为2014软件研发实习生面试经历
  8. c语言三个月兴业,c语言输出2015年日历,要求三个月在一行...
  9. 创建一个MDK工程模板
  10. linux更改库文件vfp,VFP数据库修改与删除的基本操作
  11. matlab函数文件||脚本文件和函数文件的区别
  12. 目标检测系列1——Overfeat
  13. 灵芝酸大鼠血清白蛋白纳米粒|茯苓酸小麦麦清白蛋白纳米粒雷公藤内酯醇-牛血清白蛋白纳米粒(TRD-BSA NPs)
  14. 使用Python开发小说下载器,不再为下载小说而发愁
  15. 软考易错知识点(自用)
  16. Mysql-学习笔记汇总
  17. uniapp + vue3微信小程序开发(6)地图展示
  18. 中国大学的现实是:大学层次越低,上课越多,学生读书越少
  19. 用python造数据
  20. 提升代码覆盖率的经验

热门文章

  1. 电力电子Simulink仿真-单相半波整流
  2. UVM学习笔记—前门访问/后门访问
  3. 给定两个很长的数字型字符串,并对它们进行加法运算,注意不是字符串拼接
  4. 联想一键还原系统安装流程记录
  5. u盘工作表在计算机上打不开,U盘中无法开启的excel文件的5种修复方法
  6. 「企业管理」精诚CRM+——一体化管理企业业务流程
  7. SQlite.GridView
  8. 从360手机看互联网大佬们混战智能手机市场意欲何为(1)
  9. I9003的ROOT,偷天换日,GPS搜星,凯立德导航领路人导航201107更新
  10. Java语言-石头剪刀布游戏