最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Pytorch中的model.train()?和?model.eval()?原理與用法解析

 更新時間:2025年07月24日 09:58:50   作者:專注于計算機視覺的AndyJiang  
pytorch可以給我們提供兩種方式來切換訓(xùn)練和評估(推斷)的模式,分別是:model.train()?和?model.eval(),這篇文章主要介紹了Pytorch中的model.train()?和?model.eval()?原理與用法,需要的朋友可以參考下

Pytorch中的model.train() 和 model.eval() 原理與用法

一、兩種模式

pytorch可以給我們提供兩種方式來切換訓(xùn)練和評估(推斷)的模式,分別是:model.train()model.eval()。

一般用法是:在訓(xùn)練開始之前寫上 model.trian() ,在測試時寫上 model.eval() 。

二、功能

1. model.train()

在使用 pytorch 構(gòu)建神經(jīng)網(wǎng)絡(luò)的時候,訓(xùn)練過程中會在程序上方添加一句model.train(),作用是 啟用 batch normalization 和 dropout

如果模型中有BN層(Batch Normalization)和 Dropout ,需要在 訓(xùn)練時 添加 model.train()。

model.train() 是保證 BN 層能夠用到 每一批數(shù)據(jù) 的均值和方差。對于 Dropout,model.train() 是 隨機取一部分 網(wǎng)絡(luò)連接來訓(xùn)練更新參數(shù)。

2. model.eval()

model.eval()的作用是 不啟用 Batch Normalization 和 Dropout。

如果模型中有 BN 層(Batch Normalization)和 Dropout,在 測試時 添加 model.eval()。

model.eval() 是保證 BN 層能夠用 全部訓(xùn)練數(shù)據(jù) 的均值和方差,即測試過程中要保證 BN 層的均值和方差不變。對于 Dropout,model.eval() 是利用到了 所有 網(wǎng)絡(luò)連接,即不進行隨機舍棄神經(jīng)元。

為什么測試時要用 model.eval() ?

訓(xùn)練完 train 樣本后,生成的模型 model 要用來測試樣本了。在 model(test) 之前,需要加上model.eval(),否則的話,有輸入數(shù)據(jù),即使不訓(xùn)練,它也會改變權(quán)值。這是 model 中含有 BN 層和 Dropout 所帶來的的性質(zhì)。

eval() 時,pytorch 會自動把 BN 和 DropOut 固定住,不會取平均,而是用訓(xùn)練好的值。
不然的話,一旦 test 的 batch_size 過小,很容易就會被 BN 層導(dǎo)致生成圖片顏色失真極大。
eval() 在非訓(xùn)練的時候是需要加的,沒有這句代碼,一些網(wǎng)絡(luò)層的值會發(fā)生變動,不會固定,你神經(jīng)網(wǎng)絡(luò)每一次生成的結(jié)果也是不固定的,生成質(zhì)量可能好也可能不好。

也就是說,測試過程中使用model.eval(),這時神經(jīng)網(wǎng)絡(luò)會 沿用 batch normalization 的值,而并 不使用 dropout

3. 總結(jié)與對比

如果模型中有 BN 層(Batch Normalization)和 Dropout,需要在訓(xùn)練時添加 model.train(),在測試時添加 model.eval()。

其中 model.train() 是保證 BN 層用每一批數(shù)據(jù)的均值和方差,而 model.eval() 是保證 BN 用全部訓(xùn)練數(shù)據(jù)的均值和方差;

而對于 Dropout,model.train() 是隨機取一部分網(wǎng)絡(luò)連接來訓(xùn)練更新參數(shù),而 model.eval() 是利用到了所有網(wǎng)絡(luò)連接。

三、Dropout 簡介

dropout 常常用于抑制過擬合。

設(shè)置Dropout時,torch.nn.Dropout(0.5),這里的 0.5 是指該層(layer)的神經(jīng)元在每次迭代訓(xùn)練時會隨機有 50% 的可能性被丟棄(失活),不參與訓(xùn)練。也就是將上一層數(shù)據(jù)減少一半傳播。

參考鏈接

  1. PyTorch中train()方法的作用是什么
  2. 【pytorch】model.train()和model.evel()的用法
  3. pytorch中net.eval() 和net.train()的使用
  4. Pytorch學(xué)習(xí)筆記11----model.train()與model.eval()的用法、Dropout原理、relu,sigmiod,tanh激活函數(shù)、nn.Linear淺析、輸出整個tensor的方法
  5. 好文:Pytorch:model.train()和model.eval()用法和區(qū)別,以及model.eval()和torch.no_grad()的區(qū)別

補充:pytroch:model.train()、model.eval()的使用

前言:最近在把兩個模型的代碼整合到一起,發(fā)現(xiàn)有一個模型的代碼整合后性能大不如前,但基本上是源碼遷移,找了一天原因才發(fā)現(xiàn)是因為model.eval()和model.train()放錯了位置!?。」试诖私榻B一下pytroch框架下model.train()、model.eval()的作用和不同點。

一、model.train、model.eval

1.model.train和model.eval放在代碼什么位置

簡單的說:model.train放在網(wǎng)絡(luò)訓(xùn)練前,model.eval放在網(wǎng)絡(luò)測試前。

常見的位置擺放錯誤(也是我犯的錯誤)有把model.train()放在for epoch in range(epoch):前面,同時在test或者val(測試或者評估函數(shù))中只放置model.eval,這就導(dǎo)致了只有第一個epoch模型訓(xùn)練是使用了model.train(),之后的epoch模型訓(xùn)練時都采用model.eval().可能會影響訓(xùn)練好模型的性能。
修改方式:可以在test函數(shù)里return前面添加model.train()或者把model.train()放到for epoch in range(epoch):語句下面。

model.train()
for epoch in range(epoch):
    for train_batch in train_loader:
        ...
    zhibiao = test(epoch, test_loader, model)
        
def test(epoch, test_loader, model):
    model.eval()
    for test_batch in test_loader:
        ...
    return zhibiao

2.model.train和model.eval有什么作用

model.train()和model.eval()的區(qū)別主要在于Batch NormalizationDropout兩層。
如果模型中有BN層(Batch Normalization)和Dropout,在測試時添加model.eval()。model.eval()是保證BN層能夠用全部訓(xùn)練數(shù)據(jù)的均值和方差,即測試過程中要保證BN層的均值和方差不變。對于Dropout,model.eval()是利用到了所有網(wǎng)絡(luò)連接,即不進行隨機舍棄神經(jīng)元。

下面是model.train 和model.eval的源碼,可以看到是利用self.training = mode來判斷是使用train還是eval。這個參數(shù)將傳遞到一些常用層,比如dropout、BN層等。

def train(self: T, mode: bool = True) -> T:
        r"""Sets the module in training mode.

        This has any effect only on certain modules. See documentations of
        particular modules for details of their behaviors in training/evaluation
        mode, if they are affected, e.g. :class:`Dropout`, :class:`BatchNorm`,
        etc.

        Args:
            mode (bool): whether to set training mode (``True``) or evaluation
                         mode (``False``). Default: ``True``.

        Returns:
            Module: self
        """
        self.training = mode
        for module in self.children():
            module.train(mode)
        return self

    def eval(self: T) -> T:
        r"""Sets the module in evaluation mode.

        This has any effect only on certain modules. See documentations of
        particular modules for details of their behaviors in training/evaluation
        mode, if they are affected, e.g. :class:`Dropout`, :class:`BatchNorm`,
        etc.

        This is equivalent with :meth:`self.train(False) <torch.nn.Module.train>`.

        Returns:
            Module: self
        """
        return self.train(False)

拿dropout層的源碼舉例,可以看到傳遞了self.training這個參數(shù)。

class Dropout(_DropoutNd):
    r"""During training, randomly zeroes some of the elements of the input
    tensor with probability :attr:`p` using samples from a Bernoulli
    distribution. Each channel will be zeroed out independently on every forward
    call.

    This has proven to be an effective technique for regularization and
    preventing the co-adaptation of neurons as described in the paper
    `Improving neural networks by preventing co-adaptation of feature
    detectors`_ .

    Furthermore, the outputs are scaled by a factor of :math:`\frac{1}{1-p}` during
    training. This means that during evaluation the module simply computes an
    identity function.

    Args:
        p: probability of an element to be zeroed. Default: 0.5
        inplace: If set to ``True``, will do this operation in-place. Default: ``False``

    Shape:
        - Input: :math:`(*)`. Input can be of any shape
        - Output: :math:`(*)`. Output is of the same shape as input

    Examples::

        >>> m = nn.Dropout(p=0.2)
        >>> input = torch.randn(20, 16)
        >>> output = m(input)

    .. _Improving neural networks by preventing co-adaptation of feature
        detectors: https://arxiv.org/abs/1207.0580
    """

    def forward(self, input: Tensor) -> Tensor:
        return F.dropout(input, self.p, self.training, self.inplace)


3.為什么主要區(qū)別在于BN層和dropout層

在BN層中,主要涉及到四個需要更新的參數(shù),分別是running_mean,running_var,weight,bias。這里的weight,bias是Pytorch官方實現(xiàn)中的叫法,有點誤導(dǎo)人,其實weight就是gamma,bias就是beta。當然它這樣的叫法也符合實際的應(yīng)用場景。其實gamma,beta就是對規(guī)范化后的值進行一個加權(quán)求和操作running_mean,running_var是當前所求得的所有batch_size下的均值和方差,每經(jīng)過一個mini_batch我們都會更新running_mean,running_var.為什么要更新它?因為測試的時候,往往是一個一個的圖像feed至網(wǎng)絡(luò)的,如果你在這里對其進行計算均值方差顯然是不合理的,所以model.eval()這個語句就是控制BN層中的running_mean,running_std不更新。采用訓(xùn)練結(jié)束后的running_mean,running_std來規(guī)范化該張圖像。

dropout層在訓(xùn)練過程中會隨機舍棄一些神經(jīng)元用來提高性能,但測試過程中如果還是測試的模型還是和訓(xùn)練時一樣隨機舍棄了一些神經(jīng)元(不是原模型)這就和測試的本意相違背。因為測試的模型應(yīng)該是我們最終得到的模型,而這個模型應(yīng)該是一個完整的模型。

4.BN層和dropout層的作用

既然都講到這了,不了解一些BN層和dropout層的作用就說不過去了。
BN層的原理和作用建議讀一下這篇博客:神經(jīng)網(wǎng)絡(luò)中BN層的原理與作用

dropout是指在深度學(xué)習(xí)網(wǎng)絡(luò)的訓(xùn)練過程中,對于神經(jīng)網(wǎng)絡(luò)單元,按照一定的概率將其暫時從網(wǎng)絡(luò)中丟棄。注意是暫時,對于隨機梯度下降來說,由于是隨機丟棄,故而每一個mini-batch都在訓(xùn)練不同的網(wǎng)絡(luò)。

大規(guī)模的神經(jīng)網(wǎng)絡(luò)有兩個缺點:費時、容易過擬合

Dropout的出現(xiàn)很好的可以解決這個問題,每次做完dropout,相當于從原始的網(wǎng)絡(luò)中找到一個更瘦的網(wǎng)絡(luò)。因而,對于一個有N個節(jié)點的神經(jīng)網(wǎng)絡(luò),有了dropout后,就可以看做是2^n個模型的集合了,但此時要訓(xùn)練的參數(shù)數(shù)目卻是不變的,這就解決了費時的問題。

將dropout比作是有性繁殖,將基因隨機進行拆分,可以將優(yōu)秀的基因傳下來,并且降低基因之間的聯(lián)合適應(yīng)性,使得復(fù)雜的大段大段基因聯(lián)合適應(yīng)性變成比較小的一個一個小段基因的聯(lián)合適應(yīng)性。

dropout也能達到同樣的效果,它強迫一個神經(jīng)單元,和隨機挑選出來的其他神經(jīng)單元共同工作,達到好的效果。消除減弱了神經(jīng)元節(jié)點間的聯(lián)合適應(yīng)性,增強了泛化能力。

參考鏈接

pytorch中model.train()和model.eval()的區(qū)別
BN層(Pytorch)
神經(jīng)網(wǎng)絡(luò)中BN層的原理與作用————這篇博客寫的賊棒
深度學(xué)習(xí)中Dropout的作用和原理

pytorch之model.train()和model.eval()

概要

使用PyTorch進行訓(xùn)練和測試時一定注意要把實例化的model指定train/eval
eval()時,框架會自動把 BNDropOut 固定住,不會取平均,而是用訓(xùn)練好的值,不然的話,一旦test的batch_size過小,很容易就會被BN層導(dǎo)致生成圖片顏色失真極大!

model.train()

啟用 BatchNormalizationDropout

model.eval()

不啟用 BatchNormalizationDropout

訓(xùn)練完train樣本后,生成的模型model要用來測試樣本。在model(test)之前,需要加上model.eval(),否則的話,有輸入數(shù)據(jù),即使不訓(xùn)練,它也會改變權(quán)值。這是model中含有batch normalization層所帶來的的性質(zhì)。

Batch Normalization

BN的作用主要是對網(wǎng)絡(luò)中間的每層進行歸一化處理,保證每層提取的特征分布不會被破壞。
訓(xùn)練時是針對每個mini-batch的,但是測試是針對單張圖片的,即不存在batch的概念。由于網(wǎng)絡(luò)訓(xùn)練完成后參數(shù)是固定的,因此每個batch的均值和方差是不變的.

Dropout

Dropout能夠克服Overfitting,在每個訓(xùn)練批次中,通過忽略一半的特征檢測器,可以明顯的減少過擬合現(xiàn)象。詳細見文章:《Dropout: A Simple Way to Prevent Neural Networks from Overtting》

總結(jié)

如果模型中有BN層(Batch Normalization)和Dropout,需要在訓(xùn)練時添加model.train(),在測試時添加model.eval()。
其中model.train()是保證BN層用每一批數(shù)據(jù)的均值和方差,而model.eval()是保證BN用全部訓(xùn)練數(shù)據(jù)的均值和方差;
而對于Dropout,model.train()是隨機取一部分網(wǎng)絡(luò)連接來訓(xùn)練更新參數(shù),而model.eval()是利用到了所有網(wǎng)絡(luò)連接。

到此這篇關(guān)于Pytorch中的model.train() 和 model.eval() 原理與用法的文章就介紹到這了,更多相關(guān)Pytorch model.train() 和 model.eval()內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python編寫春聯(lián)的示例代碼(支持行書隸書楷書)

    Python編寫春聯(lián)的示例代碼(支持行書隸書楷書)

    這篇文章主要介紹了如何通過Python代碼編寫春聯(lián),其中春聯(lián)字體支持行書隸書楷書。文中的示例代碼講解詳細,感興趣的小伙伴可以動手試一試
    2022-01-01
  • python如何解決指定代碼段超時程序卡死

    python如何解決指定代碼段超時程序卡死

    這篇文章主要介紹了python如何解決指定代碼段超時程序卡死,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 解決TensorFlow調(diào)用Keras庫函數(shù)存在的問題

    解決TensorFlow調(diào)用Keras庫函數(shù)存在的問題

    這篇文章主要介紹了解決TensorFlow調(diào)用Keras庫函數(shù)存在的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Python使用matplotlib填充圖形指定區(qū)域代碼示例

    Python使用matplotlib填充圖形指定區(qū)域代碼示例

    這篇文章主要介紹了Python使用matplotlib填充圖形指定區(qū)域代碼示例,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Python使用Tkinter打造一個完整的桌面應(yīng)用

    Python使用Tkinter打造一個完整的桌面應(yīng)用

    在Python生態(tài)中,Tkinter就像一把瑞士軍刀,它沒有花哨的特效,卻能快速搭建出實用的圖形界面,作為Python自帶的標準庫,無需安裝即可使用,這種“開箱即用”的特性讓它成為新手入門GUI開發(fā)的首選,本文將通過構(gòu)建一個完整的記事本應(yīng)用,帶你領(lǐng)略Tkinter的實用魅力
    2025-06-06
  • 將python代碼和注釋分離的方法

    將python代碼和注釋分離的方法

    下面小編就為大家分享一篇將python代碼和注釋分離的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • python進階教程之詞典、字典、dict

    python進階教程之詞典、字典、dict

    這篇文章主要介紹了python進階教程之詞典、字典、dict,說了好幾個詞最官方的應(yīng)該是字典,英文dict,本文就是專注講解字典的,需要的朋友可以參考下
    2014-08-08
  • Pytorch的安裝過程之pip、conda、Docker容器安裝

    Pytorch的安裝過程之pip、conda、Docker容器安裝

    PyTorch是一個基于Python的開源深度學(xué)習(xí)框架,可用于訓(xùn)練和預(yù)測深度學(xué)習(xí)模型,PyTorch支持多種安裝方法,這篇文章主要介紹了Pytorch的安裝----pip、conda、Docker容器,需要的朋友可以參考下
    2023-04-04
  • 利用Python操作excel表格的完美指南

    利用Python操作excel表格的完美指南

    你是不是會經(jīng)常簡單且重復(fù)地操作excel表格?并且這些操作的技術(shù)含量低,下面這篇文章主要給大家介紹了關(guān)于利用Python操作excel表格的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • Python 遠程開關(guān)機的方法

    Python 遠程開關(guān)機的方法

    這篇文章主要介紹了Python 遠程開關(guān)機的方法,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-11-11

最新評論

临武县| 沁源县| 阿坝县| 平阳县| 体育| 内黄县| 泊头市| 英山县| 合作市| 东平县| 武安市| 霍山县| 当阳市| 松潘县| 上林县| 兴文县| 蒙自县| 潍坊市| 桐庐县| 隆林| 乐亭县| 日土县| 靖宇县| 大连市| 东阳市| 霍城县| 华池县| 外汇| 寻乌县| 新和县| 朝阳县| 宜良县| 调兵山市| 丁青县| 崇信县| 西充县| 全椒县| 太谷县| 临高县| 彭泽县| 桂东县|