91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PyTorch之nn.ReLU與F.ReLU的區別是什么

發布時間:2020-06-28 11:50:36 來源:億速云 閱讀:332 作者:清晨 欄目:開發技術

這篇文章將為大家詳細講解有關PyTorch之nn.ReLU與F.ReLU的區別是什么,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

我就廢話不多說了,大家還是直接看代碼吧~

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)

在如上網絡中,AlexNet_1與AlexNet_2實現的結果是一致的,但是可以看到將ReLU層添加到網絡有兩種不同的實現,即nn.ReLU和F.ReLU兩種實現方法。

其中nn.ReLU作為一個層結構,必須添加到nn.Module容器中才能使用,而F.ReLU則作為一個函數調用,看上去作為一個函數調用更方便更簡潔。具體使用哪種方式,取決于編程風格。

在PyTorch中,nn.X都有對應的函數版本F.X,但是并不是所有的F.X均可以用于forward或其它代碼段中,因為當網絡模型訓練完畢時,在存儲model時,在forward中的F.X函數中的參數是無法保存的。

也就是說,在forward中,使用的F.X函數一般均沒有狀態參數,比如F.ReLU,F.avg_pool2d等,均沒有參數,它們可以用在任何代碼片段中。

補充知識:pytorch小知識點——in-place operation

一、什么是in-place

在pytorch的很多函數中經常看到in-place選項,具體是什么意思一直一知半解。這次專門來學習一下,in-place operation在pytorch中是指改變一個tensor的值的時候,不經過復制操作,而是直接在原來的內存上改變它的值。可以把它稱為原地操作符。

在pytorch中經常加后綴“_”來代表原地in-place operation,比如說.add_() 或者.scatter()。我們可以將in_place操作簡單的理解類似于python中的"+=","-="等操作。

舉個例子,下面是正常的加操作,執行結束后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的結果
x
Out[7]: tensor([0.3486, 0.2924])  #<-----這是執行操作之后x的值
y
Out[8]: tensor([0.6301, 0.0101])   #<-----這是執行操作之后y的值

我們可以發現,在正常操作之后原操作數的值不會發生變化。

下面我們來看看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結果
x
Out[10]: tensor([0.9788, 0.3026]) #<-----這是操作后x的值
y
Out[11]: tensor([0.6301, 0.0101])  #<-----這是操作后y的值

通過對比可以發現,in_place操作之后,原操作數等于表達式計算結果。也就是說將計算結果賦給了原操作數。

二、不能使用in-place的情況

對于 requires_grad=True 的 葉子張量(leaf tensor) 不能使用 inplace operation

對于在 求梯度階段需要用到的張量 不能使用 inplace operation

關于PyTorch之nn.ReLU與F.ReLU的區別是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

香河县| 大姚县| 岱山县| 和林格尔县| 怀集县| 乌什县| 张北县| 手机| 雷山县| 郁南县| 抚顺市| 满城县| 米易县| 保康县| 鹿邑县| 巴青县| 青冈县| 保靖县| 苗栗县| 大庆市| 鄄城县| 赫章县| 夏河县| 万全县| 怀柔区| 盐山县| 北安市| 兴和县| 大田县| 新沂市| 阜平县| 视频| 甘谷县| 庄浪县| 汨罗市| 瑞昌市| 南靖县| 秦皇岛市| 苗栗市| 乳山市| 兴化市|