ML/AI/SW Developer

Week3 - day2

1. 개인학습

2. 필수 과제

  • Document 탐색
    • torch.tensor() vs torch.Tensor()
      torch.tensor()는 항상 데이터를 복제합니다. 그래서 data 없이 tensor 생성이 불가능 합니다. -> runtime error
      torch.Tensor()는 객체(class의 instance)를 생성하는 것으로 data 없이도 생성이 가능합니다.
    
  • pytorch 활용
  • torch.gather 3차원에서 대각선 뽑기!
import torch
import numpy as np
# TODO : 임의의 크기의 3D tensor에서 대각선 요소 가져와 2D로 반환하는 함수를 만드세요! 
def get_diag_element_3D(A):
    # 1. 인덱스 텐서 만들기
    # 1개의 원소에서 뽑을 인덱스 [0,1,2,...]
    idx = torch.tensor([(i % A.shape[2])  for i in range(A.shape[1])])
    #print("idx: 1: ", idx, idx.shape)
    
    # 2. 차원 맞춰주기 [0,1,2] -> [[0], [1], [2]]
    idx = idx.unsqueeze(1).unsqueeze(0)
    #print("idx: unsqueeze: ", idx, idx.shape)
    
    # 3. 원소 개수 만큼 인덱스 복사(확장)
    idx = idx.expand(A.shape[0], A.shape[1], 1) 
    #print("idx: expand: ", idx, idx.shape)
    
    # 4. 대각선값만 뽑아내기
    output = torch.gather(A, 2, idx)
    #print(output.view(A.shape[0], A.shape[1])
    
    # 5. 2차원으로 만든 후 불필요한 부분 slicing
    return output.view(A.shape[0], A.shape[1])[:, :A.shape[2]]
  • LazyLinear vs Linear
    • 전자는 첫 forward가 불린 후에 initailize 된다.
    • torch.nn.UninitializedParameter class에 속한다.
  • custom_model 만들기
    • Tensor vs Parameter
      Parameter를 이용해서 W, b를 만들 경우에만
      output tensor에 gradient를 계산하는 함수인 grad_fn가 생성됩니다
    
    • module 분석하기
      for name, module in model.named_modules():
          print(f"[ Name ] : {name}\n[ Module ]\n{module}")
          print("-" * 30)
    
      output
      ------
      [ Name ] : 
      [ Module ]
      Model(
      (ab): Layer_AB(
          (a): Function_A()
          (b): Function_B()
      )
      (cd): Layer_CD(
          (c): Function_C()
          (d): Function_D(
          (c): Function_C()
          )
      )
      )
      ------------------------------
      [ Name ] : ab
      [ Module ]
      Layer_AB(
      (a): Function_A()
      (b): Function_B()
      )
      ------------------------------
      [ Name ] : ab.a
      [ Module ]
      Function_A()
      ------------------------------
      [ Name ] : ab.b
      [ Module ]
      Function_B()
      ------------------------------
      [ Name ] : cd
      [ Module ]
      Layer_CD(
      (c): Function_C()
      (d): Function_D(
          (c): Function_C()
      )
      )
      ------------------------------
      [ Name ] : cd.c
      [ Module ]
      Function_C()
      ------------------------------
      [ Name ] : cd.d
      [ Module ]
      Function_D(
      (c): Function_C()
      )
      ------------------------------
      [ Name ] : cd.d.c
      [ Module ]
      Function_C()
      ------------------------------
    
      for name, child in model.named_children():
          print(f"[ Name ] : {name}\n[ Children ]\n{child}")
          print("-" * 30)
        
      [ Name ] : ab
      [ Children ]
      Layer_AB(
      (a): Function_A()
      (b): Function_B()
      )
      ------------------------------
      [ Name ] : cd
      [ Children ]
      Layer_CD(
      (c): Function_C()
      (d): Function_D(
          (c): Function_C()
      )
      )
      ------------------------------
    
    • parameter 분석하기
      for name, parameter in model.named_parameters():
          print(f"[ Name ] : {name}\n[ Parameter ]\n{parameter}")
          print("-" * 30)
    
      output
      ------
      [ Name ] : ab.b.W1
      [ Parameter ]
      Parameter containing:
      tensor([10.], requires_grad=True)
      ------------------------------
      [ Name ] : ab.b.W2
      [ Parameter ]
      Parameter containing:
      tensor([2.], requires_grad=True)
      ------------------------------
    
      parameter = model.get_parameter('ab.b.W1')
    
    • buffer 정보 확인
      for name, buffer in model.named_buffers():
          print(f"[ Name ] : {name}\n[ Buffer ] : {buffer}")
          print("-" * 30)
    
      buffer = model.get_buffer('cd.c.duck')
    
    • doc string
      def __doc__(self): 
          구현!
    

3. 피어세션

  • pytorch-basic 강의 정리
  • 우선순위 큐 이론 공유

4. 특강

  • 라이엇 CTO 님