首先這兩者有著本質上區別。
model.eval()
是用來告知model內的各個layer採取eval模式工作。這個操作主要是應對諸如dropout
和batchnorm
這些在訓練模式下需要採取不同操作的特殊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 將每個命令的...