일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- Python
- Spring Boot
- 코딩도장
- C언어
- Docker
- Machine Learning
- 고등학생 대상
- colab
- Database
- Resnet
- API
- GoogleDrive
- ICT멘토링
- git
- 크롤링 개발
- KAKAO
- LINUX MASTER
- VSCode
- suricata
- Spring
- rnn
- cloud
- OSS
- Kubernetes
- ChatGPT
- 국가과제
- Powershell
- Rocky Linux
- Github
- 인터넷의이해
- Today
- Total
코딩두의 포트폴리오
OSS - 12_ 파이토치로 구현하는 ANN 본문
PyTorch (파이토치)
토치(Torch) 및 카페2(Caffe2)를 기반으로 한 텐서플로우와 유사한 딥러닝 라이브러리
- 페이스북(현재 메타) 인공지능 연구팀에 의해 개발
- 2016년 9월에 처음으로 공개
- 개발 철학: "하고자 하는 일이 눈에 잘 보이도록 하자"
- "강력한 GPU 가속이 적용되는 파이썬으로 된 텐서와 동적 신경망"
텐서플로(Tensorflow): 정정 계산 그래프 방식, 오프라인 학습에 최적화
파이토치: 동적 계산 그래프 방식, 실행 도중 유연하게 모델 관리 가능(자율주행, 게임 등)
Torchvision: 파이토치용 각종 비전 데이터셋과 데이터 관리용 도구
Torchtext: 파이토치용 각종 테스트 데이터셋과 데이터 관리용 도구
GitHub Repository 복사 (Fork)
https://github.com/keon/3-min-pytorch
Colab에서 GitHub의 노트북 파일 불러오기
텐서(Tensor)
파이토치
- 수학 계산용 라이브러리를 바탕으로 그 위에 딥러닝에 필요한 그래프 형태 계산 방식을 추가한 라이브러리
- 행렬 계산이 많음
기본 자료구조: 텐서(tensor)
- 수학의 벡터나 행렬을 일반화한 개념 - 파이썬의 기본 자료구조와 다름
- 차원 or 랭크(rank)
- 랭크 0: 숫자가 하나인 스칼라(scalar)
- 랭크 1: 숫자를 일렬로 나열한 벡터(vector)
- 랭크 2: 2차원 행렬(matrix)
- 랭크 3: 정육면체 같은 3차원 행렬
- 랭크 3 이상: 랭크 n 텐서
텐서 다루기 기본: 차원(Rank)과 Shape
03-파이토치로_구현하는_ANN/tensor_basic.ipynb
[ 실습 ]
텐서를 이용한 연산과 행렬곱
03-파이토치로_구현하는_ANN/tensor_operation.ipynb
행렬곱 : torch.mm()
[ 실습 ]
Predicting Exam Score: Regression
ex) 10시간 공부 후 90점 취득
기계학습 후 7시간 공부하면 몇 점을 취득하는지 예측하는 과정
Regression
그래프로 표현 시
(Linear) Hypothesis
가설을 세웠을 때 주어진 학습 데이터를 가장 잘 표현하는 학습 데이터(w,b)를 찾아야 함
Which hypothesis is better?
Cost function (= Loss function) 비용함수, 손실함수
x라는 입력 데이터가 주어졌을 때, 실제 데이터는 y
주어진 가설로 나온 결과의 차이가 실제와 얼마나 되는지?
-> 0이 되어야 정확한 값을 도출한 것임
빨간 수직선만큼 오차가 발생한 것임
오차만큼 전부 고려해서 비용을 계산해야 함
- 각각의 차이를 제곱하여 계산
Cost function (일반화)
m개의 학습 데이터 가 있을 시 각각의 데이터를 계산하여 평균을 산출
예측한 가설이 얼마나 정확한지 수치로 표현하는 것
Cost값이 작을수록 오차가 낮은 것
H(x) = Wx + b
W, b를 랜덤한 값으로 실제 값과 예측 값의 차이를 구함
Cost 값을 최소로 하는 W, b를 찾아야 함
How to minimize cost
What cost(W) looks like?
W값에 따라 cost 값이 달라짐
How to minimize cost?
Gradient descent algorithm
- 경사하강법 - 경사를 따라 내려가는 알고리즘, 오차를 최소화하는 알고리즘 가운데 하나
- 비용함수 cost(W, b)가 주어졌을 때, 이를 최소화하는 w와 b를 찾음
- 일반화된 함수에 적용, cost(w1, w2,...)
How it works?
초기값부터 시작
0 or 임의의 값에서 시작
W와 b를 조금씩 변경 -> cost(W, b)값을 줄이는 시도
파라미터를 수정할 때마다 cost(W, b)가 줄어드는 경사 방향을 선택
최소점에 수렴할 때까지 반복
더 이상 cost(W, b)값이 줄어들지 않을 때까지
Formal definition (공식 정의)
- 미분을 쉽게 적용하기 위해 cost 함수를 2로 나눔
- 1/m을 최소화하는 것이나 1/2m을 최소화하는 것이나 동일하기 때문
미분을 해서 양수, 음수에 따라 방향 결정
Autograd
미분계산을 자동화 -> 경사하강법 구현
03-파이토치로_구현하는_ANN/autograd_basic.ipynb
예) 값이 1인 스칼라 텐서 w 정의하고 아래의 식을 미분
backward() 함수를 호출하여 미분
[ 실습 ]
하나의 데이터를 생성
w가 1이라 가정
구글 드라이브에 데이터 파일 복사 및 Colab에서 구글 드라이브 연결
경사하강법으로 이미지 복원하기
오염된 이미지를 복원하는 예제
실습예제
03-파이토치로_구현하는_ANN/image_recovery.ipynb
파이토치의 기능을 이용하지 않고 직접 경사하강법 구현
pickle - 파이썬 객체를 파일 형태로 저장/로드할 수 있게 하는 라이브러리
matplotlib - 그래프 표시를 가능케 하는 라이브러리
[ 실습 ]
오염된 이미지
랭크 1의 벡터로 표현한 텐서 데이터
[100, 100] 모양의 행렬이 [10000] 모양의 벡터로 표현됨
torch.dist()
두 텐서 사이의 거리를 구하는 함수
학습률(Learning Rate) : (ex) lr = 0.8
학습을 얼마나 급하게 진행할 것인가를 정하는 매개변수
학습률에 따라 달라지는 학습 속도
경사하강법을 20,000번 반복해 이미지 복원 (뉴욕 타임 스퀘어 풍경)
ANN 신경망 모델 구현하기
Artificial Neural Network (ANN)
많은 뇌세포가 연결이 되는 형태로 신경망 구성
입력데이터 3개가 다음 계층으로 넘어가기 전
선에 가중치가 있는 것
입력 데이터 x 가중치 다음 단계로 전달
은닉층에서 다 더해서 임계치를 넘는지 안넘는지에 따라 다음 단계로 출력
파란 동그라미 노드가 오른쪽으로 보면 됨
입력 데이터 4개 존재
활성 함수로 최종 결과값 출력
가중치를 어떻게 계산할건지?
분류(Classification)
신경망 모델을 학습하여 입력 데이터가 어떤 카테고리(레이블, 정답)에 속하는지 결정하는 문제
신경망 모델 구현하기
03-파이토치로_구현하는_ANN/basic_neural_network.ipynb
Numpy – 행렬과 벡터 연산에 유용한 수치해석용 라이브러리
Scikit-learn – 파이썬의 대표적인 머신러닝 라이브러리
Matplotlib – 데이터의 분포와 패턴을 시각화하는 라이브러리
2차원 데이터를 랜덤하게 생성 - 학습 데이터, 테스트 데이터
80개 생성하여 학습 데이터로 사용
y_train - 분류 / score - 정답
test 데이터
[0, 1, 2, 3] 4가지로 출력
[0, 1] -> 0으로 변경
[2, 3] -> 1로 변경
0 or 1로 변경
지금까지는 랜던하게 생성한 데이터가 어떤 분포를 가지는지 확인 (단순화)
분류 합치고, 분포 확인
생성한 numpy 벡터 형식 데이터를 Pytorch 텐서로 변환
신경망 모듈을 상속받아 클래스 정의
# 신경망에 입력되는 데이터(입력층)의 차원
# 1번째 계층(은닉층)의 활성화 함수
# 2번째 계층(출력층)의 활성화 함수
# 은닉층의 차원
# 입력데이터를 신경망 계층의 순서대로
계산하여 결과값을 계산하는 함수
활성화 함수(Activation Function)
뉴런의 출력값을 결정하는 함수
ReLU() 함수
입력값이 0보다 작으면 0을, 0보다 크면 입력값을 그대로 출력
계산이 매우 간단, 딥러닝에 효과적 → 주로 은닉층에서 사용
예: [-1, 1, 3, -5, -7]가 ReLU()함수를 거치면,
– [0, 1, 3, 0, 0]이 됨
계산 값이 가중치 곱하여 합산한 값이 0보다 작으면 결과값 0 은닉층에 전달
0보다 작으면 그대로 전달
Sigmoid() 함수
입력 데이터를 0과 1사이의 값으로 변환
결과값이 0과 1 중 어디에 가까운 지에 따라 카테고리 분류
확률을 나타내는데 적합 → 주로 출력층에서 사용
y 값 범위는 0, 1사이로 정규화
실제로 신경망을 생성하고 학습에 필요한 변수와 알고리즘 정의
학습하기 전의 신경망 모델로 성능 평가
오차 함수 호출하여 실제 값, 테스트 값의 오차를 계산 / 66퍼는 100개 중 66개가 틀린다는 얘기
80개의 데이터가 2차원 데이터
인공신경망 원하는 형태로 코딩한 결과
실제 신경망 객체(입력 노드 2개, 은닉층 5개) - 입력 노드는 차원의 수를 뜻함
학습률 0.03
비용함수 사용
학습은 2000번 진행
한 번 학습 시 실제와 테스트의 오차를 줄이는 방향으로 가중치를 조금씩 조절해야 함 (5번째 줄 알고리즘)
성능이 얼마나 나쁜지 실행
평가모드로 전환하여 평가 진행
신경망 학습
신경망 가중치가 제대로 부여가 안 되어 있어 엉터리 값이 도출 / 실제 정답과 비교하여 오차 계산
100으로 나눠떨어질 때마다 오차 계산
train_loss.backward()
optimizer.step()
-> 오차를 줄이는 방향으로 조금씩 학습을 하여 업데이트
학습 후 신경망 모델의 평가
오차가 얼마나 줄여졌는지 확인
학습된 모델의 저장
state_dict() 함수 – 모델 내 가중치들을 딕셔너리 형태로 저장
웨이트의 바이어스 값이 존재
새로운 신경망 객체에 이미 학습된 모델의 가중치 적용
1에 가까운 결과
'Open Source Software' 카테고리의 다른 글
OSS - 14_ ChatGPT & Transformers 라이브러리 활용 (0) | 2024.05.24 |
---|---|
OSS - 13_ 패션 아이템을 구분하는 DNN (0) | 2024.05.16 |
OSS - 11_ AI-NLP 개요 (0) | 2024.05.11 |
OSS - 10_CoLab 사용하기 (0) | 2024.05.11 |
OSS - 09_GitHub로 협업하기 (0) | 2024.04.21 |