Python:tqdm不显示进度条
我已经为我的网络的Python:tqdm不显示进度条,python,jupyter-notebook,tqdm,Python,Jupyter Notebook,Tqdm,我已经为我的网络的fit功能编写了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(devic
fit
功能编写了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}')
输出使用所需参数执行
fit
函数后的输出如下所示:0%| | 0/6986[00:00当您从tqdm.notebook
导入时,这意味着您正在使用Jupyter笔记本,对吗?如果不是,您必须从tqdm导入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)
并在谷歌jupyter笔记本上执行。它向我展示了如下漂亮的进度条:
import time
from tqdm.notebook import tqdm
l = [None] * 10000
for i, e in tqdm(enumerate(l), total = len(l)):
time.sleep(0.01)
因此,这意味着tqdm
在笔记本模式下正确工作。因此,您的iterable或loop代码存在一些问题,而不是tqdm。可能的原因可能是您的内部循环需要很长时间,因此即使是一次迭代(在您的案例中,总共6986次),也需要很长时间,并且不会显示在进度条中
还有一个原因是iterable需要花费很长时间才能生成第二个元素,而且您必须检查它是否有效
此外,我看到您向我们展示了ASCII进度条,它不是笔记本中通常显示的进度条(笔记本通常显示图形条)。因此,您可能根本不在笔记本中?然后您必须从TQM导入TQM,而不是从TQM导入TQM。笔记本导入TQM
另外,首先尝试简化您的代码,只是暂时的,以确定原因是否真的与您的案例中的tqdm
模块有关,而不是与您的iterable或loop代码有关。尝试从上面提供的代码开始
另外,与tqdm不同,尝试在循环内部打印类似于print(step)
的内容,它是否在屏幕上打印至少两行
如果在我的代码中,我从tqdm导入tqdm,然后在控制台Python中执行它,那么我得到:
10%|███████████▉ | 950/10000 [00:14<02:20, 64.37it/s]
10%|███████████▉ | 950/10000[00:14您确定整个函数的执行已完成吗?是否执行循环底部的打印?是的,整个函数已执行,我也获得了损失值,代码正在运行,但进度条@gooddeedesmaybeenumerate(tqdm(列车加载器))中没有响应
works?我在MikeXydas尝试了它,但没有成功。tqdm
一般有效吗?尝试一个示例,如本文的答案所示: