python - 使用pytorch进行反向传播的两个操作有什么区别?
问题描述
我有一个张量 x 和x.shape=(batch_size,10)
我想向所有元素添加一个,并进行两种不同的操作
x=x+1
for i in range(0,batch_size): x[i]=x[i]+1
这两个操作我得到了相同的张量,但是当我调用 时loss.backward()
,(2)在反向传播中比(1)花费更多的时间。
他们有什么区别???
解决方案
这是可以预料的。首先,转发也慢很多:通过for
循环,Pythonbatch_size
将以下请求分派给 PyTorch:
- 获取
i
第一个元素x
- 加 1
- 用增加的值更新
i
的元素x
Python 很慢。在第二版中,Python 向 PyTorch 发送一条消息“到处添加 1”。PyTorch 比 Python 快得多(更不用说它的 GPU 加速能力了)。这要归功于称为矢量化的技术,它并不特定于 PyTorch,而是基本上所有 Python(和许多其他)数学包。
其次,对于您的后向,PyTorch 需要跟踪发生在它们身上的所有操作x
并通过它们进行反向传播。在第一种情况下,有batch_size
它们,在第二种情况下,只有一个。再次,矢量化获胜。
推荐阅读
- java - Morphia:将 MongoDb 文档检索为 java 对象
- bash - 使用函数检查 bash 环境变量是否存在
- google-cloud-platform - 当 orderer/peer 查找 .pem 文件时,Hyperledger 2.0.1 中的反斜杠问题
- javascript - jQuery 数据表显示太慢 - 10,000 行(客户端)
- github - Github Actions 是否适合运行 JMH 等基准测试?
- r - R dplyr 在选择后再次使用所有列
- email - 邮件卡在 OWA 草稿中(新安装的 Exchange Server 2019)
- reactjs - 当我尝试在具有反应的 ionic 中播放视频时,会发生此错误“cordova_not_available”
- authentication - 如何设置身份验证以使用密钥访问谷歌云外部 IP
- python - Python为什么numpy linspace让我在两个差异不均匀的整数之间浮动