초기 세팅

git config --global user.name "name"
git config --global user.email "name@mail"

# 새로운 폴더/Project를 만드는 경우
git init

 

작업트리/스테이지/저장소 관리

git status

# File 수정

# 스테이지 등록
git add "file name"

# 저장소 업로드
git commit -m "msg txt"

git log

##################################

# add + commit 동시에
git commit -am "msg txt"

* .gitignore 파일 내에 버전관리에서 제외할 파일 or 디렉토리를 작성하면 버전 관리에서 제외 할 수있음.

 

Git 작업 되돌리기

스테이지에 올라가지 않은 상태에서는 git checkout -- "file name"으로 되돌리 수 있음.

스테이징이(add) 된 경우에는 git reset HEAD "file name" 로 되돌릴 수 있음.

최신 커밋을 되돌리는 방법으로는 git reset HEAD^ 로 수행 가능함.

마지막으로 특정 commit으로 되돌리는 방법으로는 git log에서 기록을 보고 git reset --hard "commit hash"로 되돌릴 수 있음. 하지만 reset을 하면 그 사이의 commit된 version들은 삭제됨. 삭제를 하지 않으려면 revert를 사용면 됨. 

git checkout -- "file name"

git reset HEAD "file name"

git reset HEAD^

git reset --hard "commit hash code"
git revert "commit hash code"

 

Git & Branch

master 브랜치에서 분기로 user마다 새로운 브랜치를 만들어서 사용할 수 있습니다. 그리고 수정된 내용을 master로 다시 병합하여 유지/보수 할 수있음. 브랜치를 만드는 방법으로는 아래 명령어가 있습니다.

git branch    # branch 조회


git branch (branch name A)  # 새 branch 생성 (HEAD -> master, A)


git checkout (branch name)  # 해당 branch로 이동


git checkout master
git merge (branch name)  # A로 하면 A를 master로 merge함 (--no-edit 옵션도 있음)


git brance -d (branch name)  # 해당 branch를 삭제 (완전 삭제는 아님)

같은 파일의 다른 위치를 수정한 경우 병합하면 자동으로 한개의 파일로 합쳐짐. 하지만 같은 파일 내 같은 위치를 수정한 경우에는 CONFLICT 경고가 나오고 충돌이 생긴 file에 표시가 되어있음. 이 부분이 해결되야 merge가 정상적으로 진행이 됨. (P4Merge, Meld 같은 프로그램으로 이런 충돌을 관리할 수 있음)

 

Github

git remote add origin (github link)   # Github에 연동 시작
또는
git clone (github link) (Dir path)


git remote -V    # Github 연결 상태 확인


git push -u origin master   # commit을 한 file을 github에 업로드

###########################################

 # pull 전에 미리보기
git fetch 
git checkout FETCH_HEAD

git diff HEAD origin/master  # 바뀐 내용만 보기

git checkout master
git merge FETCH_HEAD



# origin (원격 저장소)의 내용을 master branch로 가져옴 (pull = fetch + merge FETCH_HEAD)
git pull origin master

매일 시작하기 전에 pull을 하고 시작하는 것이 충돌을 방지하는데 좋음. 그리고 git checkout -b newBranch로 하면 새로운 브랜치를 만들고 체크아웃까지 할 수 있음. 그리고 이 branch를 push 할 때에도 git push origin newBranch로 업로드를 하면 됨. branch를 원격 저장소에 업로드 했으면 merge를 위해서 new pull request를 해야함. 

'Programming > Programming Skills' 카테고리의 다른 글

Unity 게임 디자인 패턴  (1) 2020.03.18

* 모두연 박은수님, Pytorch로 시작하는 딥러닝의 내용들을 공부하면서 정리한 내용입니다.  https://www.youtube.com/watch?v=mG6N0ut9dog

1) Data 준비

Text는 연속된 문자 또는 연속된 단어의 형태로 되어있는 순차 (Sequence) 데이터이다. 그렇기 때문에 RNN 같은 순차 모델은 자연어 처리, 문서 이해, 요약, 감성 분류에 활용되고 있다. RNN에서는 이러한 순차 데이터가 가진 feature를 파악하는데 유용하다. 하지만 모델도 기계에서 구동해야 하기 때문에 이러한 텍스트 데이터를 숫자로 변환 (벡터화) 해야 한다. 이때 텍스트의 가장 작은 단위를 토큰 (Token)이라고 하고 이렇게 변환하는 것을 Tokenization이라고 한다. 그리고 이 토큰을 벡터에 대응시키는 작업으로 사용되는 방법은 One-Hot Encoding, Word Embedding이 있다.

일반적인 Tokenization 방법으로 spaCy 또는 split, list를 이용해 문자를 단어로 단어를 글자로 바꾼다. N-그램은 글자나 단어 단위가 아니라 묶음으로도 벡터화 할 수 있다. 이러한 방식으로 Feature space를 개선할 수도 있지만, 순서 정보를 잃어버릴 수 있다. 그렇기 때문에 이것 대신 RNN에서는 주로 사용하지 않는다.

그다음으로 벡터화 방법으로 사용되는 One-hot Encoding, Word Embedding 중 One-hot Encoding은 단어의 길이 (N)을 기준으로 N 길이의 벡터를 만들고 각각의 토큰에 번호를 부여한다. 다만 (0100000)처럼 요소의 값만 1이고 나머지는 0으로 처리한다. 이러한 특징 때문에 데이터가 대부분이 0이 되어 버리고 단어 수가 증가할수록 문제가 될 수 있다. Word Embedding은 부동 소수점 형태의 수로 채워진 Dense Vector로 이를 표현하고 의미가 비슷한 단어일수록 비슷한 값을 가지게 하여 공간에서 근처에 배치되게 한다. (https://wikidocs.net/33520)

2) RNN Model

RNN은 데이터의 순서 특성을 가장 잘 이용하는 모델로, 인간처럼 자연어 등을 순차적이고 반복적으로 처리하는 구조를 갖고 있다. 그리고 이러한 특성 덕분에 길이가 다른 벡터를 사용할 수 있고, 아래 이미지처럼 output의 크기도 다양하다. One to Many의 경우 이미지가 들어왔을 때 글을 생성할 수도 있고 (Image Captioning), Many to one은 어떤 단어들의 요약, Many to many는 Machine Translation 등으로 활용될 수 있다.

http://karpathy.github.io/2015/05/21/rnn-effectiveness/

위의 이미지에서처럼 RNN 모델의 한 셀에서 State vector (초록), Output vector (파랑)를 출력한다. 이 Previous Hidden Vector를 사용하는 이유는 아래 이미지로 쉽게 이해가능하다. 이전 input을 기준으로 계속 넣어준다면 모든 데이터를 알기어렵겠지만, Previous Hidden 방식으로 최종 Output에 모든 input data들을 다 함축해 가지고 있는것을 볼 수 있다. 이처럼 RNN은 이전의 Hidden data를 포함하게끔 하는 딥러닝 뉴럴 네트워크 구조이다. (첫 Hidden은 0으로 초기화함). 만약 input - prev_Input 관계로 되어있었다면 마지막은 보라2/초록2이 될 것 이다.

수식적 설명: https://dacon.io/forum/406031

RNN의 학습 과정은 예를 들어 many-to-many 모델에서 파란 셀의 결과 (y)값들을 기준으로 loss를 각각 계산하고, 그 값들을 모두 합친 Loss (Cross entropy)의 크기를 줄여주는 방향으로 weight를 줄여주는 방식으로 학습을 하게 된다. 이 과정에서 SGD 등의 방식을 사용하게 된다.

3) LSTM Model

크기가 큰 데이터를 사용할 때 RNN에서 발생하는 vanishing gradients, gradient explosion과 같은 문제를 해결하기 위한 변형 알고리즘이 LSTM이다. 예를 들어 위의 이미지를 보아도 길이가 긴 문장을 사용할 때에는 RNN의 기본 모델로는 초반 부분에 대한 데이터를 모두 다 기억하고 있기 어려운 부분이 있다. LSTM이라는 이름에서 알 수 있듯이 손실되는 데이터들을 메모장에 필기하듯이 저장해두는 방식으로, 내부셀에 선형 레이어 대신 각각에 작은 네트워크를 만들어 장/단기간으로 정보를 기억할 수 있는 모델을 만들었다. 

https://ratsgo.github.io/natural%20language%20processing/2017/03/09/rnnlstm/

이 또한 nn.LSTM pytorch layer로 구현이 되어있으며 자세한 수식적 내용은 https://elham-khanche.github.io/blog/RNNs_and_LSTM/를 참고하면 된다. 이미지에서 보면 LSTM에서 윗 부분 (C)에 해당하는 부분이 메모리에 해당하는 부분이고, O로 표시된 작은 네트워크 (Forget gate)에서 활성화 함수로 활용되며 메모리의 값들에서 버릴 것, 유지할 것을 선별하는 작업을 한다고 보면된다. + 기호에서는 내용을 메모리에 update를 하게된다. 

4) 마무리

어느 모델이 그렇듯 LSTM도 한계가 있다. RNN의 셀마다 전달되는 벡터에 모든 내용이 저장되고 업데이트 되는데, 이는 비효율적이므로 메모리에 넣어두고 필요할때마다 만드는 방식을 사용하는 Attention과 더 나아가 Self-Attention을 사용하는 Transformer (Leo Dirac)이 주목을 받았고 최근에 또 새로운 방식이 나온듯하다. 이 부분에 대해서는 GAN 이후에 좀더 공부해보려한다.

https://synergy-ai.github.io/2021-03-23-Transformer-is-all-you-need/

'Programming > Deep Learning' 카테고리의 다른 글

6. Convolution Neural Network (CNN)  (0) 2021.02.04
5. 머신러닝 Workflow  (0) 2021.02.01
4. 머신러닝 입문  (0) 2021.01.22
3. 신경망 구조  (0) 2021.01.19
2. 신경망 구성 요소  (0) 2021.01.13

1. 개요

실험을 시작하기 전에 우선 CGX Data Aquisition 프로그램을 다운/설치하여 기본적인 프로그램 환경을 구축한다 (http://cognionics.com/wiki/uploads/Main/CGXAcquisitionv66.zip). 아래 이미지와 같이 동봉된 CGX Trigger, Receiver를 PC에 연결시킨다. 이때 Trigger는 Unity 또는 실험을 구동하는 컴퓨터에, Receiver는 CGX Data Aquisition을 구동하는 컴퓨터에 연결을 해야한다. 성능이 좋은 경우 한 컴퓨터에서 다 해도 문제는 없어보인다. 아래의 미지는 헤드셋에 내장된 SD카드에 직접 저장하는 것인데 손실위험이 있기 때문에 Steraming으로 받아서 저장하는 것을 추천한다. EEG 기기를 장착하고 impedance값을 최대한 낮게 조정한 뒤 연결 후 실험을 시작하면 된다.

`Trigger System Flow (http://cognionics.com/wiki/pmwiki.php/Main/WirelessTrigger)

 

2. Wireless Trigger

다음으로는 Data Acquisition Program에서 Recording 중에 Trigger 신호를 주는 방법에 대해 설명한다. 랩에서는 주로 Unity를 활용하기 때문에 CGX Wiki에서 제공하는 예시를 변형하여 구현하였다. 아직 프로그램 내에서 문자열을 보내서 해석까지는 하지 못해서 문자열을 숫자로 변환하여 전송하도록 하였다.

Python 버젼은 LSL을 활용해서 Data Acquisition Program에서 LSL Streaming 버튼을 눌러 실행하면 그때부터 받은 데이터를 따로 저장하고, Trigger도 같이 저장하게끔하였다. 데이터 수집이 동일하게 되는 것은 확인했지만 아직 이를 활용해서 분석을 해보지는 않았으니 참고하길 바랍니다.

1) Unity (C#) - Port 설정 (https://coderzero.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-%EC%8B%9C%EB%A6%AC%EC%96%BC%ED%86%B5%EC%8B%A0-RS232-%EC%8B%9C%EB%A6%AC%EC%96%BC-%ED%86%B5%EC%8B%A0)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

using System.IO;
using System.IO.Ports;

/**
Baud Rate: 57,600 bps
Data Bits: 8
Stop Bits: 1
Flow Control: None
COM3
**/

public class serialCom : MonoBehaviour {
    public static serialCom sc;

    public enum PortNumber{
        COM1, COM2, COM3, COM4,
        COM5, COM6, COM7, COM8,
        COM9,COM10,COM11,COM12,
        COM13,COM14,COM15,COM16
    }

    private SerialPort serial;

    [SerializeField]
    private PortNumber portNumber = PortNumber.COM1;
    [SerializeField]
    private string baudRate = "9600";

    void Start(){
        if(sc && sc != this)
            Destroy(this);
        else
            sc = this;

        serial = new SerialPort(portNumber.ToString(), int.Parse(baudRate), Parity.None, 8, StopBits.One);
    }

    public void sendTriggerEEG(string data){
        if(!serial.IsOpen)
            serial.Open();

        int marker;
        if(data == "T"){  //response
            marker = 102;
        }else if(data == "S"){  //dummy
            marker = 101;
        }else if(data == "N"){  //Normal
            marker = 11;
        }else{
            marker = 10;  //Odd
        }

        byte[] buffer = new byte[] { Convert.ToByte(marker) };
        serial.Write(buffer, 0, buffer.Length);

        //0~255 사이 값을 보낼 수 있는데, 찍혀 나오는 값은 256이 곱해져있는 값이 찍히게 됨
    }
}

2) Python LSL (LabStreamingLayer) : https://github.com/jinwook31/Quick20_LSL_rtRecording_python

https://github.com/nikk-nikaznan/SSVEP_Stimuli/blob/master/onebox_stimuli_RDA.py (이거도 참고해볼만한 코드)

 

GitHub - jinwook31/Quick20_LSL_rtRecording_python: Quick20 Labstreaminglayer real-time recording (python)

Quick20 Labstreaminglayer real-time recording (python) - GitHub - jinwook31/Quick20_LSL_rtRecording_python: Quick20 Labstreaminglayer real-time recording (python)

github.com

3) MATLAB 및 기타 등등 : http://cognionics.com/wiki/pmwiki.php/Main/WirelessTrigger

 

CGX Wiki | Main / Wireless Trigger

#include #include HANDLE hSerial; COMMTIMEOUTS timeouts={0}; int init_SPP(int port){     char com[100];     sprintf(com, "\\\\.\\COM%d", port);         hSerial = CreateFile(com,                                              

cognionics.com

 

3. 주의 사항

주석에도 있지만 실험 코드에서 Trigger 신호를 보낼 때 0~255사이의 값 (8 bit)만 사용을 할수 있다. 그런데 이게 전송 과정에서 8bit Shift 되버려서 Data Aqu. Program에서 보낸 값에 256이 곱해진 값으로 보여지게 된다. 그래서 분석 전에 Trigger 값에 256을 다시 나누어주면 원래 값을 볼 수 있을 것이다.

추가로 연속으로 같은 Trigger Tag를 전송하면 찍히지 않는 것을 볼 수 있는데, 문의를 해보니 그냥 Dummy Trigger Tag를 그 사이에 보내야 한다고 한다. 그리고 이 Tag도 간격이 너무 짧으면 찍히지 않는 경우가 가끔 있으니 반드시 잘 찍히는지 확인 후 실험을 하길 바란다.

다음에는 LSL, RDA 등으로 데이터를 읽는 것과 실시간 Streaming에 대해 정리해보겠습니다.

'Cognitive Neuroscience > EEG' 카테고리의 다른 글

ERP Core P300 (EEGLAB, ERPLAB)  (0) 2021.01.13

주로 뇌파 데이터에서는 RNN보다는 CNN을 주로 활용함

 

13년도부터 뇌파 데이터에 딥러닝 적용해보려는 시도가 이루어 졌지만 발견한 문제점

 - 데이터가 부족 : 이미지처럼 많은 데이터를 얻기 힘듦

 - 불확실성이 크다 (Non stationary, Non linearity) 시간에 따라 분산 등이 변함

 

문제 해결 시도

1) 뇌파 신호의 이미지화

=> 뇌파 Data를 알파, 베타 ,감마의 이미지로 변형하여 적용해보자! (Bashivan et al., 2015) = 가능은 하지만 기존 ML보다는 성능이 낮음

=> Power-Spectral Density Image로 분류 (Ieracitano et al., 2019), Topography map CNN에 적용 (Mao et al., 2018)

 

2) Feature Extraction

=> Power-Spectral Density, Covariance 등의 Feature를 추출하여 CNN 적용 (Zhang & Eskandarian, 2020)

=> Channel Synchronicity Visualization하여 이미지화 (Naira & Alamo, 2019)

 

1,2번 방법들 모두 분류는 가능하나 LDA, SVM보다 낫지 않아 대부분 비교한 것을 보고를 하지 않음!!

 

3) Raw Data 직접 적용

=> Deep Learning with Convolution Neural Network for EEG Decoding and Visualization, Shirrmeister et al., 2017 (https://braindecode.org/) EEG 딥러닝 대중화를 위해 Pytorch 기반 툴박스 제작 & 기존 모델(FBCSP)과 비교! Shallow, Deep Conv Net 모두 성능 향상되지만 Deep이 더 안정적으로 향상되는 것을 확인

=> 시간, 공간을 분리, 즉 각각 Time-Channel에 대해 Kernel을 사용 / Time에 대해, 공간에 대해 각각 Kernel을 분리하였더니 정확도가 상승하는 것을 발견! Model 구성, parameter 최적화 부재 때문에 비교적 성능은 떨어짐

=> EEGNet (Lawhern et al., 2018) 도 나옴

 

뇌파 Data를 적용할 때 주의사항

- 여러 Model을 적용하고 기존 ML 결과와 비교하는 것이 중요 (최적화, 노다가 작업..)

- 기존 논문 결과가 항상 그대로 나오지 않는 경우가 많음 (기존 논문은 비교를 잘 하지 않았고, Data 수집 방법의 차이가 큼, Subject dependent로 높은 정확도 유도한 경우도..)

- 기존 모델 (Shallow, DeepNet, EEGNet, SVM 등), Batch Size, Subject Dependent/Independent에 따라 비교해볼 것

- Data Augmentation 하여 데이터 확대해보기

 

EEG Data Augmentation 방법 (1번(epoch < 10s)과 2-4번(~2s epoch)방법이 주로 가장 효과가 좋은 것으로 보임)

1) Sliding Window (Sakai et al., 2017) - Epoch size가 10s 정도로 긴 경우 가장 최적의 step, window size를 찾아 활용

2) EEG Data에 Noise 추가

2-1) Short-time Fourier Transform (STFT) Amplitude Perturbation (Li et al., 2019) - STFT로 EEG Spectrum를 추출하고 Amplitude Spectrum에 Noise를 더한 뒤 inverse STFT로 신호 복원; Noise 종류는 Gaussian, Salt&Pepper, Speckle 등 사용 가능 (EEG Data 특성 상 시계열에 직접 추가하면 안됨!)

2-2) STFT 한 후 관심 없는 고주파 Noise 신호 (100Hz 이상)를 추출하여 다른 Sample에 더해 Data 증강, 데이터를 n-1배까지 Augmentation 가능!! (Zhang et al., 2021)

2-3) FFT Phase Randomized Surrogates - FFT로 얻은 스펙트럼에서 amplitude는 고정한 상태에서 phase만 섞은 뒤에 inverse FFT

2-4) STFT time domain recombination (Lotte et al., 2015) - STFT로 Time-Freq Map을 만들고 시간 축으로 섞은 뒤 inverse STFT

3) GAN EEG Data Augmentation (Luo & Lu, 2018)

Taxonomy of brain signals

 Non-invasive 방법 중에는 fNIRS, fMRI, EOG, MEG 가장 대표적인 방법으로는 EEG로 본 내용에서 주로 다룰 데이터이다. Delta (0.5~4 Hz), Theta (4~8 Hz), Alpha (8~12 Hz), Beta (12~30 Hz), Gamma (30~100 Hz)로 나누어 져있고, Alpha~Gamma에서 인간의 인지 과정 및 정도에 대한 정보를 얻을 수 있다 (Zhang et al., 2018h).

 EEG의 또 다른 특징으로는 휴대성이 좋고, temporal resolution이 높다는 것이다. 그리고 다른 방법에 비해 Signal processing으로 충분히 착용자의 움직임에 영향을 줄일 수 있고, 강한 자기장에 노출되지 않아도 된다는 점이다. 그렇게 때문에 EEG를 활용한 분석 방법들이 많이 개발되어 있다. 위의 그림과 같이 여러 Paradigm으로 나눌 수 있는데, Spontaneous EEG의 경우 lower SNR과 참가자간 larger variation 때문에 분석 및 사용이 어려운 부분이 있다. 반대로 Evoked Potential의 경우에는 event를 기준으로 분석을 하기 때문에 이러한 단점들이 많이 보완될 수 있다. 하지만 ERP에서는 event 간의 간격이 겹치면 안되기 때문에 stimuli 자극 주기가 2Hz이하인 경우가 많고, SSEP는 3.5~75Hz까지 다양하게 제시 가능하다.

1) Event-Related Potential: visual, audio, somatosensory 등 다양한 감각으로 인한 evoked potential이 존재하고, occipital lobe에서 나오는 VEP가 가장 뚜렷하게 측정된다. Rapid serial visual presentation (RSVP)로 background noise를 제거하기 위해 여러번 반복하는 실험 패러다임을 사용한다. (SEP로 VR Haptic Evaluation이 가능할지??)

2) P300: Positive potential of ERP at 300ms라는 뜻으로, P1, N1, N2 등 다양한 종류가 있다. 그 중에서드 P300은 큰 진폭으로 인해 탐지하기 쉽워 대표적으로 많이 쓰인다. P3 신호를 얻기 위해서는 Odd-ball paradigm을 사용하는데 BCI에서는 P300 Speller라는 input 방식으로 활용된다.

3) Steady State Evoked Potentials: 평상시의 Brain signal과 Steady-state stimuli (고정 주기로 깜빡이는 자극)가 제시 되고 있을 때의 braing signal을 비교하여 이를 Trigger로써 활용한다. 이러한 자극에도 Auditory, Somatosensory를 기반으로 한 것들이 있지만 주로 Visual을 활용한다.

 

[참고 Link]

 

Virtual ERP Boot Camp: Introduction to ERPs

An introduction to the event-related potential technique for students and researchers with little or no prior ERP experience.

courses.erpinfo.org

 

Online EEGLAB workshop

EEGLAB Documentation including tutorials and workshops information

eeglab.org

 

* 본 Chapter는 Deep Learning for EEG-Based Brain-Computer Interface: Representations, Algorithms and Applications 책을 기반으로 공부하며 정리한 내용들입니다!

http://www.moregrasp.eu/technologies/Brain-Computer-Interfaces

BCI는 휠체어를 조작하거나 로봇을 원격으로 조작하듯 주로 motion에 불편함을 느끼는 경우 이를 보조하기 위한 기술 개발로 주로 쓰여왔다. BCI는 옆의 이미지와 같이 시스템이 구성되어있는데, EEG의 경우 noise가 포함되기 쉬운 기기이기 때문에 이러한 과정에서 Signal-to-Noise (SNR)을 높이는 것이 중요하다. 이를 위해 Preprocessing 과정에서 signal cleaning, signal normalization, signal enhancement (DC 제거), signal reduction이 수행된다. 

그 뒤에 Feature engineering에서는 도메인 지식이 필요하다. preprocess 된 후의 신호에서 사용할만한 feature를 뽑기 위해 EEG 데이터를 time (variance, mean value, kurtosis), frequency (FFT), time-frequency (Discrete wavelet transform) 도메인으로 주로 접근한다. (참고해보면 좋은 링크: https://youtu.be/48qi0exuWRI)

이러한 과정을 프로그래밍을 통해서 자동화하지만 그래도 noise가 많고 개인차가 크기 때문에 최근에 Deep learning을 활용한 방법들이 BCI에서 많이 주목을 받고 있다. BCI에서 DL을 통해서 얻고자하는 목표는 크게 4가지가 있다.

1. Challenge of low SNR: 근육, 눈움직임으로 인한 noise를 효과적으로 제거하고 feature를 찾아내는 것

2. Feature engineering Automation: 전문적인 지식이 없더라도 효율적이고 명확한 feature를 찾아낼 수 있어야함

3. High Accuracy: 기존 SVM을 활용한 방법들의 정확도가 80% 이하였는데, 이를 그 이상으로 끌어올릴 수 있어야 함

4. Handle unlabeled data: 대부분 EEG의 데이터들은 라벨링이 되있지 않거나, 데이터의 크기가 크지 않은 경우가 많은데, 이러한 조건에서도 좋은 성능을 이끌어 낼 수 있어야 함

최근들어 다양한 DL 알고리즘과 GPU가 개발되면서 BCI 분야도 많이 발전이 되었다. 앞으로 이러한 부분들을 더 다룰 예정이다. 아래는 책에서 추천해준 몇 EEG-DL 관련 git 주소들이다.

https://github.com/xiangzhang1015/Deep-Learning-for-BCI

 

GitHub - xiangzhang1015/Deep-Learning-for-BCI: Resources for Book: Deep Learning for EEG-based Brain-Computer Interface: Represe

Resources for Book: Deep Learning for EEG-based Brain-Computer Interface: Representations, Algorithms and Applications - GitHub - xiangzhang1015/Deep-Learning-for-BCI: Resources for Book: Deep Lear...

github.com

https://github.com/NeuroTechX/dl-eeg-playground

 

GitHub - NeuroTechX/dl-eeg-playground: Deep Learning EEG Playground

Deep Learning EEG Playground. Contribute to NeuroTechX/dl-eeg-playground development by creating an account on GitHub.

github.com

https://github.com/QTIM-Lab/DeepNeuro

 

GitHub - QTIM-Lab/DeepNeuro: A deep learning python package for neuroimaging data. Made by:

A deep learning python package for neuroimaging data. Made by: - GitHub - QTIM-Lab/DeepNeuro: A deep learning python package for neuroimaging data. Made by:

github.com

 

Conv1D

 

Conv1D

 - stride: 연결을 n개씩 이동 (default=1)

 - padding: data가 모자라서 tensor의 양 끝에 0을 추가

 

Conv2D

 - Gradient descent, Backpropagation으로 Kernel 값 초기화

 - kernel_size = 1,3,5,7,9 가 일반적이고, 클수록 필터의 영역이 커짐. 초기에는 7 or 9를 사용함

 

Pooling

 - conv2d layer 뒤에 주로 추가하는 것으로 feature map (input img에 filter를 한 결과)의 크기와 Conv2d의 크기를 줄여줌

 - stride와 비슷하지만 가중치는 없음

 - kernel의 크기에서 최대값 (MaxPool2d) 또는 평균값으로 계산

 

ReLU

 - MaxPooling 이후 수행하는 단계로 비선형 layer를 연결하는 형태로 쓰임

 - Feature map을 Activation map으로 변환

 

View

 - 이미지 문제는 보통 마지막에 Fully connected or linear layer를 두어 결과를 출력

 - 다차원 Tensor를 1차원으로 변환함, view(-1, 320) 으로 사용

https://highsg.tistory.com/29

위와 같은 방법으로 모델 설계시 계산할 수 있어야함!!

 

모델 학습

 1) model.train(): dropout으로 일정 비율 제거, 기울기 계산하여 parameter 변경

 2) model.eval(): dropout, parameter 변경 하지 않음!

 

Transfer Learning

 - 사전에 학습된 알고리즘을 유사한 Dataset에 재사용하여 처음부터 학습하지 않음

 - 적은 양의 데이터로도 작동할 수 있는 방법

 - 대부분 Layer의 Parameter는 그대로 사용하고, 마지막 Classifier (FC Layer)만 미세조정

 - 출력을 분류하려는 Class 수에 맞게 수정하고, feature.param = False로 classifier.param=optimizer로 설정해야 함

 

* Learning 속도 향상시키기: Transfer learning 처럼 마지막 layer에만 param을 바꿀 때, 들어오는 값은 동일하게 된다. 그러면 Conv 계산 결과를 저장하여 재사용하도록 한다.

 1) Dataset, Model을 인자로 받아 모든 Dataset의 Conv feature list, label 목록을 반환하는 함수를 만들고

 2) DataLoader로 label, feature로 batch를 생성하도록 함

'Programming > Deep Learning' 카테고리의 다른 글

7. Recurrent Neural Networks (RNN) & LSTM  (0) 2022.04.08
5. 머신러닝 Workflow  (0) 2021.02.01
4. 머신러닝 입문  (0) 2021.01.22
3. 신경망 구조  (0) 2021.01.19
2. 신경망 구성 요소  (0) 2021.01.13

1. 문제정의 & Dataset 만들기

 - 입력 데이터, 문제 유형(회기, 분류 등)을 명확히 정의하기

 - Domain 지식을 활용해 목적에 맞는 Data 수집

 - ML의 가정: 미래 Data는 과거 Data가 묘사하는 Pattern과 유사할 것!

 

2. 모델평가 기준

 - Class Data 분포가 균등할 경우: ROC, AUC (Area Under the Curve)

 - Class Data 분포가 불균등할 경우: 정밀도 (Precision, Recall)

 - 랭킹 문제: mAP (mean Average Precision)

 

3. Dataset 평가

 - Hold-out 검증 set / k-fold 교차 검증 / 반복 k-fold 검증

 

4. Data 준비

 - Data Vectorization 후에 Tensor화 (정규화가 잘 되었는지 확인)

 

5. Baseline 모델

문제 유형 활성화 함수 오차 함수
이진 분류 Sigmoid CrossEntropyLoss
다중 클래스 분류 Sigmoid CrossEntropyLoss
다중 레이블 분류 Sigmoid CrossEntropyLoss
회귀 - MSE
벡터 회귀 - MSE

 - 최적화: Adam, RMSprop 주로 사용하지만 실험이 필요

 

6. Overfitting 정도의 모델

 - Layer, weight, epoch 늘리기

 - 학습 Acc는 증가, 검증 Acc는 증가 안하고 정확도가 떨어지기 시작하면 Overfitting으로 학습 중단시킴

 

7. 가중치 규제 적용

 - Dropout 추가 (실험 필요)

 - 아키텍쳐 변경

 - L1, L2 규제 적용 (2개중 1개만)

 - 특성추가 및 학습 Dataset 늘리기

 - 학습률 변경: torch.optim.lr_schedular의 StepLR, MultiStepLR, ExponentialLR, ReduceLROpPlateau를 사용 (일정 주기로 LR을 조정함; 주로 오차 및 Acc이 정채될 때 변경하는 ReducedLROpPlateau를 사용함)

 

 

'Programming > Deep Learning' 카테고리의 다른 글

7. Recurrent Neural Networks (RNN) & LSTM  (0) 2022.04.08
6. Convolution Neural Network (CNN)  (0) 2021.02.04
4. 머신러닝 입문  (0) 2021.01.22
3. 신경망 구조  (0) 2021.01.19
2. 신경망 구성 요소  (0) 2021.01.13

+ Recent posts