hyunsu-yang / PyTorch

Deep Learning Zero to All - Pytorch
0 stars 0 forks source link

pytorch study 7주차 #8

Open hyunsu-yang opened 4 years ago

hyunsu-yang commented 4 years ago

강의

목차

hyunsu-yang commented 4 years ago

Lab-10-1 Convolution

키워드

핵심

문제

  1. padding을 넣는 이유는?

    • 출력데이터의 공간적(Spatial)크기를 조절하기 위해 사용
    • 아웃풋 이미지가 너무 작아지지 않게 방지하는 건데 convolution filter 통과시 패딩을 사용하지 않고 너무 작아지게 되면 정보가 너무 축소 되기 때문에 뉴럴 네트워크 성능에 좋지 않음
  2. 5x5 이미지에 대하여 stride가 1인 경우와 2인 경우 연산량이 몇 배 차이 나는가? (단, filter는 3x3이고 padding 등은 없는 것으로 한다.)

    • stride : 1
    • output = (5 - 3 + (2*0))/1 + 1 = 3
    • stride : 2
    • output = (5 - 3 + (2*0))/2 + 1 = 2
    • 연산 량 ?
    • 4배 차이
hyunsu-yang commented 4 years ago

Lab-10-2 Mnist CNN

핵심

# CNN Model (2 conv layers)
class CNN(torch.nn.Module):

    def __init__(self):
        super(CNN, self).__init__()
        # L1 ImgIn shape=(?, 28, 28, 1)
        #    Conv     -> (?, 28, 28, 32)
        #    Pool     -> (?, 14, 14, 32)
        self.layer1 = torch.nn.Sequential(
            torch.nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1),
            torch.nn.ReLU(),
            torch.nn.MaxPool2d(kernel_size=2, stride=2))
        # L2 ImgIn shape=(?, 14, 14, 32)
        #    Conv      ->(?, 14, 14, 64)
        #    Pool      ->(?, 7, 7, 64)
        self.layer2 = torch.nn.Sequential(
            torch.nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1),
            torch.nn.ReLU(),
            torch.nn.MaxPool2d(kernel_size=2, stride=2))
        # Final FC 7x7x64 inputs -> 10 outputs
        self.fc = torch.nn.Linear(7 * 7 * 64, 10, bias=True)
        torch.nn.init.xavier_uniform_(self.fc.weight)

    def forward(self, x):
        out = self.layer1(x)
        out = self.layer2(out)
        out = out.view(out.size(0), -1)   # Flatten them for FC
        out = self.fc(out)
        return out

# instantiate CNN model
model = CNN().to(device)

# train my model
total_batch = len(data_loader)
print('Learning started. It takes sometime.')
for epoch in range(training_epochs):
    avg_cost = 0

    for X, Y in data_loader:
        # image is already size of (28x28), no reshape
        # label is not one-hot encoded
        X = X.to(device)
        Y = Y.to(device)

        optimizer.zero_grad()
        hypothesis = model(X)
        cost = criterion(hypothesis, Y)
        cost.backward()
        optimizer.step()

        avg_cost += cost / total_batch

    print('[Epoch: {:>4}] cost = {:>.9}'.format(epoch + 1, avg_cost))

print('Learning Finished!')

# Test model and check accuracy
with torch.no_grad():
    X_test = mnist_test.test_data.view(len(mnist_test), 1, 28, 28).float().to(device)
    Y_test = mnist_test.test_labels.to(device)

    prediction = model(X_test)
    correct_prediction = torch.argmax(prediction, 1) == Y_test
    accuracy = correct_prediction.float().mean()
    print('Accuracy:', accuracy.item())

문제

  1. cpu를 사용하는 경우와 cuda를 사용할 경우 random seed를 줄 때 코드 상에 어떤 차이가 있는지?

    # for reproducibility
    torch.manual_seed(777)
    if device == 'cuda':
    torch.cuda.manual_seed_all(777)
  2. 레이어를 깊게 쌓을 수록 정확도가 더 좋아질까?

    • 모델의 레이어를 깊이를 더 깊게 만든다고 해서 학습이 더 잘되는 것은 아님.
hyunsu-yang commented 4 years ago

Lab-10-3 visdom

핵심

문제

  1. env 값의 용도는?
    • 한번의 모든 창을 제어(off) 사용