-
패스트캠퍼스 환급챌린지 38일차 미션 (3월 9일) : 딥러닝·인공지능 Signature 초격차 패키지 Online. 강의 후기패스트캠퍼스 챌린지 2024. 3. 9. 12:54
자, 오늘은
CH07-02. 실습
&
Chapter8. VGGNet을 사용한 이미지분류 실습
CH08-01. 구현을 위한 코드의 이해
CH07-02. 실습
자 그러면 앞에서 살펴본 이론을 바탕으로 알렉스넷을 한번 학습해보자.

라이브러리 불러오는건 몇번 해봤으니 패스
import numpy as npimport matplotlib.pyplot as plt
import torchfrom torch.utils.data import DataLoaderfrom torch import nn
from torchvision import datasetsfrom torchvision.transforms import transformsfrom torchvision.transforms.functional import to_pil_image트랜스폼은 불러온 데이터셋을 전처리할때 사용하는데, 이번엔 어규멘테이션 할때 같이 해보자.
#CIFAR 데이터 불러오기training_img = datasets.CIFAR10(root = 'data',train = True,download = True,transform = transforms.ToTensor(),)
test_img = datasets.CIFAR10(root = 'data',train = False,download = True,transform = transforms.ToTensor(),)이미지 다운 받기... 뭐 어제 했던 패션아이템 갖고오는거랑 매우 동일하다.

이제 해야 할 것은 이미지 어규멘테이션, 즉 인풋되는 데이터셋(트레인)이 부족하게 되면 이미지 한장을 넣었을 때
얘가 학습할 껀덕지가 없기 때문에 이 이미지를 지지고 볶고 해서 유사한 이미지를 만들어
학습할 껀덕지를 증식시켜준다는 것이다.
그 방법으로는 대칭, 회전, 색상반전, 크롭 등등이 있고 지금 위에 올린 이미지는
불러온 이미지를 조금씩 변형한 형태도 학습시키기 위해 노말라이즈 작업을 해주는거고
이미지의 평균과 표준편차를 알아보았고 이 값을 기준으로 노라라이즈 해보자.
transform_train = transforms.Compose([transforms.ToTensor(),transforms.Normalize(mean, std),transforms.RandomCrop(size=training_img.data.shape[1], padding=4),transforms.RandomHorizontalFlip(),])
transform_test = transforms.Compose([transforms.ToTensor(),transforms.Normalize(mean, std),])텐서로 변환,
평균값과 표준편차를 통한 노말라이즈.
크롭과 호리존탈 플립
자!, 테스트데이터에는 변형을 하면 안되고 원본 그대로 써야한다.

한가지 꿀팁은 위에 데이터셋을 불러올 때, 사전에 이미 트랜스폼을 정의하고있다면
이렇게 바로 처리해줄수 있으니,
일을 2번 처리하지말고 한번에 할 수 있다는 점 메모하자.
# Set hyperparametersEPOCH = 10BATCH_SIZE = 128LEARNING_RATE = 1e-3DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")print("Using Device:", DEVICE)하이퍼파라미터는 그냥 다 여기서 묶어서 한꺼번에 설정 해주자.
labels_map = {0: "plane",1: "car",2: "bird",3: "cat",4: "deer",5: "dog",6: "frog",7: "horse",8: "ship",9: "truck",}앰니스트처럼 라벨을 정해주고,
class AlexNet(nn.Module):def __init__(self, num_classes = 10):super(AlexNet, self).__init__()self.features = nn.Sequential(nn.Conv2d(3, 96, kernel_size=11, stride = 4),nn>ReLU(inplace=True),nn.MaxPool2d(kernel_size=3, stride=2, padding=1),nn.Conv2d(96, 256, kernel_size=5, padding=2),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=3, stride=2, padding=1),nn.Conv2d(256,384, kernel_size=3, padding=1)nn.ReLU(inplace = True),nn.Conv2d(384, 384, kernel_size=3, padding = 1),nn.ReLU(inplace=True),nn.Conv2d(384, 256, kernel_size=3, padding=1),nn.ReLU(inplace = True),nn.MaxPool2d(kernel_size=3, stride=2, padding=1),)self.classifier = nn.Sequential(nn.Linear(256, 4096),nn.Dropout(0, 5),nn.ReLU(inplace = True),nn.Linear(4096, num_classes),)
def forward(self, x):x = self.features(x)x = x.view(x.size(0), -1)x = self.classifier(x)return x알렉스 넷이다.
# Model compileloss = nn.CrossEntropyLoss()#Optimizeroptimizer = torch.optim.Adam(model.parameters(), lr = LEARNING_RATE)
지난번에 했던걱 고대로 옮겨준다.

비행기를 다른걸로 착각한 것들을 한눈에 보기 좋게 표현한 표다...(얘를 뭐로 헷갈려했는지 알 수 있다)
와 이건 꼭 알아야겠다.
CH08-01. 구현을 위한 코드의 이해
VGG Net을 기억하는가.
2014년에 동일한 대회에서 2위 차지. 1위가 구글넷이었다. 구글넷과 비교했을 때 굉장히 간단한 구조였고,
Conv2, pooling layer 조합, 댄스레이어 조합 해서 어떤 카테고리에 속하는지 분류기 학습을 했는데,
가장 큰 특징은 모든 conv2 레이어에서 3*3 커널을 쓴다는게 가장 큰 특징이었다.
커널사이즈를 크게하면 연산량이 많아지는데 VGG넷은 커널 사이즈를 작게 해도 컨볼루션 연산을 반복 수행하는 것만으로도 리셉티브 필드를 넓히는 동일한 효과를 낸다고 했었다.
VGG 실습은 다음시간에 해보자.
38일차 끝.
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
'패스트캠퍼스 챌린지' 카테고리의 다른 글