cs [COURSERA] Deep Neural Networks with PyTorch by IBM 강의 리뷰 1 - 2
본문 바로가기
  • 매일 한걸음씩
  • 매일 한걸음씩
개발/Deep Neural Networks with PyTorch 리뷰

[COURSERA] Deep Neural Networks with PyTorch by IBM 강의 리뷰 1 - 2

by 시몬쯔 2020. 3. 24.
728x90
반응형

그다음 1.4 Simple Dataset와 1.5 Dataset 강의에 대해 리뷰해보겠다.

 

1.4 Simple Dataset

 

Basic dataset을 만들고 여기에 transform을 적용해보자.

여기서 torch.manual_seed()는 random function이 우리가 이것을 부를 때마다 같은 수를 불러오게 한다.

또, torch.utils.data에 대해 더 자세히 알아보자. 

참고 : https://hulk89.github.io/pytorch/2019/09/30/pytorch_dataset/

 

pytorch dataset 정리 · Hulk의 개인 공부용 블로그

pytorch dataset 정리 30 Sep 2019 | ml pytorch dataloader Dataset, Sampler, Dataloader Overview Dataset Data를 가지고있는 객체. __len__, __getitem__을 구현해야함 DataLoader를 통해 data를 받아올 수 있다. DataLoader Dataset을 인자로 받아 data를 뽑아냄 Sampler data의 index를 반환 Dataset을 인자로 받음 shu

hulk89.github.io

요약하자면 Dataset은 말그대로 Data를 가지고 있는 객체고 Data:oader를 통해 data를 가져올 수 있다고 한다.

 

두 번째 특성에서 말하듯이 __len__, __getitem__을 구현해야 하는데 그래서 그다음 구현하는 알고리즘이 나온다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

# Define class for dataset

 

class toy_set(Dataset):

    

    # Constructor with default values 

    def __init__(self, length = 100, transform = None):

        self.len = length

        self.x = 2 * torch.ones(length, 2)

        self.y = torch.ones(length, 1)

        self.transform = transform

     

    # Getter

    def __getitem__(self, index):

        sample = self.x[index], self.y [index]

        if self.transform:

            sample = self.transform(sample)     

        return sample

    

    # Get Length

    def __len__(self):

        return self.len

Colored by Color Scripter

 

위에서 만든 toy_set클래스를 이용하여 우리의 dataset을 만들고 index 0 즉 첫 번째 값을 뽑으면 __getitem__ 함수를 이용하여 x, y 각각 index 0 번째 값을 가져온다. len는 처음 설정한 100이 나온다.

 

그다음, Data에 적용할 Transforms에 대해 알아보자.

 

x에 1을 더하고 y에 2를 곱하는 transform을 class로 만든 것이다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

# Create tranform class add_mult

 

class add_mult(object):

    

    # Constructor

    def __init__(self, addx = 1, muly = 2):

        self.addx = addx

        self.muly = muly

    

    # Executor

    def __call__(self, sample):

        x = sample [0]

        y = sample [1]

        x = x + self.addx

        y = y * self.muly

        sample = x, y

        return sample

cs

 

 

원래 x, y값과 transform add_mult을 적용한 값을 출력해보면 x에는 1이 더해졌고 y에는 2가 곱해졌음을 확인할 수 있다.

 

하지만 이렇게 일일이 add_mult를 적용하는 것보다 쉬운 방법이 있다.

class toy_set(Dataset)를 만들 때 Transform이라는 parameter를 넣었기 때문이다.

이런 식으로 toy_set() 대신 toy_set(transform = a_m)으로 transform을 정해줘서 만들면 된다.

 

여러 개의 transforms을 적용하려면 Compose를 사용하면 된다.

예를 들어, add_mult()를 적용하고 mult()를 적용하려면 두 transforms을 합치고 적용하면 된다.

 

그런 다음 그 compose 된 transform을 toy_set의 transform 파라미터에 넣으면 끝!

1.5 Dataset

 

들어가기 전, show_data라는 함수를 만들어 나중에 image를 보여줄 때 쓰자.

 

언제나와 같이 필요한 것들을 import

다른 것들은 알겠는데 PIL는 항상 보기만 하고 제대로 몰라서 한 번 검색해보았다.

 

참고 : http://pythonstudy.xyz/python/article/406-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%B2%98%EB%A6%AC-Pillow

 

예제로 배우는 파이썬 프로그래밍 - 파이썬 이미지 처리 (Pillow)

1. 파이썬에서의 이미지 처리 파이썬에서 이미지를 처리하고 핸들링하기 위해서는 Pillow, OpenCV, PIL 등의 외부 패키지를 설치해서 사용한다. 여기서는 PIL로부터 계승되어 많이 사용되는 Pillow 패키지를 사용한다. Pillow는 pip을 통해 아래와 같이 설치한다. pip install Pillow Pillow는 파이썬 이미징 라이브러리로서 여러 이미지 파일 포맷을 지원하고, 이미지 내부 데이타를 엑세스할 수 있게 하며, 다양한 이미지 처

pythonstudy.xyz

즉 from PIL import Image를 해줘야 image를 open, crop, save 등을 할 수 있다고 한다.

 

csv형식으로 된 파일을 불러와 pd의 dataframe으로 저장하는 과정이다. 맨 처음 경로를 설정하고 pd.read_csv를 이용해 data_name으로 둔다.

data_name.head()는 다음과 같이 dataframe의 앞부분을 보여주는 명령이다.

 

data_name.iloc [0,1]를 이용하여 0번째 row, 1번째 column 위치의 값을 가져온다. 위에서 표를 보면 img/fashion0.png임을 알 수 있다.

<참고>

index에 따라 가져온다고 생각하면 된다.

 

이제 파일명들을 알았으니 Image를 Load 해보자.

 

 

여기서 directory는 ''로 설정되어있음.

 

아까 PIL로부터 import 한 Image를 이용해서 Image.open 해보자.

그리고 plt라이브러리로브터 imshow 할 수 있다.

 

최종적으로 Dataset Class를 만들어보자.

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

# Create your own dataset object

 

class Dataset(Dataset):

 

    # Constructor

    def __init__(self, csv_file, data_dir, transform=None):

        

        # Image directory

        self.data_dir=data_dir

        

        # The transform is goint to be used on image

        self.transform = transform

        data_dircsv_file=os.path.join(self.data_dir, csv_file)

        # Load the CSV file contians image info

        self.data_name= pd.read_csv(data_dircsv_file)

        

        # Number of images in dataset

        self.len=self.data_name.shape [0] 

    

    # Get the length

    def __len__(self):

        return self.len

    

    # Getter

    def __getitem__(self, idx):

        

        # Image file path

        img_name=os.path.join(self.data_dir,self.data_name.iloc [idx, 1])

        # Open image file

        image = Image.open(img_name)

        

        # The class label for the image

        y = self.data_name.iloc[idx, 0]

        

        # If there is any transform method, apply it onto the image

        if self.transform:

            image = self.transform(image)

 

        return image, y

Colored by Color Scripter

cs

만든 Dataset class에 index.csv라는 파일명과 directory를 넣는다.

위에 class Dataset을 보면 return image, y 이므로 첫 번째는 image 두 번째는 이름을 return 한다.

 

 다음은 torchvision을 이용해보자!

 

Torchvision이란?

  • Torchvision 패키지는 딥러닝에서 쓰이는 popular datasets, model architectures 그리고 common transformations으로 구성되어있다고 한다.
  • 예를 들면 dataset으로는 MNIST, CIFAR 등 우리가 이름만 들어도 아는 dataset이 있고, model로는 classification, Semantic Segmentation 그리고 Object Detection 등이 있다. transformation으로는 Transforms on PIL Image, Transforms on torch.Tensor 등이 있다.

그런데 왜인지 coursera에서 코드 실습하는 페이지에서는 torchvision.transforms가 import가 안된다.

따라서, 후에 해결한 후 이 포스팅을 수정할 예정이다.

 

일단 1주 차 강의 리뷰 끝!

 

728x90
반응형

댓글