使用 PyTorch 进行训练#
每轮次(Epoch)活动#
在每个轮次中,我们通常需要做几件事
在一组未用于训练的数据上检查我们的相对损失来进行验证,并报告该损失
保存模型副本
在这里,我们将在 TensorBoard 中进行报告。这将需要到命令行启动 TensorBoard,并在另一个浏览器标签页中打开它。
# Initializing in a separate cell so we can easily add more epochs to the same run
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
writer = SummaryWriter(f'runs/fashion_trainer_{timestamp}')
epoch_number = 0
EPOCHS = 5
best_vloss = 1_000_000.
for epoch in range(EPOCHS):
print(f'EPOCH {epoch_number + 1}:')
# Make sure gradient tracking is on, and do a pass over the data
model.train(True)
avg_loss = train_one_epoch(epoch_number, writer)
running_vloss = 0.0
# Set the model to evaluation mode, disabling dropout and using population
# statistics for batch normalization.
model.eval()
# Disable gradient computation and reduce memory consumption.
with torch.no_grad():
for i, vdata in enumerate(validation_loader):
vinputs, vlabels = vdata
voutputs = model(vinputs)
vloss = loss_fn(voutputs, vlabels)
running_vloss += vloss
avg_vloss = running_vloss / (i + 1)
print(f'LOSS train {avg_loss} valid {avg_vloss}')
# Log the running loss averaged per batch
# for both training and validation
writer.add_scalars('Training vs. Validation Loss',
{ 'Training' : avg_loss, 'Validation' : avg_vloss },
epoch_number + 1)
writer.flush()
# Track best performance, and save the model's state
if avg_vloss < best_vloss:
best_vloss = avg_vloss
model_path = f'model_{timestamp}_{epoch_number}'
torch.save(model.state_dict(), model_path)
epoch_number += 1
EPOCH 1:
batch 1000 loss: 1.654247484177351
batch 2000 loss: 0.7726962686181068
batch 3000 loss: 0.6987732860718389
batch 4000 loss: 0.6221569780111312
batch 5000 loss: 0.5804557499862276
batch 6000 loss: 0.5524890179708017
batch 7000 loss: 0.5295137383388355
batch 8000 loss: 0.5009265253145714
batch 9000 loss: 0.5058054737325292
batch 10000 loss: 0.49260745361773295
batch 11000 loss: 0.468585665261955
batch 12000 loss: 0.45380957032914737
batch 13000 loss: 0.44796896913426465
batch 14000 loss: 0.41935056390626413
batch 15000 loss: 0.4201206929102191
LOSS train 0.4201206929102191 valid 0.40279826521873474
EPOCH 2:
batch 1000 loss: 0.41227510012625135
batch 2000 loss: 0.39864704573201015
batch 3000 loss: 0.4001820913331467
batch 4000 loss: 0.39508082253983595
batch 5000 loss: 0.36207930756598944
batch 6000 loss: 0.35573555010774727
batch 7000 loss: 0.3830765788261197
batch 8000 loss: 0.3624298877255933
batch 9000 loss: 0.3632407153651584
batch 10000 loss: 0.3778950179115636
batch 11000 loss: 0.3576152681231906
batch 12000 loss: 0.36515091116545956
batch 13000 loss: 0.3611713805411709
batch 14000 loss: 0.33597958153762736
batch 15000 loss: 0.343264871072548
LOSS train 0.343264871072548 valid 0.40966489911079407
EPOCH 3:
batch 1000 loss: 0.32743183934202535
batch 2000 loss: 0.3444891562992852
batch 3000 loss: 0.3291725230075281
batch 4000 loss: 0.3187070913249045
batch 5000 loss: 0.32714095296346934
batch 6000 loss: 0.30739905216288754
batch 7000 loss: 0.32212489395512967
batch 8000 loss: 0.29795379653651616
batch 9000 loss: 0.3247700735194667
batch 10000 loss: 0.315623918322759
batch 11000 loss: 0.33626489514997226
batch 12000 loss: 0.32514980087045114
batch 13000 loss: 0.338065604444957
batch 14000 loss: 0.3192359950903192
batch 15000 loss: 0.3433123947502827
LOSS train 0.3433123947502827 valid 0.3421742916107178
EPOCH 4:
batch 1000 loss: 0.30375947376329715
batch 2000 loss: 0.29673802652818265
batch 3000 loss: 0.3037119593455718
batch 4000 loss: 0.30708115856312906
batch 5000 loss: 0.3028442856037436
batch 6000 loss: 0.27089441766872185
batch 7000 loss: 0.3011226830706473
batch 8000 loss: 0.2984363955456356
batch 9000 loss: 0.3007340987546827
batch 10000 loss: 0.29771704207872973
batch 11000 loss: 0.31568263667479185
batch 12000 loss: 0.25841389897736733
batch 13000 loss: 0.30573024399650606
batch 14000 loss: 0.31712972641549275
batch 15000 loss: 0.2965977080956945
LOSS train 0.2965977080956945 valid 0.3430803716182709
EPOCH 5:
batch 1000 loss: 0.2697474466083549
batch 2000 loss: 0.2738529558030714
batch 3000 loss: 0.28960374634153413
batch 4000 loss: 0.268796529449495
batch 5000 loss: 0.3020780498078084
batch 6000 loss: 0.2722164069009668
batch 7000 loss: 0.2717584210411369
batch 8000 loss: 0.2732993564447643
batch 9000 loss: 0.2600738099713435
batch 10000 loss: 0.2821929820111945
batch 11000 loss: 0.29318459536922775
batch 12000 loss: 0.26708484860020687
batch 13000 loss: 0.2733659076172953
batch 14000 loss: 0.2895496564986479
batch 15000 loss: 0.3003611703527422
LOSS train 0.3003611703527422 valid 0.3127398192882538
要加载已保存的模型版本
saved_model = GarmentClassifier()
saved_model.load_state_dict(torch.load(PATH))
加载模型后,它就可以用于您所需的任何任务——进一步训练、推理或分析。
请注意,如果您的模型具有影响模型结构的构造函数参数,则需要提供这些参数,并对模型进行与保存时完全相同的配置。
