초기 세팅

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

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

ML 유형

  * 지도학습: 분류, 회기 (예측), 이미지 분할, 음성인식, 언어 번역

  * 비지도학습: 데이터에 label이 없어 Clustering (그룹화) 및 차원축소 등의 방법으로 Data를 이해함.

  * 강화학습: opentutorials.org/course/4548/28949

 

강화학습 Reinforcement Learning - 생활코딩

 

opentutorials.org

 

Model Evaluation

1) 데이터 셋을 학습 데이터셋 (learning) / 검증 데이터셋 (hyper-param 튜닝) / 테스트 데이터셋 (성능 측정)으로 나눔

2) ML의 변수

  - 가중치: optimizer에 의해 변경 or 역전파 과정 튜닝

  - Hyper-param: 아키텍쳐의 형태 (Layer 수, Learning rate), 구성, 동작 방식을 결정하는 변수로 주로 수동으로 변경해야 함

3) Overfitting / Underfitting: 학습 데이터셋에서는 잘 작동하지만, 검증과 테스트셋에서는 잘 작동안하는 경우 일반화 능력이 떨어지므로 overfitting이고, 그 반대의 경우는 underfittng. 이런 문제를 해결하기 위해 Holdout dataset, k-fold 검증, 반복 k-fold 검증 방법을 사용함. 예를 들어 k-fold 검증은 test dataset을 여러개로 나누고 1개를 검즈으로 번갈아가며 사용한 뒤에 평균값으로 판단하는 방법임. 추가적으로 상황에 따라 데이터 혼합 방법을 사용하기도 함. 

* 데이터 혼합 시 유의해야할 점!!

  - 데이터 표현력: 한쪽에 치중되지 않게 임의의 순서로 섞거나 층화 추도법(stratified sampling) 사용

  - 시간 민감도: 순서 정보가 있다면 도메인 지식을 기반으로 기준 설정해주어야 함

  - 데이터 중복: 일반화가 잘 안될수도 있음

 

Data Preprocessing & Feature Engineering

1) Data Preprocessing

  - Vectorization: Data를 Pytorch Tensor 형태로 변환

  - Normalization: Data 특성을 평균을 0, 표준편차 1로 만들어 정규화하여 더 빠른 학습과 성능 효과가 있을 수 있음. MinMaxScaler 함수를 사용하여 정규화를 할 수 있음

  - Missing value: 도메인 별로 해결방법이 다름 (숫자 대체, 예측 등)

2) Feature Engineering : 도메인 지식 base로 model에 전달할 새로운 변수 및 feature를 만들어 내는 것. 데이터가 부족하다면 feature engineering 이 도움이 될 수 있음.

 

Overfitting & Underfitting 대처법

1) Overfitting: 학습 데이터셋을 완전 암기한 상태로 noise까지 학습해버려서 오히려 새 Data 및 검증 데이터셋에 성능이 안나오는 현상, 단순한 model로 만들어서 해결함

 - 더 많은 데이터 확보: 특정 패턴보단 일반 패턴을 학습할 수 있는 데이터를 확보하고, 더 구할수 없을 땐 데이터 도메인 이해 하에 Data Augmentation (회전, 자름 등)을 이용할 수도 있음

 - 네트워크 크기 줄이기 (선형 Layer수, 가중치수)

 - 가중치 규제 적용: Network가 가중차기 큰 값을 갖지 않도록 regularization을 통해 가중치가 큰 값을 가지면 불이익을 줌. L1 규제(절댓값 weight 계수 총합) 또는 L2 규제 (weight 계수 제곱합)을 cost(Data 오차 합)에 추가함

torch.optim.Adam(params, lr=0.001, weight_decay=1e-5)

- Dropout: model의 중간 layer에 적용되어 일정 비율의 출력을 0으로 설정 (nn.dropout(x, train=True))

2) Underfitting: 학습이 제대로 되지 않는 현상으로 학습 Data를 늘리거나, layer 및 가중치 수를 늘려보도록 한다. (이 경우 가중치 규제는 사용하지 말 것!!)

 

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

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

1) Layer (신경망 기본 블록)

  - 선형 Layer, 즉 y=wx+b를 의미함 (= Dense, Fully Connected Layer)

  - 각 Layer은 개별적 학습 parameter를 가짐, but 선형 Layer를 여러개 쌓는다고 성능이 좋아지는 것은 아니다. 이는 결국 1개의 선형 Layer로 표현될 수 있기 때문에 결국 1개의 Layer와 차이가 없어진다.

  - 그래서 여러 비선형 활성 함수를 같이 사용해야 한다! (Sigmoid, Tanh, ReLU, Leaky ReLU)

   비선형 활성 함수

     Sigmoid: 실수를 취해 0~1 사이를 출력하도록 한다. input이 음수이면 0에, 양수이면 1에 가까운 값을 반환함. 단점으로는 0 or 1에 가까워 지면 기울기가 0이 되면서 가중치가 더 이상 조정되지 않으며 dead neuron이 됨.

     Tanh: -1에서 1 사이의 값으로 반환, 이 함수도 기울기가 0이 되는 경우가 존재하지만 출력값이 0을 기준으로 만들어지므로 변화폭이 더 큼

      ReLU: f(x) = max(0,x) 로, 음수는 0, 양수는 그대로 반환하게 한다. (단, Leaky ReLU는 음수를 0.001과 같은 매우 작은 수로 반환함). 최근에 가장 많이 사용되는 방법으로 SGD(Stochastic Gradient Descent)가 더 빨리 수렴하고 연산 비용이 적다라는 장점이 있지만, 이 또한 기울기가 크면 죽는 경우가 있어 learning rate를 조정해야 한다.

 

2) Neural Network 구축

    - Pytorch의 nn.Module class를 상속하여 init, forward method를 구현

        * init: 선형 Layer를 초기화

        * forward: init 메소드에서 초기화한 Layer에 입력 데이터를 전달하고 최종 출력 반환 (여기서 ReLU 같은 비선형 함수 사용)

class LinearRegressionModel(nn.Module): 
    def __init__(self): 
        super().__init__()
        self.linear = nn.Linear(5, 2)
        self.linear = nn.Linear(2, 1)

    def forward(self, x):
        return self.linear(x)

model = LinearRegressionModel()

     Model 아키텍쳐

      회기: 예측 문제로 1개의 숫자를 반환함 (마지막 Layer는 선형)

      이진분류: Sigmoid 함수를 마지막 layer에 배치하여 이미지의 output을 A 또는 B 중에 선택하게 함

      다중분류: 마지막 Layer에 softmax 함수를 사용하여 입력 데이터가 각 class로 분류될 확률을 구함 (전체 합=1)

 

3) 오차함수

    - Gradient descent optimizer (scalar를 입력 받기 때문에 loss func도 scalar로 반환해야 함)

    ML은 오차함수에서 나오는 값을 최소화하는 반복 과정으로, 2개의 오차함수가 있어도 1개의 Scalar 형태로 만들어야 함 (part 4 참고). 회기 문제는 nn.MSELoss(), 이진 및 다중 분류 문제는 cross-entropy Loss 등등을 사용하고 L1, NLL, NLL Loss 2d 등이 있다. (nuguziii.github.io/dev/dev-002/)

 

4) 최적화

    - 오차를 줄이고, 알고리즘 정확도를 향상시키기 위해 가중치 최적화하는 과정으로 optim = optim.SGD(model.parm(), lr=0.01)로 사용하고, lr은 학습 param 변경 비율을 의미함. 그리고 계속 누적되기 때문에 반복문 안에서 zero_grad()를 호출하여 기울기 초기화 과정이 필요함

for input.target in dataset:
    #초기화
    optimizer.zero_grad()

    #기울기 계산
    output = model(input)
    loss = loss_fn(output, target)
    loss.backward()

    #학습 param에 적용
    optimizer.step()

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

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

<해당 글은 'Pytorch로 시작하는 딥러닝' 책을 읽으면서 공부한 내용을 정리한 블로그입니다. 중요한 내용 위주로 정리해서 개인적으로 이해가 된 부분들은 생략되어 있을 수 있습니다.>

1) 데이터 준비 (Tensor)

- Scalar (0차원 텐서)

- Vector (1차원 텐서)

- 행렬  (2차원 텐서)

- 3차원 텐서: image에서 (height x width x RGB Channel)

- 4차원 텐서: batch (주로 16, 32, 64) 로 여러 이미지들의 묶음 (img 수 x height x width x RGB Channel)

- 5차원 텐서: batch x fps (동영상; batch 내 영상 클립 수 x fps x height x width x RGB Channel)

2) Variable 및 계산 그래프

    y=wx+b 라는 선형 모델을 사용할 때, 임의의 값으로 초기화되어 학습하며 이 변하는 w,b는 학습 parameter이고, dataset을 기반으로 정해지는 x, y는 고정 parameter이다. Pytorch의 경우 변수 선언 시 requires.grad를 true (학습), false (고정) varuable로 설정할 수 있다.

3) 신경망 모델 (Fitting)

4) 네트워크 구현

5) 오차함수: Sum of squared (SSE), MSE, Cross-Entropy 등을 이용한다. backward() 함수로 w,b의 변화 정도를 계산하여 측정할 수 있다. (단, 여러번 사용시에는 param.grad.data.zero_()로 앞서 계산된 값을 지워줘야함)

6) 신경망 최적화 (Optimize): Learning rate 등의 hyper-parameter 습 파라미터 (w,b) 조정 시 사용하는 비율을 의미함. Adam, RmsProp, SGD 등이 있다.

7) 데이터 로딩 (DataLoader class): Dataset class에서 init, len, getitem 메소드에 대한 구현 후 DataLoader class를 사용해 batch 형태로 변환한다.

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

7. Recurrent Neural Networks (RNN) & LSTM  (0) 2022.04.08
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

외주로 열전사 프린터를 갖고 서버통신으로 입력에 따른 이미지를 출력하도록 하는 프로젝트를 했었는데, 그 과정에서 라즈베리파이 - 프린터를 갖고 제작한 것에 대한 리뷰가 많지 않아서 이슈가 있던 것들을 위주로 따로 정리를 했습니다. 프로젝트에 대한 설명을 자세히 하기는 어렵지만 Android - Flask (REST API - Raspberry pi) + Printer 형태로 되어 있습니다.

준비물

Raspberry pi Sets

9V 2A Adapter with plug (중요!! - 꼭 9V 2A 인 것을 확인하세요)

www.adafruit.com/product/597

 

Mini Thermal Receipt Printer

Add a mini printer to any microcontroller project with this very cute thermal printer. Thermal printers are also known as receipt printers, they're what you get when you go to the ATM or ...

www.adafruit.com

* 설명에는 5V 2A라고 되어있지만 이미지 등을 깔끔하게 출력하기 위해서는 9V 2A 어댑터를 사용하는 것을 추천드립니다!!

구현

1) Raspberry pi Setting

sudo apt-get update

sudo apt-get upgrade

sudo raspi-config (Serial 권한 허용 [첫 번째 꺼는 No, 두번째 꺼는 Yes로])

pip3 install flask-restful

sudo apt-get install git cups wiringpi build-essential libcups2-dev libcupsimage2-dev python-serial python-pil python-unidecode

git clone https://github.com/adafruit/zj-58 

cd zj-58

make

sudo ./install

cd

git clone https://github.com/galacticfan/Python-Thermal-Printer/

이후에  /dev/serial0, 19200로 접근하면 깨지는 글자 없이 출력이 될것입니다. 한글 출력의 경우 추가 라이브러리 등 복잡한 방법이 필요하여 이미지로 대체하였습니다. 

2) Printer Setting

프린터 연결의 경우 아래 포스트를 참고하면 되는데, 해당 제품의 경우 순서에만 맞게 라즈베리파이에 꽂고 Power 선 부분만 어댑터에 맞게 잘라서 사용하면 된다.

medium.com/geckoboard-under-the-hood/building-a-slack-printer-for-remote-retrospectives-8de0282e5791

 

Building a Slack Printer for Remote Retrospectives

…with a little help from a Thermal Printer, a Raspberry Pi and Slack’s Slash Commands.

medium.com

프린터 코딩의 경우 (github.com/galacticfan/Python-Thermal-Printer/) 이 깃에서 제공하는 함수들을 사용하면 쉽게 사용할 수 있고, 추가로 필요한 부분의 경우 OS 함수로 명령어를 직접 보내줄수도 있습니다.

* Issue

- 알 수 없는 문자가 계속 나오거나 아예 아무것도 나오지 않는 경우 확인을 해야할 것이 우선 전원이 제대로 들어가고 있는지 (대다수의 경우), 이미지가 깨지지 않았는지 (기본 예시를 출력해볼 것!)를 확인해보는 것이 좋습니다.

- 가끔 Text 앞에 J 같은 글자가 나오는 경우가 있는데, 이는 Adafruit_Thermal.py에서 printBreakTime 변수를 바꿔주면 다른 값으로 찍히게 되는데 이부분을 만지면 해결이 될 수도 있습니다.

+ Recent posts