torch.optim
是實(shí)現(xiàn)各種優(yōu)化算法的軟件包。 已經(jīng)支持最常用的方法,并且接口足夠通用,因此將來也可以輕松集成更復(fù)雜的方法。
要使用 torch.optim
,您必須構(gòu)造一個(gè)優(yōu)化器對象,該對象將保持當(dāng)前狀態(tài)并根據(jù)計(jì)算出的梯度更新參數(shù)。
要構(gòu)建 Optimizer
,您必須為其提供一個(gè)包含參數(shù)的可迭代項(xiàng)(所有參數(shù)應(yīng)為Variable
)以進(jìn)行優(yōu)化。 然后,您可以指定優(yōu)化器特定的選項(xiàng),例如學(xué)習(xí)率,權(quán)重衰減等。
注意
如果您需要通過.cuda()
將模型移至 GPU,請?jiān)跒槠錁?gòu)建優(yōu)化器之前執(zhí)行此操作。 .cuda()
之后的模型參數(shù)將與調(diào)用之前的參數(shù)不同。
通常,在構(gòu)造和使用優(yōu)化器時(shí),應(yīng)確保優(yōu)化的參數(shù)位于一致的位置。
例:
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
optimizer = optim.Adam([var1, var2], lr=0.0001)
Optimizer
也支持指定每個(gè)參數(shù)選項(xiàng)。 為此,不要傳遞Variable
的迭代器,而是傳遞dict
的迭代器。 它們每個(gè)都將定義一個(gè)單獨(dú)的參數(shù)組,并且應(yīng)包含一個(gè)params
鍵,其中包含屬于它的參數(shù)列表。 其他鍵應(yīng)與優(yōu)化器接受的關(guān)鍵字參數(shù)匹配,并將用作該組的優(yōu)化選項(xiàng)。
Note
您仍然可以將選項(xiàng)作為關(guān)鍵字參數(shù)傳遞。 在未覆蓋它們的組中,它們將用作默認(rèn)值。 當(dāng)您只想改變一個(gè)選項(xiàng),同時(shí)使所有其他參數(shù)組保持一致時(shí),這很有用。
例如,當(dāng)要指定每層學(xué)習(xí)率時(shí),這非常有用:
optim.SGD([
{'params': model.base.parameters()},
{'params': model.classifier.parameters(), 'lr': 1e-3}
], lr=1e-2, momentum=0.9)
這意味著model.base
的參數(shù)將使用默認(rèn)的學(xué)習(xí)率1e-2
,model.classifier
的參數(shù)將使用1e-3
的學(xué)習(xí)率,并且動(dòng)量0.9
會(huì)用于所有參數(shù)。
所有優(yōu)化器均實(shí)現(xiàn) step()
方法,該方法可更新參數(shù)。 它可以以兩種方式使用:
optimizer.step()
這是大多數(shù)優(yōu)化程序支持的簡化版本。 一旦使用例如計(jì)算出梯度,就可以調(diào)用該函數(shù)。 backward()
。
Example:
for input, target in dataset:
optimizer.zero_grad()
output = model(input)
loss = loss_fn(output, target)
loss.backward()
optimizer.step()
optimizer.step(closure)
某些優(yōu)化算法(例如共軛梯度和 LBFGS)需要多次重新評估函數(shù),因此您必須傳遞閉包以允許它們重新計(jì)算模型。 閉合應(yīng)清除梯度,計(jì)算損耗,然后將其返回。
Example:
for input, target in dataset:
def closure():
optimizer.zero_grad()
output = model(input)
loss = loss_fn(output, target)
loss.backward()
return loss
optimizer.step(closure)
class torch.optim.Optimizer(params, defaults)?
所有優(yōu)化程序的基類。
警告
需要將參數(shù)指定為具有確定性順序的集合,這些順序在兩次運(yùn)行之間是一致的。 不滿足這些屬性的對象的示例是字典值的集合和迭代器。
參數(shù)
torch.Tensor
或dict
s 的迭代。 指定應(yīng)優(yōu)化哪些張量。add_param_group(param_group)?
將參數(shù)組添加到 Optimizer
的 <cite>param_groups</cite> 中。
當(dāng)對預(yù)訓(xùn)練的網(wǎng)絡(luò)進(jìn)行微調(diào)時(shí),這很有用,因?yàn)榭梢允箖鼋Y(jié)層成為可訓(xùn)練的,并隨著訓(xùn)練的進(jìn)行而添加到 Optimizer
中。
Parameters
load_state_dict(state_dict)?
加載優(yōu)化器狀態(tài)。
Parameters
state_dict (dict )–優(yōu)化器狀態(tài)。 應(yīng)該是從對 state_dict()
的調(diào)用返回的對象。
state_dict()?
以dict
的形式返回優(yōu)化器的狀態(tài)。
它包含兩個(gè)條目:
state - a dict holding current optimization state. Its content
優(yōu)化器類之間有所不同。
step(closure)?
執(zhí)行單個(gè)優(yōu)化步驟(參數(shù)更新)。
Parameters
閉合(可調(diào)用的)–重新評估模型并返回?fù)p失的閉合。 對于大多數(shù)優(yōu)化程序是可選的。
zero_grad()?
清除所有優(yōu)化的 torch.Tensor
的梯度。
class torch.optim.Adadelta(params, lr=1.0, rho=0.9, eps=1e-06, weight_decay=0)?
實(shí)現(xiàn) Adadelta 算法。
在 ADADELTA 中提出了一種:自適應(yīng)學(xué)習(xí)率方法。
Parameters
step(closure=None)?
執(zhí)行一個(gè)優(yōu)化步驟。
Parameters
閉合(可調(diào)用的, 可選)–重新評估模型并返回?fù)p失的閉合。
class torch.optim.Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0, initial_accumulator_value=0, eps=1e-10)?
實(shí)現(xiàn) Adagrad 算法。
它已在在線學(xué)習(xí)和隨機(jī)優(yōu)化的自適應(yīng)次梯度方法中提出。
Parameters
step(closure=None)?
Performs a single optimization step.
Parameters
closure (callable__, optional) – A closure that reevaluates the model and returns the loss.
class torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, amsgrad=False)?
實(shí)現(xiàn)亞當(dāng)算法。
Parameters
step(closure=None)?
Performs a single optimization step.
Parameters
closure (callable__, optional) – A closure that reevaluates the model and returns the loss.
class torch.optim.AdamW(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0.01, amsgrad=False)?
實(shí)現(xiàn) AdamW 算法。
最初的 Adam 算法是在 Adam:隨機(jī)優(yōu)化方法中提出的。 AdamW 變體在去耦權(quán)重衰減正則化中提出。
Parameters
step(closure=None)?
Performs a single optimization step.
Parameters
closure (callable__, optional) – A closure that reevaluates the model and returns the loss.
class torch.optim.SparseAdam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08)?
實(shí)現(xiàn)適用于稀疏張量的 Adam 算法的惰性版本。
在此變體中,僅顯示出現(xiàn)在漸變中的力矩,并且僅將漸變的那些部分應(yīng)用于參數(shù)。
Parameters
step(closure=None)?
Performs a single optimization step.
Parameters
closure (callable__, optional) – A closure that reevaluates the model and returns the loss.
class torch.optim.Adamax(params, lr=0.002, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)?
實(shí)現(xiàn) Adamax 算法(基于無窮范數(shù)的 Adam 的變體)。
It has been proposed in Adam: A Method for Stochastic Optimization.
Parameters
step(closure=None)?
Performs a single optimization step.
Parameters
closure (callable__, optional) – A closure that reevaluates the model and returns the loss.
class torch.optim.ASGD(params, lr=0.01, lambd=0.0001, alpha=0.75, t0=1000000.0, weight_decay=0)?
實(shí)施平均隨機(jī)梯度下降。
在通過平均對隨機(jī)逼近的加速中提出。
Parameters
step(closure=None)?
Performs a single optimization step.
Parameters
closure (callable__, optional) – A closure that reevaluates the model and returns the loss.
class torch.optim.LBFGS(params, lr=1, max_iter=20, max_eval=None, tolerance_grad=1e-07, tolerance_change=1e-09, history_size=100, line_search_fn=None)?
實(shí)現(xiàn) L-BFGS 算法,該算法受到 <cite>minFunc < https://www.cs.ubc.ca/~schmidtm/Software/minFunc.html ></cite> 的啟發(fā)。
Warning
此優(yōu)化器不支持每個(gè)參數(shù)的選項(xiàng)和參數(shù)組(只能有一個(gè))。
Warning
現(xiàn)在,所有參數(shù)都必須在單個(gè)設(shè)備上。 將來會(huì)有所改善。
Note
這是一個(gè)非常占用內(nèi)存的優(yōu)化器(它需要額外的param_bytes * (history_size + 1)
字節(jié))。 如果內(nèi)存不足,請嘗試減小歷史記錄的大小,或使用其他算法。
Parameters
step(closure)?
Performs a single optimization step.
Parameters
閉合(可調(diào)用的)–重新評估模型并返回?fù)p失的閉合。
class torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False)?
實(shí)現(xiàn) RMSprop 算法。
由 G. Hinton 在他的課程中提出。
居中版本首先出現(xiàn)在中,并使用遞歸神經(jīng)網(wǎng)絡(luò)生成序列。
這里的實(shí)現(xiàn)在添加 epsilon 之前取梯度平均值的平方根(請注意,TensorFlow 會(huì)互換這兩個(gè)操作)。 因此,有效學(xué)習(xí)率是,其中
是計(jì)劃的學(xué)習(xí)率,
是平方梯度的加權(quán)移動(dòng)平均值。
Parameters
True
來計(jì)算居中的 RMSProp,則通過對其斜率的估計(jì)對其進(jìn)行歸一化 方差step(closure=None)?
Performs a single optimization step.
Parameters
closure (callable__, optional) – A closure that reevaluates the model and returns the loss.
class torch.optim.Rprop(params, lr=0.01, etas=(0.5, 1.2), step_sizes=(1e-06, 50))?
實(shí)現(xiàn)彈性反向傳播算法。
Parameters
step(closure=None)?
Performs a single optimization step.
Parameters
closure (callable__, optional) – A closure that reevaluates the model and returns the loss.
class torch.optim.SGD(params, lr=<required parameter>, momentum=0, dampening=0, weight_decay=0, nesterov=False)?
實(shí)現(xiàn)隨機(jī)梯度下降(可選帶動(dòng)量)。
Nesterov 動(dòng)量基于中關(guān)于初始化和動(dòng)量在深度學(xué)習(xí)中的重要性的公式。
Parameters
例
>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
>>> optimizer.zero_grad()
>>> loss_fn(model(input), target).backward()
>>> optimizer.step()
Note
用 Momentum / Nesterov 實(shí)施 SGD 與 Sutskever 等人的方法有所不同。 等 以及其他一些框架中的實(shí)現(xiàn)。
考慮到動(dòng)量的具體情況,可以將更新寫為
其中,p,g,v 和分別表示參數(shù),梯度,速度和動(dòng)量。
這與 Sutskever 等人相反。 等 和其他使用表格更新的框架
Nesterov 版本進(jìn)行了類似的修改。
step(closure=None)?
Performs a single optimization step.
Parameters
closure (callable__, optional) – A closure that reevaluates the model and returns the loss.
torch.optim.lr_scheduler
提供了幾種根據(jù)時(shí)期數(shù)來調(diào)整學(xué)習(xí)率的方法。 torch.optim.lr_scheduler.ReduceLROnPlateau
允許基于某些驗(yàn)證度量來降低動(dòng)態(tài)學(xué)習(xí)率。
優(yōu)化器更新后應(yīng)應(yīng)用學(xué)習(xí)率安排; 例如,您應(yīng)該以這種方式編寫代碼:
>>> scheduler = ...
>>> for epoch in range(100):
>>> train(...)
>>> validate(...)
>>> scheduler.step()
Warning
在 PyTorch 1.1.0 之前,學(xué)習(xí)率調(diào)度程序應(yīng)在優(yōu)化程序更新之前調(diào)用; 1.1.0 改變了這種行為,打破了 BC。 如果您在優(yōu)化程序更新之前(調(diào)用optimizer.step()
)使用學(xué)習(xí)率計(jì)劃程序(調(diào)用scheduler.step()
),則會(huì)跳過學(xué)習(xí)率計(jì)劃的第一個(gè)值。 如果升級到 PyTorch 1.1.0 后無法重現(xiàn)結(jié)果,請檢查是否在錯(cuò)誤的時(shí)間調(diào)用了scheduler.step()
。
class torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1)?
將每個(gè)參數(shù)組的學(xué)習(xí)率設(shè)置為給定函數(shù)的初始 lr 倍。 當(dāng) last_epoch = -1 時(shí),將初始 lr 設(shè)置為 lr。
Parameters
Example
>>> # Assuming optimizer has two groups.
>>> lambda1 = lambda epoch: epoch // 30
>>> lambda2 = lambda epoch: 0.95 ** epoch
>>> scheduler = LambdaLR(optimizer, lr_lambda=[lambda1, lambda2])
>>> for epoch in range(100):
>>> train(...)
>>> validate(...)
>>> scheduler.step()
load_state_dict(state_dict)?
加載調(diào)度程序狀態(tài)。
Parameters
state_dict (dict )–調(diào)度程序狀態(tài)。 應(yīng)該是從對 state_dict()
的調(diào)用返回的對象。
state_dict()?
返回調(diào)度程序的狀態(tài)為dict
。
它包含 self . dict 中不是優(yōu)化程序的每個(gè)變量的條目。 學(xué)習(xí)率 lambda 函數(shù)僅在它們是可調(diào)用對象時(shí)才被保存,而在它們是函數(shù)或 lambda 時(shí)才被保存。
class torch.optim.lr_scheduler.MultiplicativeLR(optimizer, lr_lambda, last_epoch=-1)?
將每個(gè)參數(shù)組的學(xué)習(xí)率乘以指定函數(shù)中給定的因子。 當(dāng) last_epoch = -1 時(shí),將初始 lr 設(shè)置為 lr。
Parameters
Example
>>> # Assuming optimizer has two groups.
>>> lmbda = lambda epoch: 0.95
>>> scheduler = LambdaLR(optimizer, lr_lambda=lmbda)
>>> for epoch in range(100):
>>> train(...)
>>> validate(...)
>>> scheduler.step()
load_state_dict(state_dict)?
Loads the schedulers state.
Parameters
state_dict (dict )–調(diào)度程序狀態(tài)。 應(yīng)該是從對 state_dict()
的調(diào)用返回的對象。
state_dict()?
Returns the state of the scheduler as a dict
.
It contains an entry for every variable in self.dict which is not the optimizer. The learning rate lambda functions will only be saved if they are callable objects and not if they are functions or lambdas.
class torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1)?
在每個(gè) step_size 時(shí)期,通過 gamma 降低每個(gè)參數(shù)組的學(xué)習(xí)率。 注意,這種衰減可能與此調(diào)度程序外部的學(xué)習(xí)速率的其他更改同時(shí)發(fā)生。 當(dāng) last_epoch = -1 時(shí),將初始 lr 設(shè)置為 lr。
Parameters
Example
>>> # Assuming optimizer uses lr = 0.05 for all groups
>>> # lr = 0.05 if epoch < 30
>>> # lr = 0.005 if 30 <= epoch < 60
>>> # lr = 0.0005 if 60 <= epoch < 90
>>> # ...
>>> scheduler = StepLR(optimizer, step_size=30, gamma=0.1)
>>> for epoch in range(100):
>>> train(...)
>>> validate(...)
>>> scheduler.step()
class torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1)?
一旦歷元數(shù)達(dá)到其中一個(gè)里程碑,則通過伽馬衰減每個(gè)參數(shù)組的學(xué)習(xí)率。 注意,這種衰減可能與此調(diào)度程序外部的學(xué)習(xí)速率的其他更改同時(shí)發(fā)生。 當(dāng) last_epoch = -1 時(shí),將初始 lr 設(shè)置為 lr。
Parameters
Example
>>> # Assuming optimizer uses lr = 0.05 for all groups
>>> # lr = 0.05 if epoch < 30
>>> # lr = 0.005 if 30 <= epoch < 80
>>> # lr = 0.0005 if epoch >= 80
>>> scheduler = MultiStepLR(optimizer, milestones=[30,80], gamma=0.1)
>>> for epoch in range(100):
>>> train(...)
>>> validate(...)
>>> scheduler.step()
class torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma, last_epoch=-1)?
在每個(gè)時(shí)期以伽馬衰減每個(gè)參數(shù)組的學(xué)習(xí)率。 當(dāng) last_epoch = -1 時(shí),將初始 lr 設(shè)置為 lr。
Parameters
class torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0, last_epoch=-1)?
使用余弦退火進(jìn)度表設(shè)置每個(gè)參數(shù)組的學(xué)習(xí)率,其中設(shè)置為初始 lr,
是自 SGDR 上次重新啟動(dòng)以來的時(shí)期數(shù):
當(dāng) last_epoch = -1 時(shí),將初始 lr 設(shè)置為 lr。 注意,由于調(diào)度是遞歸定義的,因此其他操作員可以在此調(diào)度器外部同時(shí)修改學(xué)習(xí)率。 如果學(xué)習(xí)率僅由此調(diào)度程序設(shè)置,則每個(gè)步驟的學(xué)習(xí)率變?yōu)椋?/p>
它已在 SGDR:具有暖重啟的隨機(jī)梯度下降中提出。 請注意,這僅實(shí)現(xiàn) SGDR 的余弦退火部分,而不實(shí)現(xiàn)重新啟動(dòng)。
Parameters
class torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10, verbose=False, threshold=0.0001, threshold_mode='rel', cooldown=0, min_lr=0, eps=1e-08)?
當(dāng)指標(biāo)停止改善時(shí),降低學(xué)習(xí)率。 一旦學(xué)習(xí)停滯,模型通常會(huì)受益于將學(xué)習(xí)率降低 2-10 倍。 該調(diào)度程序讀取一個(gè)指標(biāo)數(shù)量,如果在“耐心”時(shí)期沒有看到改善,則學(xué)習(xí)速度會(huì)降低。
Parameters
True
,則為每次更新向 stdout 打印一條消息。 默認(rèn)值:False
。Example
>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
>>> scheduler = ReduceLROnPlateau(optimizer, 'min')
>>> for epoch in range(10):
>>> train(...)
>>> val_loss = validate(...)
>>> # Note that step should be called after validate()
>>> scheduler.step(val_loss)
class torch.optim.lr_scheduler.CyclicLR(optimizer, base_lr, max_lr, step_size_up=2000, step_size_down=None, mode='triangular', gamma=1.0, scale_fn=None, scale_mode='cycle', cycle_momentum=True, base_momentum=0.8, max_momentum=0.9, last_epoch=-1)?
根據(jù)周期學(xué)習(xí)率策略(CLR)設(shè)置每個(gè)參數(shù)組的學(xué)習(xí)率。 該策略以恒定的頻率在兩個(gè)邊界之間循環(huán)學(xué)習(xí)率,如論文訓(xùn)練神經(jīng)網(wǎng)絡(luò)的循環(huán)學(xué)習(xí)率中所述。 兩個(gè)邊界之間的距離可以在每個(gè)迭代或每個(gè)周期的基礎(chǔ)上縮放。
周期性學(xué)習(xí)率策略會(huì)在每批之后更改學(xué)習(xí)率。 在將一批用于訓(xùn)練之后,應(yīng)調(diào)用<cite>步驟</cite>。
如本文所述,該類具有三個(gè)內(nèi)置策略:
此實(shí)現(xiàn)改編自 github 存儲(chǔ)庫: bckenstler / CLR
Parameters
True
,則動(dòng)量與學(xué)習(xí)速率成反比地在“ base_momentum”和“ max_momentum”之間循環(huán)。 默認(rèn)值:TrueExample
>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
>>> scheduler = torch.optim.lr_scheduler.CyclicLR(optimizer, base_lr=0.01, max_lr=0.1)
>>> data_loader = torch.utils.data.DataLoader(...)
>>> for epoch in range(10):
>>> for batch in data_loader:
>>> train_batch(...)
>>> scheduler.step()
get_lr()?
計(jì)算批次索引的學(xué)習(xí)率。 此函數(shù)將 <cite>self.last_epoch</cite> 視為最后一批索引。
如果 <cite>self.cycle_momentum</cite> 為True
,則此功能具有更新優(yōu)化器動(dòng)量的副作用。
class torch.optim.lr_scheduler.OneCycleLR(optimizer, max_lr, total_steps=None, epochs=None, steps_per_epoch=None, pct_start=0.3, anneal_strategy='cos', cycle_momentum=True, base_momentum=0.85, max_momentum=0.95, div_factor=25.0, final_div_factor=10000.0, last_epoch=-1)?
根據(jù) 1cycle 學(xué)習(xí)率策略設(shè)置每個(gè)參數(shù)組的學(xué)習(xí)率。 1 周期策略將學(xué)習(xí)速率從初始學(xué)習(xí)速率退火到某個(gè)最大學(xué)習(xí)速率,然后從該最大學(xué)習(xí)速率退火到某個(gè)遠(yuǎn)低于初始學(xué)習(xí)速率的最小學(xué)習(xí)速率。 最初在論文超融合:使用大學(xué)習(xí)率的超快速神經(jīng)網(wǎng)絡(luò)訓(xùn)練中描述了此策略。
1 周期學(xué)習(xí)率策略每批更改一次學(xué)習(xí)率。 在將一批用于訓(xùn)練之后,應(yīng)調(diào)用<cite>步驟</cite>。
此調(diào)度程序不可鏈接。
還請注意,可以用以下兩種方法之一確定循環(huán)中的步驟總數(shù)(按優(yōu)先順序列出):
您必須為 total_steps 提供一個(gè)值,或者為紀(jì)元和 steps_per_epoch 提供一個(gè)值。
Parameters
True
, momentum is cycled inversely to learning rate between 'base_momentum' and 'max_momentum'. Default: TrueExample
>>> data_loader = torch.utils.data.DataLoader(...)
>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
>>> scheduler = torch.optim.lr_scheduler.OneCycleLR(optimizer, max_lr=0.01, steps_per_epoch=len(data_loader), epochs=10)
>>> for epoch in range(10):
>>> for batch in data_loader:
>>> train_batch(...)
>>> scheduler.step()
class torch.optim.lr_scheduler.CosineAnnealingWarmRestarts(optimizer, T_0, T_mult=1, eta_min=0, last_epoch=-1)?
使用余弦退火進(jìn)度表設(shè)置每個(gè)參數(shù)組的學(xué)習(xí)率,其中設(shè)置為初始 lr,
是自上次重啟以來的時(shí)期數(shù),
是兩次暖啟動(dòng)之間的時(shí)期數(shù) 在 SGDR 中:
當(dāng)時(shí),設(shè)置
。 重新啟動(dòng)后
時(shí),設(shè)置
。
它已在 SGDR:具有暖重啟的隨機(jī)梯度下降中提出。
Parameters
step(epoch=None)?
每次批量更新后都可以調(diào)用該步驟
Example
>>> scheduler = CosineAnnealingWarmRestarts(optimizer, T_0, T_mult)
>>> iters = len(dataloader)
>>> for epoch in range(20):
>>> for i, sample in enumerate(dataloader):
>>> inputs, labels = sample['inputs'], sample['labels']
>>> scheduler.step(epoch + i / iters)
>>> optimizer.zero_grad()
>>> outputs = net(inputs)
>>> loss = criterion(outputs, labels)
>>> loss.backward()
>>> optimizer.step()
可以交錯(cuò)方式調(diào)用此函數(shù)。
Example
>>> scheduler = CosineAnnealingWarmRestarts(optimizer, T_0, T_mult)
>>> for epoch in range(20):
>>> scheduler.step()
>>> scheduler.step(26)
>>> scheduler.step() # scheduler.step(27), instead of scheduler(20)
更多建議: