inplace=True (原地操作)

article/2025/9/23 22:51:02

Pytorch的很多地方有inplace这个参数,最近遇到的是nn.ReLU(inplace=True)。还有torch.sigmoid_等

inplace默认是False

inplace的含义是是否进行覆盖运算。即改变一个tensor的值的时候,不经过复制操作,而是直接在原来的内存上改变它的值

比如:

x = x +1

即对原值进行操作,然后将得到的值又直接复制到该值中

而不是覆盖运算的例子如:

y = x + 1
x = y

这样就需要花费内存去多存储一个变量y

所以

nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2),
nn.ReLU(inplace=True)

的意思就是对从上层网络Conv2d中传递下来的tensor直接进行修改,这样能够节省运算内存,不用多存储其他变量


注: 产生的计算结果不会有影响。利用inplace计算可以节省内(显)存,同时还可以省去反复申请和释放内存的时间。但是会对原变量覆盖,只要不带来错误就用。


inplace操作

其实inplace操作的概念会更宽泛,很多在原变量上修改的函数如detach_(), require_grad_()都属于inplace操作

inplace=True需要注意的问题

      Pytorch对于inplace操作本身会有一个正确性检查。如果pytorch检测到variable在一个Function中已经被保存用来backward,但是之后它又被in-place operations修改。当这种情况发生时,在backward的时候,pytorch就会报错。这种机制保证了,如果你用了in-place operations,但是在backward过程中没有报错,那么梯度的计算就是正确的。

      所以如果没报错,就可以放心使用

pytorch .detach() .detach_() 和 .data用于切断反向传播 - 慢行厚积 - 博客园

       现在在网上可以看到两种说法,一是inplace=True可以节约显存,应该使用;二是inpalce=True可能会影响训练的时候的梯度传递最好不要用。那到底是怎样的呢?

      inplace操作更加节省内存,但是如果该内存可能被其他变量引用,可能导致计算一致性的问题,存在后效性。考虑到Pytorch中的F.relu函数或者nn.ReLU(inplace=True)层,在使用原地操作前,我们要确定其是贯序(Sequential)结构,而不会存在被其他变量引用的情况

错误使用的例子

例如我们想实现这样一个pipeline

import torch
import torch.nn as nnmy_conv1 = nn.Conv2d(in_channels=2, out_channels=2, kernel_size=3, stride=1, padding=1)
my_relu = nn.ReLU(inplace=True)
my_conv2 = nn.Conv2d(in_channels=2, out_channels=2, kernel_size=3, stride=1, padding=1)x = torch.rand(1,2,3,4)
x1 = my_conv1(x)
h = my_relu(x1)
y = my_conv2(x1)

这样做就是有问题的。因为在x1在经过my_relu之后,其值经过改变,现在其值相当于h

所以 y = my_conv2(x1)在这里,其实相当于y=my_conv2(h)

这样得到的结果就不是我们预期的了。这种情况在多分支(Multi-branch)的网络中很常出现。


http://chatgpt.dhexx.cn/article/tomHBC6r.shtml

相关文章

Pytorch中inplace操作

文章目录 前言Inplace操作概述inplace操作的优缺点常见的inplace操作总结参考链接 前言 之前在写训练代码时,遇到了inplace operation导致的问题,所以就了解了一下pytorch的inplace operation,在此记录一下inplace操作的一些知识。报错信息如…

PyTorch的inplace的理解

inplace的理解 我们平时看到的 nn.ReLU(inplaceTrue)、nn.LeakyReLU(inplaceTrue),这些语句中的inplace是什么意思? inplaceTrue指的是进行原地操作,选择进行原地覆盖运算。 比如 x1则是对原值x进行操作,然后将得到的结果又直接覆…

mysql如何改连接端口号_MYSQL修改端口号

系统:Windows Server 2016 MYSQL版本:5.7.20 1、打开MYSQL根目录查看是否存在my.ini,若不存在,创建一个my.ini文件 复制下面的code到my.ini中 [client] port2512 default-character-setutf8 [mysqld] # 设置为自己MYSQL的安装目录…

Linux如何查询mysql的端口号

Linux如何查询mysql的端口号 如何查询mysql的端口号(使用root): netstat -anp|grep mysql netstat -anp|grep mysql

MAC:查看和更改Mysql端口号(保姆级解决方案)

MAC:查看和更改Mysql端口号 第零步: 进入终端,使用sudo su命令,并输入用户密码开启root高权限 sudo su第一步: 终端输入命令如下,输入密码后进入mysql mysql -u root -p第二步: 输入命令(…

查看 mysql端口 和进程_mysql 端口号(怎么查看mysql的端口号)

mysql 端口号(怎么查看mysql的端口号) 2020-05-07 21:54:58 共10个回答 如何查看mysql的端口号 --输入以下命令:SHOWVARIABLESWHEREVARIABLE_NAMEport就可以查看当前连接的端口号,--例如:mysql>SHOWVARIABLESWHEREVARIABLE_NAMEport; mysql的默认端口号是多少 mysql默认端口…

mysql有多少个端口号_mysql默认端口号(mysql端口号是多少)

mysql默认端口号(mysql端口号是多少) 2020-05-07 22:14:36 共10个回答 mysql的默认端口号是多少 mysql默认端口号为3306,修改端口号方法:修改配置文件/etc/my.cnf mysql使用的默认端口号是哪个端口 mysql的默认端口是3306,可以编辑用户目录下的.my.cnf文件进行修改.sqlserver默…

linux mysql修改端口号

1.登陆MySQL数据库 mysql -u root -p 2.输入show global variables like port;查看当前端口号 mysql> show global variables like port; Ps:port后面的值就是当前端口号 3.修改mysql配置文件,一般是在/etc/my.cnf,早期版本有可能是my.conf文件…

宝塔面板修改mysql端口号

为了站点安全起见,常用端口都建议修改,那么宝塔面板的Mysql端口需要怎么修改呢? 1、 找到软件商店-运行环境-Mysql-的设置菜单 2、打开后选择端口选项,将默认的3306改为自定义端口。 3、改完端口后记得在安全菜单中放行修改后的…

mysql有多少个端口号_查看mysql端口号(mysql端口号是多少)

查看mysql端口号(mysql端口号是多少) 2020-05-07 22:11:45 共10个回答 如何查看mysql的端口号 1使用命令showglobalvariableslikeport;查看端口号2修改端口,编辑/etc/my.cnf文件,早期版本有可能是my.conf文件名,增加端口参数,并且设定端口,注意该端口未被使用,保存退出.总结:注…

【修改MySQL端口号(没有my.ini文件)详细图解】

修改MySQL端口号(没有my.ini文件) 前置方案安装服务方案 前置方案 PS:修改MySQL端口号,网上大部分都是修改my.ini文件 有my.ini文件的参考地址 安装服务方案 对于没有my.ini文件使用如下步骤: 1,已安装M…

Docker部署项目更改Mysql端口号

问题情景: 师弟在阿里云服务器上通过Tomcat部署java Web项目 程序端口8080 mysql端口3306 我通过Dokcer部署了前后端分离项目,为了避免端口冲突,服务器6612:3306映射端口。 本以为需要在java后端配置文件中更改url为&#xff1…

linux下查看mysql端口号和修改端口号方法

一、查看端口号 1、登录mysql [rootlocalhost ~]# mysql -uroot -p Enter password: 输入数据库密码; 2、使用show global variables like port; 命令查看端口号, 3307即为当前端口号。 二、修改mysql端口号 1、编辑/etc/my.cnf文件 [rootlocalhost ~]# vi /…

linux下修改mysql端口号

1.登录mysql mysql -u root -p 2.查看当前端口号 show global variables like port; 3.修改端口 vim /etc/my.cnf 4. 增加或修改端口参数,然后保存退出 port3308 5.重启mysql service mysqld restart 6.查看mysql状态 systemctl status mysqld 7.阿里云上安全…

如何修改mysql占用的端口号_修改mysql端口号(mysql的端口号)

修改mysql端口号(mysql的端口号) 2020-05-07 22:12:00 共10个回答 如何查看mysql默认端口号和修改端口号 登录mysql,使用命令showglobalvariableslikeport;查看端口号修改端口在配置文件my.ini,修改后重新启动.[mysqld]port3506 如何修改修改mysql默认端口号3306 在配置文件my.…

虚拟机查看MySQL端口号

先进入MySQL mysql -hhadoop102 -uroot -p 再查看端口号 show variables like ‘port’;

mysql怎么看端口号_mysql端口号(怎么查看mysql的端口号)

mysql端口号(怎么查看mysql的端口号) 2020-05-07 21:54:58 共10个回答 如何查看mysql的端口号 1使用命令showglobalvariableslikeport;查看端口号2修改端口,编辑/etc/my.cnf文件,早期版本有可能是my.conf文件名,增加端口参数,并且设定端口,注意该端口未被使用,保存退出.总结:注…

mysql默认端口号_什么是MySQL默认端口号?

mysql默认端口号 MySQL is very popular database in the opensource community. While developing applications or connecting MySQL database we need to specify the MySQL port implicitly or explicitly. In this tutorial we will learn MySQL default port number and …

任意进制之间的转换(Java使用自带方法)

做国赛的题需要实现数字k进制之间的转换&#xff08;2<k<36&#xff09;上网搜了实现的方法&#xff1a; 博客的地址&#xff1a;就是这里&#xff01; public class BinaryTest {//设置字符数组//可以添加任意不重复字符&#xff0c;提高能转换的进制的上限static char…

java中的进制转换及转换函数

Java的进制转换 进制转换原理 十进制 转 二进制&#xff1a; 原理: 对十进制数进行除 2 运算取余。 6 --> 110 二进制 转 十进制 原理: 二进制 乘以 2 的n次幂 的过程 110 ->0*20 1*21 1 * 22 0 2 46 0 0 1 1 0 1 0 1 128 64 32 16 8 4 2 1 53 当 8个bi…