with tqdm(dataloader['train']) as td: for batch_data in td: vision = batch_data['vision'].to(self.args.device) audio = batch_data['audio'].to(self.args.device) text = batch_data['text'].to(self.args.device) labels = batch_data['labels']['M'].to(self.args.device) if self.args.train_mode == 'classification': labels = labels.view(-1).long() else: labels = labels.view(-1, 1) # clear gradient ,梯度初始化为0,把loss关于weight的导数变成0 optimizer.zero_grad() # forward 前馈 outputs = model(text, audio, vision)['M'] # compute loss 计算损失 loss = self.criterion(outputs, labels) # backward 反馈 loss.backward() # update 跟新参数 optimizer.step() # store results train_loss += loss.item() y_pred.append(outputs.cpu()) y_true.append(labels.cpu())
时间: 2023-04-11 12:01:22 浏览: 58
这段代码使用了tqdm库来显示训练数据的进度条。通过循环遍历dataloader['train']中的每个batch_data,将其中的视觉、音频、文本和标签数据分别转移到设备上。如果训练模式是分类,则将标签数据展平为一维长整型;否则将标签数据展平为二维张量。
相关问题
for epoch in range(num_epochs): model.train() train_loss = 0 train_mae = 0 for batch_data, batch_target in train_dataloader: optimizer.zero_grad() output = model(batch
_data) # 前向传播
loss = loss_fn(output, batch_target) # 计算loss
train_loss += loss.item()
mae = mean_absolute_error(output.detach().cpu().numpy(), batch_target.detach().cpu().numpy()) # 计算MAE
train_mae += mae
loss.backward() # 反向传播
optimizer.step() # 更新梯度
train_loss /= len(train_dataloader)
train_mae /= len(train_dataloader)
model.eval() # 切换到评估模式
eval_loss = 0
eval_mae = 0
with torch.no_grad():
for batch_data, batch_target in eval_dataloader:
output = model(batch_data)
loss = loss_fn(output, batch_target)
eval_loss += loss.item()
mae = mean_absolute_error(output.detach().cpu().numpy(), batch_target.detach().cpu().numpy())
eval_mae += mae
eval_loss /= len(eval_dataloader)
eval_mae /= len(eval_dataloader)
print(f"Epoch {epoch+1}/{num_epochs}, Train Loss: {train_loss:.4f}, Train MAE: {train_mae:.4f}, Eval Loss: {eval_loss:.4f}, Eval MAE: {eval_mae:.4f}")
if eval_loss < best_eval_loss:
best_eval_loss = eval_loss
torch.save(model.state_dict(), save_path)
print("Save model successfully!")
train_loader = data.DataLoader(train_dataset, batch_size)
这行代码是用来创建一个数据加载器(data loader)的。数据加载器可以帮助我们在训练模型时,将数据分成小批次(batches)进行处理。
具体来说,`train_dataset` 是一个数据集(dataset),包含了我们用来训练模型的所有数据。`batch_size` 则是指定了每个小批次要包含多少个数据样本。
`data.DataLoader` 则是一个 PyTorch 中内置的函数,用来创建数据加载器。它的输入参数包括数据集和每个小批次的大小,还可以包括其他参数,比如是否要在每个 epoch (训练轮次)之后重新打乱数据等。