2022년 9월 4일 일요일

git 사용법

처음

1. github에 들어가서 New로 새로운 repository(이름을 Processor라고 하자)를
만듬 (생성후 나오는 명령셋 참조)
2. 적당한 위치에 폴더를 만들고, vscode로 이 폴더를 오픈함
3. 폴더에서 필요한 프로그램을 작성
4. vscode의 New Terminal로 터미날을 오픈

5. 아래의 명령을 차례로 입력 (처음 업로드)
git config user.email "djk*****@d***.net"
git config user.name "djk*****"
git init (".git" 라는 폴더가 생기고현재 폴더의 변화를 추적하기 시작함)
git add filename (or git add .): 전체를 업로드하거나 변화된 파일만
업로드를 위해 파일을 staging함
git commit -m "First upload"
git remote add origin "https://github.com/galmegy/Processor.git"
(github repository와 연결)
git status: staging 상태 확인
git push -u origin master: 업로드 실행


재 수정

파일 수정 후 업로드를 원하면
git add ...부터 끝까지만 반복하면 됨


새로운 Branch

git branch Detector
git switch Detector
git status (Detector branch에 와 있음을 알 수 있음)



2022년 1월 26일 수요일

Windows 10, Anaconda환경에서 Mujoco 설치

 1. https://mujoco.org/download 에서 v.2.1.0버전(windows x86_64)을 다운 받는다.

 - C:\Users\홈경로\.mujoco 폴더를 만들고 여기에 mujoco210폴더 아래 압축을 푼다.

2. https://www.roboti.us/license.html에서 Activation key를 찾아 다운 받는다 (mjkey.txt).

 - 파일을  C:\Users\홈경로\.mujoco\mujoco210, C:\Users\홈경로\.mujoco\mujoco210\bin 복사

 - bin폴더 내에서 

   > simulate ../model/humanoid.xml 실행하면

   창이 뜨고 사람이 쓰러지는 화면이 나오면 설치가 잘 된 것임.

3. conda의 가상환경 py38로 들어가서 경로를 설정 후 mujoco-py 설치.

  > set path=C:\Users\홈경로\.mujoco\mujoco210\bin;%PATH%

  > pip install mujoco-py=2.1 설치. (안되면 =2.1 제거하고 시도)

 4. python 실행하고, 아래 명령 실행하면 필요한 컴파일 진행 

   (import mujoco_py를 처음 실행 시에 여러가지 컴파일 자동 실행됨)

import mujoco_py
import os
mj_path = mujoco_py.utils.discover_mujoco()
xml_path = os.path.join(mj_path, 'model', 'humanoid.xml')
model = mujoco_py.load_model_from_path(xml_path)
sim = mujoco_py.MjSim(model)
print(sim.data.qpos)

sim.step()
print(sim.data.qpos)

[참조] 
1. MuJoCo 설치

2021년 11월 10일 수요일

Pyside2 기초

- QT: c/c++언어 기반의 gui 라이브러리

- PyQT: QT와 다른 회사서 만듬

- PySide2: QT 회사에서 만듬

-------------------------------

from PySide2.QtWidgets import *

# 기본 절차: (1) 응용프로그램(App) 시작, (2) window 생성, (3) layout 생성,
#           (4) 위젯(버턴, 라벨, ...) 만듬, (5) layout에 위젯 추가, 
#           (6) layout을 window에 넘김, (7) window 출력, (8) App 실행

app = QApplication([]) # 응용 프로그램 시작
window = QWidget() # window를 생성
layout = QVBoxLayout() # layout을 생성

button = QPushButton("I'm just a Button man") # button 하나 만듬
layout.addWidget(QLabel('Hello World!')) # label을 layout에 추가

layout.addWidget(button) # button을 layout에 추가
window.setLayout(layout) # layout을 window로 넘김

window.show() # window 화면 출력
app.exec_() # 응용 프로그램 실행


참고

1. Medium



2021년 9월 22일 수요일

Networks

- DHCP 서버는 유동 ip 주소를 자동으로 할당, 회수 해주는 서버

- DNS 서버는 숫자 ip와 문자 ip를 바꾸어 주는 서버

- 허브, 스위치, 라우터

  허브: 물리적 연결만 표현, 지능 없음. 들어오는 신호는 모든 연결부로 나감

  스위치: 허브와 유사. 지능 가짐, 입력 데이터는 필요한 곳으로만 나감

  라우터: 허브와 스위치는 내부망에 사용하나 라우터는 외부와 연결을 중계

     class A: 10.0.0.0~10.255.255.255
     class B: 172.16.0.0~172.31.255.255
     class C: 192.168.0.0~192.168.255.255
          사설망 주소는 모두 192.168.~  시작함.   

- 서브넷 마스크: ip 주소에 마스크를 씌워 네트워크 범위와 Host범위를 나누어줌

- 게이트웨이: iptime 공유기 주소

- DNS서버: 8.8.8.8(구글 DNS)



2021년 3월 28일 일요일

Ubuntu에서 Celery

 [설치]

$ sudo apt install python-celery-common -y
$ sudo apt-get install redis-server -y
$ pip install celery
$ pip install redis

[코딩]

# tasks.py
from celery import Celery

BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
app = Celery('tasks', broker=BROKER_URL, backend=CELERY_RESULT_BACKEND)

@app.task
def add(x, y):
  return x + y


[실행]

$ celery -A tasks worker --loglevel=info

[호출]

>>> from tasks import add
>>> add.delay(4, 4)
>>> result = add.delay(4, 4)
>>> result.ready()
>>> result.get()


[참고]

1. 비동기 처리




2021년 2월 22일 월요일

Django RestFramework 스터디

 (1) OneQ 웹 프레임워크 Django(python) 개념 정리

- 프레임워크: lib는 사용자가 호출. framework는 framework이 사용자 코드를 호출


(2) OneQ 웹 프레임워크 Django 실습


(3) [T24] 장고 01강_웹프로그래밍과 Django


-여기 까지는 DJango에 대한 부분으로 상기한 링크 자료만 학습하면 됨. 

아래는 Django REST framework에 대한 부분으로 실습 해보아야 됨.

- DJango 학습 시에 유의할 사항은 django project(1개만 있음) 하에서 여러 app이 존재할 수 있다는 것을 이해. 

app은 user관리, 결제처리, 등등... 필요에 따라 추가할 수 있으며 folder단위로 관리됨, 재 사용도 가능하다. 


(4) [이 부분이 가장 중요] REST API Guide - Productionizing a Machine Learning model by creating a REST API with Python Django and Django REST Framework 


(5) Django  REST framework Quickstart


[참고] 자주 나오는 Serializer 클래스는 Model 데이터를 json으로 바꾸는 역할을 한다. 이 클래스를 만들고 model 데이터를 이 클래스 객체에 던져주면 json으로 바뀌어서 리턴된다. 


[References]

1. Database 연동하기 - Model설계, Migration 



2020년 11월 8일 일요일

가장 짧게 transformer 설명

어떤 시계열 데이터가 있는데, 시계열 길이는 32이고 속성 수는 16개라 가정하자.  

그러면 데이터 shape은 original=(bs, slen=32, nfeat=16)이다. bs는 batch_size이다. 여기서, 첫번째 데이터인 (32,16) 행렬만 추출하여 tansformer연산을 해보자.


1. (32,16)을 속성 수가 16이 아닌 8로 만드는 linear층을 적용한다. 물론 8은 바꿀수 있다. 

그러면 데이터는 (32,8)이된다. 그리고 속성은 더이상 origianl이 아닌 latent텐서가 된다. 


2. transformer의 self attention사용할 예정이므로 1에 설명된 방법으로 original로부터 (32,8)인 query, key, value 텐서 3개를 만든다. 


3. 먼저 query와 key에 대해 attention(가중치) 연산을 수행한다 (self attention연산 이해는 이미지를 활용한 아래 사례를 참조한다). 

query*key'=(32,8)x(8,32)을 하면 (32,32)크기가 나온다. 이것은 시간 t=i에서 8개 속성과 t=j에서 8개 속성을 유사도 비교 연산한 것이다. 

즉, 서로 다른 시간에서 신호 속성들의 유사도를 따지는 것이다. 현 신호는 이전 어떤 시간대에서 관련성이 있는지를 평가한다. 


따라서 (32,32)행렬 첫 행은 t=1(8속성)과 t=1,2,3,...,32까지를 비교한 값들이고, 이 값을 정규화(softmax)하여 저장한 것이다. 

이 값을 value의 첫번째 속성인 (32,1)에다 곱해준다: a1*v1+a2*v2+a3*v3+...+a32*v32


또, (32,32)행렬의 두번째 행은 t=2(8속성)와 t=1,2,3,...,32까지 속성을 비교한 것이다. 이 값도 마찬가지로 

value의 두번째 속성인(32,2)에 있는 32개 벡터와 차례로 곱해준다: a1*v1+a2*v2+...+a32*v32



4. 이런 식으로 연산을 하면 결과 행렬식 (32,8)이 생기는데, 이것이 한개의 self-attention head이다. 


5. attention head는 보통 여러개가 되고, 이를 함께 연결하여(concat) 큰 행렬 하나로 묶어 내고, 이를 linear층을 통과시켜 original data와 크기가 같은 (32,16) 행렬을 만든다. 


6. original 입력(32,16)은 attention head 출력(32,16)과 더해주는데 이는 original data의 크기값(scale)이 Attention Head 출력에 잘 반영되도록 하기 위함이다.



(사례)



그림은 Input sequence에 대한 Transformer 연산을 좀 더 쉽게 이해하기 위해 dog and dog 이미지를 이용하여 self attention 방법을 보여준다. 이미지를 4개의 patch로 분할하여 patch가 나타난 순서대로 일렬로 세워서 벡터로 만들고 이를 곱해준다. 

곱한 결과인 softmax($QK^T$) 행렬을 보면, 


- 자기 자신 patch끼리의 상관성 높음 (대각방향)    

- Noisy한 배경 끼리의 상관성은 낮음 (비대각 방향)

- Patch 2와 Patch3은 둘 다 dog이므로 상관성 높음 ($a_3^2$와 $a_2^3$ 높음)

- $V$와 곱하면 Output 2, 3 만 높음 (attention 됨). dog가 있는 patch가 attention 되었음. 

- 입력에서 반복 출현하는 유의미(salient) 객체는 상관성 높음 (자기 상관성이던 다른 dog와 상관성이던 배경보다 높아짐)

 

Output행렬의 첫 행을 보면 t=1~4의 4개의 데이터 $V$에 attention(가중치) 값 $a_j^i$값이 곱해진 형태이다. 이것은 sequence 데이터(t=1~4)에 가중치 weight($a_j^i$)가 곱해진 것이며, fully connected net이나 convolution연산과 모양이 동일하다.  

Transformer는 학습되고 나면 고정된 가중치를 가지는 FCN이나 CNN구조와 달리, 위 그림에서 나타나는 가중치 $a_j^i$처럼 Input의 함수이다. 달라지는 Input에 따라 고정된 값이 아니라 바뀌는 값이다. 따라서 FCN이나 CNN에 비해 inductive bias가 휠씬 적게 된다 [1]. 



Reference

1. PR-297 Youtube

2. ViT pytorch 코드 리뷰 (github 원본)