경 탁

[Fast ai와 파이토치가 만나 꽃피운 딥러닝] #2 본문

- 공부/2. AI

[Fast ai와 파이토치가 만나 꽃피운 딥러닝] #2

김 경 탁 2022. 1. 10. 14:45

 본 포스팅은 FAST-AI의 코드에 관한 부분을 중점적으로 다룹니다.
본 포스팅에서 다룰 내용은 4장 MNIST 분류기에 관한 내용입니다.
이 분야에서는 워낙 많이 쓰이는 데이터이기도 하고, 그래서 이미 많은 분들이 아실거라고 생각합니다.
이 책에서 밑바닥부터 다룬 부분이기도해서 내용이 살짝 난해하고 많긴 하지만 여러번 공부하고 정리하면 이해가 될듯 싶습니다.

1. 서론 및 문제제기 

path = untar_data(URLs.MNIST_SAMPLE)
path.ls()
threes = (path/'train'/'3').ls().sorted()
sevens = (path/'train'/'7').ls().sorted()

일단 MNIST 데이터를 다운받아줍니다.
.ls() 는 그 폴더에 어떤 파일이 들어있는지 판단해주는 것입니다.
여기서 threes 및 sevens 에 train 폴더의 3 이미지 및 7 이미지를 정의해줍니다. 

im3_path = threes[1]
im3 = Image.open(im3_path)
im3

임의로 im3_path라는 이름의 threes의 첫번째 파일을 정의해줍니다.
여기서 Image.open()을 쓰게되면 그 이미지를 보여줍니다.

im3_t = array(im3)
df = pd.DataFrame(im3_t)
df.style.set_properties(**{'font-size':'6pt'}).background_gradient('Greys')

한술 더떠서 array 혹은 tensor로 이미지를 변환한뒤, dataframe으로 변환시켜줍니다.
가장 아래있는 코드는 프레임을 폰트사이즈 6pt로 회색으로 칠하게 해주는 코드입니다.
'Greys'외에 'Blues'라던가 'Reds' 등으로도 설정 가능합니다.

3

 

7

 위에놈은 7입니다.
그럼 여기서 핵심은 '3과 7을 어떻게 해야 잘 구별할 수 있을 것인가 ?' 입니다.
어떻게 해야 3과 7을 야무지게 구별할 수 있을까요 ? ~^^ 

2. 일단 픽셀값들 비교해보기 

seven_tensors = [tensor(Image.open(s)) for s in sevens]
three_tensors = [tensor(Image.open(o)) for o in threes]
stacked_sevens = torch.stack(seven_tensors).float()/255
stacked_threes = torch.stack(three_tensors).float()/255
mean3 = stacked_threes.mean(0)
mean7 = stacked_sevens.mean(0)
show_image(mean3)
show_image(mean7)

7 이미지 파일들을 텐서로 불러옵니다. (3도 마찬가지)
이후 tensor들을 stack해줍니다.

출처 : https://sanghyu.tistory.com/85

 즉 3 이미지들과 7 이미지들을 저렇게 모아준다는 것입니다.
mean3 및 mean7은 각 픽셀값의 평균치, 즉 이상적인 3과 7을 만들어줍니다.
마지막 show_image는 이상적인 3과 7의 이미지를 보여줍니다.

2.1 픽셀값들의 차이 계산

dist_3_abs = (a_3 - mean3).abs().mean()
dist_3_sqr = ((a_3 - mean3)**2).mean().sqrt()
dist_3_abs, dist_3_sqr

dist_7_abs = (a_3 - mean7).abs().mean()
dist_7_sqr = ((a_3 - mean7)**2).mean().sqrt()
dist_7_abs, dist_7_sqr

 픽셀값들을 계산하였고, 또 이상적인 3과 7을 만들었으니
임의적인 3을 통해 픽셀값들의 차이를 계산해보겠습니다.
여기서 쓰이는 픽셀값들의 차이를 계산하는 방법이 2가지가 있습니다.
-MAD(평균절대차-L1노름) -RMSE(평균제곱근오차-L2노름) 입니다.


L1 노름
L2 노름

상식적으로 생각해봤을때 L2 노름은 L1 노름보다 오차에 더 큰 페널티를 부여한다고 생각할 수 있습니다.
(왜냐면 제곱을 하기 때문이죠 :-) ! 그후에 제곱근을 씌우긴 합니다.)

어쨋든 본론으로 넘어와서
저희가 임의적으로 정해준 3과 이상적인 3의 차이 
그리고 3과 이상적인 7의 차이... 두개의 차이가 보이시나요 ?
7과의 차이가 더 큰 것을 파악할 수 있습니다 !
나쁘지 않은 아이디어였던 것 같네요 ~ +_+ 

 다음 포스팅에서 또 찾아뵙겠습니다 ~ 

Comments