Ish*_*tta 8 python jupyter-notebook tqdm
我已经为我的网络功能编写了 PyTorch 代码fit。但是当我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}')
Run Code Online (Sandbox Code Playgroud)
输出
使用所需参数
执行函数后的输出fit如下所示:
0%| | 0/6986 [00:00<?, ?it/s]
如何解决这个问题?
Art*_*oul 10
当您从中导入时,tqdm.notebook意味着您正在使用 Jupyter 笔记本,对吗?如果没有,你必须这样做from tqdm import tqdm。
我简化了您的示例代码,使其非常简单,如下所示:
\nimport time\nfrom tqdm.notebook import tqdm\n\nl = [None] * 10000\n\nfor i, e in tqdm(enumerate(l), total = len(l)): \n time.sleep(0.01)\nRun Code Online (Sandbox Code Playgroud)\n并在 Google Colab jupyter 笔记本上执行。它向我展示了这样的漂亮进度条:
\n\n所以这意味着tqdm在笔记本模式下可以正常工作。因此,您的可迭代或循环代码有一些问题,而不是 tqdm。可能的原因可能是您的内部循环需要很长时间,因此即使 1 次迭代(在您的情况下总共 6986 次迭代中)也需要很长时间并且不会显示在进度栏中。
另一个原因是你的迭代需要永远生成第二个元素,你还必须检查它是否有效。
\n我还看到您向我们展示了 ASCII 进度条,这不是笔记本中通常显示的进度条(笔记本通常显示图形栏)。那么也许您根本不在笔记本电脑中?那么你必须做from tqdm import tqdm而不是from tqdm.notebook import tqdm.
另外,首先尝试暂时简化您的代码,以确定原因是否确实与tqdm您的案例中的模块有关,而不是与您的可迭代或循环代码有关。尝试从我上面提供的代码开始。
另外,不要尝试打印类似的内容,而不是 tqdmprint(step)在循环内打印类似的内容,而不是 tqdm ,它是否在屏幕上打印至少两行?
如果在我的代码中我这样做from tqdm import tqdm,然后在控制台 Python 中执行它,那么我得到:
10%|\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x89 | 950/10000 [00:14<02:20, 64.37it/s]\nRun Code Online (Sandbox Code Playgroud)\n这意味着控制台版本也可以工作。
\n| 归档时间: |
|
| 查看次数: |
15601 次 |
| 最近记录: |