Skip to content

Latest commit

Β 

History

History
271 lines (236 loc) Β· 21.4 KB

part4.md

File metadata and controls

271 lines (236 loc) Β· 21.4 KB

좜처

λ°‘λ°”λ‹₯λΆ€ν„° μ‹œμž‘ν•˜λŠ” λ”₯λŸ¬λ‹ 3 : https://www.hanbit.co.kr/store/books/look.php?p_code=B6627606922

μ†ŒμŠ€μ½”λ“œ : https://github.com/WegraLee/deep-learning-from-scratch-3

[DeZero] 4. 신경망 λ§Œλ“€κΈ°

1. ν…μ„œ ν•¨μˆ˜ κ΅¬ν˜„

μ›μ†Œλ³„ 연산을 μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜

  • ν…μ„œ μ‚¬μš© μ‹œμ˜ μˆœμ „νŒŒ
    • λ„˜νŒŒμ΄μ˜ λΈŒλ‘œλ“œμΊμŠ€νŠΈ(broadcast) : ν”Όμ—°μ‚°μžμ˜ ν˜•μƒμ΄ λ‹€λ₯΄λ©΄ μžλ™μœΌλ‘œ 데이터λ₯Ό λ³΅μ‚¬ν•˜μ—¬ 같은 ν˜•μƒμ˜ ν…μ„œλ‘œ λ³€ν™˜ν•΄μ£ΌλŠ” κΈ°λŠ₯
  • ν…μ„œ μ‚¬μš© μ‹œμ˜ μ—­μ „νŒŒ
    • image

μ›μ†Œλ³„λ‘œ κ³„μ‚°ν•˜μ§€ μ•ŠλŠ” ν•¨μˆ˜

β€» 주의 : Function의 backward λ‚΄μ—μ„œ λͺ¨λ‘ Variable μΈμŠ€ν„΄μŠ€λ₯Ό μ‚¬μš©ν•˜λ―€λ‘œ κ΅¬ν˜„ν•  λ•Œ DeZero ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

  • ν˜•μƒ λ³€ν™˜ ν•¨μˆ˜

    • reshape : ν…μ„œμ˜ ν˜•μƒμ„ λ°”κΎΈλŠ” ν•¨μˆ˜ - [Function으둜 κ΅¬ν˜„ | Variable ν΄λž˜μŠ€μ— μΆ”κ°€]
      • μˆœμ „νŒŒ : numpy의 reshape ν•¨μˆ˜ μ‚¬μš©
      • μ—­μ „νŒŒ : 기울기의 ν˜•μƒμ΄ μž…λ ₯의 ν˜•μƒκ³Ό 같아지도둝 λ³€ν™˜
    • transpose : 행렬을 μ „μΉ˜ν•΄μ£ΌλŠ” ν•¨μˆ˜ - [Function으둜 κ΅¬ν˜„ | Variable ν΄λž˜μŠ€μ— μΆ”κ°€]
      • μˆœμ „νŒŒ : numpy의 transpose ν•¨μˆ˜ μ‚¬μš©
      • μ—­μ „νŒŒ : 좜λ ₯ μͺ½μ—μ„œ μ „ν•΄μ§€λŠ” 기울기의 ν˜•μƒμ„ μˆœμ „νŒŒ λ•Œμ™€ λ°˜λŒ€ ν˜•νƒœλ‘œ λ³€κ²½
  • 합계 ν•¨μˆ˜

    • sum : μ›μ†Œκ°€ 2개 이상인 λ²‘ν„°μ˜ ν•© - [Function으둜 κ΅¬ν˜„ | Variable ν΄λž˜μŠ€μ— μΆ”κ°€]
      • μˆœμ „νŒŒ : numpy의 sum ν•¨μˆ˜ μ‚¬μš©
      • μ—­μ „νŒŒ : 기울기λ₯Ό μž…λ ₯ λ³€μˆ˜μ˜ ν˜•μƒκ³Ό 같아지도둝 λ³΅μ‚¬ν•œλ‹€. (μ•„λž˜ broadcast_to ν•¨μˆ˜ μ‚¬μš©)
        • axis, keepdim μ§€μ›μœΌλ‘œ 인해 기울기의 ν˜•μƒμ„ λ³€ν™˜ν•˜λŠ” κ²½μš°κ°€ 생기기 λ•Œλ¬Έμ— 이에 λŒ€μ‘ν•˜λŠ” ν•¨μˆ˜ : [utils에 κ΅¬ν˜„]
  • λΈŒλ‘œλ“œμΊμŠ€νŠΈ ν•¨μˆ˜

    • broadcast_to : x의 μ›μ†Œλ₯Ό λ³΅μ œν•˜μ—¬ shape인수둜 μ§€μ •ν•œ ν˜•μƒμ΄ λ˜λ„λ‘ ν•œλ‹€. - [Function으둜 κ΅¬ν˜„]
      • μˆœμ „νŒŒ : numpy의 broadcast_to ν•¨μˆ˜ μ‚¬μš©
      • μ—­μ „νŒŒ : 'μ›μ†Œ 볡사'κ°€ 일어날 경우, μ—­μ „νŒŒ λ•ŒλŠ” 기울기의 'ν•©'을 κ΅¬ν•œλ‹€. (μ•„λž˜ sum_to ν•¨μˆ˜ μ‚¬μš©)
    • sum_to : x의 μ›μ†Œμ˜ 합을 ꡬ해 shape ν˜•μƒμœΌλ‘œ λ§Œλ“€μ–΄μ£ΌλŠ” ν•¨μˆ˜ - [Function으둜 κ΅¬ν˜„]
      • μˆœμ „νŒŒ : numpy에 sum_to ν•¨μˆ˜ μ—†μŒ - [utils에 κ΅¬ν˜„ | (μ°Έκ³ )chainer의 μ½”λ“œ]
      • μ—­μ „νŒŒ : μž…λ ₯ x와 ν˜•μƒμ΄ 같아지도둝 기울기의 μ›μ†Œ λ³΅μ œν•œλ‹€. (μœ„μ˜ broadcast_to ν•¨μˆ˜ μ‚¬μš© (μ„œλ‘œ μƒν˜Έμ˜μ‘΄μ ))
    • λΈŒλ‘œλ“œμΊμŠ€νŠΈ λŒ€μ‘
      • 문제 : numpy의 broadcast_toκ°€ 보이지 μ•ŠλŠ” κ³³μ—μ„œ 이루어지면 μ—­μ „νŒŒκ°€ μΌμ–΄λ‚˜μ§€ μ•ŠλŠ”λ‹€.
      • ν•΄κ²° : Add, Mul, Sub, Div λ“± 사칙연산 ν΄λž˜μŠ€μ—μ„œ, μˆœμ „νŒŒ λ•Œ broadcastκ°€ 일어났닀고 νŒλ‹¨λ˜λ©΄ μ—­μ „νŒŒ λ•Œ DeZero의 sum_toλ₯Ό μ‚¬μš©ν•˜μ—¬ λ³΄μ •ν•œλ‹€. - [core에 반영]
  • ν–‰λ ¬μ˜ κ³±

    • κ°œλ…
      • image
    • matmul : ν–‰λ ¬ κ³± 계산 - [Function으둜 κ΅¬ν˜„]
      • μˆœμ „νŒŒ : numpy의 dot ν•¨μˆ˜ μ‚¬μš©
        • np.dot(x, W) λŒ€μ‹  x.dot(W)둜 κ΅¬ν˜„ν•˜μ—¬ ndarray μΈμŠ€ν„΄μŠ€μ—λ„ λŒ€μ‘ν•  수 μžˆλ„λ‘ ν•œλ‹€.
      • μ—­μ „νŒŒ : μ—­μ „νŒŒ κ³„μ‚°μ—μ„œμ˜ ν–‰λ ¬μ˜ 곱은 matmul ν•¨μˆ˜ μ‚¬μš©
  • 슬라이슀 μ‘°μž‘ ν•¨μˆ˜

    • GetItem, get_item : Variable의 닀차원 λ°°μ—΄ μ€‘μ—μ„œ 일뢀λ₯Ό 슬라이슀(slice)ν•˜μ—¬ λ½‘λŠ”λ‹€. - [Function으둜 κ΅¬ν˜„ | Variable ν΄λž˜μŠ€μ— μΆ”κ°€]
      • μˆœμ „νŒŒ : numpy의 ndarray의 slice κΈ°λŠ₯ κ·ΈλŒ€λ‘œ μ‚¬μš©
      • μ—­μ „νŒŒ : μ•„λž˜μ˜ GetItemGrad ν•¨μˆ˜ 이용
    • GetItemGrad - [Function으둜 κ΅¬ν˜„]
      • μˆœμ „νŒŒ : numpy의 add.at ν•¨μˆ˜ 이용
      • μ—­μ „νŒŒ : μœ„μ˜ get_item ν•¨μˆ˜ 이용

2. 신경망 κ΅¬ν˜„(νšŒκ·€)

μ„ ν˜• νšŒκ·€

  • νšŒκ·€(regression) : xλ‘œλΆ€ν„° μ‹€μˆ«κ°’ yλ₯Ό μ˜ˆμΈ‘ν•˜λŠ” 것
  • μ„ ν˜• νšŒκ·€(linear regression) : νšŒκ·€ λͺ¨λΈ 쀑 μ˜ˆμΈ‘κ°’μ΄ μ„ ν˜•(직선)을 μ΄λ£¨λŠ” 것
    • λͺ©ν‘œ : , 손싀 ν•¨μˆ˜μ˜ 좜λ ₯을 μ΅œμ†Œν™”ν•˜λŠ” 와 μ°ΎκΈ°
    • 평균 제곱 였차(mean squared error) : μ„ ν˜• νšŒκ·€λŠ” 손싀 ν•¨μˆ˜λ‘œ 평균 제곱 였차λ₯Ό μ΄μš©ν•  수 μžˆλ‹€.
  • μ„ ν˜• νšŒκ·€ κ΅¬ν˜„ 예제
    • κ²½μ‚¬ν•˜κ°•λ²•μœΌλ‘œ λ§€κ°œλ³€μˆ˜λ₯Ό κ°±μ‹ ν•  λ•Œ, 계산 κ·Έλž˜ν”„λ₯Ό λ§Œλ“€μ§€ μ•Šλ„λ‘ W.data, W.grad.data값을 μ΄μš©ν•œλ‹€.
    • DeZero λ‚΄λΆ€μ—μ„œ Variable μΈμŠ€ν„΄μŠ€λ‘œ λ³€ν™˜ν•˜λ―€λ‘œ ndarray μΈμŠ€ν„΄μŠ€λ„ μ²˜λ¦¬ν•  수 μžˆλ‹€. μ•žμœΌλ‘œλ„ xκ°€ ndarray μΈμŠ€ν„΄μŠ€μΈ μƒνƒœλ‘œ λ“€μ–΄κ°ˆ 수 있음

신경망

  • μ„ ν˜• λ³€ν™˜(linear transformation) (ν˜Ήμ€ μ•„ν•€ λ³€ν™˜(affine transformation))
    • y = F.matmul(x, W) + b
    • 완전연결계측(fully connected layer)에 ν•΄λ‹Ήν•œλ‹€.
  • λΉ„μ„ ν˜• λ³€ν™˜(nonlinear transformation)
  • 2μΈ΅ 신경망 κ΅¬ν˜„ 예제
    • μž…λ ₯μΈ΅(input layer), 은닉측(hidden layer or middle layer), 좜λ ₯μΈ΅(output layer)
    • κ°€μ€‘μΉ˜μ˜ μ΄ˆκΉƒκ°’μ€ λ¬΄μž‘μœ„λ‘œ μ„€μ •ν•˜λŠ” 것이 μ’‹λ‹€.

λͺ¨λΈ

  • Parameter 클래슀
    • λ§€κ°œλ³€μˆ˜ : κ²½μ‚¬ν•˜κ°•λ²• λ“±μ˜ μ΅œμ ν™” 기법에 μ˜ν•΄ κ°±μ‹ λ˜λŠ” λ³€μˆ˜ (κ°€μ€‘μΉ˜, 편ν–₯)
    • Variable ν΄λž˜μŠ€μ™€ λ˜‘κ°™μ€ κΈ°λŠ₯을 κ°€μ§€μ§€λ§Œ λ§€κ°œλ³€μˆ˜μž„μ„ ꡬ별할 수 μžˆλ„λ‘ 함
    • [Parameter 클래슀 κ΅¬ν˜„]
      class Parameter(Variable):
          pass
  • Layer 클래슀
    • Function ν΄λž˜μŠ€μ™€ 달리, λ§€κ°œλ³€μˆ˜λ₯Ό μœ μ§€ν•˜κ³  λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ λ³€μˆ˜λ₯Ό λ³€ν™˜ν•˜λŠ” 클래슀
    • [Layer 클래슀 κ΅¬ν˜„]
      class Layer:
          def __init__(self):
              self._params = set() # λ§€κ°œλ³€μˆ˜ 집합(쀑볡ID μ €μž₯ 방지)
      
          def __setattr__(self, name, value): # μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ μ„€μ • ν•¨μˆ˜
              if isinstance(value, (Parameter, Layer)):
                  self._params.add(name)
              super().__setattr__(name, value)
      
          def __call__(self, *inputs):
              outputs = self.forward(*inputs)
              if not isinstance(outputs, tuple):
                  outputs = (outputs,)
              self.inputs = [weakref.ref(x) for x in inputs] # μ•½ν•œ μ°Έμ‘°
              self.outputs = [weakref.ref(y) for y in outputs] # μ•½ν•œ μ°Έμ‘°
              return outputs if len(outputs) > 1 else outputs[0]
      
          def forward(self, inputs):
              raise NotImplementedError()
      
          def params(self):
              for name in self._params:
                  obj = self.__dict__[name]
      
                  if isinstance(obj, Layer):
                      yield from obj.params() # Layer μ†μ˜ Layerμ—μ„œ λ§€κ°œλ³€μˆ˜λ₯Ό μž¬κ·€μ μœΌλ‘œ 꺼냄
                  else:
                      yield obj # 처리λ₯Ό 'μΌμ‹œ 쀑지(suspend)'ν•˜κ³  값을 λ°˜ν™˜
      
          def cleargrads(self):
              for param in self.params(): # `params`λ©”μ„œλ“œλ₯Ό 호좜 μ‹œ 처리λ₯Ό '재개(resume)'
                  param.cleargrad()
      • yieldλ₯Ό μ‚¬μš©ν•œ ν•¨μˆ˜λ₯Ό μ œλ„ˆλ ˆμ΄ν„°(generator)라고 ν•œλ‹€.
      • yield from을 톡해 또 λ‹€λ₯Έ μ œλ„ˆλ ˆμ΄ν„°λ₯Ό λ§Œλ“€ 수 μžˆλ‹€.
    • Linear 클래슀
      • κ³„μΈ΅μœΌλ‘œμ„œμ˜ Linear 클래슀이며, Layer 클래슀λ₯Ό μƒμ†ν•˜μ—¬ κ΅¬ν˜„ν•œλ‹€.
      • [Linear 클래슀 κ΅¬ν˜„]
        • __init__ : Layer 클래슀의 __init__ν•¨μˆ˜ μ‹€ν–‰ ν›„, μΈμˆ˜μ— 따라 κ°€μ€‘μΉ˜μ™€ λ³€μˆ˜ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ μ„€μ •
        • _init_W : κ°€μ€‘μΉ˜ μ΄ˆκΈ°ν™” ν•¨μˆ˜(Xavier initialization)
        • forward : 데이터가 ν˜λŸ¬μ˜€λŠ” μ‹œμ μ— κ°€μ€‘μΉ˜λ₯Ό μ΄ˆκΈ°ν™”ν•  수 μžˆλ‹€.
  • Model 클래슀
    • Layer 클래슀λ₯Ό μ΄μš©ν•˜μ—¬ μ‹ κ²½λ§μ—μ„œ μ‚¬μš©ν•˜λŠ” λ§€κ°œλ³€μˆ˜λ₯Ό ν•œκΊΌλ²ˆμ— 관리할 수 μžˆλ‹€.
    • λ”°λΌμ„œ Layer 클래슀λ₯Ό μƒμ†ν•˜μ—¬ λͺ¨λΈ 전체λ₯Ό ν•˜λ‚˜μ˜ 클래슀둜 μ •μ˜ν•  수 μžˆλ‹€.
    • [Model 클래슀 κ΅¬ν˜„]
      class Model(Layer):
          def plot(self, *inputs, to_file='model.png'): # μ‹œκ°ν™” λ©”μ„œλ“œλ§Œ μΆ”κ°€
              y = self.forward(*inputs)
              return utils.plot_dot_graph(y, verbose=True, to_file=to_file)
    • MLP 클래슀
      • λ‹€μΈ΅ νΌμ…‰νŠΈλ‘ (Multi-Layer Perceptron) : 완전연결계측 μ‹ κ²½λ§μ˜ λ³„μΉ­μœΌλ‘œ ν”νžˆ 쓰인닀.
      • λ²”μš©μ μΈ 완전연결계측 신경망을 μœ„ν•œ λͺ¨λΈ (TwoLayerNet의 μžμ—°μŠ€λŸ¬μš΄ ν™•μž₯)
      • [MLP 클래슀 κ΅¬ν˜„]
        • self.l1 = ... λŒ€μ‹  setattrν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ μ„€μ •

μ΅œμ ν™”

  • Optimizer 클래슀
    • λ§€κ°œλ³€μˆ˜ κ°±μ‹  μž‘μ—…μ„ λͺ¨λ“ˆν™”ν•˜κ³  μ‰½κ²Œ λ‹€λ₯Έ λͺ¨λ“ˆλ‘œ λŒ€μ²΄ν•  수 μžˆλŠ” ꡬ쑰
    • μ „μ²˜λ¦¬ μˆ˜ν–‰ ν•¨μˆ˜λ₯Ό μΆ”κ°€ν•  수 μžˆλ„λ‘ ν•˜λ©΄, κ°€μ€‘μΉ˜ κ°μ†Œ(Weight Decay)λ‚˜ 기울기 클리핑(Gradient Clipping) 같은 기법을 μ΄μš©ν•  수 μžˆλ‹€.
    • [Optimizer 클래슀 κ΅¬ν˜„]
      class Optimizer:
          def __init__(self):
              self.target = None # λ§€κ°œλ³€μˆ˜λ₯Ό κ°–λŠ” 클래슀(Model λ˜λŠ” Layer)
              self.hooks = [] # μ „μ²˜λ¦¬λ₯Ό μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜λ“€
      
          def setup(self, target): # target μ„€μ •
              self.target = target
              return self
      
          def update(self): # λͺ¨λ“  λ§€κ°œλ³€μˆ˜ κ°±μ‹ 
              params = [p for p in self.target.params() if p.grad is not None] # gradκ°€ None인 λ§€κ°œλ³€μˆ˜λŠ” 갱신을 κ±΄λ„ˆλ›΄λ‹€.
      
              # ν•„μš” μ‹œ μ „μ²˜λ¦¬ 진행
              for f in self.hooks:
                  f(params)
      
              # λ§€κ°œλ³€μˆ˜ κ°±μ‹ 
              for param in params:
                  self.update_one(param)
      
          def update_one(self, param): # ꡬ체적인 λ§€κ°œλ³€μˆ˜ κ°±μ‹ 
              raise NotImplementedError()
      
          def add_hook(self, f): # μ›ν•˜λŠ” μ „μ²˜λ¦¬ ν•¨μˆ˜ μΆ”κ°€
              self.hooks.append(f)
    • SGD 클래슀
      • ν™•λ₯ μ  κ²½μ‚¬ν•˜κ°•λ²•(Stochastic Gradient Descent) : λŒ€μƒ 데이터 μ€‘μ—μ„œ λ¬΄μž‘μœ„λ‘œ(ν™•λ₯ μ μœΌλ‘œ) μ„ λ³„ν•œ 데이터에 λŒ€ν•΄ κ²½μ‚¬ν•˜κ°•λ²•μ„ μˆ˜ν–‰ν•œλ‹€.
      • Optimizer 클래슀λ₯Ό μƒμ†ν•˜κ³  update_one λ©”μ„œλ“œμ—μ„œ λ§€κ°œλ³€μˆ˜ κ°±μ‹  μ½”λ“œλ₯Ό κ΅¬ν˜„ν•œλ‹€.
      • [SGD 클래슀 κ΅¬ν˜„]
        class SGD(Optimizer):
            def __init__(self, lr=0.01):
                super().__init__()
                self.lr = lr
        
            def update_one(self, param):
                param.data -= self.lr * param.grad.data
      • SGD 클래슀 μ‚¬μš© 예제
    • 이 μ™Έ

3. 신경망 κ΅¬ν˜„(닀쀑 클래슀 λΆ„λ₯˜)

닀쀑 클래슀 λΆ„λ₯˜

  • 닀쀑 클래슀 λΆ„λ₯˜(multi-class classification) : λΆ„λ₯˜ λŒ€μƒμ΄ μ—¬λŸ¬ 가지 클래슀 쀑 어디에 μ†ν•˜λŠ”μ§€ μΆ”μ •
  • μ†Œν”„νŠΈλ§₯슀 ν•¨μˆ˜(softmax function) : μ›μ†Œ 각각을 ν™•λ₯ λ‘œ ν•΄μ„€ν•  수 있게 λœλ‹€.
  • ꡐ차 μ—”νŠΈλ‘œν”Ό 였차(cross entropy error)
    • 원핫 벑터(one-hot vector) : μ •λ‹΅ λ°μ΄ν„°μ˜ 각 μ›μ†Œκ°€ 정닡에 ν•΄λ‹Ήν•˜λŠ” 클래슀면 1, μ•„λ‹ˆλ©΄ 0으둜 ν‘œν˜„
      • : μ›ν•«λ²‘ν„°λ‘œ ν‘œν˜„λœ μ •λ‹΅ λ°μ΄ν„°μ˜ 차원째 κ°’
      • : μ •λ‹΅ 클래슀의 번호
    • [κΈ°λ³Έ κ΅¬ν˜„ | Function으둜 κ΅¬ν˜„]
      • 을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ `clip` ν•¨μˆ˜ 이용
      • clip ν•¨μˆ˜ : Variable x의 μ›μ†Œκ°€ x_min μ΄ν•˜λ©΄ x_min으둜, x_max 이상이면 x_max둜 λ³€ν™˜
  • 닀쀑 클래슀 λΆ„λ₯˜ 예제

4. μƒˆλ‘œμš΄ 데이터셋 ν•™μŠ΅

데이터셋 ꡬ쑰

  • Dataset 클래슀
    • λŒ€κ·œλͺ¨ 데이터셋을 μ²˜λ¦¬ν•  λ•Œ, ndarray μΈμŠ€ν„΄μŠ€ ν•˜λ‚˜λ‘œ μ²˜λ¦¬ν•˜λ©΄ ν•œκΊΌλ²ˆμ— λ©”λͺ¨λ¦¬μ— μ˜¬λ €μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— λ¬Έμ œκ°€ 될 수 μžˆλ‹€.
    • [Dataset 클래슀 κ΅¬ν˜„]
      • __getitem__κ³Ό __len__ λ©”μ„œλ“œκ°€ λ°μ΄ν„°μ…‹μ˜ 핡심 λ©”μ„œλ“œμ΄λ‹€.
      • 데이터셋 μ „μ²˜λ¦¬ : λ°μ΄ν„°μ—μ„œ νŠΉμ • 값을 μ œκ±°ν•˜κ±°λ‚˜ λ°μ΄ν„°μ˜ ν˜•μƒμ„ λ³€ν˜•ν•˜λŠ” 처리
    • Spiral 클래슀
      • [Spiral 클래슀 κ΅¬ν˜„]
        • Dataset 클래슀λ₯Ό μƒμ†ν•˜κ³  prepareλ©”μ„œλ“œμ—μ„œ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ data와 label에 데이터λ₯Ό μ„€μ •ν•œλ‹€.
        • (λ˜λŠ” __getitem__이 λΆˆλ¦¬λŠ” μ‹œμ μ— 데이터λ₯Ό νŒŒμΌμ—μ„œ μ½μ–΄μ˜€λŠ” 방법도 μžˆλ‹€.)
      • Spiral 데이터셋 ν•™μŠ΅ 예제
        • 각 iterationμ—μ„œ λ―Έλ‹ˆλ°°μΉ˜λ₯Ό κΊΌλ‚΄κ³ (getitem), κ·Έ ν›„ ndarray μΈμŠ€ν„΄μŠ€λ‘œ λ³€ν˜•ν•œλ‹€.
  • DataLoader 클래슀
    • λ―Έλ‹ˆλ°°μΉ˜ 생성과 데이터셋 λ’€μ„žκΈ° λ“±μ˜ κΈ°λŠ₯ 제곡
    • 반볡자(iterator) : μ›μ†Œλ₯Ό λ°˜λ³΅ν•˜μ—¬ κΊΌλ‚΄μ€€λ‹€.
      • 파이썬의 iterν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ 반볡자둜 λ³€ν™˜ν•˜κ³ , nextν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ μ›μ†Œλ₯Ό μ°¨λ‘€λŒ€λ‘œ κΊΌλ‚Έλ‹€.
      • ν΄λž˜μŠ€μ—μ„œ 특수 λ©”μ„œλ“œ κ΅¬ν˜„μ„ 톡해 파이썬 반볡자둜 직접 λ§Œλ“€ μˆ˜λ„ μžˆλ‹€.
        • __iter__ : 자기 μžμ‹ (self) λ°˜ν™˜
        • __next__ : λ‹€μŒ μ›μ†Œ λ°˜ν™˜
    • [DataLoader 클래슀 κ΅¬ν˜„]
      • dataset : Dataset μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§Œμ‘±ν•˜λŠ” μΈμŠ€ν„΄μŠ€(__getitem__, __len__ λ©”μ„œλ“œ κ΅¬ν˜„λ¨)
      • batch_size : 배치 크기
      • shuffle : μ—ν¬ν¬λ³„λ‘œ 데이터셋을 λ’€μ„žμ„μ§€ μ—¬λΆ€
  • Spiral 데이터셋 ν•™μŠ΅ 예제
    • (μ°Έκ³ ) accuracy ν•¨μˆ˜ : μ •λ‹΅λ₯  κ³„μ‚°μš©, 계산 κ·Έλž˜ν”„ 그리지 μ•ŠμŒ
  • MNIST 데이터셋 ν•™μŠ΅ 예제