
【pytorchでニューラルネットワーク#6】ニューラルネットワーク(sequential)
記事の目的
pytorchでニューラルネットワークを実装していきます。ここにある全てのコードは、コピペで再現することが可能です。
目次
1 ライブラリとデータ
x
26
26
1
# In[1]
2
from torchvision import datasets
3
import torchvision.transforms as transforms
4
from torch.utils.data import DataLoader
5
6
import torch
7
import torch.nn as nn
8
import torch.optim as optim
9
10
import matplotlib.pyplot as plt
11
torch.manual_seed(1)
12
13
# In[2]
14
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0),(1)),lambda x: x.view(-1)])
15
16
root = './data'
17
mnist_train = datasets.MNIST(root=root,download=True,train=True,transform=transform)
18
mnist_test = datasets.MNIST(root=root,download=True,train=False,transform=transform)
19
20
train_dataloader = DataLoader(mnist_train,batch_size=100,shuffle=True)
21
test_dataloader = DataLoader(mnist_test,batch_size=100,shuffle=False)
22
23
# In[3]
24
x, t = next(iter(train_dataloader))
25
image = x[0,].view(28,28).detach().numpy()
26
plt.imshow(image,cmap='binary_r')
2 モデル
1
4
1
# In[4]
2
model = nn.Sequential(nn.Linear(784,200), nn.ReLU(), nn.Linear(200,10))
3
criterion = nn.CrossEntropyLoss()
4
optimizer = optim.SGD(model.parameters(),lr=1e-2)
3 モデルの学習と評価
1
56
56
1
# In[5]
2
loss_train_all = []
3
acc_train_all = []
4
loss_test_all = []
5
acc_test_all = []
6
7
for epoch in range(1, 50+1):
8
9
loss_train = 0
10
acc_train = 0
11
loss_test = 0
12
acc_test = 0
13
14
for (x,t) in train_dataloader:
15
y = model(x)
16
loss = criterion(y,t)
17
optimizer.zero_grad()
18
loss.backward()
19
optimizer.step()
20
21
loss_train += loss.item()
22
acc_train += sum(y.argmax(axis=1) == t)/len(t)
23
24
loss_train_mean = loss_train / len(train_dataloader)
25
acc_train_mean = acc_train / len(train_dataloader)
26
27
with torch.no_grad():
28
for x, t in test_dataloader:
29
y = model(x)
30
loss = criterion(y,t)
31
32
loss_test += loss.item()
33
acc_test += sum(y.argmax(axis=1) == t)/len(t)
34
35
loss_test_mean = loss_test / len(test_dataloader)
36
acc_test_mean = acc_test / len(test_dataloader)
37
38
loss_train_all.append(loss_train_mean)
39
acc_train_all.append(acc_train_mean)
40
loss_test_all.append(loss_test_mean)
41
acc_test_all.append(acc_test_mean)
42
43
if epoch == 1 or epoch % 10 == 0:
44
print(f"Epoch: {epoch}")
45
print(f"loss_train: {loss_train_mean:.4f}, acc_train: {acc_train_mean:.4f}")
46
print(f"loss_test: {loss_test_mean:.4f}, acc_test: {acc_test_mean:.4f}")
47
48
# In[6]
49
plt.plot(range(1,len(loss_train_all)+1), loss_train_all, label="train")
50
plt.plot(range(1,len(loss_test_all)+1), loss_test_all, label="test")
51
plt.legend()
52
53
# In[7]
54
plt.plot(range(1,len(acc_train_all)+1), acc_train_all, label="train")
55
plt.plot(range(1,len(acc_test_all)+1), acc_test_all, label="test")
56
plt.legend()