# Pytorchでモデルを実装する際のベース [自分用メモ]

from torch.autograd import Variable

# Function to save the model
def saveModel():
path = "./myFirstModel.pth"
torch.save(model.state_dict(), path)

# Function to test the model with the test dataset and print the accuracy for the test images
def testAccuracy():

model.eval()
accuracy = 0.0
total = 0.0

images, labels = data
# run the model on the test set to predict labels
outputs = model(images)
# the label with the highest energy will be our prediction
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
accuracy += (predicted == labels).sum().item()

# compute the accuracy over all test images
accuracy = (100 * accuracy / total)
return(accuracy)

# Training function. We simply have to loop over our data iterator and feed the inputs to the network and optimize.
def train(num_epochs):

best_accuracy = 0.0

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print("The model will be running on", device, "device")
# Convert model parameters and buffers to CPU or Cuda
model.to(device)

for epoch in range(num_epochs):  # loop over the dataset multiple times
running_loss = 0.0
running_acc = 0.0

for i, (images, labels) in enumerate(train_loader, 0):

# get the inputs
images = Variable(images.to(device))
labels = Variable(labels.to(device))

# predict classes using images from the training set
outputs = model(images)
# compute the loss based on model output and real labels
loss = loss_fn(outputs, labels)
# backpropagate the loss
loss.backward()
optimizer.step()

# Let's print statistics for every 1,000 images
running_loss += loss.item()     # extract the loss value
if i % 1000 == 999:
# print every 1000 (twice per epoch)
print('[%d, %5d] loss: %.3f' %
(epoch + 1, i + 1, running_loss / 1000))
# zero the loss
running_loss = 0.0

# Compute and print the average accuracy fo this epoch when tested over all 10000 test images
accuracy = testAccuracy()
print('For epoch', epoch+1,'the test accuracy over the whole test set is %d %%' % (accuracy))

# we want to save the model if the accuracy is the best
if accuracy > best_accuracy:
saveModel()
best_accuracy = accuracy

https://docs.microsoft.com/ja-jp/windows/ai/windows-ml/tutorials/pytorch-train-model#train-the-model-on-the-training-data