Neural Network 구현하기

Yelim Kim·2023년 7월 14일
0

Machine_Learning

목록 보기
39/44
post-thumbnail
  • input : Flattened MNIST Image => (784, ) vector

위 그림에서 x는 784개가 될 것이다.
그리고 첫번째 레이어에서 뉴런이 128개를 넣으면, 128개의 필터가 있다는 뜻이다!
각각의 뉴런들은 affine & sigmoid 를 거쳐서 각각 a1,a2,...,a128a_1, a_2, ..., a_{128}을 갖게 된다.

만약 여기서 두번째 레이어에 64개의 뉴런이 있다면,
이때도 모든 뉴런이 받는 입력은 128개이고, weight 128개, bias 1개이다. 그리고 출력은 64개이다.

마지막 레이어에는 10개의 뉴런이 있어야 할 것이다. 왜냐하면 MNIST 는 10개의 레이블이 있기 때문에 10개의 출력이 필요하기 때문이다.
마지막 출력에는 activation 대신 그대로 logic을 출력하고 softmax를 출력한다.
그럼 우리는 확률값을 얻을 수 있게 된다.

총 parameter 개수;

1stlayer=(784+1)128=1st layer =(784+1)\cdot128=
2ndlayer=(128+1)64=2ndlayer=(128+1)\cdot64=
3rdlayer=(64+1)10=3rdlayer=(64+1)\cdot10=

총합은 109,386개이다.

제일 처음 parametric function으로 돌아가서, 처음에는 파라미터가 2개였다. 파라미터를 조절해줌에 따라서 같은 입력을 받더라도 다른 출력을 낸다.
우리가 원하는 출력을 받기 위해 우리는 파라미터를 조정해준다.
우리가 원하는 출력 = 5가 적인 사진에 대해 p5p_5의 값이 크게 나오는 함수
파라미터 조절 = 학습

학습은 어떻게?
loss를 조절했다. cross entropy를 사용하면 loss가 출력되고,

loss를 줄이기 위한 방향으로 모든 파라미터가 미분을 구하고, 반대 방향으로 backpropagation을 진행한다.

예전에 배운 내용과 똑같다. 다만 모델이 커졌다.
모델이 커졌다는 것은, 같은 입력을 받더라도, 뉴런의 개수가 많아졌다. 즉, 다른 패턴을 추출하는 필터들이 늘어났다.

실습

모델 기초 구성

아래는 코드 뼈대

import torch.nn as nn

class ModelName(nn.Module):
  def __init__(self):
    super(ModelName, self).__init__()
    pass

  def forward(self, x):
    pass

model = ModelName()

ModelName에는 모델 네임이 들어간다.
super(ModelName, self).__init__() 상속받은 것 이 그대로 사용한다.

이 뒤에는 레이어를 만들어준다.
forward함수에서는 레이어를 어떻게 통과시킬 지 작성한다.

마지막 줄에서 모델을 찍어내고, 학습시킨다.

모델 실습

위에서 구성한 모델을 바탕으로 레이어를 작성한다.

import torch.nn as nn

class ModelName(nn.Module):
  def __init__(self):
    super(ModelName, self).__init__()
    
    self.fc1 = nn.Linear(in_features = 784, out_features = 128)
    self.fc1_act = nn.Sigmoid()

    self.fc2 = nn.Linear(in_features = 128, out_features = 64)
    self.fc2_act = nn.Sigmoid()

    self.fc3 = nn.Linear(in_features = 64, out_features = 10)
    self.softmax = nn.Softmax(dim=1)

  def forward(self, x):
    
    x = self.fc1(x)
    x = self.fc1_act(x)

    x = self.fc2(x)
    x = self.fc2_act(x)

    x = self.fc3(x)
    x = self.softmax(x)
    return x
    
model = ModelName()

__init__함수에서는 레이어를 만들고
forward함수에서는 입력값을 가지고 각각의 레이어를 통과하는 과정을 적는다.

self.softmax = nn.Softmax(dim=1) 뜻은 (-1,10)중에서 10을 기준으로 softmax를 통과시키겠다.라는것

torchsummary기능을 이용하여 전체적인 레이어와 파라미터 개수를 확인할 수 있다.

from torchsummary import summary
summary(model, input_size = (784, ))


-1로 나오는 이유는 아직 배치 사이즈를 정해주지 않았기 때문이고, 나중에 정해지면 그 수로 채워진다.

profile
뜬금없지만 세계여행이 꿈입니다.

0개의 댓글