3D 세그먼트란?

Segment : 부분, 나누다, 분할하다

 

 

3차원 영상데이터 내에서 관심있는 구조(: 장기,조직)를 픽셀(2D), 복셀(3D)단위로 구분하는 과정.

이를통해 해당 구조의 정확한 형태, 크기, 위치 등을 파악할 수 있으며, 질병의 진단, 치료계획수립, 수술 시뮬레이션 등에 활용된다.

 

의료영상분석에서 매우 중요한 기술 중 하나이다.

 

 

박스 하나를 3 x 3 x 3 = 27개로 나눈 모습이다. (Length, width, height = 3, 3, 3)

 

 

 

3D 의료영상

CT, MRI 같은 장비를 통해 얻은 3차원의 의료영상 데이터.

각 영상은 2D 슬라이스의 집합으로 형성되며, 3차원 구조이다.

 

복셀(Voxel)

3D영상에서 한 픽셀에 해당하는 3차원 단위. 각 복셀은 3차원 공간내에서 특정 위치의 값을 가진다.

 

의료 사용 예시)

MRI 영상에서 뇌의 특정부위(회백질,백질 등)를 정밀하게 분리해내어 뇌의 구조적 특성을 분석하거나, 종양의 위치와 크기를 정확히 파악하는 것 등등...

 

 

 

 

 

기본 원리

 

예를들어 뇌 MRI 영상에서, 뇌 영상을 작은 3차원픽셀인 복셀단위로 분리하여, 각 복셀이 종양인지 정상조직인지 분류한다. 이 과정으로 영상내의 정확히 어느부분이 이상이있는지, 종양의 위치, 크기, 형태 등을 정밀하게 분석할 수 있다.

 

1. 데이터셋

: 영상취득 : 환자 뇌의 MRI영상을 취득한다. 뇌의 3차원구조를 복셀단위로 표현한 데이터셋을 준비한다.

 

2. 전처리

: MRI영상은 노이즈제거,표준화,정규화 등의 전처리를 거친다. 이는 영상의 품질을 향상시키고, 세그먼테이션 알고리즘을 더 효과적으로 적용하기 위한 준비작업이다.

 

3. 세그먼테이션

: 딥러닝 알고리즘, 예를들어 3D U-Net모델로 각 복섹이 종양인지 정상조직인지 분류한다. 모델은 각 부분의 특징을 학습하고, 이를 바탕으로 각 복셀의 라벨(종양, 정상조직 등)을 예측한다.

 

4. 활용

: 세그먼테이션 결과는 질병의 진단, 치료, 수술계획 등에 활용되며, 종양의 정확한 위치와 크기정보는 치료의 정밀도를 높일 수 있다.

 

 

 

 

 

 

3D 세그먼테이션을 위한 딥러닝 모델

 

U-Net3D버전,  3D CNN,  V-Net 등등..

해당 모델들은 3차원 데이터의 깊이 정보를 효과적으로 처리할 수 있게 설계되었다.

 

3D U-Net

: U-Net 아키텍처의 3D확장버전, 대칭적인 구조를 통해 영상의 깊이정보를 포함한 특징을 추출하고 세그먼테이션을 수행한다.

 

V-Net

: 의료영상 세그먼테이션을 위해 특별히 설계된 네트워크로, 복잡한 3D구조를 효과적으로 학습한다.

 

 

 

 

 

 

3D 세그먼테이션의 활용방안

 

- 질병진단 : 종양, 뇌졸증, 관절염 등의 질병에 걸린 환자들을 기준으로, 영향을 받고있는 조직의 변화를 정밀하게 분석

- 치료계획 : 방사선 치료계획, 수술 계획수립 등에 활용되며, 치료의 정확성과 효율성을 높인다.

- 추적관찰 : 장기적 치료과정에서 종양의 변화를 정밀하게 추적관찰하여, 치료방법조정, 예후판단을 한다.

- 수술 시뮬레이션 : 실제 수술전에 3D 세그먼테이션을 통해 얻은 모델을 사용하여, 시뮬레이션을 진행, 수술결과를 예측하고 위험을 최소화한다.

 

 

 

 

 

 

 

3D 세그먼트로 나눈다는 표현?

이미지나 영상을 3D 세그먼트로 나눈다는 표현은 3차원 영상데이터 내의 관심대상을 정밀하게 구분하고 분리하는 과정이다. 이는 영상 내에서 각각의 조직, 장기 등을 독립적으로 식별하고 분석하기 위한 기초작업이다.

 

 

)

- 가상 시뮬레이션

3D 세그먼테이션을 통해 생성된 정밀한 3D 모델은 가상현실(VR)이나 증강현실(AR)과 같은 기술을 활용하여 실제와 유사한 환경에서 시뮬레이션을 가능하게 한다.

예를 들어, 의료교육에서 실제 수술과 유사한 환경을 제공하거나, 특정 치료방법의 효과를 가상으로 시험해볼 수 있다.

 

- 디지털 트윈

개인의 3D 의료영상데이터를 기반으로 생성된 디지털 트윈은 개인맞춤형 치료계획의 수립, 질병진행 예측, 치료방법의 최적화 등에 활용될 수 있다.

이는 실제 환자의 건강상태와 매우 유사한 가상모델을 생성하여, 보다 정밀한 의료서비스를 제공하는 데 기여할 수 있다.

 

 

 

 

 

 

 

 

의료 영상 세그먼테이션의 개념과 예시

 

의료 영상 내 특정구조(장기, 조직 등)를 식별하고 분리하는 과정이다.

이는 영상 내에, 관심있는 영역을 정확히 구분하여, 그 형태, 크기, 위치 등을 분석할 수 있게 한다.

세그먼테이션은 질병진단, 료계획수립, 수술 시뮬레이션 등 다양한 의료적 응용에 필수적인 기술이다.

 

 

예시

주제

: MRI 영상에서 뇌 종양 세그먼테이션

 

문제정의

: MRI 뇌 영상에서 종양영역을 정확히 실별하고 분리하는 것

 

세그먼테이션 과정

 

1. 딥러닝모델( ex) 3D U-Net)을 사용하여 영상내에서 종양으로 추정되는 영역의 픽셀 또는 복셀을 분류한다.

2. 모델은 영상의 각 부분이 종양에 속하는지 아닌지 결정하여, 전체 영상 중, 종양부위만을 고립시킨다.

 

응용

세그먼테이션을 통해 얻어진 종양의 3D모델은 종양의 크기, 형태를 분석하고, 수술이나 치료계획을 수립하는 데 사용될 수 있다.

 

이러한 세그먼테이션 과정은 의료영상에서 정확한 진단정보를 추출하고, 환자 맞춤형 치료를 가능하게 하는 중요한 단계이다. 3D세그먼테이션은 특히 3차원 구조의 이해가 필요한 경우, 예를들어 복잡한 장기구조를 분석하거나, 정밀한 수술계획을 수립하는 경우에 매우 유용하다.

 

 

 

 

 

 

데이터의 깊이정보란?

2차원의 높이,너비에 더해, 깊이(또는 높이)정보가 추가된 것.

3차원에서 깊이(높이)정보는 객체가 공간에서 얼마나 멀리 또는 가깝게 위치하는지에 대한 정보이다.

깊이정보를 통해 물체의 형태공간 내에서의 위치를 정확하게 식별할 수 있다.

 

 

영상에서의 깊이정보란?

해당 영상을 구성하는 각 픽셀 또는 복셀이 실제 3차원공간에서 얼마나 깊은 위치에 있는지 나타낸다.

예를들어 카메라로 촬영된 영상에서, 각 픽셀의 색상정보 뿐만 아니라 카메라로부터 해당 픽셀까지의 거리(깊이)정보도 함께 기록되는 경우이다.

이를 통해 사물의 형태, 위치, 움직임, 거리 등을 더 정확하게 파악할 수 있다.

저번시간에 이어 비트코인 데이터 수집 및 1차 전처리를 완료했다.

 

지난포스팅)

https://jayindustry.tistory.com/99

 

[주가예측] 2. 비트코인 데이터수집 / 전처리

지난 포스팅은 애플 주가데이터를 받아와 LSTM,CNN를 이용한 다양한 학습과 앙상블을 진행해보았다. 이제 비트코인 데이터를 가져와, 여러가지의 Boosting모델을 사용하여 업/다운을 분류하는 작업

jayindustry.tistory.com

 

 

저번시간에는 '일봉'의 시계열 데이터를 가져왔으나,

데이터양이 너무 적어서 '1시간봉'의 시계열 데이터로 다시 로드해보았다.

 

 

이번 수집과정에서는 함수와 반복문을 사용하여 최대 1000개씩밖에 받지못하는 API 제한구조상,

반복문으로 데이터를 받아서 머지하는 과정에 초점을 두었다.

 

 

 

코드

https://github.com/seokjunHwang/DeepLearning/blob/main/%EC%A3%BC%EA%B0%80%EC%98%88%EC%B8%A1(LSTM%2CCNN...)/Try_history/10.%20Boost_%08Classifier.ipynb

 

 

 

 

 

 

1. 데이터 수집

 

가장 최신날짜로 1시간봉 1000개를 받아온다.

 

end_time을 마지막날짜로 설정하여 이전의 1000개 데이터를 가져온다.

이 때, 함수 convert_to_utc_unix를 코딩하여 datetime데이터를 unix밀리초단위로 바꾸는 함수를 구현하였다.

 

 

 

 

 

 

2. 더 많은 데이터 수집 + 전처리

 

이 후, 위 첫번째 df를 기준으로 과거 데이터를 1000개씩 반복적으로 받아온다. (API limit = 1000)

 

 

 

if 문을 사용하여, 더 이상 과거데이터가 없을 경우 break하도록 코딩하였다.

 

마지막에 datetime_proccessing코드로 unix밀리초 단위를 datetime으로 변경해주었다.

 

 

 

 

 

 

3. 머지

 

총 57개의 df가 df_list 추가되었고, 이를 모두 머지하였다.

 

datetime 컬럼 기준으로, 중복되는 행은 삭제하고, 정렬하였다.

행 기준으로 아래에 붙이는 방식으로 merge하였다.

 

2017년도부터 2024년1월까지의 데이터가 잘 머지되었다.

 

 

 

 

 

 

4. 1차 피쳐엔지니어링

 

 

아래처럼 주가와 관련없어보이는 시간데이터를 파악하였다.

openTime, closeTime, interval 컬럼이다.

 

 

위 결과에서 interval은 1시간 간격씩 텀을 두었음을 보여주는 unix단위이고, opentime과 closetime은 가격과 별 영향없는 시계열 데이터임을 알 수 있다.

 

 

 

drop !

 

 

 

 

 

5. Data Split

 

학습을 위해, 데이터를 Train, Validation, Test 3등분으로 나눈다.

여기서 사용할 모델들은 LightGBM, xgboost, catboost의 부스트 모델들이므로, 시계열 데이터의 특징을 별로 반영하지 않는걸로 알고있다. 따라서 2가지로 실험을 해볼 예정이다.

 

 

 

1. 시계열에 따라 순서대로 train : val : test로 나눈다.

2. 랜덤으로 나눈다.

 

 

 

하이퍼파라미터 튜닝없이 1번과 2번의 스플릿방법의 결과를 비교해보려고한다.

먼저 2번 랜덤으로 나눠보았다.

 

 

 

업/다운 분류가 목적이니, 타갯밸류인 0,1 컬럼을 생성하였다.

 

 

업 : 1

다운 : 2

 

 

 

그리고 train : test = 8 : 2 로 나눈 후,

train을 다시 train : val = 8 : 2 로 나누었다.

 

 

 

train, validation, test

순서대로 아래처럼 나누어졌다.

 

 

 

 

랜덤으로 잘 나누어졌다.

 

 

 

 

 

다음은 스플릿된 학습데이터로 학습을 진행시켜보고,

검증 후 결과를 1번 시계열 순서대로의 학습결과와 비교해보겠다.

 

오늘은 유명한 백준 사이트에서 1000, 1330번 문제를 풀어보았다.

 

그동안 프로젝트를 하며 코딩실력을 쌓아왔는데 더욱 체계적으로 실력을 쌓기위해 백준 코테를 시작하기로 하였다.

 

매일 코딩문제를 연습하면서 코딩실력을 쌓는데 집중하려고 한다.

 

 

 

 

아래 사이트와 백준을 연동하면, 백준 문제를 풀면서 티어도 올릴 수 있고 대회도 참여할 수 있다.

더 객관적이고 체계적으로 나의 코딩실력을 평가할 수 있어서 좋다.

 

https://solved.ac/

 

solved.ac

알고리즘 문제해결 학습의 이정표 🚩 Baekjoon Online Judge 문제들의 난이도 및 티어 정보를 제공하는 사이트입니다.

solved.ac

 

 

 

 

 

class 1레벨부터 10레벨까지 있다.

 

 

 

 

 

오늘은 1000, 1330번을 풀었고

1330 문제에 대해 포스팅해보도록 하겠다.

 

 

 

 

 

 

처음에 예제를 잘 이해하지 못하였지만, 고민끝에 무슨말인지 이해가 갔다.

 

아래는 내 답안과 정답이다.

 

 

 

 

제한에 A,B의 범위가 있길래, while문으로 범위를 제한해야겠다 생각했는데,

내가 인풋할때 그 범위안의 정수를 넣으라는 말이었다.

 

 

 

인풋 : 3 7

출력 : <

 

 

 

map은 반복적인 자료구조 이터레이블(리스트, 튜플...)등에만 사용했었다.

하지만 이렇게 연속적으로 정수를 선언할때도 사용해보았다.

split으로 공백을 기준으로 나누어주고, 각각의 변수에 int내장함수를 적용시킨다.

 

 

정답을 보면  조건에 따라 다른 결과를 선택하는 조건부 표현식으로

숏코딩을 하였다. 경이로웠다.

 

 

 

연습하면서 다양하게 응용하고 이해해보았다.

 

 

 

피드백

 

- 내 코드는 너무 길다. 코딩 후, 숏코딩을 항상 고민해보아야겠다.

- 백준 문제의 '제한'이라는 개념을 잘 이해하자.

- 반복문을 사용하지 않아도 된다.

- if문을 짧게 표현가능한 조건부표현식을 익힐 수 있게 되어 좋았다.

 

지난 포스팅은 애플 주가데이터를 받아와 LSTM,CNN를 이용한 다양한 학습과 앙상블을 진행해보았다.

이제 비트코인 데이터를 가져와, 여러가지의 Boosting모델을 사용하여 업/다운을 분류하는 작업을 진행하려고한다.

 

 

지난 포스팅)

https://jayindustry.tistory.com/98

 

[주가예측] 1. LSTM,CNN 학습부터 앙상블까지

지난 포스팅 주가예측 딥러닝 프로젝트 소개 https://jayindustry.tistory.com/96 [NLP,CNN] LSTM + CNN 주가예측모델 LSTM과 CNN을 통해 주가를 예측해보고 최종적으로 비트코인 단타매매에 실전 적용할 수 있는

jayindustry.tistory.com

 

 

 

 

 

[ 개요 ]

 

비트코인 차트데이터 수집

전처리

 

 

 

 

[ 내용 ]

 

2가지 방법을 사용하였다.

 

1. ccxt 라이브러리

2. Binance API 호출

 

 

 

 

1. ccxt 라이브러리

 

 

바이낸스의 다양한 API 기능들을 제공하는 ccxt 라이브러리이다.

 

이런식으로 여러 함수 정보가 저장되어있고,

그 중 차트데이터를 가져오는 함수 하나를 사용하였다.

 

 

 

 

 

 

 

 

 

먼저 데이터를 로드하기위해 ccxt에 바이낸스 거래소를 이용하고,

바이낸스로부터 생성한 API키를 셋팅한다.

 

 

 

 

 

 

 

 

그리고 fetch_ohlcv함수를 사용하여 1500일분의 데이터를 가져온다.

max limit이 1500이라고 함수에 규정되어있다.

 

데이트타임은 Unix 시간스탬프로 나타나있기때문에 전처리가 필요했다.

Unix는 1970년 1월 1일 00:00:00 UTC(협정 세계시)부터 경과한 밀리초의 총 수를 나타낸다.

 

 

 

 

 

 

그리하여 datetime의 열에 utc시간대를 사용하고, 밸류값들이 밀리초임을 알려준다.

서울 시간으로 컨버트 후,

추가정보(+9시간) 출력을 없애준다.

 

 

 

 

 

 

 

 

 

2. endpoint API 호출

 

바이낸스 공식 API문서에서 GET으로 호출하는 방법이 있다.

이는 위의 정보들보다 더 다양한 피쳐들을 가져올 수 있어서 이 방법으로 사용하였다.

 

 

아래 API문서를 참고하였다.

https://binance-docs.github.io/apidocs/spot/en/#kline-candlestick-data

 

Binance API Documentation

 

binance-docs.github.io

 

 

 

 

 

GET은 이용방법,

/api/v3/uiKlines 는 엔드포인트이다.

 

 

 

 

 

 

이는 1회 get제한량이다. 1d로 했을 경우, 최대 1000일까지의 데이터를 가져올 수 있다.

 

 

 

 

 

 

 

 

request를 사용하여 원하는 데이터를 GET하고,

문서에 제시된 파라미터를 적어주었다.

받은 데이터를 제이슨으로 변경 후, 데이터프레임으로 변경 하였다.

 

그리고 데이터타잎이 object인 열들을 모두 float으로 변환하였고,

datetime Unix밀리초를 한국시간으로 바꾸는 함수를 만들어 Return하였다.

 

 

 

 

 

 

 

 

API에서는 unix의 밀리초단위를 인풋해야하므로,

편의상, 현재 서울시간을 unix단위로 바꾸는 함수를 추가하였다.

 

 

 

 

 

 

이렇게 원하는 시작시간을 넣고 함수를 실행하였다.

 

 

 

 

 

 

[ 결과 ]

 

총 11개의 피쳐를 가진 데이터셋이 완성되었다.

 

 

 

[ 다음목표 ]

 

1. 나온 데이터셋을 여러 부스팅모델에 학습시킨다. 이렇게 큰 싸이클을 대강적으로 완성시킨다.

 

2. 피쳐엔지니어링
: 가격반영에 꽤 유의미한 피쳐들을 추가시킨다. -->   RSI, 골든크로스, MFI 등의 추가 지표를 추가시킨다. 

 

3. 재학습 및 성능개선

: 피쳐엔지니어링과 학습을 여러번거쳐서 가장 높은 성능을보이는 피쳐조합을 찾는다.

 

4. 하이퍼파라미터 튜닝

 

5. 앙상블 Voting

 

 

< 심화 과정 >

 

6. 시계열 딥러닝모델 학습

: 시퀀스데이터 학습에 유리한 LSTM을 갖고 3차원 데이터를 인풋하여, 시계열에 따른 예측값을 찾아본다.

 

7. 차트이미지 등을 구하여 CNN모델학습

 

모든 모델들의 up down을 타겟밸류로하여 Voting 앙상블을 한다.

 

지난 포스팅

주가예측 딥러닝 프로젝트 소개

 

https://jayindustry.tistory.com/96

 

[NLP,CNN] LSTM + CNN 주가예측모델

LSTM과 CNN을 통해 주가를 예측해보고 최종적으로 비트코인 단타매매에 실전 적용할 수 있는 모델을 개발해보겠다. [ 개념 ] LSTM은 RNN(Recurrent neural network)에서 나온 모델로 장기의존성(장기기억)에

jayindustry.tistory.com

 

 

첫 번째 스탭으로 LSTM,CNN을 각각 학습시키고 앙상블까지 진행해보았다.

 

 

- 프레임워크 : tensorflow, keras 

- 손실함수 : MSE

- 사용모델 : LSTM, CNN , CatboostRegression

- 사용기법 : Ensemble : Stacking, 가중치, 단순평균, Optuna, K-fold

 

 

 [코드 & 결과]

https://github.com/seokjunHwang/DeepLearning/tree/main/%EC%A3%BC%EA%B0%80%EC%98%88%EC%B8%A1(LSTM%2CCNN...)/Try_history

 

 

 

 

 

[ 진행 내용 ]

 

예측률을 높이기위해 여러 다양한 방법들을 시도해보았다.

 

1. LSTM, CNN 각각 학습

2. CNN 하이퍼파라미터 튜닝(옵튜나사용)

3. CNN2 : 다다음날 종가 예측

4. LSTM, CNN Ensemble : 가중치조정, 단순평균

5. LSTM, CNN Stacking Ensemble : Catboost메타모델 + 하이퍼파라미터 튜닝

 

 

 

 

 

 

[ 결과 ]

 

1. LSTM, CNN 각각 학습

 

결과는 성능자체는 비슷하였으나, CNN이 학습속도가 훨씬 빠르고(맥북에서 GPU사용가능), 손실함수도 약간 더 낮게 나왔다.

 

 

 

 

 

 

 

2. CNN 하이퍼파라미터 튜닝(옵튜나사용)

 

CNN을 카테고리컬 옵튜나를 사용하여 최상의 하이퍼파라미터 조합을 찾아 저장하였다.

 

결과는 그냥 CNN모델과 비교했을때,

학습,테스트셋에 대해서는 이전 CNN이 손실함수가 약간 더 낮았고,

다른 주가데이터들을 인풋했을때는 하이퍼파라미터 튜닝한 CNN이 손실함수가 더 낮았다.

 

 

 

 

 

 

3. CNN2 : 다다음날 종가 예측

 

예측결과가 사진과 같이 2~5일정도? 밀려나오는 것 같아서

다음날종가가 아닌 다다음날 종가를 예측해보도록 하였으나, 결과는 기존의 CNN보다(다음날 종가예측) 살짝 더 안좋았다.

 

예측 : 빨강

실제주가 : 초록

 

 

 

 

 

 

4. LSTM, CNN Ensemble : 가중치조정, 단순평균

 

  • 0.5 : 0.5로하면 그냥 단순평균앙상블과 같아진다.
  • 결과 : test셋에서는 cnn쪽으로 가중치를 올렸을때 가장성능이 좋앗지만, 최신주가데이터에 반영할떈 LSTM으로 가중치를높일수록 가장좋았다.

 

 

 

 

5. LSTM, CNN Stacking Ensemble : Catboost메타모델 + 하이퍼파라미터 튜닝

 

기대

  • lstm,cnn을 boost알고리즘과 앙상블하려면, 1. 부스팅알고리즘만 사용하던가, 2. 스태킹앙상블하던가
  • 평가차트를보면 실제주가데이터보다 며칠 밀려서(빨강선이 초록보다 약간 옆으로 밀려있음) 예측을하는데,
    그럼 스태킹앙상블해서 캣부스트로 넣으면 이러한 패턴을 읽고 어느정도 보완해서 정확히 예측할 수 있지 않을까?
  • 예를들면, 실제주가데이터가 4,3,2,3,5,7순서라면, lstm,cnn은 4,4,3,2,2,3,5,8이런식으로 한발짝 늦게가니까, 이러한 패턴을 스태킹앙상블 캣부스트가 잡아주지않을까?

결과

  • 아래처럼 기대했으나 결과는 더 안좋았다. catboost가 특정구간의 데이터셋이 부족했는지 or 특성이 부족했는지(LSTM,CNN 2개) 아래 사진처럼 특정 구간에서는 비슷한 수치의 예측물들만 출력했다.

 

 

 

 

 

 

 

 

앞으로 방향성

  • 먼저 lstm과 cnn의 최종예측 결과물에서 3일~4일 정도를 앞당겨보려고한다. 그리고 다른 테스트용 주가셋에 적용시켰을 때의 결과를 보고, 그래도 좋지 않다면 분류모델로 넘어간다.
  • 종가의 실제 수치를 예측하는 것은 어려움이 많다. 실제로 많은 기업에서도 아직 연구단계라고 한다.
    따라서, 실제 수치예측은 이쯤으로하고 주가의 상승 / 하락의 분류하는 방법으로 넘어간다.
    예를들어, 1000개의 종목을 돌렸을 때, 각 종목의 다음날 업 / 다운을 높은확률로 알려준다면 그것만으로 유용한 모델이 될 수 있을것이다.
  • 다양한 분류모델을 학습시키고 voting방법으로 앙상블한다. 

keras, tensorflow의 모델학습을 위해 맥북의 GPU를 사용하는 방법에 대해 포스팅해보았다.

 

 

이제껏 내제되어있는 gpu를 활용하지 못하여 구글 colab으로 gpu를 사용했는데,

이젠 주피터노트북이나 vscode등의 로컬상에서도 gpu를 사용하려고 한다.

 

 

 

 

맥북 M2 기준

 

1. Homebrew 설치

macOS 패키지관리자로, 필요한 소프트웨어를 쉽게설치하도록 돕는다

 

터미널 명령어)

 

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

 

 

 

 

 

 

 

2. Miniforge 설치

Conda환경 제공 도구로, M1/M2 칩에서 ARM64아키텍처를 지원한다.

 

brew install miniforge

 

 

 

 

 

 

 

3. Conda 환경설정

Conda 환경을 생성하고 활성화한다. 

이 환경에서 필요한 패키지들을 설치한다.

 

conda create --name myenv python=3.8 

conda activate myenv

 

 

Conda?

python 및 기타 프로그래밍 언어를 위한 오픈소스 패키지 관리 시스템 및 환경 관리 시스템.
 Conda를 사용하면 프로젝트별로 독립된 환경을 생성할 수 있다. 이를 통해 다양한 프로젝트에서 서로 다른 버전의 라이브러리와 도구들을 충돌 없이 사용할 수 있다.

 

 

 

 

 

 

4. 케라스 및 필요한 패키지 설치

필요 라이브러리들을 Conda환경에 설치. 

Tensorflow는 케라스의 백엔드로 사용된다.

Apple Silicon (M1/M2)에서는 Metal 기반의 TensorFlow를 설치해야 한다.

 

 

conda install -c apple tensorflow-deps
pip install tensorflow-macos
pip install tensorflow-metal
pip install keras

 

 

 

 

 

 

5. GPU확인

 Python 스크립트나 Jupyter 노트북에서 확인한다.

 

 

 

  • 출력결과 1은 TensorFlow가 GPU를 인식하고 있으며, 케라스를 통해 GPU를 사용할 수 있다는 것을 나타낸다.

 

 

 

주의 !

 

세팅하면 보통 자동으로 gpu가 사용되나, 아닐경우엔 conda를 실행해줘야한다.

 

conda activate myenv

 

그리고 gpu를 체크하는 코드를 실행시켜, 반드시 체크하도록 한다!

 

LSTM과 CNN을 통해 주가를 예측해보고 최종적으로 비트코인 단타매매에 실전 적용할 수 있는 모델을 개발해보겠다.

 

 

 

 

[ 개념 ]

 

LSTM은 RNN(Recurrent neural network)에서 나온 모델로 장기의존성(장기기억)에 더 특화된 모델이다.

직전데이터 뿐만아니라 과거데이터들을 분석하여 미래데이터를 예측한다.

 

시계열데이터의 예측, 시퀀스(순서)데이터, 자연어처리, 음성인식, 이미지 분류 등에서 많이 사용된다.

 

 

 

 

 

CNN(Convolutional Neural Network)

합성곱 신경망으로, 입력층과 출력층 사이 여러 은닉층이 존재하여 복잡한 패턴의 데이터를 분석/처리해준다.

주로 이미지, 영상처리, 오디오처리에 사용된다.

 

 

컨볼루션(ConV), Relu(비선형함수), Pooling(풀링), 드랍다운(dropdown)층으로 구성되며,

 

컨볼루션 : 데이터(이미지 등등..)의 특징을 추출

렐루 :  선형함수를 비선형함수를 거쳐 더 복잡한 은닉층을 가능케 해줌

풀링층 : 추출한 데이터를 다운샘플링하여 학습할 파라미터의 개수를 줄여줌

dropdown : 특정 뉴런을 비활성화 시킴으로서 오버피팅(과적합)을 방지한다. 

 

 

 

 

 

[ 왜 CNN, LSTM을 사용하는가? ]

 

CNN

CNN은 이미지데이터 외에도 다양한 형태의 데이터를 처리할 수 있다.

예를들어, 주가, 거래량, 뉴스, 지표 등등..

그리고 주가의 변동을 나타내는 시계열 데이터의 공간적 특징을 잘 파악할 수 있다.

이는 과거의 특정한 패턴을 특징으로 추출하여 미래 주가를 예측할 수 있다.

 

LSTM

장기기억 학습에 특화된 이 모델은 시계열 데이터처리에 특히 유용하다.

주가데이터 자체가 시계열이니 매우 적합하다고 볼 수 있다.

LSTM은 거래량이나 지표 등의 변수간의 관계를 이해하는데도 뛰어나서 주가예측에 자주 사용되는 모델이다.

 

 

 

 

 

 

[ 방법 ]

 

1. 오픈소스를 참고하여 주가데이터를 가져와 전처리한다.

2. 같은 방법으로 비트코인의 주가데이터를 가져와 전처리한다.

3. 각각의 모델을 학습시키고 실제주가와 비교해보며 평가해본다.

4. 각각의 결과물의 정확도를 높이기위해 두 모델을 합치는 방안을 모색한다.


 - 하이브리드모델 : 두 모델을 하나의 모델 안에서 연결하여 사용한다. 

 - 앙상블 : 별도 학습 후, 각 결과를 평균내거나 가중치를 부여하여 종합적인 예측결과를 도출한다. 각 모델의 강점들을 결합할 수 있다.

 - 스태킹 : 각각의 출력을 '메타모델'의 학습데이터로 입력시켜 학습한다.

 - 특징결합 : 각각 별도 학습 후, 각 모델의 출력(특징)을 결합 -> 각 모델이 독립적으로 학습한 정보를 통합하여 새로운 정보를 도출한다

 

5. LSTM,CNN모델을 각각 저장하고 앙상블(평균 or 투표방식)기법이나 스태킹방법을 사용한다.

 

 

 

[ 주의 ]

1. 과적합 주의

2. 단일모델이 더 성능이 좋을 수 있으므로, 모델을 결합시킬때 성능이 낮다면 하나의 모델을 더 업그레이드 하는 것에 초점을 두기

3. 너무 복잡한 모델은 오히려 성능이 떨어짐

오늘은 huggingface에서 pretrained된 BERT모델을 추가조정학습(파인튜닝)으로 영화리뷰의 긍정/부정을 분석해보겠다.

 

 

< 프로젝트 소개 >

 

 

 

 

< 라이브러리 >

 

 

 

크게 torch, Transformers의 BERT 모델들, tensorflow를 사용한다.

 

 

 

 

데이터 로드

 

 

깃허브에서 영화 리뷰들이 담긴 데이터셋을 가져온다.

1이면 긍정, 0이면 부정인 리뷰이다.

이렇게 긍정/부정의 감성을 분류하는 기능을 수행한다.

 

 

 

그리고 미리 설정한 코랩에서의 GPU사용이 잘되고 있나 확인한다.

 

 

 

 

Load Tokenizer 

그리고 토크나이저를 불러온다.

 

버트 베이스를 토크나이저로 설정하여, 모델에 데이터를 인풋하기위해 텍스트(리뷰)들을 작은 단위로 쪼개어준다.

 

 

 

 

데이터 스플릿

 

데이터셋을 학습을 위한 학습데이터, 테스트데이터를 8:2비율로 나눈다.

그럼 학습데이터의 리뷰, 라벨(타겟밸류 -> 0 or 1)과 테스트데이터의 리뷰, 라벨로 나뉜다.

 

 

 

Encoding & Tokenizing

 

다음은 인코딩 작업이다.

인코딩은 모델이 알아들을 수 있는 형태로 데이터를 변환하는 작업을 말하는데,

 

먼저 토크나이징으로 텍스트를 모델이 이해할 수 있는 토큰으로 잘게 분리하고

인코딩으로 이러한 토큰을 숫자로 변환한다.

 

토크나이징은 인코딩의 일부단계로 포함시킬 수 있다.

위 함수는 이 두 가지 작업을 수행한다.

 

- tokenizer.encode_plus : 함수는 주어진 텍스트를 토크나이징하고, 필요한 추가 정보를 생성합니다.
- max_length=50: 토크나이징된 텍스트의 최대 길이를 50으로 설정합니다.
- add_special_tokens=True: 특수 토큰(예: 시작, 종료 토큰)을 추가합니다.
- pad_to_max_length=True: 모든 텍스트를 최대 길이(여기서는 50)에 맞추기 위해 패딩을 추가합니다.
- return_attention_mask=True: 어텐션 마스크를 생성하여 반환합니다. 어텐션 마스크는 모델이 중요한 토큰에 집중할 수 있도록 돕습니다.
- truncation=True: 최대 길이를 초과하는 텍스트는 잘라냅니다.

 

 

수행 결과

 

 

input_ids, attention_masks, token_type_ids라는 세 가지 리스트를 반환하는데 이 값들은

각각 train_input_ids, train_attention_masks, train_token_type_ids라는 변수에 저장된다.

 

 

 

BERT모델 입력을 위한 형태로 전처리

 

BERT에 입력하기 위해서는 데이터를 딕셔너리 형태로 변경해야 한다.

 

따라서 딕셔너리로 바꿔주는 함수를 만들고

map함수로 튜플에 있는 각각의 요소들에게 모두 적용시킨다.

 

그리고 훈련 데이터를 텐서플로우 Dataset 객체로 변환하고, 

셔플로 데이터를 섞어서 모델이 특정 순서에 의존하지 않도록 하며, 

지정된 배치 크기로 나누어 모델 훈련에 사용할 준비를 한다.

 

 

 

batch(BATCH_SIZE)?
batch 메서드는 데이터셋을 지정된 배치 크기(BATCH_SIZE)의 작은 그룹으로 나눈다.

모델 훈련 시, 각 배치는 독립적으로 모델에 공급되어 처리된다. (병렬처리)

배치 크기는 메모리 사용량과 훈련 속도에 영향을 미칩니다. 일반적으로, 큰 배치 크기는 메모리 사용량을 증가시키지만, 훈련 속도가 빨라질 수 있습니다.

 

 

 

 

모델 불러오기

num_labels = 2는 모델이 이진 분류 작업을 수행을 의미

즉, 출력 레이블이 두 가지(예: 긍정/부정)임을 의미한다. 이 부분을 수정하여 다중 클래스 분류 작업을 수행할 수도 있다.

 

 

 

 

Model Pine Tuning

 

위에서 불러온 모델을 본격적으로 우리의 task(목적)에 맞게 조정시킨다.(추가학습)

 

fit()함수를 이용해서 모델 학습을 진행한다.
validation set(테스트용 데이터셋)으로 앞서 정의한 test_data_encoded 를 사용했다.

 

 

파인튜닝(Fine-tuning)?

머신러닝과 딥러닝에서 이미 사전 훈련된(pre-trained) 모델을 특정 작업이나 데이터셋에 맞게 추가적으로 조정(추가적인 훈련)하는 과정을 말합니다. 이 과정에서 모델의 가중치는 새로운 데이터에 맞게 적절히 조정되어, 특정 작업에 대한 모델의 성능이 개선됩니다. 파인튜닝은 주로 대규모 데이터셋으로 사전 훈련된 모델을 더 작은 데이터셋이나 특정한 작업에 적용할 때 사용됩니다.

 

 

 

 1. optimizer 
 - 학습률이 1e-5인 Adam 옵티마이저를 생성
 - Adam 옵티마이저는 모델의 가중치를 업데이트하는 데 사용되며, 이 학습률은 가중치 조정의 속도를 결정


 2. loss
 - 'Sparse Categorical Crossentropy' 손실 함수를 사용합니다. 
 - from_logits=True는 손실을 계산하기 전에 출력 레이어에 소프트맥스(softmax) 함수를 적용해야 함을 의미합니다. 이 손실 함수는 다중 클래스 분류 문제에 주로 사용됩니다.

 

 

 

소프트맥스 함수?

, 소프트맥스 함수는 다중 클래스 분류에서 신경망의 출력을 확률 분포로 변환하여, 각 클래스에 속할 확률을 나타내는 데 사용됩니다. 이는 모델의 예측을 해석하기 쉽게 하고, Sparse Categorical Crossentropy와 같은 손실 함수를 효과적으로 적용할 수 있도록 합니다.

 


 3. Metric(평가메트릭)
 - 'Sparse Categorical Accuracy' 메트릭은 모델의 정확도를 측정하는 데 사용됩니다. 
 - 이 메트릭은 모델이 예측한 레이블과 실제 레이블이 얼마나 잘 일치하는지를 나타냅니다.


 4. model.compile 
 - .compile 메서드는 모델을 학습하기 전에 필요한 설정을 적용합니다. 여기서는 앞서 정의한 옵티마이저, 손실 함수, 그리고 평가 메트릭을 모델에 적용합니다.

 

 

 

결 과

 

에포크를 10회를 주었다.

학습시킬수록 손실함수와 정확도가 어떻게 달라졌는지 보여준다.

 

 

 

< Loss 손실함수 >

 

 

< 정확도 >

 


epoch=10 인 경우 정확도가 0.9 정도로 향상되었음을 알 수 있다.
epoch=30으로 학습할 경우 정확도가 0.91로 별 차이는 없었다.

 

 

 

결과 분석 / 피드백

 

1. GPU사용여부

일단 모델학습 시킬때 파이토치처럼 device를 Gpu로 넣었는지 확인해보는 과정이 없었다.

이 과정을 추가시켜서 gpu를 잘 사용하고있는지 확인해봐야겠다.

 

 

2. 과적합?

 

훈련 데이터에 대한 손실은 시간이 지남에 따라 감소하는 반면, 검증 데이터(validation data)에 대한 손실은 증가하는 경향을 보인다.

이러한 현상은 '과적합(overfitting)'을 나타낼 수 있다.

 

과적합은 모델이 훈련 데이터에만 너무 잘 맞춰져서 새로운 데이터에 대한 일반화 능력이 떨어지는 현상을 말한다.

즉, 모델이 훈련 데이터의 특성을 너무 자세히 학습하여, 실제 세계의 데이터나 검증 데이터에서는 오히려 성능이 떨어지는 현상이다.

 

그래서 정확도가 더 이상 증가하지 않는 모습을 보인다.

강사님 말을 기억해보자면, train데이터의 loss함수가 저렇게 낮고 정확도가 90%이상이라면 높은확률로 과적합이라고 하셨다.

 

아니나 다를까 Validation의 정확도는 에포크가 증가해도 더 이상 증가하지 않았다.

 

 

이는 학습데이터셋의 다양성을 더 늘리거나,

무작위로 일부 뉴런을 학습과정에서 제외시키는 드롭아웃,

하이퍼파라미터 조정 (학습률, 배치크기 등)으로 어느정도 해결할 수 있다.

 

 

오늘은 데이터베이스의 필수 기본개념들을 정리해보고,

https://dbdiagram.io/d 사이트를 이용하여 ERD를 설계해 보았다.

 

 

1. Primary key (기본키) : pk

 

개체를 식별하는 고유의 값이다.

보통 하나의 필드(속성)에 부여하며 엔터티(테이블)들 간의 관계를 형성하는 역할을 담당한다.

 

주민등록번호처럼 식별해주는 고유 id같은 개념이다.

(예를들어, 회원하나하나는 하나의 객체고 그 한사람한사람을 식별해주는 값)

 

따라서 모든 테이블에는 필수로 기본키 값을 저장하는 필드(속성)이 반드시 존재해야한다!

 

데이터베이스 모델링은 크게 두 가지로 나눌 수 있다.

 

1. 논리적 모델링

2. 물리적 모델링

 

데이터베이스에 저장한다는 것은 우리가 사는 현실공간의 개체를 데이터베이스(이진형태)로 저장하는 과정이다.

 

먼저 논리적모델링을 하고 물리적모델링(시스템공간에서 정의되어 데이터베이스에 들어감)을 한다.

 

 

< 논리적 모델링 >

 

현실세계의 값의 속성을 정의하고 관계를 정의하는 과정

 

만약, 어떤 쇼핑몰의 매출이 형성되는 관계를 데이터베이스화 하겠다하면,

 

 

 

이런식으로 모델링을 해볼 수 있다.

 

회원정보의 아이디매출에서 구매자아이디를 외래키로 지정함으로서 두 테이블간의 관계를 연결시켜주었다.

 

그리고 매출에는 주문번호라는 고유의 기본키가있다.

선에서 1이 시작점이고 n이 끝점이다.

매출상세  <-  품정보 에서는 상품정보의 기본키가 매출상세의 '상품코드'로 "외래키"가 지정되어있다.

 

데이터가 항상 정확한 값을 유지하는 성질
위 테이블중 왼쪽 테이블에서 student_id가 변경되었는데 오른쪽 테이블의 student_id가 변경되지 않았다면 문제가 생긴다. 이런 상황을 예방하기 위해 외래키가 존재한다.

 

 

2. Foreign key (외래키) : fk

테이블간의 관계를 나타낼때 사용하며, 다른 테이블의 기본키를 참조해 외래키로 사용한다.
즉, 한 테이블의 외래키는 연결되어있는 다른 테이블의 기본키 중 하나다.

 

기능 : 참조된 데이터가 삭제되거나 변경되면 외래키로 연결된 필드도 같이 변경되어야 하는데 이 때, 외래키를 사용하여 데이터의 일관성을 유지시킬 수 있다.

 

무결성 : 데이터가 항상 정확한 값을 유지하는 성질

 

 

< 물리적 모델링 >

 

이러한 논리적모델링을 바탕으로,

실제 값들이 가지는 데이터 형식 어떤 테이블명 필드명 등을 가질지 상세하게 기록한 게 바로 물리적 모델링

 

이를 도식화하여 보기좋게 표현한 것이 ERD

 

 

 

멤버테이블에서 기본키 id가 sales의 s_id의 외래키와 참조되었다.

 

이런식으로 각 테이블간의 관계를 정의해 주는 역할을 하는 것이 '키' 개념이다.

 

 

MQTT메시지는 경량메시지로 이번 트래킹맵 프로젝트를 진행할 때, 웹소캣으로 받은 gps의 데이터 형태이다.

 

 

< 트래킹맵 프로젝트 >

 

MQTT메시지 내용이 포함된 포스트이다.

 

https://jayindustry.tistory.com/82

 

#3 [2단계] 파이프라인 + 서버코드2

이번 포스트에서는 최근경로를 지도맵상에 계속 업데이트하며 표시해주는 기능을 구현하고 지난시간의 서버코드를 개선하도록 하겠다. < 지난 1단계 포스팅 > https://jayindustry.tistory.com/79 #1 프로

jayindustry.tistory.com

 

 

 

[ 개념 ]

 

MQTT(Message Queue Telemetry Transport)

IoT(Internet of Things) 장치에서 많이 사용되는 경량 메시징 프로토콜이다.

가볍기 때문에 이러한 프로토콜형태는 낮은 대역폭과 불안정한 네트워크 환경에서도 효율적으로 메시지를 전달할 수 있다. 트래킹 프로젝트에서는 RabbitMQ를 사용하여 MQTT를 브로커로써 받고 전송하였다.

 

 

 

내 프로젝트에서 mqtt를 브로커로써 사용하는 이유 


1. 로깅확인 가능, 지속적인 데이터가 들어오는지 등등 확인가능
2. 로봇에서 바로 psql에 데이터를 쏘려면 psql정보를 로봇마다 일일히 다 줘야하는데, 그럴 필요가 없다.
3. 모두 저장할 필요가 없는 데이터를 받아올때 좋음. mqtt는 구독하면 그때그때 그 메시지의 데이터만 가져오면 되니까
4. mqtt는 그라파나 외에도 다양한 툴에 대해 지원을 많이하여 추후, 다른 툴을 사용할때도 적용이 가능하다.
5. 중앙집중으로 mqtt데이터를 모으고 거기서 필요한정보만 구독하여 사용하니 관리가 편하다.

 




MQTT의 주요 특징


경량 프로토콜 : MQTT는 매우 작은 메시지 크기와 최소한의 네트워크 대역폭 사용한다.
발행/구독 모델: 발행자는 메시지를 토픽(topic)에 발행하고, 구독자는 필요한 토픽을 구독하여 메시지(데이터)를 받는다.
메시지 큐잉: 네트워크가 불안정하거나 장치가 오프라인일 때 메시지를 저장하고 장치가 다시 연결되면 전송한다.

 

 

 


MQTT의 작동 방식


연결: MQTT 클라이언트는 브로커에 연결을 요청
발행: 클라이언트는 특정 토픽에 메시지를 발행
구독: 다른 클라이언트는 관심 있는 토픽을 구독
메시지 전달: 브로커는 해당 토픽의 구독자에게 메시지를 전달

 

 

 


MQTT 사용 사례


스마트 홈: 조명, 온도 조절기 등의 장치를 제어하기 위해 MQTT를 사용
산업 자동화: 공장의 기계 및 센서 데이터를 실시간으로 모니터링하는 데 사용됩니다.
차량 추적: 차량의 위치 및 상태 정보를 전송하는 데 사용될 수 있습니다.


MQTT는 그 간결함과 높은 효율성으로 IoT 솔루션에서 중요한 역할을 하고 있으며, 앞으로도 다양한 분야에서 활용될 것같다.

 

+ Recent posts