单精度,双精度和精度(转载)

本文深入探讨了浮点数的不同精度类型,包括双精度、单精度和半精度,重点介绍了半精度浮点数的起源、用途及布局。通过对比三种浮点数的结构,解析了它们的表示规则,并讨论了在深度学习等场景中使用半精度浮点数的优势。

浮点数是计算机上最常用的数据类型之一,有些语言甚至数值只有浮点型(Perl,Lua同学别跑,说的就是你)。

常用的浮点数有双精度和单精度。除此之外,还有一种叫半精度的东东。

双精度64位,单精度32位,半精度自然是16位了。

半精度是英伟达在2002年搞出来的,双精度和单精度是为了计算,而半精度更多是为了降低数据传输和存储成本。

很多场景对于精度要求也没那么高,例如分布式深度学习里面,如果用半精度的话,比起单精度来可以节省一半传输成本。考虑到深度学习的模型可能会有几亿个参数,使用半精度传输还是非常有价值的。

Google的TensorFlow就是使用了16位的浮点数,不过他们用的不是英伟达提出的那个标准,而是直接把32位的浮点数小数部分截了。据说是为了less computation expensive。。。

比较下几种浮点数的layout:

双精度浮点数

单精度浮点数

半精度浮点数

它们都分成3部分,符号位,指数和尾数。不同精度只不过是指数位和尾数位的长度不一样。

解析一个浮点数就5条规则

如果指数位全零,尾数位是全零,那就表示0
如果指数位全零,尾数位是非零,就表示一个很小的数(subnormal),计算方式 (−1)^signbit × 2^−126 × 0.fractionbits
如果指数位全是1,尾数位是全零,表示正负无穷
如果指数位全是1,尾数位是非零,表示不是一个数NAN
剩下的计算方式为 (−1)^signbit × 2^(exponentbits−127) × 1.fractionbits
常用的语言几乎都不提供半精度的浮点数,这时候需要我们自己转化

原文地址:https://blog.youkuaiyun.com/sinat_24143931/article/details/78557852

<think>好的,我现在需要帮用户逐行解释这段Python代码。首先,用户提供的代码是类的__init__方法,可能属于一个PyTorch模型或数据处理类。我要确保自己理解每一行代码的作用,并用清晰的中文解释出来。 首先看第一行:xy = np.loadtxt('data.csv', delimiter=',', dtype=np.float32)。这里用到了numpy的loadtxt函数来读取CSV文件。我需要说明这个函数的作用,参数delimiterdtype的意义,以及加载后的数据形式。可能用户需要知道数据是如何被导入的,以及为什么要用float32类型。 接下来是self.len = xy.shape[0]。shape[0]应该是指数据的行数,也就是样本数量。需要解释shape属性的各个维度的含义,并说明这里获取的是样本总数,保存到实例变量len中。 然后是self.data_input = torch.from_numpy(xy[:, 0:-1])。这里将numpy数组转换为PyTorch张量。需要解释切片操作xy[:, 0:-1]的含义,即取所有行,列从0到倒数第二列,作为输入特征。同时要提到torch.from_numpy的作用,以及默认的数据类型是否numpy一致,或者是否需要转换。 接下来是self.label = torch.from_numpy(xy[:, [-1]])。同样转换为张量,但这里取的是最后一列作为标签。注意用户代码中使用的是xy[:,[-1]],双括号可能是为了保持维度,避免变成一维数组。需要解释这样做的目的,即保持二维形状(比如n行1列),这对某些模型可能是必要的。 还要注意整个代码可能是在一个神经网络模型的类中,用于初始化数据。需要指出可能的错误点,比如文件路径是否正确,数据是否存在,以及数据类型是否正确转换。此外,是否需要处理数据归一化或划分训练测试集?但用户提供的代码中没有这部分,所以可能不需要提及,除非用户有后续问题。 可能的疑问点包括:为什么用np.float32而不是更高的精度?可能是因为在深度学习中使用单精度浮点数更快,占内存更少。还有,torch.from_numpy返回的张量是否numpy共享内存?是的,但用户可能需要注意如果之后修改了numpy数组,张量也会变化,但在这个代码中,因为数据加载后直接转换,可能不会有这个问题。 需要确保解释清晰,每行代码的作用、参数含义、转换原因都说明到位。同时,用户可能希望知道这段代码在整个模型训练流程中的作用,比如数据准备阶段。是否需要提到这些张量会被用来作为模型的输入标签?可能的话,可以简要说明。 最后,检查是否有遗漏的细节,比如版权声明原文链接,用户可能希望确认代码的来源是否可靠,但可能不需要在解释中提及这些,除非用户特别询问。</think>以下是对这段代码的逐行解释: ```python def __init__(self): # 从CSV文件加载数据,使用逗号分隔符,数据类型为32位浮点数 # 返回的xy是二维numpy数组,格式为[样本数, 特征数+标签] xy = np.loadtxt('data.csv', delimiter=',', dtype=np.float32) # 获取数据集总样本数:xy.shape返回(行数,列数),shape[0]即行数 self.len = xy.shape[0] # 提取输入特征:所有行的第0到倒数第二列(切片语法0:-1) # torch.from_numpy将numpy数组转换为PyTorch张量 # 结果维度为[样本数, 特征数] self.data_input = torch.from_numpy(xy[:, 0:-1]) # 提取标签数据:所有行的最后一列([-1]保持二维结构) # 使用双括号[ [-1] ]是为了保持二维形状(n,1)而不是一维(n,) # 结果维度为[样本数, 1] self.label = torch.from_numpy(xy[:, [-1]]) ``` 关键细节说明: 1. 数据加载:`np.loadtxt`默认跳过空行以`#`开头的注释行 2. 维度保持:`xy[:,[-1]]`比`xy[:,-1]`多保留一个维度,避免降维 3. 自动类型转换:`torch.from_numpy`会继承numpy数组的数据类型(此处为float32) 4. 内存共享:生成的PyTorch张量与原始numpy数组共享内存,修改其中一个会影响另一个 典型应用场景:这段代码通常出现在PyTorch自定义Dataset类中,用于: 1. 数据加载与预处理 2. 特征与标签分离 3. 转换为PyTorch张量供神经网络直接使用 注意事项: 1. 文件路径:需确保data.csv位于当前工作目录 2. 数据规范:建议在加载后进行归一化/标准化处理 3. 数据集划分:通常需要添加训练集/测试集分割逻辑 4. 数据类型:float32适合大多数深度学习任务,可降低内存消耗
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值