PyTorch之nn.ReLU與F.ReLU的區(qū)別介紹
我就廢話不多說了,大家還是直接看代碼吧~
import torch.nn as nn
import torch.nn.functional as F
import torch.nn as nn
class AlexNet_1(nn.Module):
def __init__(self, num_classes=n):
super(AlexNet, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 64, kernel_size=3, stride=2, padding=1),
nn.BatchNorm2d(64),
nn.ReLU(inplace=True),
)
def forward(self, x):
x = self.features(x)
class AlexNet_2(nn.Module):
def __init__(self, num_classes=n):
super(AlexNet, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 64, kernel_size=3, stride=2, padding=1),
nn.BatchNorm2d(64),
)
def forward(self, x):
x = self.features(x)
x = F.ReLU(x)
在如上網(wǎng)絡(luò)中,AlexNet_1與AlexNet_2實現(xiàn)的結(jié)果是一致的,但是可以看到將ReLU層添加到網(wǎng)絡(luò)有兩種不同的實現(xiàn),即nn.ReLU和F.ReLU兩種實現(xiàn)方法。
其中nn.ReLU作為一個層結(jié)構(gòu),必須添加到nn.Module容器中才能使用,而F.ReLU則作為一個函數(shù)調(diào)用,看上去作為一個函數(shù)調(diào)用更方便更簡潔。具體使用哪種方式,取決于編程風(fēng)格。
在PyTorch中,nn.X都有對應(yīng)的函數(shù)版本F.X,但是并不是所有的F.X均可以用于forward或其它代碼段中,因為當(dāng)網(wǎng)絡(luò)模型訓(xùn)練完畢時,在存儲model時,在forward中的F.X函數(shù)中的參數(shù)是無法保存的。
也就是說,在forward中,使用的F.X函數(shù)一般均沒有狀態(tài)參數(shù),比如F.ReLU,F(xiàn).avg_pool2d等,均沒有參數(shù),它們可以用在任何代碼片段中。
補充知識:pytorch小知識點——in-place operation
一、什么是in-place
在pytorch的很多函數(shù)中經(jīng)??吹絠n-place選項,具體是什么意思一直一知半解。這次專門來學(xué)習(xí)一下,in-place operation在pytorch中是指改變一個tensor的值的時候,不經(jīng)過復(fù)制操作,而是直接在原來的內(nèi)存上改變它的值。可以把它稱為原地操作符。
在pytorch中經(jīng)常加后綴“_”來代表原地in-place operation,比如說.add_() 或者.scatter()。我們可以將in_place操作簡單的理解類似于python中的"+=","-="等操作。
舉個例子,下面是正常的加操作,執(zhí)行結(jié)束后x的值沒有變化
import torch x = torch.rand(2) x Out[3]: tensor([0.3486, 0.2924]) #<-----這是x初始值 y = torch.rand(2) y Out[5]: tensor([0.6301, 0.0101]) #<-----這是y初始值 x.add(y) Out[6]: tensor([0.9788, 0.3026]) #<-----這是x+y的結(jié)果 x Out[7]: tensor([0.3486, 0.2924]) #<-----這是執(zhí)行操作之后x的值 y Out[8]: tensor([0.6301, 0.0101]) #<-----這是執(zhí)行操作之后y的值
我們可以發(fā)現(xiàn),在正常操作之后原操作數(shù)的值不會發(fā)生變化。
下面我們來看看in_place操作
import torch x = torch.rand(2) x Out[3]: tensor([0.3486, 0.2924]) #<-----這是x初始值 y = torch.rand(2) y Out[5]: tensor([0.6301, 0.0101]) #<-----這是y初始值 x.add_(y) Out[9]: tensor([0.9788, 0.3026]) #<-----這是x+y結(jié)果 x Out[10]: tensor([0.9788, 0.3026]) #<-----這是操作后x的值 y Out[11]: tensor([0.6301, 0.0101]) #<-----這是操作后y的值
通過對比可以發(fā)現(xiàn),in_place操作之后,原操作數(shù)等于表達(dá)式計算結(jié)果。也就是說將計算結(jié)果賦給了原操作數(shù)。
二、不能使用in-place的情況
對于 requires_grad=True 的 葉子張量(leaf tensor) 不能使用 inplace operation
對于在 求梯度階段需要用到的張量 不能使用 inplace operation
以上這篇PyTorch之nn.ReLU與F.ReLU的區(qū)別介紹就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python Requests爬蟲之求取關(guān)鍵詞頁面詳解
這篇文章主要為大家詳細(xì)介紹了Python Requests爬蟲之求取關(guān)鍵詞頁面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-02-02
django框架實現(xiàn)模板中獲取request 的各種信息示例
這篇文章主要介紹了django框架實現(xiàn)模板中獲取request 的各種信息,結(jié)合實例形式分析了Django框架模板直接獲取request信息的相關(guān)配置與操作技巧,需要的朋友可以參考下2019-07-07
pandas中concat函數(shù)實現(xiàn)橫向連接
在pandas中,concat函數(shù)可用于合并不同的Series和DataFrame對象,本文主要介紹了pandas中concat函數(shù)實現(xiàn)橫向連接,具有一定的參考價值,感興趣的可以了解一下2024-04-04
python中os.stat().st_size、os.path.getsize()獲取文件大小
本文介紹了使用os.stat()和os.path.getsize()函數(shù)獲取文件大小,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01
python中的hashlib和base64加密模塊使用實例
這篇文章主要介紹了python中的hashlib和base64加密模塊使用實例,hashlib模塊支持的加密算法有md5 sha1 sha224 sha256 sha384 sha512,需要的朋友可以參考下2014-09-09

