<jupyter_start><jupyter_text>2．학습 데이터 준비<jupyter_code># PyTorch 라이브러리 임포트
import torch
from torch.autograd import Variable
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset

# scikit-learn 라이브러리 임포트
from sklearn.datasets import load_digits
from sklearn import datasets, model_selection

# pandas 라이브러리 임포트
import pandas as pd

# matplotlib 라이브러리 임포트
from matplotlib import pyplot as plt
from matplotlib import cm
%matplotlib inline
# MNIST 데이터를 읽어 들인 다음, 화면에 출력
mnist = datasets.fetch_mldata('MNIST original', data_home='./data/')
mnist
# 설명변수를 정규화하고 변수에 대입하고 화면에 출력
mnist_data = mnist.data / 255

# 데이터프레임 객체로 변환하고 화면에 출력
pd.DataFrame(mnist_data)
# 1번째 이미지를 화면에 출력
plt.imshow(mnist_data[0].reshape(28, 28), cmap=cm.gray_r)
plt.show()
# 목적변수를 변수에 할당하고 데이터를 화면에 출력
mnist_label = mnist.target
mnist_label
# 훈련 데이터 건수
train_size = 5000
# 테스트 데이터 건수
test_size = 500

# 데이터 집합을 훈련 데이터와 테스트 데이터로 분할
train_X, test_X, train_Y, test_Y = model_selection.train_test_split(
    mnist_data, mnist_label, train_size=train_size,test_size=test_size)
# 길이가 784인 1차원 배열을 28*28 크기의 2차원 배열로 만듬
train_X = train_X.reshape((len(train_X), 1, 28, 28))
test_X = test_X.reshape((len(test_X), 1, 28, 28))<jupyter_output><empty_output><jupyter_text>3．텐서 생성<jupyter_code># 훈련 데이터 텐서 변환
train_X = torch.from_numpy(train_X).float()
train_Y = torch.from_numpy(train_Y).long()

# 테스트 데이터 텐서 변환
test_X = torch.from_numpy(test_X).float()
test_Y = torch.from_numpy(test_Y).long()

# 변환된 텐서의 데이터 건수 확인
print(train_X.shape)
print(train_Y.shape)
# 설명변수와 목적변수 텐서를 합침
train = TensorDataset(train_X, train_Y)

# 텐서의 첫 번째 데이터를 확인
print(train[0])

# 미니배치 분할
train_loader = DataLoader(train, batch_size=100, shuffle=True)<jupyter_output><empty_output><jupyter_text>4．신경망 구성<jupyter_code># 신경망 구성
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        # 합성곱층
        self.conv1 = nn.Conv2d(1, 6, 5) # 입력 채널 수, 출력 채널 수, 필터 크기
        self.conv2 = nn.Conv2d(6, 16, 5)
        # 전결합층
        self.fc1 = nn.Linear(256, 64) # 256 = (((28-5+1)/2 )-5+1)/2 * (((28-5+1)/2 )-5+1)/2 * 16
        self.fc2 = nn.Linear(64, 10)
    
    def forward(self, x):
        # 풀링층
        x = F.max_pool2d(F.relu(self.conv1(x)), 2) # 풀링 영역 크기
        x = F.max_pool2d(F.relu(self.conv2(x)), 2)
        x = x.view(-1, 256)
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return F.log_softmax(x)
    
# 인스턴스 생성
model = Net()<jupyter_output><empty_output><jupyter_text>5．모형 학습<jupyter_code># 오차함수 객체
criterion = nn.CrossEntropyLoss()

# 최적화를 담당할 객체
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 학습 시작
for epoch in range(1000):
    total_loss = 0
    # 분할해 둔 데이터를 꺼내옴
    for train_x, train_y in train_loader:
        # 계산 그래프 구성
        train_x, train_y = Variable(train_x), Variable(train_y)
        # 경사 초기화
        optimizer.zero_grad()
        # 순전파 계산
        output = model(train_x)
        # 오차계산
        loss = criterion(output, train_y)
        # 역전파 계산
        loss.backward()
        # 가중치 업데이트
        optimizer.step()
        # 누적 오차 계산
        total_loss += loss.data[0]
    # 100회 반복마다 누적 오차 출력
    if (epoch+1) % 100 == 0:
        print(epoch+1, total_loss)
# 계산 그래프 구성
test_x, test_y = Variable(test_X), Variable(test_Y)
# 출력이 0 혹은 1이 되게 함
result = torch.max(model(test_x).data, 1)[1]
# 모형의 정확도 측정
accuracy = sum(test_y.data.numpy() == result.numpy()) / len(test_y.data.numpy())

# 모형의 정확도 출력
accuracy<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.12148736871984105, 'fraction_numerical': 0.03406187908032927, 'mean_word_length': 3.3995006242197254, 'pattern_counts': {'":': 0, '<': 17, '<?xml version=': 0, '>': 17, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '219858', 'license': 'Apache-2.0', 'n_tokens_mistral': 1890, 'n_tokens_neox': 2164, 'n_words': 354, 'path': 'pytlesson_notebooks/CH7-2_CNN_MNIST.ipynb', 'repo_name': 'YeoHoonYun/study_ex', 'size': '3523'}