PyTorch裡eval和no grad的關係

2021-10-19 09:43:51 字數 1700 閱讀 1029

首先這兩者有著本質上區別。

model.eval()是用來告知model內的各個layer採取eval模式工作。這個操作主要是應對諸如dropoutbatchnorm這些在訓練模式下需要採取不同操作的特殊layer。訓練和測試的時候都可以開啟。

torch.no_grad()則是告知自動求導引擎不要進行求導操作。這個操作的意義在於加速計算、節約記憶體。但是由於沒有gradient,也就沒有辦法進行backward。所以只能在測試的時候開啟。

所以在evaluate的時候,需要同時使用兩者。

model =..

.dataset =..

.loss_fun =..

.# training

lr=0.001

model.train(

)for x,y in dataset:

model.zero_grad(

) p = model(x)

l = loss_fun(p, y)

l.backward(

)for p in model.parameters():

p.data -= lr*p.grad

# evaluating

sum_loss =

0.0model.

eval()

with torch.no_grad():

for x,y in dataset:

p = model(x)

l = loss_fun(p, y)

sum_loss += l

print

('total loss:'

, sum_loss)

另外no_grad還可以作為函式是修飾符來用,從而簡化**。

def

train

(model, dataset, loss_fun, lr=

0.001):

model.train(

)for x,y in dataset:

model.zero_grad(

) p = model(x)

l = loss_fun(p, y)

l.backward(

)for p in model.parameters():

p.data -= lr*p.grad

@torch.no_grad(

)def

test

(model, dataset, loss_fun)

: sum_loss =

0.0 model.

eval()

for x,y in dataset:

p = model(x)

l = loss_fun(p, y)

sum_loss += l

return sum_loss

# main block:

model =..

.dataset =..

.loss_fun =..

.# training

train(

)# test

sum_loss = test(

)print

('total loss:'

, sum_loss)

參考:

Pytorch中的train和eval用法注意點

一般情況,model.train 是在訓練的時候用到,model.eval 是在測試的時候用到 如果模型中沒有類似於 bn這樣的歸一化或者 dropout model.train 和model.eval 可以不要 建議寫一下,比較安全 並且 model.train 和model.eval 得到的效果...

Linux裡的eval命令

這個命令之前沒有用過,在網上查了一下資料,覺得人家寫的很好,所以複製過來了。語法 eval cmdline eval會對後面的cmdline進行兩遍掃瞄,如果在第一遍掃面後cmdline是乙個普通命令,則執行此命令 如果cmdline中含有變數的間接引用,則保證簡介引用的語義。舉例如下 set 11...

執行順序和eval

1 將命令切割成token 是以固定的一支煙meta字元分割的,有空格 製表符 換行符 與 token 的種類暴扣單詞,關鍵字 輸出入重定向 以及分號 2 檢查每個命令的第乙個token,看看是否他是不帶引號或者反斜槓的關鍵字,如果他是乙個開發的關鍵字,則這個命令其實是乙個復合命令 3 將每個命令的...