前言:我们用pytorch官方的tutorial来对比

1.transfer learning例子的对比代码

0.3:
def train_model(model, criterion, optimizer, scheduler, num_epochs=25): since
= time.time() best_model_wts = copy.deepcopy(model.state_dict()) best_acc = 0.0
for epoch in range(num_epochs): print('Epoch {}/{}'.format(epoch, num_epochs -
1)) print('-' * 10) # 每一个迭代都有训练和验证阶段 for phase in ['train', 'val']: if phase ==
'train': scheduler.step() model.train(True) # 设置 model 为训练 (training) 模式 else:
model.train(False) # 设置 model 为评估 (evaluate) 模式 running_loss = 0.0
running_corrects = 0 # 遍历数据 for data in dataloaders[phase]: # 获取输入 inputs,
labels = data # 用 Variable 包装输入数据 if use_gpu: inputs = Variable(inputs.cuda())
labels = Variable(labels.cuda()) else: inputs, labels = Variable(inputs),
Variable(labels) # 设置梯度参数为 0 optimizer.zero_grad() # 正向传递 outputs =
model(inputs) _, preds = torch.max(outputs.data, 1) loss = criterion(outputs,
labels) # 如果是训练阶段, 向后传递和优化 if phase == 'train': loss.backward()
optimizer.step() # 统计 running_loss += loss.data[0] * inputs.size(0)
running_corrects += torch.sum(preds == labels.data) epoch_loss = running_loss /
dataset_sizes[phase] epoch_acc = running_corrects / dataset_sizes[phase]
print('{} Loss: {:.4f} Acc: {:.4f}'.format( phase, epoch_loss, epoch_acc)) #
深拷贝 model if phase == 'val' and epoch_acc > best_acc: best_acc = epoch_acc
best_model_wts = copy.deepcopy(model.state_dict()) print() time_elapsed =
time.time() - since print('Training complete in {:.0f}m {:.0f}s'.format(
time_elapsed // 60, time_elapsed % 60)) print('Best val Acc:
{:4f}'.format(best_acc)) # 加载最佳模型的权重 model.load_state_dict(best_model_wts)
return model
0.4:
def train_model(model, criterion, optimizer, scheduler, num_epochs=25): since
= time.time() best_model_wts = copy.deepcopy(model.state_dict()) best_acc = 0.0
for epoch in range(num_epochs): print('Epoch {}/{}'.format(epoch, num_epochs -
1)) print('-' * 10) # Each epoch has a training and validation phase for phase
in ['train', 'val']: if phase == 'train': scheduler.step() model.train() # Set
model to training mode else: model.eval() # Set model to evaluate mode
running_loss = 0.0 running_corrects = 0 # Iterate over data. for inputs, labels
in dataloaders[phase]: inputs = inputs.to(device) labels = labels.to(device) #
zero the parameter gradients optimizer.zero_grad() # forward # track history if
only in train with torch.set_grad_enabled(phase == 'train'): outputs =
model(inputs) _, preds = torch.max(outputs, 1) loss = criterion(outputs,
labels) # backward + optimize only if in training phase if phase == 'train':
loss.backward() optimizer.step() # statistics running_loss += loss.item() *
inputs.size(0) running_corrects += torch.sum(preds == labels.data) epoch_loss =
running_loss / dataset_sizes[phase] epoch_acc = running_corrects.double() /
dataset_sizes[phase] print('{} Loss: {:.4f} Acc: {:.4f}'.format( phase,
epoch_loss, epoch_acc)) # deep copy the model if phase == 'val' and epoch_acc >
best_acc: best_acc = epoch_acc best_model_wts =
copy.deepcopy(model.state_dict()) print() time_elapsed = time.time() - since
print('Training complete in {:.0f}m {:.0f}s'.format( time_elapsed // 60,
time_elapsed % 60)) print('Best val Acc: {:4f}'.format(best_acc)) # load best
model weights model.load_state_dict(best_model_wts) return model
可以明显看到以下几点改变:

1.0.4中使用设备:.to(device)

2.0.4中删除了Variable,直接tensor就可以

3.with torch.no_grad():的使用代替volatile

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信