BIG_PY
home
Introduce
home

4장 딥러닝 시작

발표 자료

질문

*이름 적고 질문 적어 주세요
황현수 <미니 배치 경사 하강법 파이토치에서 구현하기> 첫 줄 클래스 생성할 때 class CustomDataser(Dataset): 괄호 안에 Dataset이 왜 있는지 모르겠어요
import torch class CustomDataset: def __init__(self): self.x_data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] self.y_data = [[12], [18], [11]] def __len__(self): return len(self.x_data) def __getitem__(self, idx): x = torch.FloatTensor(self.x_data[idx]) y = torch.FloatTensor(self.y_data[idx]) return x, y def __str__(self): return "x: {}, y: {} ".format(self.x_data, self.y_data) dataset = CustomDataset() # 객체생성, __init__ 메소드 호출 print(dataset) # __str__ 메소드 호출 len(dataset) # __len__ 메소드 호출 dataset[0] # __getitem__ 메소드 호출 dataset[1] # __getitem__ 메소드 호출 dataset[2] # __getitem__ 메소드 호출
Python
복사
## 상속을 하면 자식 클래스가 부모 클래스의 변수와 메소드를 그대로 물려받는다 class Employee: """직원 클래스""" company_name = '버거킹' # 가게 이름 raise_percentage = 1.03 # 시급 인상률 def __init__(self, name, wage): """인스턴스 변수 설정""" self.name = name # 이름 self.wage = wage # 시급 def raise_pay(self): """시급을 인상하는 메소드""" self.wage *= self.raise_percentage def __str__(self): """직원 정보를 문자열로 리턴하는 메소드""" return Employee.company_name + " 직원: " + self.name class Cashier(Employee): # Employee 클래스 상속 pass hyeonsu = Cashier("황현수", 8900) # 객체 생성 hyeonsu.raise_pay() print(hyeonsu.wage) print(hyeonsu) # __str__ 메소드 출력 # help 함수 : Class의 정보를 자세히 출력 -> Employee(부모) 클래스의 변수와 메소드 가지고 있음 help(Cashier) # Method resolution order: -> Cashier 클래스의 상속 관계 보여줌 # Cashier # Employee -> Cashier Class의 부모 Class # builtins.object -> Employee Class의 부모 Class : 파이썬에서 모든 Class는 자동으로 builtins.object Class를 상속받음 # issubclass 함수 : 한 클래스가 다른 클래스의 자식 클래스인지를 알려주는 함수 print(issubclass(Cashier, Employee)) # 출력: True ## 부모 클래스로부터 물려 받은 내용을 자식 클래스가 자신에 맞게 변경 -> 오버라이딩(덮어쓴다) # 오버라이딩 -> 부모 클래스에서 물려받은 메소드와 같은 이름의 메소드를 내용을 바꿔 정의 ## __init__ 메소드 오버라이딩(number_sold 변수 추가) class Cashier(Employee): # Employee 클래스 상속 def __init__(self, name, wage, number_sold): # number_sold 변수 추가(오버라이딩) self.name = name # 이름 self.wage = wage # 시급 self.number_sold = number_sold # 하루 판매량 # 똑같은 name, wage 가져오기 class Cashier(Employee): def __init__(self, name, wage, number_sold): Employee.__init__(self, name, wage) # 부모클래스 Employee를 통해 init메소드 호출 self.number_sold = number_sold # super()함수로 더 간단하게 -> 부모 클래스의 메소드를 호출 가능 class Cashier(Employee): def __init__(self, name, wage, number_sold): super().__init__(name, wage) # 자식 클래스에서 부모클래스의 메소드를 사용하고 싶을 때 사용하는 함수, self파라미터 쓸 필요 없다 self.number_sold = number_sold # class DeliveryMan(Employee): # Employee 클래스 상속 pass hyeon = Cashier("황현수", 8900, 4) # 객체 생성(오버라이딩 된) hyeon.raise_pay() print(Cashier.raise_percentage) print(Cashier.company_name) print(hyeon.name) print(hyeon.wage) print(hyeon.number_sold) ## __str__ 메소드 오버라이딩 (부모클래스 직원을 자식클래스에서 계산대 직원으로 수정) class Cashier(Employee): def __init__(self, name, wage, number_sold): super().__init__(name, wage) # 자식 클래스에서 부모클래스의 메소드를 사용하고 싶을 때 사용하는 함수, self파라미터 쓸 필요 없다 self.number_sold = number_sold def __str__(self): return Employee.company_name + " 계산대 직원: " + self.name hyeon = Cashier("황현수", 8900, 4) # 객체 생성(오버라이딩 된) print(hyeon) # __str__ 메소드 출력 ## 변수 오버라이딩 -> 자식 클래스에서 다른 값을 대입 # 계산대 직원들만 시급 인상률 1.05로 바꾸기(1.03 -> 1.05) # 자식 클래스에도 똑같은 이름의 변수를 두고 다른 값을 넣어주면 된다 class Cashier(Employee): raise_percentage = 1.05 def __init__(self, name, wage, number_sold): super().__init__(name, wage) # 자식 클래스에서 부모클래스의 메소드를 사용하고 싶을 때 사용하는 함수, self파라미터 쓸 필요 없다 self.number_sold = number_sold def __str__(self): return Employee.company_name + " 계산대 직원: " + self.name hyeon = Cashier("황현수", 8900, 4) # 객체 생성(오버라이딩 된) print(hyeon) # __str__ 메소드 출력 print(hyeon.raise_percentage) # 1.05
Python
복사
조민진 - 제한된 볼츠만 머신이 가시층과 은닉층으로 구성된 모델이라고 나와있는데 가시층과 입력층은 같은 건가요?
유성현 옵티마이저는 잘 모르면 일단 Adam을 쓰라고 할 정도로 보편적으로 사용하는 것 같습니다. 모델링할 때 각 데이터 종류나 딥러닝 분야의 다양한 상황에 맞게 최적화를 진행하는 것으로 알고 있는데 Adam의 성능이 떨어지는 경우는 없는지, 이외에 더 적합한 옵티마이저를 사용하는 경우는 어떤 것이 있을지 궁금합니다. https://hiddenbeginner.github.io/deeplearning/paperreview/2019/12/29/paper_review_AdamW.html