딥 러닝(10) – AlexNet

알렉스넷

CNN 구조의 상위 뷰

3D 구조

넓은(넓은)높이(키)뿐만 아니라 깊이(깊이)가지다

이미지는 3개의 R/G/B 컴포넌트를 가지고 있기 때문에 3으로 시작하지만 컨볼루션은 특징 맵을 생성하고 그에 따라 중간 이미지의 깊이가 변경됩니다. (3에서 더 클 수 있음)


AlexNet의 구조


– 총 5개의 컨볼루션 레이어 + 3개의 완전 연결 레이어

– 마지막 완전 연결 계층은 softmax 활성화 기능을 사용하여 1000개의 범주를 분류합니다.

– 2개의 GPU를 기반으로 한 병렬 구조.

– 네트워크 입력:

대상 코드에 대한 네트워크 설계


도서관에 전화하기

import torch
import torchvision
from torch.utils.data import DataLoader, Dataset
from torchvision import transforms
from torch.autograd import Variable
from torch import optim
import torch.nn as nn
import torch.nn.functional as F
import os
import cv2
import random
from PIL import Image
from tqdm import tqdm_notebook as tqdm
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

데이터 전처리

– 이미 설명을 했으니 굳이 설명을 넣지 않겠습니다.

D 6-23 데이터 전처리

class ImageTransform():
    def __init__(self, resize, mean, std):
        self.data_transform = {
            'train': transforms.Compose((
                transforms.RandomResizedCrop(resize, scale=(0.5,1.0)),
                transforms.RandomHorizontalFlip(),
                transforms.ToTensor(),
                transforms.Normalize(mean, std)
            )),
            'val': transforms.Compose((
                transforms.Resize(256),
                transforms.CenterCrop(resize),
                transforms.ToTensor(),
                transforms.Normalize(mean, std)
            ))
        }

    def __call__(self, img, phase):
        return self.data_transform(phase)(img)

이미지가 위치한 경로에서 데이터를 가져와 학습, 검증, 테스트로 분리

cat_directory = '/cat'
dog_directory = '/dog'


cat_images_filepaths = sorted((os.path.join(cat_directory, f) for f in os.listdir(cat_directory)))
dog_images_filepaths = sorted((os.path.join(dog_directory, f) for f in os.listdir(dog_directory)))
images_filepaths = (*cat_images_filepaths, *dog_images_filepaths)
correct_images_filepaths = (i for i in images_filepaths if cv2.imread(i) is not None)

random.seed(42)
random.shuffle(correct_images_filepaths)
train_images_filepaths = correct_images_filepaths(:400)
val_images_filepaths = correct_images_filepaths(400:-10)
test_images_filepaths = correct_images_filepaths(-10:)
print(len(train_images_filepaths), len(val_images_filepaths), len(test_images_filepaths))

사용자 정의 데이터 세트 정의

class DogvsCatDataset(Dataset):
    def __init__(self, file_list, transform=None, phase="train"):
        self.file_list = file_list #이미지 데이터가 위치한 파일 경로
        self.transform = transform #이미지 데이터 전처리
        self.phase = phase #self.phase는 ImageTransform()에서 정의한 ‘train’과 ‘val’을 의미
    def __len__(self):
        return len(self.file_list)
        
    def __getitem__self(self, idx):
        img_path = self.file_list(idx) #이미지 데이터의 인덱스를 가져오기
        img = Image.open(img_path)
        img_transformed = self.transform(img, self.phase)
        
        label = img_path.split('/')(-1).split('.')(0) #레이블 값 가져오기
        if label == 'dog':
            label = 1
        elif label == 'cat':
            label = 0
            
        return img_transformed, label  # 전처리가 적용된 이미지와 레이블을 반환함

변수 정의(평균, 표준편차, 배치 크기, 이미지 데이터 크기)

size = 256
mean = ()