[英]Python: tqdm not showing progress bar
我已經為我的網絡的fit
function 編寫了 PyTorch 代碼。 但是當我在其中的循環中使用tqdm
時,它不會從 0% 增加,這是我無法理解的原因。
這是代碼:
from tqdm.notebook import tqdm
def fit(model, train_dataset, val_dataset, epochs=1, batch_size=32, warmup_prop=0, lr=5e-5):
device = torch.device('cuda:1')
model.to(device)
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=batch_size, shuffle=False)
optimizer = AdamW(model.parameters(), lr=lr)
num_warmup_steps = int(warmup_prop * epochs * len(train_loader))
num_training_steps = epochs * len(train_loader)
scheduler = get_linear_schedule_with_warmup(optimizer, num_warmup_steps, num_training_steps)
loss_fct = nn.BCEWithLogitsLoss(reduction='mean').to(device)
for epoch in range(epochs):
model.train()
start_time = time.time()
optimizer.zero_grad()
avg_loss = 0
for step, (x, y_batch) in tqdm(enumerate(train_loader), total=len(train_loader)):
y_pred = model(x.to(device))
loss = loss_fct(y_pred.view(-1).float(), y_batch.float().to(device))
loss.backward()
avg_loss += loss.item() / len(train_loader)
optimizer.step()
scheduler.step()
model.zero_grad()
optimizer.zero_grad()
model.eval()
preds = []
truths = []
avg_val_loss = 0.
with torch.no_grad():
for x, y_batch in val_loader:
y_pred = model(x.to(device))
loss = loss_fct(y_pred.detach().view(-1).float(), y_batch.float().to(device))
avg_val_loss += loss.item() / len(val_loader)
probs = torch.sigmoid(y_pred).detach().cpu().numpy()
preds += list(probs.flatten())
truths += list(y_batch.numpy().flatten())
score = roc_auc_score(truths, preds)
dt = time.time() - start_time
lr = scheduler.get_last_lr()[0]
print(f'Epoch {epoch + 1}/{epochs} \t lr={lr:.1e} \t t={dt:.0f}s \t loss={avg_loss:.4f} \t val_loss={avg_val_loss:.4f} \t val_auc={score:.4f}')
Output
output 使用所需參數執行fit
function 后如下所示:
0%| | 0/6986 [00:00<?, ?it/s]
如何解決這個問題?
當您從tqdm.notebook
導入時,這意味着您正在使用 Jupyter 筆記本,對嗎? 如果不是,你必須from tqdm import tqdm
做。
我簡化了您的示例代碼,使其真正最小化,如下所示:
import time
from tqdm.notebook import tqdm
l = [None] * 10000
for i, e in tqdm(enumerate(l), total = len(l)):
time.sleep(0.01)
並在 Google Colab jupyter notebook 上執行。 它向我展示了這樣的進度條:
所以這意味着tqdm
可以在筆記本模式下正常工作。 因此,您的可迭代或循環代碼存在一些問題,而不是 tqdm。 可能的原因可能是您的內部循環需要很長時間,因此即使 1 次迭代(在您的情況下總共 6986 次)也需要永遠並且不會顯示在進度條中。
另一個原因是您的迭代需要永遠生成第二個元素,您還必須檢查它是否有效。
另外我看到您向我們展示了 ASCII 進度條,這不是筆記本中通常顯示的進度條(筆記本通常顯示圖形條)。 所以也許你根本不在筆記本里面? 然后你必須做from tqdm import tqdm
而不是from tqdm.notebook import tqdm
。
還首先嘗試暫時簡化您的代碼,以找出原因是否真的與您的案例中的tqdm
模塊有關,而不是與您的可迭代或循環代碼有關。 嘗試從我上面提供的代碼開始。
另外,不要嘗試在循環中打印諸如print(step)
之類的內容,而是嘗試在屏幕上打印至少兩行?
如果在我的代碼中執行from tqdm import tqdm
然后在控制台 Python 中執行它,那么我得到:
10%|███████████▉ | 950/10000 [00:14<02:20, 64.37it/s]
這意味着控制台版本也可以。
如果筆記本不受信任,則在 Jupyter 中可能會發生這種情況 - 如果是這種情況,請單擊右上角的“不受信任”框。
這是因為在終端環境中使用from tqdm.notebook import tqdm
而不是from tqdm import tqdm
。
提供一個例子來說明這個問題:
from tqdm.notebook import tqdm
if __name__ == '__main__':
data = range(10000)
for i, item in enumerate(tqdm(range(len(data)))):
i = i + 1
它將顯示:
但是,如果您使用此代碼示例:
from tqdm import tqdm
if __name__ == '__main__':
data = range(10000)
for i, item in enumerate(tqdm(range(len(data)))):
i = i + 1
它將顯示:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.