1. Précautions lors de la formation du modèle
(1) Habituellement, nous rassemblons les paramètres d'hyperparamètres pour rendre le code plus intuitif et facile à modifier :
BATCH_SIZE = 64
LEARNING_RATE = 0.01
EPOCH = 10
(2) À chaque tour d'époque, nous allons d'abord former l'ensemble d'entraînement, puis utiliser l'ensemble de test pour tester le taux de précision, donc généralement nous enregistrerons le nombre total de temps de formation total_train_step
et total_test_step
.
(3) Il est généralement nécessaire de mettre le modèle à l'état d'apprentissage avant de commencer l'apprentissage, et à l'état d'évaluation avant de tester. Ces deux états affecteront un petit nombre de couches telles que Dropout
et BatchNorm
:
model.train()
# training
model.eval()
# evaluation
(4) Le taux de précision est généralement calculé selon les méthodes suivantes dans les problèmes de classification :
import torch
a = torch.tensor([
[0.3, 0.7],
[0.6, 0.4]
]) # 假设两个物体二分类的结果
b = torch.tensor([0, 0]) # 正确的标签
print(a.argmax(dim=1)) # tensor([1, 0]),在第1维上取最大值,即对每一行求最大值,将最大值作为分类结果
print(a.argmax(dim=1) == b) # tensor([False, True]),与标签进行比较,第一个物体的结果与标签不符,第二个和标签相符
print((a.argmax(dim=1) == b).sum()) # tensor(1),将所有物体与标签的比较结果求和就是 True 的数量,也就是预测正确的数量
(5) N'interférez pas avec le modèle pendant le test, c'est-à-dire que le réseau de neurones ne peut pas générer de gradients pendant le test, donc le code suivant doit être ajouté avant chaque test :
with torch.no_grad():
# evaluation
2. Utilisez le GPU pour la formation
Prérequis : L'ordinateur dispose d'une carte graphique NVIDIA et CUDA est configuré, et vous pouvez utiliser torch.cuda.is_available()
pour vérifier si CUDA est disponible.
Lors de l'utilisation du GPU pour la formation, il est nécessaire de transférer l'objet Module et les données de type Tensor vers le GPU pour le calcul. D'une manière générale, il s'agit de mettre le modèle de réseau, les données et la fonction de perte sur le GPU pour le calcul.
Il existe deux manières d'utiliser l'entraînement GPU, la première consiste à utiliser cuda()
la fonction , par exemple :
# 网络模型
model = MyNetwork()
model = model.cuda()
# 损失函数
loss_function = nn.CrossEntropyLoss()
loss_function = loss_function.cuda()
# 数据
for step, data in enumerate(data_loader):
imgs, targets = data
imgs = imgs.cuda()
targets = targets.cuda()
L'autre consiste à utiliser to(device)
, device
qui est l'appareil que nous choisissons pour entraîner le modèle. Cette méthode est cuda()
légèrement la suivante :
- Pour les données de type Tensor (images, étiquettes, etc.),
to(device)
après , vous devez recevoir la valeur de retour, et la valeur de retour est ledevice
Tensor correctement défini. - Pour l'objet Module (modèle de réseau, fonction de perte), le modèle peut
to(device)
êtredevice
, et il n'est pas nécessaire de recevoir la valeur de retour. Bien entendu, la réception de la valeur de retour est également possible.
Par exemple:
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') # 'cuda:0' 表示第 0 号 GPU
# 网络模型
model = MyNetwork()
model.to(device)
# 损失函数
loss_function = nn.CrossEntropyLoss()
loss_function.to(device)
# 数据
for step, data in enumerate(data_loader):
imgs, targets = data
imgs = imgs.to(device)
targets = targets.to(device)