-
๋ณธ ๊ธ์ '๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋ ์์ฆ 2'์ 'pytorch๋ก ์์ํ๋ ๋ฅ ๋ฌ๋ ์ ๋ฌธ'์ ๋ณด๋ฉฐ ๊ณต๋ถํ ๋ด์ฉ์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
ํ์์ ์๊ฒฌ์ด ์์ฌ ๋ค์ด๊ฐ ๋ถ์ ํํ ๋ด์ฉ์ด ์กด์ฌํ ์ ์์ต๋๋ค.
1. ํ์ต๋ฅ (Learning late)
gradient descent๋ฅผ ํ ๋, ๋ฐ์๊ตญ์ ํฌ๊ธฐ๋ฅผ ์ ํ๋ ์ผ! ์ฆ, ์ผ๋ง๋ ์ด๋ํ ์ง ์ ํ๋ค.
์ฒ์์ ํ 0.1 ์ ๋์์ ์์ํ๋ค๊ฐ ๋๋ฌด ๋ฐ์ฐํ๋ฉด ์ค์ด๊ณ , ๋๋ฌด ์ง์ ์ด ์์ผ๋ฉด(๋ณํ๊ฐ ์์ผ๋ฉด) ๋๋ฆฌ๋ ์์ผ๋ก ์ต์ ์ ํ์ต๋ฅ ์ ์ฐพ์๊ฐ์ผ ํ๋ค.
2. Data Preprocessing
๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ.
๋ฐ์ดํฐ์ ํฌ๊ธฐ ํธ์ฐจ๊ฐ ๋๋ฌด ํฌ๋ฉด, ํฐ ๊ฐ์๋ง ์ง์คํ๊ฒ ๋์ด์ ํ์ต์ด ์ ๋์ง ์์ ์ ์๋ค.
์ ๊ท๋ถํฌํ(standardization)์ ํตํด์ ๊ท ๋ฑํ๊ฒ ๋ง๋ค์ด ์ค์ผ ํ๋ค.
mu = x_train.mean(dim=0) sigma = x_train.std(dim=0) norm_x_train = (x_train - mu) / sigma
์๋งคํ์ผ๋ก ๊ฐ์ค์น ์ ์ฒ๋ฆฌ๋ ์๋ค. 09-2์ ๋์จ๋ค.
3. MNIST
๋ฐฉ๋ํ ์์ ์๊ธ์จ ๋ฐ์ดํฐ๋ฅผ ๋ชจ์๋์ ๋ฐ์ดํฐ Set!
1) torch vision
์ ๋ช ํ ๋ฐ์ดํฐ ์ , ๋ชจ๋ธ ์ํคํ ์ณ, ํธ๋์ค ํผ ๋ฑ๋ฑ์ ์ ๊ณตํ๋ค.
2) introduction
- 28 x 28 image => 784 (input์ ๊ฐ์)
- 1 channel gray image (์์์ด ํ๋ฐฑ์ด๋ค = 1์ฑ๋์ด๋ค)
- 0~9 digits (0๋ถํฐ 9๊น์ง์ ์ซ์๊ฐ ์๋ค, output์ ๊ฐ์)
3) Reading data
import torchvision.datasets as dsets ... mnist_train = dsets.MNIST(root="MNIST_data/", train=True, transform=transforms.ToTensor(), download=True) mnist_test = dsets.MNIST(root="MNIST_data/", train=False, transform=transforms.ToTensor(), download=True)
dsets.MNIST
- root = mnist dataset์ด ์๋(์์) ์ฅ์ - ํ์ผ ์์น
- train = T๋ฉด ํ์ต ๋ฐ์ดํฐ, F๋ฉด ํ ์คํธ ๋ฐ์ดํฐ ์ฌ์ฉ
- transform = ๋ฐ์ดํฐ์ ํํ๋ฅผ ๊ฒฐ์ . ToTenser()๋ฅผ ํ๋ฉด pytorch์์ ์ฐ๋ ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ฟ์ค.
- download = T๋ฉด ํ์ผ ๊ฒฝ๋ก์ ๋ฐ์ดํฐ ์ ์ด ์์ ๊ฒฝ์ฐ, ๋ค์ด๋ก๋๋ฅผ ๋ฐ๊ฒ ๋ค๊ณ ๋ช ์.
data_loader = torch.utils.DataLoader(DataLoader=mnist_train, batch_size=batch_size, shuffle=True, drop_last=True)
Data loader : mini batch๋ฅผ ๋ง๋ค ๋ ์ฌ์ฉ.
- DataLoader = ์ด ๋ฐ์ด์ ์ ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฒ ๋ค.
- batch_size = ์ผ๋ง์ ํฌ๊ธฐ๋ก ์ด๋ค์ ๋๋ ๊ฒ์ด๋ค.
- shuffle = ํ์ตํ ๋ ๋ง๋ค ๋ฐ์ดํฐ๋ฅผ ์์ด ์ฃผ๊ฒ ๋ค.
- drop_last = T๋ผ๋ฉด, ๋ง์ง๋ง ๋ฐฐ์น๊ฐ ๋ฑ ์๋จ์ด์ง๊ณ ์ ๋งคํ๊ฒ ๋จ์ ๋ ๊ทธ ๋ฐฐ์น๋ฅผ ๋ฒ๋ฆฐ๋ค. (๋ค๋ฅธ ๋ฏธ๋ ๋ฐฐ์น๋ณด๋ค ๊ฐ์๊ฐ ์ ์ ๋ง์ง๋ง ๋ฐฐ์น๊ฐ ์๋์ ์ผ๋ก ๊ณผ๋ ํ๊ฐ๋๋ ํ์์ ๋ฐฉ์ง)
for epoch in range(training_epochs): ... for x, y in data_loader: X = X.view(-1, 28*28).to(device)
x์๋ mnist image, y์๋ label(0~9)์ด ๋ค์ด๊ฐ.
view๋ฅผ ์ด์ฉํด์ ๋ฐ์ดํฐ ํ์์ ๋ฐ๊ฟ์ค๋ค. (B, 1, 28, 28) -> (B, 784)
4) etc...
- Epoch : ๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ ์ ์ ์ฒด๊ฐ ํธ๋ ์ด๋์ ๋ชจ๋ ์ฌ์ฉ์ด ๋๋ค => ํ ์ํญ์ ๋์๋ค.
- batch size : ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ์ผ๋ง์ ํฌ๊ธฐ๋ก ์๋ฅด๋๋.
- Iteration : ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ๋ฐฐ์น ์ฌ์ด์ฆ๋งํผ ๋๋๋ฉด ๋์ค๋ ๋ฉ์ด๋ฆฌ์ ๊ฐ์. ๊ทธ ๊ฐ์์ Iteration์ ๋์๋ค -> 1 epoch
5) softmax train
import torch import torchvision.datasets as dsets import torchvision.transforms as transforms import matplotlib.pyplot as plt import random device = 'cuda' if torch.cuda.is_available() else 'cpu' # for reproducibility random.seed(777) torch.manual_seed(777) if device == 'cuda': torch.cuda.manual_seed_all(777) # hyperparameters training_epochs = 15 batch_size = 100 # MNIST dataset mnist_train = dsets.MNIST(root='MNIST_data/', train=True, transform=transforms.ToTensor(), download=True) mnist_test = dsets.MNIST(root='MNIST_data/', train=False, transform=transforms.ToTensor(), download=True) data_loader = torch.utils.data.DataLoader(dataset=mnist_train, batch_size=batch_size, shuffle=True, drop_last=True) # MNIST data image of shape 28 * 28 = 784 (input), output => 0~9 (10๊ฐ) linear = torch.nn.Linear(784, 10, bias=True).to(device) # to() = ์ฐ์ฐ์ ์ด๋์ ์ํํ ์ง ์ ํจ.(๊ธฐ๋ณธ์ CPU) #bias - ํธํฅ์ ์ฌ์ฉํ ๊ฑด์ง (๊ธฐ๋ณธ๊ฐ์ T) # define cost/loss & optimizer criterion = torch.nn.CrossEntropyLoss().to(device) # Softmax is internally computed. optimizer = torch.optim.SGD(linear.parameters(), lr=0.1) for epoch in range(training_epochs): # ์์ training_epochs์ ๊ฐ์ 15๋ก ์ง์ ํจ. avg_cost = 0 total_batch = len(data_loader) for X, Y in data_loader: #Iteration ๋๋ ค์ฃผ๊ธฐ (์ด๊ฒ ๋ค ๋๋ฉด 1epoch) # ๋ฐฐ์น ํฌ๊ธฐ๊ฐ 100์ด๋ฏ๋ก ์๋์ ์ฐ์ฐ์์ X๋ (100, 784)์ ํ ์๊ฐ ๋๋ค. X = X.view(-1, 28 * 28).to(device) # ๋ ์ด๋ธ์ ์-ํซ ์ธ์ฝ๋ฉ์ด ๋ ์ํ๊ฐ ์๋๋ผ 0 ~ 9์ ์ ์. Y = Y.to(device) optimizer.zero_grad() hypothesis = linear(X) cost = criterion(hypothesis, Y) cost.backward() optimizer.step() avg_cost += cost / total_batch print('Epoch:', '%04d' % (epoch + 1), 'cost =', '{:.9f}'.format(avg_cost)) print('Learning finished') # Test the model using test sets with torch.no_grad(): X_test = mnist_test.test_data.view(-1, 28 * 28).float().to(device) Y_test = mnist_test.test_labels.to(device) prediction = linear(X_test) correct_prediction = torch.argmax(prediction, 1) == Y_test accuracy = correct_prediction.float().mean() print('Accuracy:', accuracy.item()) # Get one and predict r = random.randint(0, len(mnist_test) - 1) X_single_data = mnist_test.test_data[r:r + 1].view(-1, 28 * 28).float().to(device) Y_single_data = mnist_test.test_labels[r:r + 1].to(device) print('Label: ', Y_single_data.item()) single_prediction = linear(X_single_data) print('Prediction: ', torch.argmax(single_prediction, 1).item()) plt.imshow(mnist_test.test_data[r:r + 1].view(28, 28), cmap='Greys', interpolation='nearest') plt.show()
<Reference>
https://deeplearningzerotoall.github.io/season2/lec_pytorch.html
'๐STUDY > ๐ฅPytorch ML&DL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
09-1. ํ์ฑํ ํจ์(Activation function) (0) 2020.03.07 08. Perceptron (0) 2020.03.03 06. softmax classification (0) 2020.02.28 05. Logistic Regression (0) 2020.02.28 04-2. Loading Data(Mini batch and data load) (0) 2020.02.24 ๋๊ธ