-
[내돈내산/수강후기] 패스트캠퍼스 - 컴퓨터비전 정주행 kit
작년에 컴퓨터 비전 스터디를 시작하면서 강의를 패스트 캠퍼스 강의를 처음 구매했었다. 인프런에서 몇번 강의를 구매해서 수강한적이 있지만 패캠은 처음이였고, 사실 수강 후기도 많지 않아서 걱정도 되었지만 스터디원들과 함께 듣고 질문을 공유하면서 같이 해결해나가면 내가 긴장감 있게 할거 같아서 구매했다. 가격은 40만원 정도였고, 이벤트해서 할인도 받았다. (하지만, 할부로 구매했어요. 넘 비쌈요 ㅠㅠ) 교육과정 소개서를 보면 강의 시간은 149시간으로 되어있다. 꽤 많은 시간을 투자한다는 말씀!주 1회씩 들었고 느리게 보더라도 완전히 이해하자가 목표였던 거 같다. 1. 강의 소개 강의 명: 컴퓨터비전 정주행 kit강사: 변영호, 신경식(완전 추천), 윤준호, 이종민, 김희원, 박충현, 이준하강의 목표:..
2024.11.01
-
[에러] ImportError: cannot import name 'runtime_version' from 'google.protobuf'
문제strealit run app.py 실행하는데 해당 에러 발생최근에 protobuf가 업데이트 했고 변경사항이 많아서 호환안되는 것해결pip uninstall protobufpip install protobuf참고 문서https://github.com/streamlit/streamlit/issues/8965
2024.09.10
-
[챗봇/벡터디비] Weaviate로 커스텀 임베딩 모델 벡터 서치하기
지난, 게시글에서는 벡터 디비 초기 세팅 및 사용방법에 대해서 알아봤다.사실 조금 아쉬웠던 점은 openai ada-2 임베딩 모델을 사용했던 것이였다. 오늘은, 임베딩 과정에서 돈이 들지 않고 정확도가 심하게 떨어지지 않는 허깅페이스 올라간 오픈 모델을 사용하여 임베딩 후 벡터 디비에 저장 및 서치 하는 방법에 대해서 설명하겠다. 초기, 클러스터 생성 부분은 아래의 링크를 참고하세요.https://lena-train-cfg.tistory.com/88 [챗봇/벡터디비] Weaviate란? 벡터 디비 설정, 저장, 쿼리 테스트하기벡터 데이터베이스란?대량의 고차원 데이터 저장 및 조회를 위해 벡터 임베딩 및 쿼리 벡터 유사도 비교 기반 신속하게 인덱싱하는 데이터 베이스 어떻게 쓰일까?벡터 데이터베이스는 다..
2024.09.05
-
[챗봇/벡터디비] Weaviate란? 벡터 디비 설정, 저장, 쿼리 테스트하기
벡터 데이터베이스란?대량의 고차원 데이터 저장 및 조회를 위해 벡터 임베딩 및 쿼리 벡터 유사도 비교 기반 신속하게 인덱싱하는 데이터 베이스 어떻게 쓰일까?벡터 데이터베이스는 다차원 벡터 데이터를 처리하기때문에 대규모 머신러닝 어플리케이션 특히 추천 시스템이나 의미 검색 및 이상 감지에서 사용된다. 1. 추천시스템: 아이템 이미지를 벡터로 표현하고 벡터간 코사인 유사도 같은 유사성 계산을 하고 가장 관련도 높은 추천을 도와줌2. 의미 검색: 사용자의 질의를 벡터로 표현하고 질의 벡터와 의미가 유사한지 유사성 계산해서 관련도 높은 문서를 찾아서 수준 높은 검색 기능을 제공3. 이상 감지: 정상적인 소리, 주파수 벡터와 정상적인 패턴에서 벗어난 벡터 데이터를 비교함으로써 정상 패턴에서 벗어난 데이터를 감지고..
2024.08.28
-
[챗봇] GPT API를 활용하여 서울시 문화행사 공공프로그램 챗봇 만들기
최근에 진행하고 있는 토요일 스터디에 챗봇을 개발하자고 의견을 내었다.감사하게도 다들 좋아해주셨고 다들 눈에 흥미가 가득 생겼다. 10월 쯤에 나가려고 하신 분도 재밌을거 같다며 더 오래할 수도 있다고 말해주시기 까지 했다. 나는 빠르게 구현 후 비용이 안들게 대체하는 방법을 택했다. 그래서 GPT API를 먼저 사용했다.이후에 계속 업로드 하겠지만 GPT까진 아니더라도 GPT의 80%정도만 되도 좋을 것 같다. 그래서, 어떤 챗봇을 만들껀데?우선 내가 데이터가 있어야한다. 바로 서울 열린데이터 광장에 들어갔다.다양한 데이터가 있었는데 "서울시 문화행사 공공서비스예약 정보" 데이터가 눈에 들어왔다. 공공서비스를 알려주는 챗봇을 만들어보자! 링크: https://data.seoul.go.kr/dataL..
2024.08.20
-
[에러] "RemovePodSandbox from runtime service failed"
문제상황은 도커 빌드된 이미지를 crictl 명령어을 통해 실행시키려고 하는데 이미 생성된 파드 이름과 겹치면서 아래 명령어를 진행했을때 생긴 문제였다. 왜 ctr 명령어를 안사용했냐면 내 이미지는 단순 실행만하면 안되고 이미지 내부 포트랑 로컬이랑 포트포워딩을 해야하는데 ctr은 저수준 도구라 포트포워딩을 지원하지 않음sudo crictl rmp PodId 에러명E0808 14:38:57.010093 48678 remote_runtime.go:241]"RemovePodSandbox from runtime service failed"err="rpc error: code = Unknown desc = failed to forcibly stop sandbox failed to destroy network..
2024.08.08
-
[Docker] 사용법, 명령어 총 정리, CheatSheet
개념정리도커 파일도커 이미지를 빌드하기 위한 스크립트나 지시문을 포함한 텍스트 문서(FROM, RUN 등) 도커 이미지도커 이미지는 컨테이너를 실행하기 위한 템플릿docker images 명령어를 터미널에 치면 확인 할 수 있다. 도커 컨테이너도커 컨테이너는 도커 이미지를 기반으로 실행되는 실제 실행 인스턴스, 이미지를 활성화 한것docker ps 또는 docker ps -a 명령어를 터미널에 치면 확인 할 수 있다.실제 우리가 실행하려는 앱 또는 응용프로그램은 하나의 도커 컨테이너를 실행해서 사용하는 것이고컨테이너를 실행하기 위해 도커파일을 작성하고 도커파일 빌드를 통해 이미지로 생성해주고 도커 헙에 버전별로 저장(백업)해두고 서버 컴퓨터에서 도커 컨테이너를 실행하면 되는 것이다. 작업 순서도커 파일 ..
2024.08.07
-
[OpenAI] LLM 파인 튜닝하기
환경 설정우선, OpenAI의 API Key가 필요하다. 해당 키는 https://platform.openai.com/api-keys 여기서 발급 받으면 됩니다. 키를 웹사이트에서 발급 받으면 키를 환경 변수로 설정합니다. .env 파일을 만들어 API_KEY에 나의 키를 담아줍니다.os와 dotenv를 사용해서 키를 실제 학습 시킬 파이썬 파일에서load_dotenv()와 os.environ.get("API_Key")로 가져와줍니다. # 필요한 라이브러리 임포트import osfrom dotenv import load_dotenvfrom openai import OpenAI# api_key .env파일에 넣어줌load_dotenv()api_key = os.environ.get("API_KEY")# op..
2024.08.06
-
[자연어] 자연어 처리 기초 정리
자연어처리 모델이란?자연어를 입력 받아 해당 입력이 특정 범주일 확률을 출력하고 이 확률 값을 적당히 후처리 해서 자연어 형태로 가공해서 반환하는 인공지능 모델을 말합니다. 자연어 추론문장 2개를 입력 받아 두 문장 사이의 관계가 참, 거짓, 중립 등 어떤 범주인지 그 확률값을 반환하는 것을 말합니다. 그럼, 자연어 처리에서 토큰의 뜻은 무엇일까요?토큰은 문장보다 작은 단위로 보통 띄어쓰기만으로 나눌 수 있거나 의미의 최소 단위읜 형태소 단위로 나누는 2가지의 분리 기준을 가집니다. 토큰화문장을 토큰 시퀀스로 나누는 과정을 의미하고 문자, 단어, 서브워드 등 3가지 방법이 존재합니다. 단어 단위 토큰화는 공백으로 분리하기 때문에 별도의 토크나이저 사용을 하지 않고 어휘 집합의 크기가 매우 커집니다.예시..
2024.08.05
-
[에러] ERROR: Failed building wheel for chroma-hnswlib
문제크로마 디비 설치 시 chroma-hnswlib를 위한 휠 빌딩이 안되는 상황pip install chromadb 해결1. Microsoft C++ 빌드 툴 설치링크: https://visualstudio.microsoft.com/ko/visual-cpp-build-tools/ Microsoft C++ Build Tools - Visual Studio visualstudio.microsoft.com 2. 아래의 깃헙처럼 비주얼 스튜디오 세팅 후 환경 변수 추가https://github.com/bycloudai/InstallVSBuildToolsWindows GitHub - bycloudai/InstallVSBuildToolsWindows: Tutorial on how to install Microso..
2024.08.04
-
[에러] ImportError: cannot import name 'Filters' from 'telegram.ext' (/.conda/lib/python3.10/site-packages/telegram/ext/__init__.py)
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContextdispatcher.add_handler(MessageHandler(Filters.text & ~Filters.command, handle_message))문제텔레그램 챗봇 만들다가 발생한 임포트 에러Filters라는 클래스가 삭제되고 filters 모듈로 바꿔서 사용해야한다. 위에 공식문서를 보면 2. Removed the FIlters class라고 써있다. 해결from telegram.ext import Updater, CommandHandler, MessageHandler, filters, CallbackContextdispatcher..
2024.06.27
-
[에러] TypeError: 'ChatCompletion' object is not subscriptable
client = OpenAI(api_key=apiKey) response = client.chat.completions.create(model=model, messages=prompt) print(response) print(response["choices"][0]["message"]) system_message = response["choices"][0]["message"]문제구버전 openai = 0.28.1과 현재 내가 설치한 버전 openai=1.33.0의 사용 형식이 맞지 않아 발생한 에러system_message = response["choices"][0]["message"]위의 부분에서 에러가 발생한 것인데 말 그대로 해결#(변경 전)system_message = re..
2024.06.08
-
[openai/API] Audio Response Format 음성 응답 형식
위의 이미지는 openai의 audio모듈의 Transcriptions 클래스에 대해서 설명된 문서이다.음성 관련 토이 프로젝트를 하면서 openai 공식문서를 자주 들여다 보고 있는데response_format이 다양해서 공부할 겸 하나씩 보면서 블로그에 기록하려고 한다. Response Format은 위에 보이는 것처럼 json, text, srt, verbose_json, vtt등 5가지로 제공된다. 1. json디폴트로 제공되는 방식이 json이다. 내가 생각했던 json형식은 아니였지만 text 변수에 담겨서 나오는 것 같다.transcript = client.audio.transcriptions.create( model="whisper-1", file=audio_file, response..
2024.06.07
-
[에러] A detailed migration guide is available here: https://github.com/openai/openai-python/discussions/742
import openaiimport osaudio = 'output/output.mp3'filename = 'input_test.mp3'# audio.export('./output/'+filename, format="mp3")# 음원 파일 열기audio_file = open(audio, "rb")# Whisper 모델을 활용해 텍스트 얻기transcript = openai.Audio.transcribe("whisper-1", audio_file) 문제링크: https://github.com/openai/openai-python/discussions/742 v1.0.0 Migration Guide · openai openai-python · Discussion #742We have released a ne..
2024.06.07
-
[에러] AttributeError: module 'openai' has no attribute 'OpenAI'
from dotenv import load_dotenvimport osimport openaiload_dotenv()GptApiKey = os.environ.get("API_Key")client = openai.OpenAI(api_key = GptApiKey) 문제 openai 패키지를 설치했음에도 openai모듈에서 OpenAI 어트리뷰트(매서드나 변수)가 없다는 뜻openai 패키지가 업데이트 되면서 생긴 문제 해결삭제 후 재설치 또는 openai 패키지를 업데이트 하면 됨 삭제 후 재설치pip uninsatll openaipip install openai 패키지 업데이트pip install openai --upgradeOpenAI 클릭해서 들어가보면 클래스로 되어있지만 어쨋든 업데이트하니 OpenA..
2024.06.07
-
[LLM/임베딩] 임베딩 이란? 임베딩 모델 추천
임베딩이란?임베딩은 자연어 처리와 기계 학습에서 텍스트 데이터를 수치형 벡터로 변환하는 방법입니다.단어, 문장 또는 문서와 같은 텍스트 데이터를 고차원 공간에서 저차원 공간으로 매핑하여, 기계 학습 모델이 텍스트 데이터를 이해하고 처리 할 수 있도록 도와주는 방법입니다.임베딩 방법1. Word2Vec- 구글에서 개발한 임베딩 기법으로 단어를 저차원 벡터로 변환하는데 단어의 문맥을 고려하여 유사한 단어들이 가까운 벡터로 표현합니다. CBOW 방식과 Skip-gram 방식 2가지가 있습니다. 2. GloVe- 스탠포드 대학에서 개발한 임베딩 기법으로, 전역적인 통계 정보를 이용하여 단어 임베딩을 생성합니다. 3. FastText- 페이스북에서 개발한 임베딩 기법으로, 단어 자체뿐만 아니라 단어 내의 문자 ..
2024.05.28
-
[LLM/모델 선정] 모델 선정 시 고려 사항
회사에서 LLM 서비스를 진행하기 앞서 제일먼저 진행 할 것은 서비스할 테스크가 무엇인지, 어떤 모델로 구성을 할 것인지 일 것 같다. 보통은 서비스할 테스크는 정해져있고 어떤 모델로 진행해야 할지 찾아볼때 어디서 부터 시작해야할지 모를 것 같다. 우선, LLM 모델은 일반적으로 크기가 크다. 기술 개발 속도가 빨라 로컬에서도 충분히 테스트 할 수 있게 압축된 형식으로 제공도 하지만 대부분은 테스트하기 어려운 상황일 수 있다. 그러면 서비스를 위한 모델을 선정할때 고려사항은 뭐가 있을까?첫번째, 모델 개발 조직이 지속적으로 서포트 가능한가?회사 내에서 모델 개발 팀이 없다면 조직원 누군가 담당하게 될텐데사실, 새로운 기술에 투입되고 익숙해지는데 사람마다 다르겠지만 경력 기준으로 최소 2~3개월은 걸..
2024.05.27
-
[DL/프레임워크] 텐서플로우-파이토치 더이상 헷갈리지 마세요
Tensorflow 1. Dense layer, Linear layer 차이- Dense layer는 Affine func(xw+b) + Activation func(sig, tanh, relu)- Linear layer는 Affine func만 Activation func 붙여줘야함- torch는 Linear layer만 있음! 2. Sequential 클래스의 add메소드깃헙: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/keras/engine/sequential.pysequential 클래스의 add메소드가 stack으로 쌓인다고 하는데 실제로 add로 쌓인 레이어들은 스택으로 빼서 사용하지 않는단말이지(스택은 라스트..
2024.05.21
-
[STT/Whisper] Speech To Text 빠른 시도와 작은 실패
얼마전, 대표님께서 내자리에 오시더니 장황하게 다른 회사의 서비스를 우리도 진행해보고 싶다고 하셨다. 내용을 들어보니, stt, tts, llm 모델을 사용하는 것...비전 공부를 집중해서 한지 이제 6개월 가량 되었는데 새로운 도메인을 공부하려니 정말 많은 생각이 들었다.그래도 후회만 할 수 없으니 빠르게 stt 먼저 테스트 해봤다.시도해본것은 3가지로 추릴 수 있다. 1. 한국어로 학습한 STT 모델 테스트2. ETRI open api 테스트3. open ai Whisper 테스트 순차적으로 시도 방법, 결과, 느낀점 순으로 블로그가 작성될 것 같다.1. 한국어로 학습한 STT 모델 테스트 최근에 음성 모델은 asr이라는 사람의 음성을 텍스트로 변환하는 기술을 사용한다. 우리 주변에도 많이 서비스로..
2024.05.20
-
[LLM/파인튜닝] Adapter - LoRA 차이와 Gemma Fine Tunning
Adapter란? 추가 학습 시 작은 사이즈의 네트워크 layer (adapter)를 추가시키고 해당 네트워크 layer만 학습에 참여시켜 학습에 필요한 비용을 줄이는 방법 => 전체 모델을 학습에 사용하는 것이 아니기 때문에 학습 속도를 높이고, 자원 사용량을 줄여 효과적으로 학습할 수 있다. Adapter는 full fine tunning과는 다른데 일반적으로 fine tunning이라고 하면 모델 마지막에 레이어를 추가해서 학습하는 방법이었으나 Adapter는 모델 중간에 레이어가 들어가는게 차이가 있다고 볼 수 있다. LoRA란? (Low-Rank Adaptation of Large Language Models) rank decomposition matrix를 추가해서 파라미터를 효율적으로 학습..
2024.05.16
-
[LLM/소형모델비교] Phi-3-mini, Gemma, Llama 3 차이
최근 인공지능 업계에서는 소형 언어 모델(LLM)이 큰 주목을 받고 있습니다. 이들 모델은 가벼우면서도 높은 성능을 발휘하여 다양한 자연어 처리 작업에 활용될 수 있습니다. 특히 Microsoft, Google, Meta와 같은 대기업들이 오픈소스로 배포한 Phi-3-mini, Gemma, Llama 3 모델은 상업적으로도 사용할 수 있어 많은 관심을 받고 있습니다. 이번 포스트에서는 이 세 가지 모델의 특징과 장단점을 비교해보겠습니다.1. Microsoft | Phi-3-miniPhi-3-mini는 Microsoft가 배포한 소형 LLM으로, 주로 단순한 자연어 처리 작업에 적합합니다. 제한된 도메인 내에서의 활용에 중점을 두고 있으며, 영어만 학습되어 있습니다. 다국어 지원이 필요한 경우 Phi-..
2024.05.14
-
[LLM/구글모델비교] BERT, Bard, Gemini 차이
자연어 처리(NLP) 분야는 빠르게 발전하고 있으며, 여러 대기업들이 혁신적인 모델을 출시하여 이 분야를 선도하고 있습니다. 이번 포스트에서는 Google의 BERT, Bard, Gemini 모델을 비교하여 각각의 특징과 활용 방안을 알아보겠습니다. 1. BERTBERT(Bidirectional Encoder Representations from Transformers)는 2018년에 출시된 NLP 모델로, 컨텍스트를 고려한 텍스트 이해에 중점을 둡니다. BERT는 감정 분석, 질의 응답, 텍스트 분류 등 다양한 자연어 처리 작업에 활용될 수 있습니다.2. BardBard는 2022년에 출시된 모델로, 인간처럼 자연스럽게 반응할 수 있는 능력을 갖추고 있습니다. 텍스트를 정확하게 이해하고 논리적으로 처리..
2024.05.14
-
[SERV] 비디오로 접촉없이 심박수를 예측하는 서비스
최근 it-show를 다녀오고나서 흥미로운 서비스를 보여준 회사가 있어 개인적으로 어떻게 구현된 건지 궁금해서 찾아봤다. 서비스는 비접촉 심박수 예측이었는데 일반 카메라에 영상을 촬영하면 나의 심박수를 체크해주는 것이였다. 비접촉 심박수 측정 서비스는 비대면, 원격 의료에서 많이 사용될 것 같고 보통 병원에 가면 팔에 직접 두르고 측정하는데 개개인마다 팔의 두께도 다르고 피부병이 있거나 피부가 예민한 사람들은 사용하기 불편하고 심지어 아기들은 통제가 잘 안되니 물리적으로 측정했을때 단점을 커버해줄것 같았다.Non-contact heart rate measurement (비접촉 심박수 측정)비접촉 심박수 측정은 웹캡, 폰 카메라로 충분히 가능한데 이 말뜻은 사람이 따로 장비를 구매하지 않아도 된다는 의..
2024.04.22
-
[DL/모델구현] VAE(Variational Auto-Encoder)
## 소스 깃헙 : https://github.com/hyesukim1/Gen_AI VAE- VAE는 오토인코더와 유사한 구조를 가지고 있지만 latent variable 부분에서 잠재 변수에 분포를 정규 분포 형태로 나타내고 그 분포에서 샘플링하도록 합니다.- VAE는 딥러닝 네트워크로 역전파를 통한 학습이 가능한 아키텍처로 구성합니다. 단순히 정규 분포에서 샘플링하면 인코더와 디코더 사이의 잠재 변수가 미분이 불가능해집니다. 이를 해결하기 위해 인코더 출력부에 μ(평균),σ(분산)를 출력하고 이 값의 선형 결합을 통해 가우시안 분포의 샘플링을 하면 μ, σ에 대해 미분이 가능해집니다.(=Reparametrization Trick)- 오토인코더는 데이터 압축이 목적이고 VAE는 데이터 생성이 목적입니다..
2024.04.22
-
[DL/모델구현] CNN Autoencoder
## 소스 깃헙 : https://github.com/hyesukim1/Gen_AI 컨볼루션 오토인코더란?- 기본적으로 오토인코더의 구조를 가지고 있지만, 데이터의 특징을 추출하기 위해 컨볼루션 신경망(CNN) 구조를 사용합니다. 구조1. 인코더- 인코더는 입력이미지를 점점 작은 차원으로 압축하는 역할- 컨볼루션 레이어와 풀링 레이어를 사용하여 이미지의 중요한 특징들만 추출하고, 이를 잠재 공간에 표현함 2. 디코더- 디코더는 인코더에서 생성된 압축된 데이터를 다시 원래의 이미지 크기로 복원하는 역할- 일반적으로 transposed convolution 레이어를 사용 * upsampling을 사용할 수 있으나 covolution이 학습할 수 있는 파라미터가 있어서 cnn autoencoder는 Conv..
2024.04.11
-
[컴퓨터비전 정주행 Kit] Part2 ch05 객체탐지와 분할
# Selective search- region proposal 방식으로, 영역을 추정하는 방식으로 원본 이미지 내의 컬러, 무늬, 크기, 형태에 따라 유사한 Region을 그룹핑- over segmentation된 이미지를 여러번 반복하여 유사한 region끼리 그룹핑을 진행한 뒤 bounding box를 그림 [selective search 사용]import selectivesearchimg = imread('path')'''scale = Higher means larger clusters in felzenszwalb segmentation.sigma = Width of Gaussian kernel for felzenszwalb segmentation.min_size = Minimum componen..
2024.03.18
-
[컴퓨터비전 정주행 Kit] Part2 ch04 표현학습
# representation learning - feature extractor가 있을때 이제 로컬 피쳐나 아웃풋 레프리젠테이션을 뽑는데 그 레프리젠테이션을 잘 학습하고 자 하는 것 - 데이터의 유사도나 차이를 파악하고자하는 가장 중요한 요소이고 레프리젠테이션을 학습하는게 중요한 요소 # metric - 어떤 측도, 측정 정도 - 예) accuracy, l2-distance, cosine similarity - 학습에서 어떤 메트릭을 쓰겠다는게 metric learning 핵심 # image clustering - 비슷한 데이터들끼리 군집하는 것 - relational database 상의 데이터라고 하면 다양한 클러스터링 기법들이 있음 - high dimensional한 이미지는 w by h by r..
2024.01.27
-
[컴퓨터비전 정주행 Kit] Part2 ch03
activation function이 왜 중요한가? - 비선형성을 줘서 중요함 - activation을 안쓰면 레이어가 계속 중첩이되면 하나의 선형 형태로 구성이 되고 한번 레이어를 쌓는 것과 레이어를 여러개 쌓는것과 동일하게 됨 loss - 주어진 데이터에대해 파라미터를 업데이트하는 펑션 퍼셉트론에서 학습 1. 파라미터 값을 초기화 2. 현재 위치에서 경사도를 계산 3. 기울기가 작아지는 방향으로 포지션을 이동 chain_rule - 함수를 연결지어서 미분값을 계산 gradient descent 방법의 문제점 - 많은 학습 데이터가 필요함 - 에포크별로 미분 계산은 시간이 많이 걸림 - 최적화를 위해 많은 에포크가 필요되어짐 Convolutional Neural Network 컨볼루셔널 층 + 풀링 연..
2023.12.23
-
[컴퓨터비전 정주행 Kit] Part2 ch02
* Receptive Field은 filter가 한번에 볼 수 있는 입력의 Spatial area이다, filter size와 동일한 의미 Convolution - 미리 정해져있는 컨볼루션 커널이 이미지의 각 픽셀들과 곱해지면서 컨볼루션 아웃풋을 만들어내는 연산 - 인풋 이미지의 선형적 연산이라고도 함 - 교환법칙, 결합법칙, 분배법칙 성립 스무딩: 노이즈 줄일 수 있음 패딩: 이미지 필터링에서 바운더리 이펙트를 없애기 위해 주로 사용하게 되는 것 Edge and Corner 엣지는 점들의 집합, 픽셀의 강도가 갑자기 변하는 부분 텍스처, 뎁스의 차이, 방향성이 달라질때, 조도 등으로 엣지가 만들어짐 Edge Detection Process smoothing > Gradient magnitude > No..
2023.12.18
-
[컴퓨터비전 정주행 Kit] Part2 ch01
Linear Algebra in Computer Vision - vector space: image understanding = image description + Decision Making image description(이미지가 어디에 어떤 피처가 있는지 분석) - 어떤 x쪽 방향의 그래디언트와 y쪽 방향의 그래디언트를 구한 다음에 그것의 오리엔테이션, 방향성을 에그리게이션해서 보팅을해서 히스토그램을 만드는 이런 걸 고전적으로 사용했음 아래처럼 히스토그램을 벡터로서 사용하고 로컬 피처들을 전체 에그리게이션해서 전체 디스크립터를 구하거나 로컬 디스크립터를 사용해서 매칭 또는 오브젝트 디텍션, 로컬한 정보들을 얻을 수 있음 Decision Making 인풋 x(=이미지) => 사람을 구분해주는 함수 =..
2023.12.16
-
[컴퓨터비전 정주행 Kit] Part1 ch1
인공지능 = 인공(Artificial) + 지능(Intelligence) 머신러닝 = 학습하는 기계(Decision tree, svm)*svm: 서포트 벡터가 어떤 직선을 만들때 그 직선에서 수직거리가 가까운 포인트를 서포트 벡터라고 하는데 두 서포트 벡터 사이의 거리를 마진이라고 하고 마진을 최대화하는 어떤 직선을 찾는 테스크- 해석력이 좋음 딥러닝 = 깊은 신경망 구조의 머신러닝(신경망)- 예측력이 좋음- MLP, CNN(컨볼루션 필터를 사용해서 지역적 특징 추출), RNN(노드가 본인한테 회귀함), Transformer(셀프 어텐션을 사용)*MLP(완전연결신경망)와 CNN(합성곱 신경망)의 차이는 특징점 추출의 유무MLP는 이미지 행렬을 1차원 배열로 만들고 신경망에 입력으로 넣어 가중치를 계산해서..
2023.12.09
-
[스터디/밑시딥3] 제 4고지 신경망 만들기_47. 소프트맥스 함수와 교차 엔트로피 오차
다중 클래스 분류: 여러 클래스로 분류하는 문제로 분류 대상이 여러 가지 클래스 중 어디에 속하는지 추정 47.1 슬라이스 조작 함수 get_item이라는 편의함수를 추가합니다. import numpy as np from dezero import Variable import dezero.functions as F x = Variable(np.array([[1,2,3],[4,5,6]])) y = F.get_item(x,1) print(y) get_item 함수는 Variable의 다차원 배열 중에서 일부를(여기선 1번째 행) 슬라이스하여 뽑아줍니다. y.backward() print(x.grad) y.backward()를 호출해 역전파를 진행했더니 위의 결과가 나옵니다. 0으로 채워진 부분은 y.grad ..
2023.10.16
-
[스터디/밑시딥3] 제 4고지 신경망 만들기_46. Optimizer로 수행하는 매개변수 갱신
46.1 Optimizer 클래스 class Optimizer: def __init__(self): self.target = None self.hooks = [] def setup(self, target): self.target = target return self def update(self): params = [p for p in self.target.params() if p.grad is not 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...
2023.10.15
-
[스터디/밑시딥3] 제 4고지 신경망 만들기_45. 계층을 모아두는 계층
45.1 Layer 클래스 확장 Layer 클래스 안에 Layer가 들어간 구조로 만드는 것이 이번장의 목표입니다. class Layer: def __init__(self): self._params = set() def __setattr__(self, name, value): if isinstance(value, (Parameter, Layer)): # 1. Layer 추가 self._params.add(name) super().__setattr__(name, value) def params(self): for name in self._params: obj = self.__dict__[name] if isinstance(obj, Layer): yield from obj.params() # 2.Layer에..
2023.10.14
-
[스터디/밑시딥3] 제 4고지 신경망 만들기_44. 매개변수를 모아두는 계층
44.1 Parameter 클래스 구현 class Parameter(Variable): pass Variable 클래스를 상속하기만 했습니다. 44.2 Layer 클래스 구현 Layer 클래스는 매개변수를 유지하고 매개변수를 사용하여 변환을 하는 클래스입니다. from dezero.core import Parameter class Layer: def __init__(self): self._params = set() # 매개변수 보관 def __setattr__(self, name, value): if isinstance(value, (Parameter, Layer)): self._params.add(name) super().__setattr__(name, value) __setattr__은 인스턴스 변수..
2023.10.10
-
[스터디/밑시딥3] 제 4고지 신경망 만들기_43. 신경망
43.1 DeZero의 linear 함수 아핀 변환은 선형 변환(행렬 곱셈)에 평행이동(벡터 덧셈)을 추가한 변환입니다. DeZero에서 보면 입력 x의 매개변수 W 사이에서 행렬 곱을 구하고 b를 더해주는 것입니다. y = F.matmul(x, W) + b로 구현했었습니다. 선형 변환은 신경망에서 완전연결계층(fully connected layer)에 해당하고 매개변수 W는 가중치, 매개변수 b는 편향이라고 합니다. 선형 변환을 linear 함수로 구현하는데 Function 클래스를 상속하여 새롭게 linear라는 함수 클래스를 구현합니다. 왼쪽 그림은 Dezero의 matmul 함수와 add 함수를 이용한 방식이고 matmul의 출력이 Variable 인슽너스이므로 계산 그래프에 기록됩니다. 계산 그..
2023.10.10
-
[스터디/밑시딥3] 제 4고지 신경망 만들기_42. 선형 회귀
42.1 토이 데이터셋 import numpy as np import matplotlib.pyplot as plt np.random.seed(0) x = np.random.rand(100, 1) y = 5 + 2 * x + np.random.rand(100, 1) # Scatter plot plt.scatter(x, y, c='blue', marker='o', label='Data points') plt.xlabel('X') plt.ylabel('Y') plt.title('Scatter plot of x vs y') plt.legend(loc='upper left') plt.grid(True) plt.show() x, y라는 두 개의 변수로 구성된 데이터 셋을 생성하고 시각화하였습니다. 수식처럼 x와 y..
2023.10.10
-
[스터디/밑시딥3] 제 4고지 신경망 만들기_41. 행렬의 곱
41.1 벡터의 내적과 행렬의 곱 벡터의 내적은 두 벡터 사이의 대응 원소의 곱을 모두 합한 값입니다. 행렬 곱은 왼쪽 행렬의 가로방향 벡터와 오른쪽 행렬의 세로방향벡터 사이의 내적을 계산합니다. 그리고 그 결과가 새로운 행렬의 원소가 됩니다. 넘파이에선 np.dot 함수를 사용합니다. np.dot(x, y)은 두 인수가 모두 1차원 배열이면 벡터의 내적을 계산하고 인수가 2차원 배열이면 행렬의 곱을 계산합니다. 41.2 행렬의 형상 체크 행렬곱은 아래 그림처럼 대응하는 차원(축)의 원소 수를 일치시킵니다. 41.3 행렬 곱의 역전파 행렬곱의 순전파에서 스칼라 L을 출력하는 계산을 다룰때 x의 i번째 원소에 대한 미분은 아래와 같습니다. 왼쪽의 그림은 xi를 미세하게 변화시켰을 때 L이 얼마나 변화하느냐..
2023.10.09
-
[스터디/밑시딥3] 제 4고지 신경망 만들기_40. 브로드캐스트 함수
40.1 broadcast_to 함수와 sum_to 함수(넘파이 버전) np.broadcast_to(x, shape)는 ndarray 인스턴스인 x의 원소를 복제하여 shape 인수로 지정한 형상이 되도록 해줍니다. broadcast_to 함수의 역전파의 입력 x의 형상과 같아지도록 기울기의 합을 구해줍니다. sum_to(x, shape)로 해당 부분을 구현해주면 되고 이 함수는 x의 원소의 합을 구해 shape 형상으로 만들어주는 함수 입니다. 넘파이에서는 이런함수가 없고 DeZero에서 sum_to 함수를 만들어줍니다. def sum_to(x, shape): """Sum elements along axes to output an array of a given shape. Args: x (ndarray..
2023.10.09
-
[스터디/밑시딥3] 제 4고지 신경망 만들기_38. 형상 변환 함수
38.1 reshape 함수 구현 넘파이에서 np.reshape(x, shape) 형태로 쓰며 x를 shape 인수로 지정한 형상으로 변환해줍니다. 안에 텐서의 원소 수만 같고 겉에 싸여진 대괄호가 추가되거나 빠지는 것이죠 계산을 원소별로 하지 않는 함수는 텐서의 형상을 고려해야하는데 그러면 역전파 구현이 좀더 명확해집니다. 변수의 데이터 쉐입과 기울기의 쉐입이 일치하는지 확인해야하는데 x가 Variable 인스턴스일 때 x.data.shape == x.grad.shape를 만족할 수 있도록 역전파를 구현합니다. 위의 그림처럼 역전파는 출력 족에서 기울기를 전달하는데 [a,b,c,d,e,f] 쉐입으로는 (,6)인 형상을 [[a,b,c],[d,e,f]]로 즉 (2,3)의 쉐잎으로 변환해서 주고 있습니다. ..
2023.10.08
-
[스터디/밑시딥3] 제 4고지 신경망 만들기_37. 텐서를 다루다
37.1 원소별 계산 지금까지는 연산 하무의 입력과 출력이 모두 스칼라라고 정의했는데 텐서일경우, 행렬일 경우에 대해서 다룰수 있도록 해보겠습니다. 37.2 텐서 사용 시의 역전파 지금까지 스칼라를 대상으로 역전파를 구현했는데 DeZero 함수에 텐서를 건네면 텐서의 원소마다 스칼라로 계산을 해왔습니다. 텐서의 원소별 스칼라 계산이 이루어지면 스칼라를 가정해 구현한 역전파는 텐서의 원소별 계산에서도 성립합니다. 위의 코드를 보면 두 변수 x와 c를 더한다음 sum 함수로 모든 원소를 더해 하나의 스칼라로 출력하는 코드입니다. 디버깅 해서 보면 t = [[11, 22, 33],[44,55,66]]의 값이 나오고 이 각각의 원소를 합하면 23이라는 스칼라값을 얻을 수 있습니다. 위의 계산그래프를 보면 계산이..
2023.10.08
-
[스터디/밑시딥3] 제 4고지 신경망 만들기_39. 합계 함수
39.1 sum 함수의 역전파 덧셈의 미분은 y = x0+x1일 때 ∂y/∂x0 = 1, ∂y/∂x1 = 1입니다. 역전파는 출력 쪽에서 전해지는 기울기를 그대로 입력 쪽으로 흘려보내주면 됩니다. 덧셈을 수행한 후 변수 y로 부터 역전파를 수행하는데 x0, x1에 출력 쪽에서 전해준 기울기 1을 두개로 '복사'해서 전달해줍니다. 원소가 두개인 sum 함수의 계산 그래프입니다. [1, 2]라는 2개의 원소로 구성된 벡터에 sum 함수를 통과해 [3]이라는 스칼라를 출력합니다. => forward 출력 쪽에서 전해준 값 1을 [1, 1]로 벡터(1차원 배열)로 확장해 전파합니다. => backward 원소가 2개 이상인 벡터 일땐? 기울기 벡터 원소 수 만큼 '복사'해줍니다. 이러한 원리가 입력 변수가 2차..
2023.09.19
-
[스터디/밑시딥3] 제 3고지 고차미분계산_36. 고차 미분 이외의 용도
이번 단계에서는 역전파로 수행한 계산에 또 다시 역전파를 할 수 있는 double backpropagation을 구현합니다. 36.1 double backprop의 용도 미분이 포함된 식에 미분 계산을 할때 double backprop으로 게산할 수 있습니다. import numpy as np from dezero import Variable x = Variable(np.array(2.0)) y = x ** 2 y.backward(create_graph=True) gx = x.grad x.cleargrad() z = gx ** 3 + y z.backward() print(x.grad) 위 코드에서 y.backward(create_graph=True)는 미분을 하기위해 역전파 하는 코드 입니다. 여기서 새..
2023.09.11
-
[스터디/밑시딥3] 제 3고지 고차미분계산_35. 고차 미분 계산 그래프
이번에 추가할 함수는 tanh인데 tanh는 쌍곡 탄젠트 혹은 하이퍼볼릭 탄젠트라고 읽습니다. 입력을 -1 ~ 1 사이의 값으로 변환 합니다. 35.1 tanh 함수 미분 자연 로그의 밑(e)에 대해 ∂e**x/∂x = e**x이고 ∂e**-x/∂x = -e**-x인 점을 이용하면 위와 같이 미분할 수 있습니다. tanh의 미분은 분수 함수의 미분을 이용해 간단하게 변환할 수 있고 1-y**2의 결과를 얻을 수 있습니다. 35.2 tanh 함수 구현 class Tanh(Function): def forward(self, x): y = xp.tanh(x) return y def backward(self, gy): y = self.outputs[0]() gx = gy * (1 - y * y) return g..
2023.09.11
-
[스터디/밑시딥3] 제 3고지 고차미분계산_34. sin 함수 고차 미분
34.1 sin 함수 구현 고차 미분에 대응할 수 있는 sin 클래스를 구현합니다. y = sin(x)일때 미분은 cos(x)입니다. import numpy as np from dezero.core import function class Sin(Function): def forward(self, x): y = xp.sin(x) return y def backward(self, gy): x, = self.inputs gx = gy * cos(x) # 1 return gx def sin(x): return Sin()(x) backward 메서드에서 메서드 안의 모든 변수가 Variable 인스턴스 이며 cos(x)는 DeZero의 cos 함수입니다. 즉 Cos 클래스와 cos 함수를 구현해야합니다. 34.2..
2023.09.11
-
[스터디/밑시딥3] 제 3고지 고차미분계산_33. 뉴턴 방법으로 푸는 최적화(자동계산)
33.1 2차 미분 계산하기 수식 y = x**4 - 2x**2를 2차 미분을 해보겠습니다. import numpy as np from dezero import Variable def f(x): y = x ** 4 - 2 * x ** 2 return y x = Variable(np.array(2.0)) y = f(x) y.backward(create_graph=True) # 1 # 두번째 역전파 gx = x.grad # 2 gx.backward() # 3 print(x.grad) 1의 y.backward(create_graph = True)에 의해 첫 번째 역전파가 진행되고 True로 지정하여서 역전파 계산에서도 게산 그래프를 만들게 하였습니다. 2의 gx = x.grad 코드로 y의 x에 대한 미분값을..
2023.09.10
-
[스터디/밑시딥3] 제 3고지 고차미분계산_32. 고차 미분(구현 편)
32.1 새로운 DeZero로! 수정 전 class Variable: def backward(self, retain_grad=False): if self.grad is None: # 수정할 부분 self.grad = np.ones_like(self.data) funcs = [] seen_set = set() def add_func(f): if f not in seen_set: funcs.append(f) seen_set.add(f) funcs.sort(key=lambda x: x.generation) add_func(self.creator) 위에 표시한 부분인 self.grad = np.ones_like(self.data) 여기를 수정할 건데 미분값을 자동 저장할 수 있게 Variable 인스턴스가 되도..
2023.09.09
-
[스터디/밑시딥3] 제 3고지 고차미분계산_31. 고차 미분(이론 편)
이전 단계에서 정리된 내용은 1. 계산의 '연결'은 Function 클래스의 __call__ 메서드에서 만들어집니다. 2. 구체적인 순전파와 역전파 계산은 Function 클래스를 상속한 클래스의 forward 메서드와 backward 메서드로 처리합니다. 31.1 역전파 계산 역전파의 계산 로직 class Sin(Function): def backward(self, gy): x = self.inputs[0].data gx = gy * np.cos(x) return gx gx = gy * np.cos(x) 라는 계산이 진행되는데 현재는 이 계산과 관련된 계산 그래프가 만들어지지 않고 있습니다. 역전파를 계산할 때 '연결'이 만들어지면 고차 미분을 자동으로 계산 할 수 있게 됩니다. y = sin(x)의 ..
2023.09.09
-
[스터디/밑시딥3] 제 3고지 고차미분계산_30. 고차 미분(준비편)
이번 단계에서는 고차 미분을 자동으로 게산 할 수 있도록 DeZero를 확장합니다. 30.1 확인 1: Variable 인스턴스 변수 class Variable: __array_priority__ = 200 def __init__(self, data, name=None): if data is not None: if not isinstance(data, np.ndarray): raise TypeError('{} is not supported'.format(type(data))) self.data = data self.name = name self.grad = None self.creator = None self.generation = 0 Variable 클래스에는 인스턴스 변수가 여러개 인데 그 중에 da..
2023.09.09
-
[스터디/밑시딥3] 제 3고지 고차미분계산_29. 뉴턴 방법으로 푸는 최적화(수동 계산)
이전 단계에서 로젠브록 함수의 최솟값을 경사하강법으로 구했는데 기울기를 구하는 작업을 5만 번 가까이 반복해야 목적지에 도달했습니다. 이는 경사하강법이 수려이 느리다는 건데요. 경사하강법을 대체하고 수렴이 더 빠른 방법 중 유명한 것이 '뉴턴 방법'입니다. 경사하강법은 '계곡'에서 서서히 목표값에 접근해가는 반면에 뉴턴 방법은 계곡을 뛰어넘어 목적지에 도착합니다. * 로젠브록 함수에서는 경사하강법과 뉴턴 방법의 갱신 횟수 차이가 크게 나왔는데, 초깃값이나 학습률 등을 어떻게 설정하느냐에 따라 달라질 수 있습니다. 일반적으로 초깃값이 정답에 충분히 가까우면 뉴턴 방법이 더 빨리 수렴합니다. 29.1 뉴턴 방법을 활용한 최적화 이론 변수를 하나만 받는 함수를 예로 들어 뉴턴 방법을 활용한 최적화 구현을 설명..
2023.09.09
-
[스터디/밑시딥3] 제 3고지 고차미분계산_28. 함수 최적화
최적화란 어떤 함수가 주어졌을 때 그 최솟값(또는 최댓값)을 반환하는 '입력(함수의 인수)'을 찾는 것 입니다. 신경망의 학습 목표도 손실 함수의 출력을 최소화하는 매개변수를 찾는 것이니 최적화 문제에 속함을 알 수 있습니다. 28.1 로젠브록 함수 위의 그림을 보면 포물선 모양으로 길게 뻗은 골짜기가 보입니다. 산의 등고선을 그리면 그 모양이 바나나를 닮았다고 해서 로젠브록 함수를 바나나 함수라고도 합니다. 뭔가 귀엽네요 우리의 목표가 로젠브록 함수의 출력이 최소가 되는 x0과 x1을 찾는 건데 로젠브록 함수가 최솟값이 된느 지점은 (x0, x1) = (1, 1)입니다. 28.2 미분 계산하기 (x0, x1) = (0.0, 2.0)에서의 미분을 계산한다고 했을때 아래의 코드로 구현할 수 있습니다. im..
2023.09.06
-
[스터디/밑시딥3] 제 3고지 고차미분계산_27. 테일러 급수 미분
27.1 sin 함수 구현 sin함수의 미분은 y = sin(x)일 때, 그 미분은 ∂y/∂x = cos(x)입니다. import numpy as np from dezero import Function class Sin(Function): def forward(self, x): y = np.sin(x) return y def backward(self, gy): x = self.inputs[0].data gx = gy * np.cos(x) return gx def sin(x): return Sin()(x) 넘파이가 제공하는 np.sin, np.cos함수를 사용해 구현했습니다. x = Variable(np.array(np.pi / 4)) y = sin(x) y.backward() print(y.data) p..
2023.09.06
-
[스터디/밑시딥3] 제 3고지 고차미분계산_26. 계산 그래프 시각화(2)
이번 단계에서는 Dezero 계산 그래프를 DOT 언어로 변환하는 기능을 구현합니다. 26.1 시각화 코드 예 import numpy as np from dezero import Variable from dezero.utils import get_dot_graph x0 = Variable(np.array(1.0)) x1 = Variable(np.array(1.0)) y = x0 + x1 x0.name = 'x0' x1.name = 'x1' y.name = 'y' txt = get_dot_graph(y, verbose=False) print(txt) with open ('C:/Users/000/Desktop/sample.dot.txt', 'w') as o: o.write(txt) get_dot_graph ..
2023.09.03
-
[스터디/밑시딥3] 제 3고지 고차미분계산_25. 계산 그래프 시각화(1)
이번 단계는 계산 그래프를 시각화 하는데 왜 계산 그래프를 시각화하냐면 문제가 발생했을 때 원인이 되는 부분을 파악하기 쉽기 때문입니다. 또한 더 나은 계산법을 발견하거나 신경망 구조를 3자에게 시각적으로 전달하는 용도로 활용할 수 있습니다. 25.1 Graphviz 설치하기 Graphviz는 그래프를 시각화 해주는 도구입니다. 책에서는 mac os, 우분투에서 설치 방법을 알려줬습니다. 터미널 창에 아래 명령어를 실행합니다. brew install graphviz dot - V 윈도우에서 설치하는 방법은 아래에 있습니다. https://graphviz.org/download/ Download Graph Visualization Software graphviz.org 다운로드 페이지에 들어가 원하는 버전..
2023.09.03
-
[스터디/밑시딥3] 제 2고지 자연스러운 코드로_24. 복잡한 함수의 미분
이번 단계에서 다루는 함수는 최적화 문제에서 자주 사용되는 테스트 함수입니다. 위키백과의 'Test functions for optimization' 페이지에 있는 3개의 함수를 선택하여 실제 미분합니다. 24.1 Sphere 함수 Sphere 함수를 수식으로 표현하면 z = x**2+y**2입니다. 단순히 두 개의 입력 변수를 제곱하여 더하는 함수입니다. 이 함수를 가지고 미분을 계산합니다. if '__file__' in globals(): import os, sys sys.path.append(os.path.join(os.path.dirname(__file__), '..')) import numpy as np from dezero import Variable def sphere(x, y): z = x..
2023.08.30
-
[스터디/밑시딥3] 제 2고지 자연스러운 코드로_23. 패키지로 정리
이번 단계는 재사용 가능하도록 패키지로 정리합니다. 파이썬에서는 '모듈', '패키지', '라이브러리'라는 용어를 사용합니다. 각각의 용어 설명은 아래에 있습니다. 1) 모듈 - 모듈은 파이썬 파일입니다. 특히 다른 파이썬 프로그램에서 임포트 하여 사용한느 것을 가정하고 만들어진 파이썬 파일을 모듈이라고 합니다. 2) 패키지 - 패키지는 여러 모듈을 묶은 것입니다. 패키지를 만들려면 머저 디렉터리를 만들고 그 안에 모듈(파이썬 파일)을 추가합니다. 3) 라이브러리 - 라이브러리는 여러 패키지를 묶은 것입니다. 그래서 하나 이상의 디렉터리로 구성됩니다. 패키지를 '라이브러리'라고 부를때도 있습니다. 23.1 파일 구성 Dezero라는 디렉터리를 만들어줍니다. 지금까지 스텝 파일들은 steps라는 폴더에 넣어..
2023.08.30
-
[스터디/밑시딥3] 제 2고지 자연스러운 코드로_22. 연산자 오버로드(3)
이번에 추가될 연산자들을 아래에 표로 만들었습니다. 특수 메서드 예 설명 __neg__(self) -self 양수를 음수로 or 음수를 양수로 바꿔주는 부호 연산자, 단항 연산자 __sub__(self, other) self - other 뺄셈 연산자, 이항 연산자 __rsub__(self, other) other - self 뺄셈 연산자, 이항 연산자 __truediv__(self, other) self / other 나눗셈 연산자, 이항 연산자 __rtruediv__(self, other) other / self 나눗셈 연산자, 이항 연산자 __pow__(self, other) self** other 거듭제곱 연산자, 이항 연산자 이러한 연산자를 추가하는 순서는 1. Function 클래스를 상속하여..
2023.08.28
-
[스터디/밑시딥3] 제 2고지 자연스러운 코드로_21. 연산자 오버로드(2)
현재 DeZero는 a * np.array(2.0)처럼 ndarray 인스턴스와 함께 사용할 수 없습니다. 또한, 3+b처럼 수치 데이터도 함께 사용 할 수 없습니다. 이번 단계는 1. Variable 인스턴스와 ndarray 인스턴스를 함께 사용하기 2. float, int와 함께 사용하기를 구현하겠습니다. 21.1 ndarray와 함께 사용하기 전략: a가 Variable 인스턴스 일때 a * np.array(2.0)이면 ndarray 인스턴스를 Variable 인스턴스로 변환 ndarray 인스턴스를 Variable로 바꿔주는 as_variable 함수를 만들어줍니다. def as_variable(obj): if isinstance(obj, Variable): return obj return Var..
2023.08.27
-
[스터디/밑시딥3] 제 2고지 자연스러운 코드로_20. 연산자 오버로드(1)
이번장의 목표: Variable 인스턴스 a, b가 있을 때, y = a * b처럼 연산할 수 있게 확장하는 것입니다. 20.1 Mul 클래스 구현 y = x0 * x1 일때 x0을 y에 대해 미분하면 ∂y/∂x0 = x1, x1을 y에 대해 미분하면 ∂y/∂x1 = x0 입니다. 그러나, 우리는 최종 출력인 'L'에 대해 x0, x1의 미분을 각각 구할 것입니다. * 여기서 말하는 L은 스칼라를 출력하는 합성 함수로 가정하고 Loss인 오차(=손실)을 의미합니다. 우리는 최종 출력인 L에 대해 미분을 한다고 했을 때 즉, L의 변수에 대한 미분을 전파한다고 했을 했을때는 ∂L/∂y이 전파되어 ∂y/∂x0 = ∂L/∂y * x1 ∂y/∂x1 = ∂L/∂y * x0 이 됩니다. Mul 클래스 구현 clas..
2023.08.27
-
[스터디/밑시딥3] 제 2고지 자연스러운 코드로_19. 변수 사용성 개선
19.1 변수 이름 지정 변수에 이름을 붙여줄 수 있도록 설정합니다. class Variable: def __init__(self, data, name=None): #2.초기화 인수 추가 if data is not None: if not isinstance(data, np.ndarray): raise TypeError('{} is not supported'.format(type(data))) self.data = data self.name = name # 1.Variable 클래스에 name 이라는 인스턴스 변수 추가 self.grad = None self.creator = None self.generation = 0 x = Variable(np.array(1.0), 'input_x') # 3. 실제사용..
2023.08.26
-
[스터디/밑시딥3] 제 2고지 자연스러운 코드로_18. 메모리 절약 모드
DeZero의 메모리 사용을 개선할 수 있는 두 가지 구조를 도입합니다. 1. 역전파 시 사용하는 메모리양을 줄이는 방법으로, 불필요한 미분 결고를 보관하지 않고 즉시 삭제 2. 역전파가 필요없는 경우용 모드를 제공(불필요한 계산을 생략) 18.1 필요 없는 미분값 삭제 현재 DeZero에서는 모든 변수가 미분값을 변수에 저장하고 있습니다. y,backward()를 실행하여 미분하면 모든 변수가 미분 결과를 메모리에 유지합니다. 머신러닝에서 역전파로 구하고 싶은 미분값은 말단 변수 뿐일때가 대부분이며 중간 변수의 미분값을 필요하지 않습니다. 그래서, 중간 변수에 대해서 미분값을 제거하는 모드를 추가합니다. class Variable: def backward(self, retain_grad=False): ..
2023.08.26
-
[스터디/밑시딥3] 제 2고지 자연스러운 코드로_17. 메모리 관리와 순환 참조
지금까지의 구현은 처리 속도와 메모리 사용량에 신경 쓰지 않았기 때문에 성능을 개선할 수 있는 기술을 사용합니다. 파이썬이라고 하면 보통은 프로그램 언어를 가리키지만 파이썬 코드를 실행하는 '프로그램'을 지칭할 때도 사용합니다. 이 프로그램을 일반적으로 '파이썬 인터프리터'라고 부르며 표준으로 사용되는 인터프리터는 C언어로 구현된 CPython입니다. 그래서, 이번 단계에서 사용하는 메모리 관리 설명은 CPython을 기준으로 합니다. 17.1 메모리 관리 파이썬은 필요 없어진 객체를 메모리에서 자동으로 삭제합니다. 불필요한 객체는 파이썬 인터프리터가 제거해주기 때문에 더 중요한 작업에 집중할 수 있었습니다. 하지만, 코드를 제대로 작성하지 않으면 메모리 누수 및 메모리 부족등의 문제가 발생합니다. 특히..
2023.08.26
-
[스터디/밑시딥3] 제 2고지 자연스러운 코드로_16. 복잡한 계산 그래프(구현편)
먼저, 순전파 시 세대를 설정하는 부분부터 시작하겠습니다. 그 다음, 역전파 시 최근 세대의 함수 부터 꺼내도록 합니다. 16.1 세대 추가(순전파) Variable 클래스, Function 클래스의 인스턴스 변수인 generation을 추가합니다. Variable 클래스에 인스턴스 변수 generation 추가 class Variable: def __init__(self, data): if data is not None: if not isinstance(data, np.ndarray): raise TypeError('{} is not supported'.format(type(data))) self.data = data self.grad = None self.creator = None self.gener..
2023.08.26
-
[스터디/밑시딥3] 제 2고지 자연스러운 코드로_15. 복잡한 계산 그래프(이론 편)
지금까지는 변수와 함수가 위의 이미지처럼 한 줄로 연결된 계산 그래프로 되어있습니다. 그러나 같은 변수를 반복해서 사용하거나 여러 변수를 입력 받는 함수를 사용하는 계산을 할 수 있기 때문에 아래 이미지처럼 더 복잡한 연결을 만들 수 있습니다. 현재 DeZero는 이런 복잡한 연결의 역전파를 진행할 수가 없습니다. *그래프의 '연결된 형태'는 위상이라고 하는데 다양한 위상의 계산 그래프에 대응하여 제대로 미분하는 것이 목표 15.1 역전파의 올바른 순서 중간에 분기했다가 다시 합류하는 위의 계산 그래프에서 주목할 부분은 변수 'a'입니다. 이전 단계(Add 함수를 사용하여 역전파를 구현했던)처럼 같은 변수를 반복해서 사용하면 역전파 때 출력 쪽에서 전파되는 각각의 미분값들을 더해야합니다. 그래서, a를 ..
2023.08.22
-
[스터디/밑시딥3] 제 2고지 자연스러운 코드로_14. 같은 변수 반복 사용
현재, DeZero는 문제가 있습니다. 문제는 같은 변수를 반복해서 사용할 경우 의도대로 동작하지 않을 수 있습니다. 예를들어 위의 그래프처럼 y = add(x,x)일때 동일한 변수를 사용하여 덧셈을 하면 제대로 미분하지 못합니다. y = x + x는 y = 2x인데 이를 미분하면 2가 나와야하는데 array(1.)을 내보내고 있습니다. 14.1 문제의 원인 출력 쪽에서 전해지는 미분값을 그대로 대입하여 같은 변수를 쓰면 미분값이 덮어 써지는 것인데 위 그림처럼 x.grad가 각각으로 가는 값들을 그냥 덮어쓰고 내보내는 것이 아니라 두 x.grad를 더해줘야 (x.grad + x.grad = 2)가 되야 올바른 결과 입니다. 14.2 해결책 형광펜 칠해진 곳을 수정하는데 gxs가 반복할 수 있는 값을 가..
2023.08.22
-
[스터디/밑시딥3] 제 2고지 자연스러운 코드로_13. 가변 길이 인수(역전파 편)
13.1 가변 길이 인수에 대응한 Add 클래스의 역전파 위의 그림에서 덧셈의 순전파는 입력이 2개 출력이 1개인데 역전파는 반대로 입력이 1개 출력이2개가 됩니다. y = x0 + x1 계산(함수)의 입력 변수는 2개인데 이렇게 입력 변수가 여러개인 함수를 다변수 함수라고합니다. 다변수 함수에서 하나의 입력 변수에만 주목하여(다른 변수는 상수로 취급) 미분하는 것을 편미분이라고합니다. 덧셈의 역전파는 출력 쪽에서 전해지는 미분값에 1을 곱한 값이 입력 변수(x0, x1)의 미분입니다. 즉, 상류에서 흘러오는 미분값(∂L/∂z)을 '그대로 흘려보내는 것'이 덧셈의 역전파입니다. 코드로 구현하면 아래처럼 backward 메서드에서 gy를 그대로 return gy, gy로 흘려보냅니다. 13.2 Variab..
2023.08.21
-
[스터디/밑시딥3] 제 2고지 자연스러운 코드로_12. 가변 길이 인수(개선편)
12.1 첫 번째 개선: 함수를 사용하기 쉽게 개선 전은 Add 클래스는 인수를 리스트에 모아서 받고 결과는 튜플로 반환합니다. 개선 후는 리스트나 튜플을 거치지 않고 인수와 결과를 직접 주고 받아 훨씬 자연스럽습니다. 2. 리스트의 원소가 하나라면 첫 번째 원소를 반환 outputs if len(outputs) > 1 else outputs[0] outputs에 원소가 하나뿐이면 리스트가 아니라 원소 하나만 반환해줍니다. 즉, 함수의 반환값이 하나라면 해당 변수를 직접 돌려주는 것입니다. 1. 별표를 붙인다 *inputs 인수 앞에 별표(*)를 붙이면 리스트를 사용하는 대신 임의 갯수 인수(가변 길이 인수)를 건네 함수를 호출 할 수 있습니다. 12.2 두 번째 개선: 함수를 구현하기 쉽도록 개선 전에..
2023.08.20
-
[스터디/밑시딥3] 제 2고지 자연스러운 코드로_11. 가변 길이 인수(순전파 편)
가변 길이 인수: 함수가 임의의 수의 인수를 받을 수 있게 해주는 프로그래밍 기능입니다. - 함수의 매개변수(input)가 여러개 일때마다 함수를 수정하면 비효율적인 방식이 됩니다. - 매개변수 개수와 상관없이 함수를 1개로 만들고 싶을때 입력값을 리스트 또는 튜플과 같은 반복형(literable)자료로 받거나 가변인자함수 방식을 사용해야합니다. 현재, 우리가 사용하는 함수는 입출력 변수가 하나씩인데, 예시 이미지로 Square 클래스에 forward 메서드만 봐도 x = Variable(np.array(0.5)) -> a = A(x)로 들어가서 연산 진행 시 forward input : 0.5, output 즉, y가 0.25로 하나의 값만 리턴 합니다. 근데 덧셈이나 곱셈 처럼 입력이 여러개거나 sp..
2023.08.15
-
[스터디/밑시딥3] 제 1고지 미분 자동 계산_10. 테스트
10.1 파이썬 단위 테스트 - 파이썬 라이브러리에 포함된 unittest를 사용 - unittest를 임포트하고 unittest.TestCase를 사용한 SquareTest 클래스를 구현 - 테스트 할때는 이름이 test로 시작하는 메서드를 만들고 그안에 test 할 내용을 적음 - square 함수긔 출력이 기댓값과 같은지 확인 - self.assertEqual메서드는 주어진 두 객체가 동일한지 여부를 판정함 10.2 square 함수의 역전파 테스트 10.3 기울기 확인을 이용한 자동 테스트 - 기울기 확인: 수치 미분으로 구한 결과와 역전파로 구한 결과를 비교하여 그 차이가 크면 역전파 구현에 문제가 있다고 판단하는 검증 기법 - np.allclose(a, b)는 ndarray 인스턴스인 a와 b..
2023.08.15
-
[스터디/밑시딥3] 제 1고지 미분 자동 계산_9. 함수를 더 편리하게
9.1 파이썬 함수로 이용하기 def square(x): return Square()(x) def exp(x): return Exp()(x) # 해당 방식으로 함수로 변경해서 쓰면 더 편해짐 x = Variable(np.array(0.5)) y = square(exp(square(x)) # 한줄로 연달아 쓸수 있음 y.grad = np.array(1.0) y.backward() print(x.grad) 9.2 backward 메서드 간소화 def backward(self): if self.grad is None: self.grad = np.ones_like(self.data) - np.ones_like() 코드는 인풋으로 받는 데이터의 타입이 같은 ndarray 인스턴스를 생성해서, 모든 요소를 1로 채..
2023.08.15
-
[스터디/밑시딥3] 제 1고지 미분 자동 계산_8. 재귀에서 반복문으로
8.1 현재의 Variable 클래스 빨간 표시를 한 부분이 입력방향으로 하나 앞 변수의 backward 메서드를 호출하는데, 호출된 backward 메서드에서 또 호출하는 방식이고 self.creator가 None이 변수를 찾을 때까지 계속됨 f: x: 1.2840254166877414 x.grad: 2.568050833375483 f: x: 0.25 x.grad: 3.297442541400256 f: x: 0.5 x.grad: 3.297442541400256 f: None f: None x.backward() None # f, x.backward 가 None 값 나와서 끝남 # 바로 앞 변수 시작함 f: x: 0.5 x.grad: 3.297442541400256 f: None f: None x.bac..
2023.08.13
-
[스터디/밑시딥3] 제 1고지 미분 자동 계산_7.역전파 자동화
7.1 역전파 자동화의 시작 class Variable: def __init__(self, data): if data is not None: if not isinstance(data, np.ndarray): raise TypeError('{}은(는) 지원하지 않습니다.'.format(type(data))) self.data = data # 통상값 self.grad = None # 미분값 self.creator = None def set_creator(self, func): self.creator = func class Function: def __call__(self, input): x = input.data y = self.forward(x) output = Variable(as_array(y)) ou..
2023.08.13
-
[스터디/밑시딥3] 제 1고지 미분 자동 계산_6.수동 역전파
6.1 Variable 클래스 추가 구현 class Variable: def __init__(self, data): self.data = data # 통상값 self.grad = None # 미분값 - grad는 None으로 초기화해두고 실제 역전파 계산 할때 미분값 계산 - 벡터나 행렬등 다변수에 대한 미분은 기울기라고 함 6.2 Function 클래스 추가 구현 class Function: def __call__(self, input): x = input.data y = self.forward(x) output = Variable(y) self.input = input # 입력 변수 기억 return output def forward(self, x): raise NotImplementedError()..
2023.08.13
-
[스터디/밑시딥3] 제 1고지 미분 자동 계산_5.역전파 이론
5.1 연쇄법칙 - 합성 함수(두 개 이상의 함수가 결합된 함수)의 도함수(미분계수)를 찾을 때 사용 - 합성 함수의 미분은 구성 함수 각각을 미분한 후 곱한 것과 같음 - 딥러닝 모델을 학습시킬 때, 손실 함수(=비용 함수)를 최소화하기 위해 파라미터를 업데이트하는데 이때, 그래디언트(미분값)를 계산하여 파라미터를 업데이트하고 이 그래디언트를 계산할 때 연쇄법칙이 사용됨 - 딥러닝 모델인 신경망은 입력층부터 출력층까지 다양한 함수와 연산을 포함하는데 전체 모델을 많은 함수들의 '합성함수'로 볼 수 있음 => 이 복잡한 합성함수의 미분을 계산하기 위해 연쇄 법칙이 필요함 5.2 역전파 원리 도출 - 신경망은 입력층, 여러 개의 은닉층, 그리고 출력층으로 구성되어있고 각 레이어는 여러 뉴런으로 이루어져 있..
2023.08.13
-
[스터디/밑시딥3] 제 1고지 미분 자동 계산_4.수치 미분
4.1 미분이란 - 미분은 변화율을 말함 - 극한으로 짧은 시간(순간)에서의 변화량 ** 추가 정리(미분, 도함수, 수치 미분) ** 1) 미분(Differentiation) - 미분은 어떤 함수가 주어진 시점에서 얼마나 변화하는지 측정하는 연산(=미분은 함수의 변화율을 측정하는 연산) - 함수 f(x)의 미분은 x에 대한 변화율 - f'(x)는 f(x)의 도함수라고 부름 2) 도함수(Derivative) - 도함수는 특정한 점에서 함수의 미분값을 나타냄 - 그래프 상에서, 도함수는 주어진 점에서의 접선의 기울기 - 즉, f'(x)는 점 x에서 함수 f(x)의 미분값 또는 도함수라고 함 3) 수치 미분(Numerical Differentiation) - 수치 미분은 미분 값을 근사적으로 계산하는 방법 -..
2023.08.12
-
[스터디/밑시딥3] 제 1고지 미분 자동 계산_3.함수 연결
3.1 Exp 함수 구현 numpy.exp - 함수는 주어진 입력 배열에 대한 자연 상수 e의 지수 값을 계산 - e는 오일러의 수 또는 네이피어의 상수로 약 2.71828의 값을 가짐 - numpy.exp는 통계, 머신러닝, 딥러닝에서는 로그 변환의 역변환, 활성화 함수, 소프트맥스 함수의 계산에 사용됨 특징 1. 벡터화 연산: 배열의 모든 요소에 대해 동시에 지수 연산 수행할 수 있어 코드가 간결해짐 2. 브로드캐스팅: 다른 크기의 배열 간 연산이 가능하도록 크기를 자동으로 조정 (추가) 넘파이의 배열 지수 함수들 exp( ) : exponential 값을 구해줌 exp2( ) : 배열값으로 2를 거듭제곱해줌 expm1( ) : exp(배열값) - 1 # Exp 함수 구현 class Exp(Funct..
2023.08.12
-
[스터디/밑시딥3] 제 1고지 미분 자동 계산_2.변수를 낳는 함수
2.1 함수란 - 어떤 변수로부터 다른 변수로의 대응 관계를 정한 것 - 위의 그림은 변수 x,y와 함수 Function과의 관계를 보여주고 원, 사각형의 노드들을 화살표로 연결해 계산과정을 표현한 그림(=계산 그래프), 화살표는 방향이 있는 에지에 해당함 - 그래프는 노드와 에지로 구성된 데이터 구조 또는 구조를 나타낸 그림 2.2 Function 클래스 구현 - Function 클래스는 Variable 인스턴스를 입력받아 Variable 인스턴스를 출력 - Variable 인스턴스의 실제 데이터는 인스턴스 변수인 data에 있음 class Function: def __call__(self, input): x = input.data y = x ** 2 output = Variable(y) return ..
2023.08.12
-
[스터디/밑시딥3] 제 1고지 미분 자동 계산_1.상자로서의 변수
1.1 상자로서의 변수 변수의 성질 -변수와 데이터는 별개 -변수에 데이터가 대입 혹은 할당함 -변수 속을 보면 데이터를 알수 있고 이는 참조한다고 표현함 1.2 Variable 클래스 구현 import numpy as np # 1번 class Variable: def __init__(self, data): self.data = data # 2번 data = np.array(1.0) # 넘파이 다차원 배열, dtype: float64 # float64(또는 double precision 부동소수점)은 64비트를 사용하여 실수를 표현하는 방식 # 3번 x = Variable(data) # Variable의 인스턴스, x안에 실제 데이터(=data)가 담겨있음 print(x.data) # 4번 # data에..
2023.08.12