- 목공 . . . . 1 match
1. 콤비네이션 스퀘어
- 20100513_new_camtron_hw_package . . . . 4 matches
1. CCD 인터페이스 설정
gps에서 사용하던 부분이 Power on reset으로 변경 사용됨.
GPIO80은 단선으로 쓰이지 않는 부분으로 제거
== CCD 인터페이스 설정 ==
- 20100802_ipnc_osd . . . . 1 match
아래 예제는 특정 위치에 특정 사이즈로 사각형에 빨간색 박스를 칠하는 것임.
- 20100816_samsung_filesystem . . . . 2 matches
nfs로 부팅을 하고 아래와 같이 mtdblock3을 마운트 시키고
cmem이 사용할 영역을 늘리기 위해서 mem size를 74M로 줄였다.
- 20101101_HDCCTV_pal . . . . 2 matches
= 관련 데이터 시트 =
{{{{color: rgb(255, 1, 1); font-size: 13px;}문제점 }}}: 화면 출력은 변경 되었지만 화면 하단에 검은 패턴이 발생 함.
- 20101105_hdcctv_image_data_path . . . . 9 matches
DM365에서 영상 이미지를 센서로 부터 입력 받아 SDI로 출력하는 작업.
입력 영상의 사이즈 1920x1080 --> 1920x1080 (1080i)
입력 영상의 사이즈 1920x1080 --> 1280x720 (720p)
IPIPE와 RSZ에서 사용할 기본 소스의 크기를 결정하는 레지스터이다.
다음은 1080 ---> 720 으로 변환하는 예이다.
* PAL & NTSC 모드를 리사이저 설정은 다음과 같다
1280 * 720 사이즈 osd 설정
OSD가 출력할 화면을 구성했다고 하면 VENC는 외부 장비에 화면을 전송하기 위한 출력을 구성하는 곳이다.
아래 코드는 720p 출력을 만드는 예시이다.
- 20101105_ipnc . . . . 2 matches
캠트론의 요청으로 System default configuration value를 하드웨어 테스트에 용이하게 수정하고
digital out의 출력을 이벤트 발생 시점으로 수정함.
- 20101117_spd400_filesystem_yaffs2 . . . . 8 matches
=== NAND Flash 와 NOR Flash의 차이점 ===
* NOR Flash는 버스 인터페이스를 사용하고 NAND Flash는 제어핀이 추가된 다중화 I/O 인터페이스를 사용한다.
* NOR Flash는 SDRAM과 같은 다른 메모리 디바이스와 같이 어드레스/ 데이터 버스를 사용해서 '''Program code 수행이 가능'''하다.
- 20101203_spd400_filesystem_install_guide . . . . 23 matches
.name : 부팅 과정중에 표시 되는 이름이다. 개발자의 의도를 알 수 있도록 적당한 이름을 부여한다. (ex. app, conf, temp, log..)
.size : 파티션의 크기, NAND_BLOCK_SIZE의 배수로 설정한다. NAND는 BLOCK 단위로 처리 되기 때문이다.
= YAFFS2 이미지 생성하기 =
YAFFS2 이미지 생성은 local에서도 할 수 있고 target 보드에서도 할 수 있다.
이미지 생성에 사용하는 명령어는 '''/usr/sbin/mkyaffs2''' 입니다.
= YAFFS2 이미지 Fusing =
yaffs2 이미지를 nand에 fusing 하는 방법은 두 가지 환경에서 가능합니다.
== U-BOOT 상에서 YAFFS2 이지미 올리기 ==
파일 시스템을 올리는 일은 KERNEL 이미지를 올리는 것과는 조금 다릅니다.
erase size와 page size의 얼라인이 맞아야 하기 때문에 이미지의 사이즈가 중요 합니다.
이미지 사이즈가 맞지 않으면 이미지가 올라가지 않습니다.
yaffs2 이미지의 경우 정확하게 얼라인을 계산해서 만들기 때문에 이미지 size를 적어주시면 됩니다.
== Linux 상에서 YAFFS2 이미지 올리기 ==
예상 시나리오는 app.img라는 이미지를 target이 갖고 있고 app.img 이미지를 NAND의 다른 파티션에 올리려고 합니다.
- 20110711_xbmd . . . . 2 matches
FFT를 수행 할 수 있도록 사용자 인터페이스를 제공한다.
carriage return 이라는 것을 처리 하기 위해서 조건에 '''ch != 13'''을 추가 했다.
- 20110824_fftw . . . . 6 matches
-- svn://210.119.60.156/xbmd-- 에서 아래로 이전
라이브러리의 정확한 이름은 '''apt-cache search''' 명령으로 검색해서 찾을 수 있다.
== opengl 라이브러리 설치 ==
== freeimage 라이브러리 설치 ==
== fftw3 라이브러리 설치 ==
- 20111214_fpga_work_flow . . . . 2 matches
||* Interface 자체 개발 ||* Pico bus 방식의 인터페이스 ||
||*자체보드 제작에 필요한 선행 작업 ||* 당장 사용가능 (교육이 필요함) ||
- 20120213_jhkim_impulsec_review . . . . 3 matches
오상훈 박사의 부탁으로 종환이가 임펄스 씨에서 만든 단진자 운동 방정식을 PICO 보드에 올려 테스트 하는 일.
1. 입력 데이텨 셋
* 종환이가 만든 임펄스 C 프로젝트의 오류로 진행 중단.
- 20120402_fpga_fft . . . . 3 matches
1. [[date(4-2)]] FFT를 구현하기 위해 페이지 개설 및 C code 작업
int leg_diff;// leg 차이
order[j+jmax] = order[j]+size/2/jmax; // 다이어그램에서 인풋 순서
- 52hour . . . . 21 matches
고용노동부의 행정해석을 통해 휴일도(근로일에서 제외하는 것으로 해석) 근무하는 것으로 해서 토요일, 일요일도 근무가 가능하기 때문에 16시간이 추가 되어 사실상 최장 허용 근로시간이 68시간이됨.
* 300인 이상 기업은 2018년 7월 1일부터 시행
고용부의 행정해석에 따라 8시간 이하의 휴일근로에 대해서는 150% 수당 지급,
8시간 이상의 휴일근로에 대해서는 200% 수당 지급하고 있음.
''근로자가 1주일 중 근무일에 40시간을 근무한 뒤 휴일에 근로(8시간 이내)했다면 휴일근로수당 50%만 가산하면 된다는 게 행정해석의 핵심 내용이다. 국회는 이런 행정해석을 근로기준법에 명시해 지급의 ‘법적 근거’를 제공하기로 했다.''
''노동계는 근로기준법상 주당 법정 근로시간이 40시간인 점을 들어 근무일에 40시간을 근무한 뒤 휴일에 근로하면 휴일수당(50%)과 연장근로수당(50%)을 합쳐 200%의 중복할증 수당을 지급해야 한다고 주장했는데 이는 받아들여지지 않았다.''
''이런 법 개정은 그간 법원의 판결과 배치된다. 앞서 법원은 ‘휴일근무수당을 150%만 지급하도록 한 행정해석이 위법하다’며 성남시를 상대로 소송을 제기한 성남시 환경미화원들에 대해 1심과 2심에서 승소 판결을 해 휴일ㆍ연장수당을 각각 50%씩 중복가산해 통상임금의 200%를 지급하라고 판시했다.''
(1) 5인 이상 사업장
5인 이상 사업장은 일소정근로시간 이상 근무하게 되면, 통상시급의 1.5배를 연장근로한 시간만큼 지급해주시면 됩니다.
(1) 5인 이상 사업장
5인 이상 사업장은 근로제공 의무가 아닌 휴일에 근무하게 되면, 통상시급의 1.5배를 휴일근로한 시간만큼 지급해주시면 됩니다.
야간근무수당은 밤10시부터 오전6시 사이에 발생한 근로에 대해 발생합니다.
5인 이상 사업장이라면 통상시급의 0.5배를 가산하여 지급해주시기 바랍니다.
- AliasPageNames . . . . 25 matches
# config.php 파일에 다음과 같은 설정을 넣어주시면 별명 기능이 활성화됩니다.
# 이 페이지 이름을 가리킵니다.
# 또한, 별명으로 가리킨 페이지가 단 하나의 페이지일 경우에 연결이 바로되기를 원하시면
# 없는페이지이름>있는페이지1,있는페이지2
사랑하면알게되고알면보이나니그때에보이는것은전과같지않으리라>안녕
# 있는페이지<없는페이지1,없는페이지2
# 있는페이지,없는페이지,없는페이지
WikiName,위키네임,위키이름
ExtendedWikiName,확장위키네임,확장위키이름
Cairo,cairo,카이로
# 존재하는 페이지에는 인터위키(자매 페이지) 혹은 URL도 가능합니다.
# 자매 페이지 연결
- AttachmentMacro . . . . 10 matches
올리고 싶은 파일 이름 혹은 이미 첨부된 파일 이름을 {{{attachment:파일이름.확장자}}}라고 써준다.
파일이 이미 올려 있을 경우에는 그 파일을 받을 수 있는 링크가 자동으로 걸리게 되고, 파일이 아직 업로드되지 않았다면 파일을 업로드 할 수 있는 링크가 생성된다.
/!\ 모니위키 1.0.9 혹은 그 이후에 지원되는 기능입니다.
이 경우 config.php에 {{{$use_convert_thumbs=1}}}를 넣어준다.
손톱그림의 내정된 기본 크기로 손톱 그림이 만들어지고 보여진다.
- AuxCAM . . . . 27 matches
Advanced LIGO, Virgo와 같은 중력파 검출기로 부터 수집되는 데이터의 품질을 높이는 것은 중력파 천체 관측의 성능에 매우 중요한 일이다.
지상에 설치된 중력파 검출기는 매우 민감한 장치로 우주에서 오는 중력파를 검출하는 것은 물론 지구환경과 검출기 기기 내에서 발생하는 다양한 노이즈에도 민감하게 반응한다. 때문에 검출기에 들어오는 노이즈를 제거하거나 노이즈를 발생 시키는 노이즈원을 사전에 해결할 수 있도록 원인을 분석하는 일이 중요하다.
이와 같은 일들을 하기 위한 여러가지 연구가 진행 중이다. 검출기 주변에 각종 센서를 설치하여 모니터링을 하고 이 데이터를 [:auxMVC Auxiliary channel data]라고 하고 이를 근거로 노이즈를 분류하는 연구를 진행하였다.[* Rahul Biswas et al. '''Application of machine learning algorithms to the study of noise artifacts in gravitational-wave data''', Phys. Rev. D, 2013, https://arxiv.org/abs/1303.6984] 최근에는 이러한 연구에 기반해서 노이즈원까지도 분석하려는 시도가 있었다.[* Marco et al. '''Finding the origin of noise transients in LIGO data with machine learning''', https://arxiv.org/pdf/1812.05225.pdf]
검출기 초기에는 노이즈의 원인은 알 수 없지만 데이터가 쌓이면서 반복적으로 검출되는 노이즈가 있음을 육안으로 확인하고 이것들을 분류하는 연구도 진행하였다. 프로젝트의 이름은 Gravity Spy[* M Zevin et al. '''Gravity Spy: integrating advanced LIGO detector characterization, machine learning, and citizen science''', CQG. 2017] 이다.
2015년 9월 14일 아침, 최초의 중력파를 LIGO 검출기가 검출했다. 그 이후로 다양한 질량의 블랙홀 병합과 중성자 별 병합 이벤트에 대한 중력파 검출을 했고 지금도 검출중이다. 지상에 설치된 Advanced LIGO의 Sensitivity [* A. Buikema et al. '''Sensitivity and Performance of the Advanced LIGO Detectors in the Third Observing Run''', Phys. Rev. D 102, 2020]는 현재 아래 그림과 같다.
[attachment:channel_convention.pdf 라이고 보조 채널: Channel Naming Convention]
- BSN_Driver . . . . 8 matches
= 드라이버 파일 위치 및 구조 =
이다.
= BSN 드라이버 구조 =
BSC 드라이버는 두개의 개층으로 분리 된다.
Linux 드라이버 형태를 이루기 위한
{{{{color: rgb(15, 78, 100); font-size: 12px; font-weight: bold;}dm365_bsc_hw.c, dm365_bsc_hw.h }}}이다.
= 드라이버 검증 =
- BT.656 . . . . 7 matches
ITU 656(BT.656) 표준은 압축되지 않은 PAL 또는 NTSC 표준 화질 텔레비전을 스트리밍하기 위한 단순한 디지털 영상 프로토콜을 정의한다. 이 프로토콜은 비월 주사된 영상 데이터를 지원하며, 각 필드는 따로따로 스트리밍된다. ITU 656 프로토콜은 TV-out용의 DAC 칩으로 비디오 프레임을 보내는 데 사용되거나 비디오 캡쳐용 ADC 의 출력으로 사용될 수 있다.
= BT.656 데이터 스트림 형식 =
하나의 BT.656 스트림은 27 MHz 로 동작하는 픽셀 클럭 신호에 따라 동시에 8 비트를 병렬로 전송한다. 스트림 내의 비디오 픽셀 데이터의 수평 주사선은 SAV (Start of Active Video) 코드와 EAV (End of Active Video) 코드로 구분된다. 또한 SAV 코드는 비디오 필드 혹은 프레임 내의 라인 위치를 가리키는 상태 비트를 포함한다. 전체 프레임 내의 라인 정보는 SAV 상태 비트를 추적함으로써 알 수 있으며, 수신기가 새로운 스트림과 동기화(synchronize)되도록 한다.
라인 내의 각각의 픽셀은 YUV 형식으로 부호화 된다. 4 바이트 길이의 SAV 코드가 전송된 후에 Y (휘도) 신호의 초기 8 비트가 전송되고 그 다음에는 Cb (색차 U) 신호의 8 비트가 전송되며 그 다음에는 Y 신호의 다음 8 비트, 그 다음에는 Cr (색차 V) 신호의 8 비트가 전송된다. 온전한 Y, Cb, Cr 픽셀 값을 복원하기 위해서는 반드시 [크로마 서브샘플링]이 필요하다.
- Bias_Variance_Tradeoff . . . . 65 matches
기계학습, 통계적 추론(Statistical Inference)을 공부하다 보면 언젠가는 Bias-Variance Tradeoff라는 개념을 만나게 된다. 사실, 아무리 기를 써도 피할 수 없다 :) Bias의 사전적 의미는 “편이”, “선입견”, “편견”, “성향”, “치우침”, Variance는 “변화”, “편차”, “분산”이다. 기계학습의 문맥에서 이들의 의미는 ‘학습 모형이 입력 데이터에 얼마나 의존하는가’라고 이해하면 쉬울 것 같다. Bias가 높다 / 낮다는 말의 의미를 혼동하기 쉬운데, 내가 찾아낸 헷갈리지 않는 설명은 이렇다.
Bias, 즉 선입관이 크면, (좋게 말해서) 줏대가 있고 (나쁘게 말해서) 고집이 세기 때문에 새로운 경험을 해도 거기에 크게 휘둘리지 않는다. 평소 믿음과 다른 결과가 관찰되더라도 한두 번 갖고는 콧방귀도 안 뀌며 생각의 일관성을 중시한다. (High Bias, Low Variance) 반대로 선입관이 작으면, (좋게 말하면) 사고가 유연하고 (나쁘게 말하면) 귀가 얇기 때문에 개별 경험이나 관찰 결과에 크게 의존한다. 새로운 사실이 발견되면 최대한 그걸 받아들이려고 하는 것이다. 그래서 어떤 경험을 했느냐에 따라서 최종 형태가 왔다갔다한다. (High Variance, Low Bias)
일란성 쌍둥이가 경제적 능력과 가풍이 크게 다른 두 집안에 입양되었다고 하자. 20년 후 그들은 서로 얼마나 달라져 있을까? 유전적으로 타고난 Bias가 높다면 환경의 차이에도 불구하고 교육으로 학습된 개인차는 상대적으로 작을 것이며, Variance가 크다면 둘은 정말 완전히 다른 사람이 되어 있을 것이다.
= 이 개념이 기계학습에서 왜 중요할까? =
기계학습이 다루는 중요한 문제 중 하나는, 귀납적인 알고리즘을 이용해서 데이터를 잘 분류하는 모형을 찾는 것이다. 그런데 이런저런 제약이 많아서 데이터 전체를 살펴볼 수는 없고, 일부만 샘플링해서 학습해야 한다. 모형마다 표현할 수 있는 능력이 다르기 때문에 문제의 복잡도에 따라서 적당한 모형을 고르는 것이 중요하다. 닭 잡는 데 소 잡는 칼을 쓰는 것도, 바늘 들고 소 잡겠다고 설치는 것도 모두 현명한 일이 아니므로. 위키피디아에서 가져온 오른쪽 그림에서 녹색 곡선이 소잡는 칼인데, 과욕이 불러온 참사를 목격할 수 있다. 반대로, 만약 이런 데이터를 곡선이 아닌 직선으로 분류하려고 하면 어떤 일이 생길지를 생각해보자. 그게 바로 바늘이다. 검은선처럼 적당한 도구를 찾아야 한다.
세상일이 복잡다단한데도 자기만의 잣대로 너무 단순하게 해석해버리는 사람을 우리는 순진(naive)하다고 한다. 그런 사람이 내놓는 결론은 정확도가 낮아서 신뢰하기 힘들다. 반면에, 자기 경험에 지나치게 생각이 맞춰진(overfitting) 사람의 의견은 그 경험과 조금만 상황이 달라져도 신뢰하기 어렵다. 일부 샘플을 과신해서 그 하나하나에 다 맞추려다 보니 보편성을 잃어버리는 것이다. 그렇다고 다시 변화에 보수적인 태도를 취하면 유연성을 잃어버린다. 경험에서 배우는 게 적고 스스로의 능력에 한계를 지우게 된다. 그 결과, 순진해진다.
이렇게 하나를 추구하면 다른 하나를 희생해야 하기 때문에 Bias와 Variance는 서로 트레이드오프(tradeoff) 관계에 있다고 한다. 결국 답은 이 둘의 합이 최소가 되도록 모델링을 잘 해야 한다는 것인데, 통계학에는 이 Bias와 Variance의 합을 일컫는 용어가 이미 있다. 바로 위험(risk)이다.2 Bias, Variance, Risk 이런 개념들을 창안한 학자들이 이름 지을 때는 경험을 통해서 일상용어 중 적당한 것을 가져다 붙인 것이겠지만, 뒤늦게 공부하는 후학으로서는 거꾸로 이런 학술용어의 의미를 일상에서 곱씹어 보게 된다.
경험으로부터 어떻게 배워야 할까? 기계학습에는 이런 위험을 최소화하는 수학적 방법이 있다지만, 우리 삶에서 위험을 최소화하는 알고리즘은 어디에 있을까? 아니, 있기는 할까?
MSE를 계산을 전개해보면 결국은 Variance와 bias를 최소화하는 일이 된다. 둘의 관계는 trade-off로 bias를 낮아지면 variance가 높아지고, variance가 낮아지면 bias가 높아지게 된다.
Class가 두 개인 분류 문제를 예를 들어보자. 두 Class의 Label을 0과 1로 할당했다. 두 Class는 평균이 0, 1인 정규분포를 따른다고 가정할 수 있다. (분산은 모름) 기계학습 모델은 두 클래스를 학습을 통해 학습 데이터를 가장 잘 표현하는 latent variable에 할당하는 과정을 거치게 된다. 이런 과정을 통해 찾아낸 parameter의 평균과 실제 parameter와 차이를 bias라고 하고 찾아낸 parameter들의 분산을 variance라고 한다.
Gaussian mixture 모델처럼 학습데이터 하나가 \(\theta_i\)를 갖는다. \(\theta_i\) 0에서 1사이의 값을 갖는다. [* http://jaejunyoo.blogspot.com/2018/02/minimizing-negative-log-likelihood-in-kor-3.html]
- BlogChanges . . . . 2 matches
[이건 어떨까]
wiki라는게 이렇게 쓰는건가?B)
- BlogChangesMacro . . . . 3 matches
특정 페이지에 대한 blog rss
전체 페이지에 대한 BlogChanges
특정 페이지에 대한 BlogChanges
- CCTV . . . . 3 matches
3.3V 공급이기 때문에 OUTPUT LEVEL 값이 0~ 3.3V 입니다.
GIO24(T3) I2C_EN : I2C 레벨 컨버터 역할 칩( PCA9306DCU)을 Enalbe시켜 i2c 통신한 후 disable을 시켜 차 후 어떠한 디바이스와 I2C 통신을 할때 영향을 미치지 않게 설계하였습니다.
- CalendarMacro . . . . 2 matches
이게 뭔가?? -- [wskim] [[DateTime(2010-12-03T04:33:09)]]
하이 ~ -- [wskim] [[DateTime(2010-12-03T04:37:44)]]
- CamtronPackage . . . . 1 match
Application 팀에서 작업한 내용이 들어가 있는 패키지
- Camtron_complie . . . . 1 match
*make installaew를 하게 되면 .a 파일들이 IPNC쪽으로 복사 됨.
- CategoryCategory . . . . 6 matches
분류 페이지에 들어가서 제목을 클릭하면 그 분류 페이지에 대한 역링크를 서치하고, 그 분류페이지의 링크가 들어있는 모든 페이지 목록을 보여주게 됩니다.
또한 각각의 분류는 그 분류의 최상위 분류인 Category''''''Category를 가리키는 링크를 가지게 함으로서, 모든 분류페이지를 최종 역링크를 Category''''''Category가 되게 할 수도 있습니다.
OriginalWiki와 일관적으로 만드려면 모든 분류는 "Category"로 시작하도록 지정해야 합니다. 물론 다른 방식으로 이름을 붙여도 문제되지 않습니다.
- CommentMacro . . . . 7 matches
특정 페이지 하단에 [[Comment]]를 넣으면 http://moniwiki.kldp.net/''''''에서 보이듯이 맨 하단에 CommentMacro가 붙게 됩니다.
만약 모든 페이지에 Comment 매크로를 붙이기를 원한다면 config.php에 다음을 추가해주세요.
/!\ Comment 매크로 이외에 자신이 만든 매크로가 맨 하단에 들어가도록 위의 방법을 쓰실 수 있습니다. 위의 방법으로 FootNoteMacro와 CommentMacro를 넣은 예입니다.
- DM365_VoiceCodec . . . . 1 match
읽고 쓰는 데이터의 크기를 8-bit로 하고, timing control은 1 word, bit control은 unsigned로 했다.
- DNN_index . . . . 23 matches
Andrew Ng(앤드류 응, 스탠포드대학) 과 구글이 2012년에 16,000개의 프로세서와 10억개 이상의 뉴럴네트워크를 이용해서 유튜브 비디오중에서 고양이를 인식하는 DNN 연구를 진행했다. Unsupervised learning을 이용해서 고양이를 찾음.
중국 바이드의 IDL(Institute of Deep Learning)의 산호세 연구소를 맡게 됨.
Geoffery Hinton 교수(캐나다 대학) - DeepMind 설립자, 구글이 회사를 인수하면서 구글에서 일함. 머신러닝의 부흥을 이끈 장본인
Yenn LeCun(뉴욕 대학) - 페이스북에 채용됨. [[https://www.reddit.com/r/MachineLearning/comments/25lnbt/ama_yann_lecun Reddit]]에서 강연?
* LuaJit 기반 Torch7 이라는 DNN 툴킷이 이음. (http://torch.ch/)
Yoshua Bengio(토론토 대학) - 암흑기에 있던 머신러닝에 새로운 화두를 이끓어낸 장본인
Xavier Glorot(DIRO, 몬트리얼 대학) - ---Yoshue Bengio의 제자인거 같음. --- 제자는 아니고 뱅지오 렙에서 딥러링 과제를 같이 했네요.
Pascal Vincent - [:ann_rnn RNN] (Recurrent Neural Network) 예전의 RNN은 인공신경망이 너무 깊어서 오랜 시간 전의 데이터들을 까먹는 현상(vanishing gradient problem) 때문에 학습이 힘들었는데요, 유르겐 슈미트후버(Jurgen Schmidhuber) 교수의 Long-Short term Memory란 게이트 유닛을 노드마다 배치하여 이러한 문제를 극복, 현재는 컨볼루셔널 네트워크의 가장 강력한 경쟁 상대로 자리매김하고 있습니다.
김정희 (네이버) - 국내에서는 가장 활발하게 활동 중.
이창기 교수 (강원대) - [attachment:kangwon_changgi.pdf 발표자료]
김준모 교수 (카이스트) - [attachment:KAIST_junmo.pdf 발표자료]
- DSC_Depthwise_separable_Convolution . . . . 16 matches
Inception 과 같이 CNN의 계산량을 줄이기 위한 또 하나의 기술로 Depthwise separable convolution과 pointwise convolution이 있다.[* https://m.blog.naver.com/PostView.nhn?blogId=chacagea&logNo=221582912200&categoryNo=43&proxyReferer=https:%2F%2Fwww.google.com%2F]
일반적인 Convolution 연산에 대해서 생각해 보자.[* https://zzsza.github.io/data/2018/02/23/introduction-convolution/] 위 그림과 같이 \(D_F, D_F, M\) 차원의 입력을 N개의 커널로 합성곱(Convolutional operator)을 수행하게 되면 \(D_G \times D_G \times N\) 크기의 결과를 얻을 수 있다. 이 결과를 얻기 위해서 사용한 weight의 갯수를 생각해 보면 \(D_K \times D_K \times M \times N\)개가 된다.
이 것을 Depth-wise separable convolution과 Pointwise convolution을 이용하면 동일한 모양의 결과를 얻는 가벼운 모델을 사용할 수 있다.
여기서 중요한 것은 동일한 모양의 결과를 만들어 낸다는 것이지 내용상 같은 결과를 얻을 수 있다는 것을 의미 하지 않는다.
먼저 Depth-wise separable convolution의 연산을 보면, 합성곱 연산을 모든 입력에 대해서 수행하는 것이 아니라 채널별로 합성곱을 수행하는 것이다. Depth에 대해서 독립된 결과를 얻을 수 있고 결과로는 \(D_G \times D_G \times M\) 크기의 결과 얻는다. 입력과 동일한 채널수를 유지한다. 이 결과를 얻기 위해서 사용한 weight의 갯수는 \(D_K \times D_K \times 1 \times M\)이다.
Depth-wise separable convolution 결과에 \(1 \times 1\) 필터 합성곱 연산을 수행해서 원하는 채널만큼 새로운 채널을 생성할 수 있다. 결과적으로 일반적인 합성곱 연산을 수행했을 경우과 동일한 모양의 결과를 얻었다. 이 때 사용한 필터의 갯수는 \(1 \times 1 \times N \)이 된다. Depth-wise separable convolution에 사용한 필터 갯수 \(D_K \times D_K \times 1 \times M\)를 더하면 총 \(D_K \times D_K \times 1 \times M + N\)개의 필터로 \(D_K \times D_K \times M \times N\) 개의 필터를 사용한 합성곱 연산과 동일한 모양을 만들었다.
이와 같은 기능을 하는 함수는 이미 pytorch로 간단히 구현된 코드도 있다.[* https://wingnim.tistory.com/104]
- DTW_dynamic_time_wrapping . . . . 21 matches
두개의 시계열 데이터의 유사도를 알아내기 위한 알고리즘이다.[* <https://okky.kr/article/400717> 간단한 python code 있음.][* https://hamait.tistory.com/862] 시계열 데이터는 시작점과 속도에 따라서 유사성을 비교하기가 힘들다. 단순히 Euclidean Distance만을 계산하면 비슷한 신호도 전혀 다른 신호로 나타낼 수 있다. 이를 극복하기 위해서 자신의 index뿐만 아니라 주변 다른 요소와도 비교해서 더 비슷한 요소를 자신의 비교쌍으로 놓는다면 어느정도 극복 할 수 있을 것이다. 아래 그림에서 보는 것과 같이 DTW는 자신과의 비교쌍을 최대한 비슷한 요소로 잡는다.
동적시간와핑(DTW, Dynamic Time Warping) 알고리즘은 쉽게 말해 시간 흐름에 따른 패턴간의 유사성을 측정하기 위한 알고리즘이다.[* https://manzanera.tistory.com/entry/Dynamic-Time-WarpingDTW-%EB%8F%99%EC%A0%81-%EC%8B%9C%EA%B0%84-%EC%9B%8C%ED%95%91]
길이가 각각 m, n 인 두 개의 시계열이 있을때, 두 시계열의 비교를 위해 \(m \times n \) 행렬을 만들어 보자. 이 행렬의 요소는 두 점 x좌표와 y좌표의 거리를 의미한다. 두 점 사이의 거리는 유클리드 거리로 계산한다.
warping 경로 W값은 x와 y사이의 매핑을 정의하는데, W의 k번째 요소는 \(W_k = (i,j)_k\)로 정의된다. 따라서 위에서 이야기 했던 각각의 m, n 인 두 개의 시계열을 보자면 \(W =\max(m,n) \le k < m+ n -1\)이 될 수 있다. 이 때, W는 아래 세 가지 조건을 만족해야 한다.
* '''이동 크기 조건(step size condition)''': 입력 패턴과 참조 패턴 비교 시 격자상의 비교를 위한 이동 크기는 일정하게 하여 모든 격자의 패턴을 비교해야 한다.
밑의 그림은 최단 경로를 찾아가게 되는 과정을 잘 보여주고 있다. 이 그림에서는 맨 아래의 시작점으로부터 시작하여 오른쪽, 위쪽, 대각선으로 가장 작은 수를 향하여 전진하게 된다. 그때 제일 낮은 값을 향해 가고 제일 끝 종착지에서 지나온 값들을 더한 값중 가장 작은 경로가 제일 이상적인 경로다.
하지만 이 그림에서 빠진 부분은 시작지점으로부터 계속해서 더해가지 않았다는 점이다. 그 부분은 참고하고 봤으면 좋겠다.
- DrawMacro . . . . 3 matches
Q: Mac 에서는 편집이후에 drawing 화면이 없어지지 않습니다.
윈도우즈의 경우는 다음의 파일을 받아서 직접 압축을 풀어준다. {{{applets/TWikiDrawPlugin/}}}twikidraw.jar 및 *gif 파일이 있게끔 해야 한다.
- DueDateMacro . . . . 7 matches
일단 위를 보면 (어째선지 미리보기에선 글씨가 깨져보이는군요 ...) 오늘(12월1일)과 내일이 똑같이 0일 남았다고 되어있습니다. 제 위키에서는 이틀 다 '오늘입니다' 라고 표시되던데.. 버그인듯 하군요 ^_^;; - stania
리눅스 + 모니위키 버전 1.0.5 모두 잘 됩니다. 이곳의 DueDateMacro는 옛날 버전이라서 이렇습니다. --WkPark
- EmbeddedLinux시작하기 . . . . 84 matches
리눅스는 버전업이 이루워 지면서 많은 부분에서 발전해 왔다. 하지만 기본 구조는 변경되지 않은 채로 남아 있다.
기본 구조는 다음과 같은 요소로 이루워져 있다.
HAL(Hardware Abstraction Layer)는 플랫폼 하드웨어를 가상화하므로 드라이버를 다른 하드웨어에 쉽게 포팅할 수 있도록 해 준다.
다음은 리눅스 커널 2.6에서 지원하는 (x86을 제외한) 임베디드 프로세서 아키텍처들이다.
* 타이머
리눅스 커널은 전체 메모리를 일반적으로 4KB 크기인 페이지 단위로 나우어 관리한다. 커널은 모든 페이지를 접근할 수 있지만, 실제로는 그 일부만 사용하고 나머지는 응용 프로그램에서 사용하게 된다.
* '''커널 쓰레드''': 이는 사용자 공간의 정보를 포함하지 않는 프로세서이다. 이들은 항상 커널 공간 내에서 실행된다.
* '''사용자 프로세서''': 각각의 사용자 프로세서는 가상 메모리 기능으로 인해 자신만의 주소 공간을 갖는다. 이들은 인터럽트, 예외, 시스템 콜을 통해 커널 모드로 진입할 수 있다. ''프로세스가 커널 모드로 진입하면, 원래와는 다른 스택을 이용한다는 것에 주의하자.'' 이것을 커널 스택이라 하며, 각 프로세서는 자신만의 독자적인 커널 스택을 갖고 있다.
* '''사용자 쓰레드''': 쓰레드는 하나의 사용자 프로세스로 매핑된 또 다른 실행 개체이다. 사용자 공간의 쓰레드는 동일한 텍스트, 데이터, 힙 영역을 공유한다. 또한 열려 있는 파일 목록, 시그널 처리 함수 등의 자원은 공유되지만 스택 영역은 별도로 존재한다.
리눅스에서는 다양한 종류의 파일 시스템들이 VFS(Virtual File System)라는 계층을 통해 관리 된다. VFS는 시스템상의 다양한 장치들에 저장된 데이터를 일관적인 형식으로 바라볼 수 있도록 해 준다.
리눅스가 동작하는 모든 장치는, 그것이 임베디드 시스템이든 서버 머신이든 간에 최소한 하나 이상의 파일 시스템이 필요하다.
이것은 특별히 파일 시스템을 필요로 하지 않는 실시간 운영체제와 구분되는 특징이다.
리눅스의 IO서브시스템은 시스템상에 존재하는 장치들에 대해 단순하고 통합적인 인터페이스를 제공한다. IO 서브시스템은 다음과 같은 장치들을 지원한다.
* 순차적인 접근이 필요한 장치들을 지원하는 문자 장치(Character device)
* 임의적인 접근이 가능한 장치들을 지원하는 블록 장치(Block device). 블록 장치는 파일 시스템을 구현하는 기본이 된다.
리눅스의 가장 큰 장점 중의 하나는 다양한 프로토콜을 지원하는 강력한 네트워킹 기능이다.
리눅스의 IPC(Inter-Process Communication, 프로세스 간 통신)는 (비동기 통신 방식인) 시그널과 파이프, 소켓은 물론 공유 메모리, 메시지 큐, 세마포어와 같은 System V의 IPC 메커니즘을 포함한다.
* '''프로그램''': 파일 시스템상에 존재하는 응용 프로그램으로, 메모리상에 로드되어 실행된다. 가상 메모리 기능으로 전체 프로그램 이미지가 메모리상에 로드 되는 것이 아니라 현제 실행 중인 부분의 페이지만 로드 된다.
* '''가상 메모리''': 프로세서별로 각각의 주소공간을 갖도록 해준다. 가상 메모리는 공유 메모리와 같은 고급 기능들을 이용할 수 있도록 한다. 각 프로세스는 가상 메모리상에 자신만의 고유한 메모리 맵을 가지며, 이는 커널의 메모리 맵과는 완전히 별개의 것이다.
* '''시스템 콜''':커널로 진입할 수 있는 지점으로 이를 통해 커널은 응용 프로그램을 대신해 운영체제의 서비스를 제공한다.
- English_letter . . . . 16 matches
Dear ~~~로 쓰는 것은 다들 알고 계실텐데요. 받는 사람이 Smith씨인 경우 Dear Mr. Smith, 로 쓰고, 받는 사람이 누구인지 모르는 상태에서 편지를 쓸 경우에는 Dear Sir or Madam, 이라고 씁니다. 여기서 주의할 점은 이름 뒤에는 꼭 Comma를 찍으셔야 합니다.
편지는 한국편지던, 일본편지던, 중국편지든 항상 화두를 잘 던져야 하죠? 내가 이 편지를 왜 쓰게 되었는지, 어떤 의사를 전달하려고 하는지를 상대방에게 잘 전달할 수 있어야 합니다.
1. '''이 편지를 쓰는 목적'''
1. '''무엇에 대해 이 편지를 쓰는지'''
1. '''좀 더 강한 강조를 하고 싶을 때''' : 내가 쓰는 편지의 주제나 내용에 대해 읽는 이는 좀더 확실히 새겨들 것을 요구할 때
(I look forward to + 명사형은 명사형을 고대한다는 뜻으로 굉장히 많이 쓰이는 표현입니다)
Dear + 사람이름을 아는 경우에는 Yours Sincerely, 를 쓰고, Dear Sir or Madam, 인 경우에는 Yours Faithfully, 를 사용합니다.
이 경우에도 Comma를 찍는 것을 절대 잊어서는 안됩니다.
이상 영어편지쓰기에 대하여 간략하게 알아보았습니다. 외국인들은 정확하고 간결한 표현을 좋아합니다. 편지를 쓸 때에는 간략하지만 본인이 원하는 바로 정확하게 전달할 수 있도록 깔끔하고 간략하게 편지를 정리하는 것이 중요합니다. 이상입니다.
- FPGA_PSA_Implementation . . . . 45 matches
손재주 박사의 아이디어인 FFT PSA 를 FPGA 에 구현한 내용에 대해서 기술 하려고 한다.
FPGA 상에서 여러 가지 방법으로 FFT 가 개발되고 있다. 계산에 들어가는 point 의 개수에 따라서 2Radix, 4Radix, 8Radix 등으로 나뉘고, 데이터 패스의 형태에 따라서 SDC(Single-path Delay Commutator), MDC(Multi-path Delay Commutator), SDF(Single-Path Delay Feedback), MDF(Multi-Path Delay Feedback)[[footnote(A New Approach to Pipeline FFT Processor - http://ipdps.cc.gatech.edu/1996/PAPERS/S19/HE/HE.PDF)]]로 나뉠 수 있다.
PSA FFT 는 R2MDC(Radix-2 Multi-path Delay Commutator)에 속하며 두 개의 데이터를 연산의 기본 단위로 사용하는 Radix2 알고리즘이다. 또한, Stream data 입력을 받아 내부에서 Multi-path 로 데이터를 병렬화해서 연산 속도를 높이는 방식을 취하며 출력 데이터가 입력으로 돌아오는 Feed-back 이 없어 계산 블록 마지막에 결과를 확인할 수 있는 구조이다.
PSA FFT 는 그림 1에서 보이는 futterfly 연산을 최대한 병렬화하려는 방법을 취하고 있다. 그림 1의 futterfly 연산 모듈을 병렬화 가능한 형태로 묶으면 그림 2와 같은 형태로 묶을 수 있다.
그림 2는 그림 1를 그대로 표현한 것이다. 하지만 FPGA 에 들어오는 입력 신호는 병렬구조가 아닌 순차구조이기 때문에 그림 2를 그대로 사용할 수 없다. 이것을 순차적 입력을 받는 형태로 수정하게 되면 그림 66과 같은 구조를 갖게 된다. 순차적인 입력을 받아 state 가 증가 할수록 병렬화 정도를 증가시키는 구조이다.
전체 PSA FFT 의 구조는 그림 3과 같이 state마다 전 state의 두 배의 Butterfly 연산을 병렬처리해서 연산 속도를 극대화한다. 계산해야 하는 데이터의 수가 늘어날수록 state는 많아지고 그 만큼 사용하는 FPGA자원 사용량은 늘어나게 된다. 하나의 butterfly 연산은 그림 4와 같은 구조를 가진다. butterfly 모듈 하나는 4개의 곱셉기와 3개씩의 뺄셈기, 덧셈기를 가지며 하나의 fifo 로 구성된다. 하나의 butterfly 모듈이 사용하는 DSP의 개수는 16개이다.
이 내용을 VHDL 로 구현하였는데 그 내용은 APPENDIX 로 붙이겠다.
입력이 들어가기 시작해서부터 출력이 완전히 나오기 까지 Clock를 시뮬레이션을 통해서 얻어낸 결과이다.
state 하나를 계산하는데 38clk가 소효되며 state가 증가 할수록 2^^n^^ (n≥0)clk 가 추가되며 계산되는 데이터 point 숫자만큼 추가 Clock이 필요하다. 또한, 기본적으로 2clk은 데이터 출력을 위해 사용한다.
예) 8point 데이터
PSA FFT를 구현하는데 있어 가장 중요한 요소는 DSP의 개수이다. 계산 POINT에 따른 필요 DSP의 개수는 다음과 같다.
계산 하려는 데이터를 n point라고 하면,
n point를 계산하는데 필요한 dsp 개수 = 16 * (n-1) 이다.
Butterfly module 하나를 구현하는데 필요한 dsp의 수는 16이고 n point 데이터를 계산하기 위해 필요한 butterfly module의 숫자는 n-1이기 때문이다.
int leg_diff;// leg 차이
이것은 가장 먼저 들어온 데이터가 아웃 신호에 물려 있게 하는 옵션이다. (한 클럽 앞에서 데이터를 갖고 갈 수 있다.)
'''void dp(complex x)''' - complex 타입의 데이터를 double형과 IEEE754 포멧으로 출력하기 위한 함수.
'''double atod(char *str)''' - 기존의 atof()함수와 같이 문자형을 double형 데이터로 변환해주는 함수.
'''int file_load(char* filename, double* data, int* size)''' - 파일로 부터 double형 데이터를 얻어오는 함수 파일에서 문자를 읽어 double형 데이터를 취한다.
- FindPage . . . . 12 matches
== 페이지 이름을 아신다면, 페이지 이름을 넣어 검색하실 수 있습니다 ==
== 페이지 이름을 잘 모르신다면 관심있는 내용을 검색해보세요 ==
* RecentChanges: 최근에 고쳐진 페이지와 사람들의 참여 내역을 보여줍니다.
* TitleIndex: 이곳에 있는 모든 페이지 목록을 보여줍니다.
* WordIndex: 이곳의 모든 페이지 이름에 사용된 단어의 목록
- Finite_Elements_Method . . . . 99 matches
''유한요소법은 연속체인 구조물을 1차원인 막대, 2차원인 삼각형이나 사각형, 3차원인 중실체(사면체, 6면체)의 유한 개의 요소로 분할하여 각기의 영역에 관하여 에너지원리를 기초로 하는 근사해법에 기하여 계산을 해나가는 수치계산방법이다. CAE 중에서 구조해석을 중심으로 하여 가장 많이 사용되는 방법으로, 복잡한 형상의 응력해석 등을 위해 개발된 방법이다. 방대한 매트릭스 연산을 하는 것이므로 고성능의 컴퓨터가 필요하지만, 최근의 컴퓨터 발전에 의하여 퍼스널 컴퓨터로도 가능하다. 수치계산방법에는 그밖에 차분법, 경계요소법 등이 있다.''
수치해석 기법은 다음과 같이 연속체 모델과 불연속체 모델로 구분할 수 있다.
내 전공은 수학 중에서도 수치해석 및 수치편미분방정식이고, 그 중에서도 수리유체(Mathematical Fluids)이다. 사실 역학이라는 분야를 그렇게 좋아하지 않는데.... 오히려 전자기학 부분을 더 재미있어하는데....... 어떻게 하다보니 이런 전공을 선택하게 되었다. 그래도 하다보면 미해결 된 문제가 산더미 같이 쌓여있더 도전 가치가 많은 문제가 엄청 많다.
졸업할 때 그래도 석사논문에는 수치해석학 전공이라고 쓰여져 나갈텐데, 사실 수치해석과 같은 응용수학분야보다는 그 동안 순수수학 방면에 내 관심이 치우쳤던 것은 사실이다. 원래 내꿈이 순수와 응용 양다리를 걸치면서 사기꾼(?) 노릇을 좀 해보는 거였는데..... 이상하게도 우리 나라에서는 이런 걸 별로 안 좋아하는 분위기이다.
유한요소법은 도대체 누가 생각해내었는가? 혹자는 중세 농부다!라고 말을 하기도 하고, 미국 사람들은 바부스카(Babuska)라고 하고, 자존심 내세우기 좋아하는 중국 짱께들은 펭캉(Feng Kang)이라고 주장하기도 하고..... 하여간 누구 밑에서 공부했느냐를 따져보면 전부 자기네들 스승이나 학파에서 만들었다고 주장한다.
유한 요소법. 말그대로 유한하게 영역을 잘라서 생각해서 편미분 방정식의 해를 구하는 방법이다. 즉, 공학이나 다른 분야에서 수학적으로 잘 풀리지 않는 Navier-Stokes 방정식이나 KdV(Korte de Vries)방정식 같은 것을 여러 패키지(Package) 프로그램을 돌려서 Simulation하게 되는데... 이런 Simulation의 결과가 과연 합당한 것이냐 아니냐를 판별하는 수학적 기법 중에 하나이며 동시에 이런 Simulation의 기초가 되는 방법이다. (컴퓨터 유효 숫자처리 문제나, 오차가 반복되면 이 오차가 점점 커져 원래 값과는 동떨어지는 그런 현상 때문에 컴퓨터 Simulation이 맞다 틀리다 판별하기가 쉽지는 않다....)
어쨌든, 유한 요소법은 사실 순수수학에서 해석학과 편미분방정식 이론이 정립되면서 발전되었다고 볼 수 있겠다. 즉, 원래 편미분 방정식을 그대로 푸는 것이 아니라, Weak Formulation이라는 과정을 거쳐 편미분 방정식을 적분형태로 표현하게 되는데, 이 때 Test Function Space나 여러 Hilbert 공간 등 적당히 조건이 통제된 우리 입맛에 맞는 함수 공간을 선택하게 된다. 이 떄 이런 함수 공간은 일반적으로 차원이 무한대이므로 이는 Simulation하는 데 적당하지 않다.
그래서 이러한 함수 공간의 부분공간(Subspace)로 유한차원의 부분 공간을 생각하게 되는데, 사실 이는 갤러킨(Galerkin) 방법이라는 이름으로 약한 수렴(Weak Convergence)와 관련하여 어느 정도 이론이 정립되어 있다. 현실적으로 유한차원 공간이 되면 우리가 학부에서 많이 배우는 선형대수(Linear Algebra) 지식을 사용하여 기저함수(Basis Function)를 잡게 되고, 이를 이용하여 이런 편미분방정식 문제가 행렬문제 Ax=b 형태의 문제로 바뀌게 된다. 이때 지금까지 이 기저함수로 부분적 선형함수(Piecewise Linear 함수)가 많이 사용되고 있다.
또한 우리가 해결하고자 하는 영역(Domain) 역시 아래 그림처럼 삼각형 형태로 자르게(Triangulation) 된다. 어떻게 자를 것이냐는 문제 역시 아주 중요해지는데, 이를 그물코 형성(Mesh Generation)이라고 한다. 사실 아래 그림은 원에서 이런 삼각형 요소를 잡은 것인데, 만약 도메인에 나쁜 성질(뾰족한 점, cusp와 같은 점)이 있으면 쉽게 잡기도 힘들다. 또한 이러한 Mesh Generation은 나중에 Computation Cost에도 직접적인 영향을 미치기 때문에 (돈문제에 사람들은 민감하다....) 어떻게든 최대한 적게 잡고 좋은 수렴율(어짜피 유한 차원 공간이기 때문에 원래 편미분 방정식의 해와 같기가 쉽지 않다.)을 얻을까 고민하고 있다. 이를 적응 그물코 형성(Adaptive Mesh Refinement)라고 한다. 아직 이부분에 관한 연구가 진행 중에 있다. 수치해석 학술지 저널에 이런 주제로 많은 논문이 실리고는 있지만 거의 대부분 부분적인 결과들이다.....
또한 FEM은 기존에 해석학에서 많이 알려진 부등식을 사용하거나, Green Function을 사용하여 실제 해의 오차를 기본적으로 쉽게 측정할 수 있게 해 준다. 이를 선험적 측정(A priori estimate)라고 하는데, 일단 기본적으로 오차가 이정도 이내에는 있다는 것이 이야기 해 준다. 즉, 실제 해를 구하지도 않고, 단지 수학적인 공식만 쭉 나열하다보면 이러한 측정을 쉽게 얻을 수 있다. 물론 이는 나중에 좀 더 해에 관한 고민을 하고 나면 경험적 측정(A posteriori estimate)를 통해 더욱 더 엄밀한 측정을 할 수 있게 된다.
여기까지는 그나마 약간 수학적인 지식을 가지고 접근하는 것이다. 사실 이러한 접근을 위해서도 해석학에 관한 지식이 많이 요구된다. 실변수함수론, 함수해석학 등에서 나온 지식도 상당부분 요구한다. 따라서 이미 시중에 나와있는 2,000만원짜리 패키지 프로그램이나 삼성 종기원에서 쓴다는 5,000만원짜리 패키지는 이러한 수학적 기반위에서 프로그래머들이 매틀랩이나 C, Fortran 등등으로 짠 응용 프로그램이다. 또한 이러한 상용코드는 극비로 공개가 잘 되지 않는다. (당연한 이야기)
이런 FEM의 연구가 한계에 부딪히는 부분이 생겨나서 요즘은 이의 응용으로 여러가지 방법이 제시되고 있다. 물론 약간 다른 아이디어들이 들어가 있기는 하다. 유한부피법(Finite Volume Method, FVM)이나 세포요소법(Cell Element Method), 경계요소법(Boundary Element Method) 등등 거의 대부분 편미분방정식의 적분 형태에서 파생된 방법이거나 선형함수의 단점을 보완하고자 도입된 다항식에 관한 방법론이다. (사실 우리는 다항식에 대해서 모르는 부분이 엄청 많다. 잘 아는 것 같지만서도........)
[출처] 유한요소법(Finite Element Method)이란??|작성자 쩡익
- Fortran95_Tutorial . . . . 350 matches
Fortran은 각 버전 별로 조금의 차이가 있는데 그 차이는 명확하도 컴파일 자제가 되지 않기 때문에 호완성이 떨어짐.
앞의 두개는 실행 가능한 파일이고 마지막 ''.o'' 파일은 Object 파일이다.
Object 파일을 여러개 묶어서 하나의 실행 파일을 만들 수 있는데 그때를 위함 과정이라고 보면 된다.
이때 주의해야 할 점은 모든 Object 파일을 다 합쳤을때 '''program''' 키워드는 한번은 존재해야 한다는 것이다.
보통은 이러하지만 사용하는 머신에 따라서 자료형의 크기는 달라질 수 있으니 주의하기 바란다.
C언의 const 같은 역할이다. 프로그램의 첫 머리에 정의하고 프로그램 전반에 반복해서 사용하는 경우에 사용한다.
이다.
* 매개변수문(parameter)에서 정의한 변수 (variable)은 실제에서 변수가 아니라 그 값이 변하지 않는 상수이다.
Fortan90에서는 변수 이름의 길이의 제한이 없지만 Fortran77에서는 ''1-6''글자 이여야 한다는 제한이 있다.
이는
논리식 (logical expression)은 .TRUE. 이나 .FALSE.의 값만이 가능하다.
논리식은 그 뜻이 분명한 논리 연산자logical operators .AND. .OR. .NOT.와 결합할 수 있다.
마지막 예에서 보듯 우선 순위는 중요하다. 수식의 값 구하는 것이 가장 먼저이고 다음에 관계 연산자, 마지막으로 논리 연산자이다. 따라서 위 예에서 b는 .FALSE.가 될 것이다.
가장 간단한 문장은 논리 if문이다.
이는 한 줄에 적어야 한다. 위 예에서는 x의 절대값을 구하는 것이다.
if 내부에서 한 문장 이상을 수행하여야 할 경우에는 다음의 syntax를 사용한다.
수행 순서는 위에서 아래 방향이다. 조건식은 하나가 참일때 까지 순서대로 그 값을 구한다. 그 후 그와 관련된 code를 수행하고 endif 이후의 다음 문장으로 뛰어 넘는다
do-loop 는 간단히 세고자 할 경우 사용한다. 다음은 정수 1부터 n (n의 값은 다른 곳에서 지정되었다고 가정한다.)까지의 합을 매번 구하는 예이다.
숫자 10 은 문장 번호 label이다. 보통 한 프로그램 안에 문장 번호가 필요한 loop와 다른 문장이 많이 있다. 각각의 프로그램 (또는 부프로그램) 안에서 고유의 문장 번호를 부여하도록 주의하여야 한다. 칸 (column) 2-5는 이 문장 번호를 적는 곳이다. 문장 번호롤 사용하는 숫자는 의미가 없으므로 어떤한 정수를 사용하여도 관계없다. 보통 한 번에 10씩 증가하도록 한다.
do-문장에서 정의한 변수는 특별한 명려이 없는 한 1씩 증가한다. 그러나 step 을 사용하여 그 증가량을 다른 정수로 바꿀 수 있다. 다음은 1부터 10사이의 짝수를 큰 수부터 인쇄하는 프로그램이다.
- FortuneMacro . . . . 4 matches
Fortune 매크로 플러그인은 GNU fortune프로그램을 이용한 매크로입니다.
1. fortune이 설치되어 있어야 한다. {{{/usr/bin/fortune, /usr/share/games/fortune/}}}
1. 이게 맞지 않는다면 {{{plugin/fortune.php}}}에서 소스를 직접 조정해 주세요.
Fortune 매크로는 fortune파일의 인덱스를 직접 읽어들여 사용하므로 FortuneCookies를 읽어들이는 RandomQuoteMacro보다 매우 빠릅니다. :)
- FrontPage . . . . 7 matches
|| [:index_2012 2012] || [:index_2016 2016] || [:index_2019 2019] || [:index_2023 2023] || [:index_2025 2025] || [:arduino_list 아두이노 관련] ||
이곳은 나만의 디지털 안식처로, 초대받지 않은 자의 출입을 엄격히 금지합니다.
당신이 실수로 들어왔다면, 지금 당장 Ctrl+W (또는 뒤로 가기) 버튼을 누르세요.
만약 이 경고를 무시한다면?
⚠️ 비밀 코드를 발견하지 못하면, 이곳에서 빠져나가지 못할 수도 있습니다.
총 생성된 페이지 : [[PageCount]] 페이지를 보유 중.
- FrontPage2013 . . . . 6 matches
{{{{color: rgb(120, 150, 200); font-size: 12px;}그 긴장감이 두려움이거나 미지의 것에 대한 공포가 아닌 기대와 설레임이기를 바란다.}}}
{{{{color: rgb(120, 150, 200); font-size: 12px;}이 두 가지 상반된 감정은 작은 마음 가짐에서 시작된다.}}}
위키가 만들어진지 [[DueDate(20100117)]] 지났고 [[PageCount]]페이지를 보유 중
{{{{color: rgb(220, 50, 10); font-size: 14px;}이곳은 개인 공간 입니다.}}} [http://iou78.ncity.net/w1/ 공개 Wiki는 W1 입니다. ]
- FullSearchMacro . . . . 12 matches
()가 붙고 안 붙고에 따라 기능이 다름.
* 붙으면, (rc15 이상에서) 인자가 없을 땐 현재 페이지 제목으로 찾고, 인자가 있으면 그에 따라 찾는다.
날짜별 정렬 옵션이 어떻게 되는지 모르겠습니다.
그런데, gybe 경우에 해당되는 페이지 이름이 불규칙해서 PageList를 쓸 수가 없습니다. FullSearch가 날짜별 정렬을 지원하지 않는다면, MoniWiki의 기능 중에 어떤 걸 쓰면 될까요? --[kz]
{{{[[PageList(^Gybe.*|Gybe$)]]}}}이런 식으로도 됩니다. [모인모인]에서도 되구요, MoniWiki는 여기에 date옵션을 쓸 수 있는거죠. --WkPark
음, 그러니까 규칙이 전혀 없다고 할 수 있습니다. 주로 gybe로 시작하지만, 그 외에 gybe란 글자가 전혀 안 들어가지는 페이지도 많거든요. -_-a --[kz]
아하.. 그러니까, Category페이지를 어떻게 찾느냐는 것을 말씀하신 것이군요 ? 흠 그것은 FullSearch로 찾아야 겠군요. ToDo로 넣겠습니다. ^^;;; --WkPark
- GAN_iclr_2017 . . . . 21 matches
논문의 초록을 읽어보면 GAN 으로 트레이닝된 Generator 로 Latent vector에서 이미지를 생성하는 것까지는 되지만 역으로 이미지를 Latent vector(Latent space)로 mapping하는 것은 일반적으로 잘 안 된다고 소개하고 있습니다. 하지만 자신들의 방법으로는 이것을 완벽하게 해결할 수 있다고 합니다. 어떻게 하면 될지 천천히 살펴 봅시다.
이 논문에서 일반적인 GAN에 대해서 아래와 같이 소개하고 있네요
또한 generator 를 이용해서 이미지를 역으로 latent vectors로 mapping 하는 일은 어렵다고 하네요.
''stochastic clipping'' 이라는 새로운 기술로 위에서 이야기한 문제를 해결 했다고 합니다.
이 기술을 사용하면 이미지에 노이즈를 넣었음에도 불구하고 원래의 latent vector 를 복구할 수 있다네요.
트레이닝된 Generator 에서 만들어진 이미지를 Latent vector로 mapping하기 위한 방법으로
1. 임이의 latent vector \(z\) 에 의해서 생성된 이미지 \(\phi(z)\)를 생성한다.
1. 새로운 random vector \(z'\) 를 생성하고 그에 해당하는 이미지 \(\phi(z')\)를 생성한다.
1. \(z'\)을 조절해서 \(\phi(z')\)를 원래 이미지 \(\phi(z)\)와 가까워 지도록 \(L_2 norm\)을 minimize를 시도한다.
1. 많은 경우 Latent vectors는 bounded domain에서 오는 경우가 많다. 예로 DCGANS에 경우 \([-1, 1]^{100}\) 의 hyper cube로 부터 uniformly 난수를 추출해서 사용하고 있다. 이런 경우 \(z'\)의 출력 범위를 한정하기 위해서 아래와 같이 Update 방법을 수정했다.
- GAN_review . . . . 45 matches
GAN (Generative Adversarial Network) [* Generative Adversarial Networks (http://arxiv.org/abs/1406.2661)] 라는게 이쪽에서 가장 유명한 방식인데, 위조지폐범과 경찰의 대결 같은 방식으로 네트워크를 학습합니다. 경찰은 계속 새로운 위조지폐를 잘 판별할 수 있어야 하고, 위조지폐범은 계속 경찰을 더 잘 속일 수 있는 위조지폐를 만들어야 합니다. 이렇게 경찰과 위조지폐범을 동시에 학습시키면 최후에는 인생의 진리에 따라 악이 승리하고 완벽한 위조지폐가 만들어지게 되죠.
GAN에서는 위조지폐범에 해당하는 Generative Model (G)이 실제 이미지와 구분하기 힘든 이미지를 생성해 내고, 경찰에 해당하는 Discriminative Model (D)은 실제 이미지 또는 생성된 이미지를 랜덤으로 뽑아서 이게 위조인지 아닌지를 판별하게 됩니다. Minimax Loss를 적용해 서로 반대 작용을 하는 G와 D를 동시에 학습합니다.
이걸 개선한 모델 중 이미지 피라미드와 Laplacian 필터를 적용한 LAPGAN [* Deep Generative Image Models using a Laplacian Pyramid of Adversarial Networks (http://arxiv.org/abs/1506.05751)]이 있고요, 이번에 나온 DCGAN [* Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks (http://arxiv.org/abs/1511.06434)]이란게 있습니다 (이건 아직 안 읽음). 첨부한 이미지가 DCGAN 논문에 있는 이미지인데 침실 이미지를 상당히 디테일하게 만들어내네요.
Generative Model이 이미지를 생성할 때, 무에서 유를 생성할 수는 없으니, 보통은 Noise에 해당하는 z라는걸 하나 뽑은 뒤 이걸 토대로 이미지를 생성합니다. (저번주에 발표한 DRAW모델에서도 이 z에 해당하는게 있었음)[* DCGAN 캐릭터 생성 데모: http://mattya.github.io/chainer-DCGAN/]
Tensorflow를 이용해서 간단한 GAN을 실제 구현해 본 사람이 있다.[* https://github.com/nlintz/TensorFlow-Tutorials/blob/master/11_gan.ipynb]
본인도 이 예제를 직접 돌려 보았는데 위 사람이 구현한 것과 같은 결과는 확인하지 못 했다. 어떤 문제가 있는지 아직은 정확히 알 수 없지만 코드를 하나 하나 확인하면서 알아가 보려고 한다.
이 부분까지는 텐서플로우와 MNIST 예제를 쓰기 위한 준비 작업으로 특별한 것은 없다.
Weights의 초기값을 어떻게 정하느냐에 따라서 성능 차이가 발생한다. 머신러닝에서 초기값은 중요하다.
초기값을 렌덤하지 않은 특정 값으로 설정한다면 트레이닝이 되지 않는다.
예로 초기값이 모두 '0'으로 초기화 된다면 모든 입력값에 대해서 0의 결과값을 주게 된다.
Weights 초기값 중에서 지나치게 큰값이 들어간다면 이 역시 좋지 않은 결과를 야기 시킨다. 때문에 균질하면서도 중복되지 않은 초기값 설정이 중요하다.
이런 관점에서 간단하면서도 성능이 좋은 두 개의 초기화 설정 방법을 소개한다.
예제에서는 아래와 같이 만들어 쓰고 있다.
모델에 따른 초기화는 아래와 같이 했습니다.
원래 코드에서는 Bias 값을 '0'으로 초기화를 진행했는데 이것을 normal random 함수를 사용해서 표준편차 0.1인 난수로 초기화 하도록 수정 했다.
모델 구성은 간단하다 G 네트워크와 D 네트워크의 사이즈는 동일하게 400개의 Weight를 갖게 구성했고 Latent Vector의 사이즈를 100으로 잡았다.
Hidden 레이어는 Relu를 사용했고 출력단은 시그모이드를 사용하도록 구성 했습니다. 우선은 그냥 사용해 보고 Activation function을 바꿔가면서 테스트 해보도록 하겠습니다.
2014년 발표된 Goodfellow의 논문[* Goodfellow, Ian, et al. "Generative adversarial nets." Advances in neural information processing systems. 2014.]과 같이
- Gradient_Descent . . . . 47 matches
Gradient descent 방법은 미분의 개념을 최적화 문제에 적용한 대표적 방법 중 하나로서 함수의 local minimum을 찾는 방법 중 하나입니다. Gradient descent 방법을 다른 말로 steepest descent 방법이라고도 부릅니다.
= Gradient descent 방법의 직관적 이해 =
자신이 한치앞도 잘 안보이는 울창한 밀림에 있을 때 산 정상으로 가기 위한 방법은 간단합니다. 비록 실제 산 정상이 어디에 있는지는 모르지만 현재 위치에서 가장 경사가 가파른 방향으로 산을 오르다 보면 언젠가는 산 정상에 다다르게 될 것입니다.
또는 이와 반대로 깊은 골짜기를 찾고 싶을 때에는 가장 가파른 내리막 방향으로 산을 내려가면 될 것입니다.
이와 같이 어떤 함수의 극대점을 찾기 위해 현재 위치에서의 gradient 방향으로 이동해 가는 방법을 gradient ascent 방법, 극소점을 찾기 위해 gradient 반대 방향으로 이동해 가는 방법을 gradient descent 방법이라 부릅니다.
어떤 다변수 함수 \(f(x_1,x_2,...,x_n)\)이 있을 때, f의 그레디언트(gradient)는
와 같이 정의 됩니다. 즉, 그레디언트(gradient)는 위 식과 같이 각 변수로의 일차 편미분 값으로 구성되는 벡터입니다. 그리고 이 벡터는 '''f의 값이 가장 가파르게 증가하는 방향'''을 나타냅니다. 또한 벡터의 크기는 그 증가의 가파른 정도(기울기)를 나타냅니다.
이므로, (1, 1)에서 f값이 최대로 증가하는 방향 (2, 2) 기울기는 (2, 2) = sqrt(8) 입니다.
또한 반대로 그레디언트(gradient)에 음수를 취하면 즉, -▽f는 f값이 가장 가파르게 감소하는 방향을 나타내게 됩니다.
이러한 그레디언트의 특성은 어떤 함수를 지역적으로 선형근사(linear approximation)하거나 혹은 함수의 극점(최대값, 최소값 지점)을 찾는 용도로 활용될 수 있습니다.
최적화 알고리즘 중 하나로 널리 알려진 gradient descent 방법은 이러한 그레디언트의 특성을 이용하여 어떤 비용함수의 값을 최소화시키기 위한 파라미터 값을 아래와 같이 점진적으로 찾는 방법입니다.
즉, 어떤 초기값 \(X_0 = (x_0^1,...,x_0^n)\)부터 시작하여 위 식에 따라 gradient 반대 방향으로 x를 조금씩 이동시키면 f(x)가 극소가 되는 x를 찾을 수 있다는 방법이 gradient descent 방법입니다.
Gradient descent 방법의 문제점은 쉽게 생각할 수 있듯이 local minimum에 빠지는 것입니다. 즉, 이쪽이 산 정상인줄 알고 열심히 올라갔더니 막상 여기는 작은 언덕 정도이고 바로 옆에 훨씬 높은 산이 있는 경우입니다.
Gradient descent 방법의 또 하나의 문제점은 해에 근접할수록 |∇f|가 0에 가까워지기 때문에 수렴속도가 느려진다는 것입니다. 그렇다고 수렴속도를 조절하는 step size 파라미터 λ를 너무 크게 하면 알고리즘이 발산할 수 있는 문제점이 있습니다 (step size를 자동으로 adaptive하게 조절하는 방법도 있는 것 같습니다).
= Gradient descent 방법의 이해와 활용 =
Gradient descent 방법에 대해서는 그 기본적인 개념만 이해하고 있으면 된다고 생각합니다. 그 핵심은 함수의 극대값 또는 극소값을 구하기 위해 현재 위치에서 함수값의 변화가 가장 큰 방향으로 이동한다는 것이므로 함수값의 변화가 가장 큰 방향을 구할 수만 있다면 다양한 문제에 똑같은 개념을 적용할 수 있습니다.
다변수 스칼라 함수(scalar-valued function of multiple variables)의 경우에는 gradient(그레디언트)를 이용하여 최대 증가 방향을 찾았지만 일변수 함수의 경우에는 통상적인 일차 미분값 f'(x)을 이용하면 될 것입니다. 예를 들어, \(f(x) = x^2 + 3x + 1\)가 극소가 되는 점 및 극소값을 구하고 싶다면 식을 다음과 같이 세울 수 있습니다
== 비선형 연립방정식의 풀이(인공신경망) ==
선형연립방정식으로 주어지는 Least Square 문제는 '''선형대수학 #5''' 선형연립방정식 풀이 글에서 설명한 바와 같이 SVD나 Pseudo-inverse를 이용하여 계산할 수 있습니다. 그리고 비선형연립방정식으로 주어지는 Least Square 문제는 [:Newtons_method 뉴턴법/뉴턴-랩슨법의 이해와 활용(Newton's method)] 글에서 설명한 Gauss-Newton 법으로 풀 수 있습니다. 여기서는 비선형연립방정식으로 주어지는 Least Square 문제를 gradient descent 방법으로 푸는 방법에 대해 살펴보겠습니다.
그런데 ▽E를 직접 구하여 위 식을 적용해도 되지만, \(E = F^TF\) 로부터 \( \nabla E = 2J_F^TF\) 이므로 아래 식과 같이 F의 Jacobian인 \(J_F\)를 이용하여 해를 탐색해도 됩니다.
- Gradient_Jacobian_Hessian_Laplacian . . . . 69 matches
이들을 함께 보는 이유는? 그냥 왠지 이들은 세트로 함께 봐야 할 것 같은..
와 같이 정의 된다.
즉, gradient는 위 식과 같이 각 변수로의 일차 편미분 값으로 구성되는 벡터입니다. 그리고 이 벡터는 f의 값이 가장 가파르게 증가하는 방향으로 나타냅니다. 또한 벡터의 크기는 그 증가의 가파른 정도(기울기)를 나타냅니다.
이므로, (1, 1)에서 f값이 최대로 증가하는 방향은 (2,2)이고, 기울기는 ∥(2,2)∥= sqrt(8) 입니다.
또한 반대로 gradient(그레디언트)에 음수를 취하면 즉, \(-\nabla f\)는 f값이 가장 가파르게 감소하는 방향을 나타내게 됩니다.
이러한 gradient의 특성은 어떤 함수를 지역적으로 선형근사(linear approximation)하거나 혹은 gradient descent 방법([:Gradient_Descent Gradient Descent 탐색] 방법 글 참조)처럼 함수의 극점(최대값, 최소값 지점)을 찾는 용도로 활용될 수 있습니다.
Gradient를 이용한 다변수 scalar 함수 f의 점 p 근처에서의 선형 근사식은 다음과 같습니다 (first order Taylor expansion).
영상처리에서 gradient(그레디언트)는 영상의 edge 및 edge 방향을 찾는 용도로 활용될 수 있습니다. 이미지 I(x,y)를 (x,y)에서의 픽셀의 밝기를 나타내는 함수로 보고 각 픽셀 위치에서 gradient의 크기와 방향을 구하면 해당 픽셀이 얼마나 edge에 가까운지, 그리고 edge의 방향이 어디인지 쉽게 알 수 있습니다.
attachment:gradientex.png?'''[[br]]그림''' 2: gradient를 이용한 영상 edge 검출
☞ 앞서 나온 gradient(그레디언트)나 Jacobian(야코비언)이나 모두 함수에 대한 일차 미분(first derivative)을 나타낸다는 점에서는 동일합니다. 다만, 그레디언트는 다변수 스칼라 함수(scalar-valued function of multiple variables)에 대한 일차 미분인 반면 Jacobian(야코비언)은 다변수 벡터 함수(vector-valued function of multiple variables)에 대한 일차미분입니다. 즉, 그레디언트는 통상적인 일변수 함수의 일차미분을 다변수 함수로 확장한 것이고, Jacobian(야코비언)은 이를 다시 다변수 벡터함수로 확장한 것입니다.
Jacobian(야코비언)이나 그레디언트나 모두 함수에 대한 일차미분이기 때문에 미분이 가지고 있는 의미나 성질은 모두 동일하게 적용됩니다. 즉, 어떤 함수의 지역적인 변화특성을 파악할 때, 지역적인 함수의 변화를 선형근사할 때 또는 함수의 극대(극소)를 찾을 때 활용될 수 있습니다.
예를 들어, 점 \(p \in R^n\) 근처에서 F를 선형근사할 때 Jacobian(야코비언)을 다음과 같이 활용할 수 있습니다 (first order Taylor expansion).
Jacobian(야코비언)이 비선형 연립방정식의 해를 구하는 목적으로 활용되는 예에 대해서는 [http://darkpgmr.tistory.com/58 뉴턴법/뉴턴-랩슨법의 이해와 활용(Newton's method)] 글을 참조하기 바랍니다.
와 같이 정의 됩니다.
앞서 설명한 gradient(그레디언트), Jacobian(야코비언)이 모두 함수에 대한 일차미분(first derivative)를 나타내는 반면 Hessian은 함수의 이차미분(second derivative)를 나타낸다는 점에서 차이가 있습니다.
즉, Hessian은 함수의 곡률(curvature) 특성을 나타내는 행렬로서 최적화 문제에 적용할 경우 Hessian을 이용하면 다음 식과 같이 p 근처에서 함수를 2차 항까지 근사시킬 수 있습니다 (second-order Taylor expansion)
또한 Hessian은 critical point의 종류를 판별하는데 활용될 수 있습니다. 어떤 함수의 일차미분이 0이 되는 되는 점을 critical point (또는 stationary point)라 부르는데 함수의 극점(극대, 극소), saddle point 등이 여기에 해당됩니다 (쉽게 생각하면, 고교수학 미분에서 f'(x) = 0이 되는 지점).
어떤 (다변수) 함수를 최적화시키기 위해 극점(극대, 극소)을 찾기 위해서는 먼저 그 함수의 일차미분인 gradient(그레디언트)가 0이 되는 지점(critical point)을 찾습니다. 그런데, 이렇게 찾은 critical point가 극대점인지 극소점인지, 아니면 saddle point(말안장처럼 방향에 따라서 극대, 극소가 바뀌는 점)인지 구분하기 위해서는 이차미분값을 조사해야 하는데 이 때 바로 Hessian을 사용할 수 있습니다.
그 구체적인 방법은, 어떤 함수의 critical point에서 계산한 Hessian 행렬의 모든 고유값(eigenvalue)이 양수(positive)이면 해당 지점에서 함수는 극소, 모든 고유값이 음수이면 극대, 음의 고유값과 양의 고유값을 모두 가지면 saddle point인 것으로 판단합니다 (고교수학에서 f''(x)의 부호에 따라서 아래로 볼록, 위로 볼록 여부를 구분하는 것과 같은 이치).
이러한 구분의 핵심에는 Hessian 행렬의 고유벡터(eigenvector)는 함수의 곡률이 큰 방향벡터를 나타내고 고유값(eigenvalue)은 해당 고유벡터(eigenvector) 방향으로의 함수의 곡률(curvature, 이차미분값)을 나타낸다는 점에 있습니다.
- HDCCTV50HZ . . . . 6 matches
이외의 23.98, 29.97, 59.94Hz 에서는 74.176 MHz이다.
Sample clock rate는 고정이고 출력 frame refresh rate를 변경하려고 한다면 ①의 공식에서 frame refresh rate를 변경하고 이에 따른 HINT+1 값을 구하면 된다.
② 를 계산 하면 χ = 1980 이다.
* 소스의 위치는 dm355 프로젝트에 '''dm355_disp.c''' 이다.
- HDCCTV_2M_SONY . . . . 3 matches
이것을 수정해서 YUV 포멧으로 영상을 입력 받아 출력하려고 할 때 이루워 지는 작업
작업해야 할 파일은 2개 이다.
- HDCCTV_BE_ycc8 . . . . 1 match
OSD 설정이 최종 출력에 영향을 주는 것을 확인
- HDCCTV_ISIF . . . . 4 matches
ISIF(Image Sensor Interface ) 센서나 외부로 부터 영상을 입력 받는 인터페이스이다.
HSIZE 의 값이 1280의 2배가 되게 설정 되어 있어야 한다.
SDRAM에 저장 하기 위해서는 '''DWEN'''이 '1' 로 설정 되어야 한다.
- HDCCTV_NTSC . . . . 13 matches
영상신호란, 빛을 전기신호로 바꾸어 전송 또는 기록하기 위한 신호이다.
비월주사(Interlace)와 순자주사(Progressive) 방식이다.
주사란, 영상의 화소를 순서대로 전송해 가는 방법이다.
사람의 눈의 잔상작용을 이용해여 화상, 특히 동화상을 자연스럽게 볼 수 있도록 하기 위해 영화에서는 1초 동안 24장의 화상을 사용한다.
NTSC방식의 TV 화상에서는 초당 30장의 화상을 사용하고 있는데 영화와 같이 순간적으로 1장의 화상을 표시하는게 아니라 주사 방식을 사용하기 때문에 1초당 30장으로는 화상으로는 깜박거림을 막을 수 없다.
1장의 완성된 화상을 "Frame"이라고 하고 1회 주사로 만들어진 절반의 영상을 "Field"라고 하면 "V"로 약칭한다.
TV뿐만 아니라, 컴퓨터 디스플레이의 화상도 주사로 이루어지고 있다. 컴퓨터에서는 비월주사는 사용하지 않고, 1장의 화상을 한번에 주사한다.
이 방식을 순차주사(Progressive 또는 Non-interlace)라고 한다.
그런데, 순자주사와 비월주사에서는 같은 주사선수일 때, 동화상의 해상도에 차이가 발생한다.
비월주사에서는 2필드간의 시간차 영향으로 동화상이 흐려지기 때문에 세로방향의 해상도가 70%, 또는 그 이하로 표현 된다.
따라서 '''1화면당 동일한 주사선을 사용할 경우 순차주사 쪽이 더 선명하다.'''
- HDCCTV_VPBE . . . . 2 matches
OSD는 on-screen display로 다양한 포멧의 출력 화면을 구성하는 windows라는 것을 형성해 주는 장치이다. 이렇게 구성된 화면은
- HDCCTV_package . . . . 2 matches
1. 패키지를 svn에서 얻어 와서 컴파일을 하면 각 project에 lib 파일이 생성 되고 자동으로 lib 폴더에 .lib 파일들이 복사 된다.
- HDCCTV_조이스틱 . . . . 4 matches
아프로 텍크놀로지 OSD 제어를 위한 5키 조이스틱 드라이버 만들기
= 기본 아이디어 =
PINMUX가 속한 System module의 BASE ADDRESS는 '''0x01c4 0000''' 이다.
- Hello드라이버예제 . . . . 23 matches
간단한 예제를 통해서 리눅스 드라이버를 생성하는 방법과 리눅스가 하드웨어를 제어하는 방법에 대해서 알아본다.
= 디바이스 번호의 할당과 해제 =
* '''first'''는 할당 받으려는 디바이스 번호 범위 중 시작 번호.
* '''count''' 요청하는 연속적인 디바이스 번호의 개수
* '''name''' 장치 이름
* '''dev'''는 출력 전용 매개 변수이다. 할당 받은 받은 번호가 들어간다.
디바이스 번호를 할당 받았다고 해서 드라이버를 사용 할 수 있는것은 아니다. 디바이스 번호와 드라이버 동작 함수를 연결 시켜 줘야 한다.
* file_operation는 함수 포인터의 집합이다.
file_opertaion에 대한 정의부는 ''리눅스 디바이스 드라이버'' 페이지 80, 3장 문자 드라이버 부분을 참고 하기 바란다.
위 코드는 file_operation의 초기화 부분이다. file_operation에서 정의 하고 있는 모든 함수를 정의 할 필요는 없다 사용할 함수만 정의 해서 쓰면 된다. 정의 되지 않은 함수는 NULL로 초기화 된다. 위 초기화 문법은 C99표준을 따르고 있다.
= 문자 디바이스 등록 =
* 커널은 내부적으로 문자 디바이스를 표현하기 위해서 '''cdev''' 구조체를 사용한다.
* 커널이 (file_operation에 등록되어 있는) 디바이스 동작 함수를 호출하기 전에 드라이버는 cdev 구조체를 할당하고 등록 해야 한다.
1. cdev_init를 이용한 방법
* char 디바이스를 제거 하는 방법은 다음과 같다.
- HelpContents . . . . 9 matches
아래는 가장 중요한 도움말 페이지목록입니다:
* HelpForBeginners - 위키 초보자를 위한 페이지
* HelpOnPageCreation - 새 페이지 만드는 방법과 템플리트 이용하기
* HelpOnPageDeletion - 페이지 지우기
* HelpOnEditing - 페이지를 고치기
* HelpOnNavigation - 위키위키를 이리저리 돌아다녀보세요.
* HelpOnActions - 각 페이지에 대한 여러가지 조작 및 변형법
== [:SlideShow 슬라이드 쇼]로 보기 ==
- HelpForBeginners . . . . 18 matches
위키위키웹는 여러 사람이 공동작업을 할 수 있는 하이퍼텍스트 환경을 말하며, 보다 쉽고 직관적인 정보의 수정에 초첨이 맞춰져 있습니다. 이곳 위키는 전체 위키위키웹의 일부분이며 각각의 개별 위키를 인터위키라고 말합니다.
누구나 어떠한 페이지라도 고칠 수 있으며, 페이지간의 보다 손 쉬운 연결, 쉬운 서치환경, 그리고 현 위키에 있지 않는 페이지에 대해 새로운 페이지를 만들기 쉬운 어포던스를 제공합니다.
처음 위키위키를 방문하신다면 무작정 다른 페이지를 고치려 하지 마시고 [위키모래상자]같은 곳에서 위키위키에 사용되는 간단한 문법을 테스트해보시기 바랍니다.
위키위키의 문법을 지금 당장 알고싶으신 분은 HelpOnEditing 페이지로 가시기 바랍니다.
위키위키에 대하여 좀 더 배우고 싶으신 분은 Wiki:WhyWikiWorks 와 Wiki:WikiNature 를 읽어보시기 바라며, Wiki:WikiWikiWebFaq 와 Wiki:OneMinuteWiki 도 도움이 될 것 입니다.
* RecentChanges: 사람들이 지금 무슨 작업을 하고 있는지
* TitleIndex: 이 위키위키에 있는 모든 쪽 목록
* WordIndex: 위키위키 페이지 이름을 구성하고 있는 단어들의 목록(따라서 이 위키위키의 주된 콘셉트를 보여줍니다.)
* WikiSandBox: 이곳에서 마음껏 시범과 테스트를 해보시기 바랍니다.
- HelpOnAdministration . . . . 3 matches
열거된 페이지는 위키를 관리하기 위한 여러가지 정보를 담고있습니다.~
설치와 업그레이드:
* HelpOnUpdating - 예전에 설치된 것을 새로운 버전으로 업데이트 하려면
- HelpOnConfiguration . . . . 13 matches
MoniWiki는 `config.php`에 있는 설정을 입맛에 맛게 고칠 수 있다. config.php는 MoniWiki본체 프로그램에 의해 `include`되므로 PHP의 include_path변수로 설정된 어느 디렉토리에 위치할 수도 있다. 특별한 경우가 아니라면 MoniWiki가 설치된 디렉토리에 config.php가 있을것이다.
모니위키의 몇몇 플러그인중 외부 프로그램을 사용하는 프로그램은 환경변수 PATH를 참조하여 외부 프로그램을 호출하게 된다. 이때 PATH의 설정이 제대로 맞지 않아 외부 프로그램이 제대로 실행되지 않는 경우가 있다. 이 경우 config.php에서 `$path`를 고쳐보라.
config.php에 `$security_class="needtologin";`를 추가하면 로그인 하지 않은 사람은 위키 페이지를 고칠 수 없게 된다. 로그인을 하지 않고 편집을 하려고 하면 경고 메시지와 함께, 가입을 종용하는 간단한 안내가 나온다.
메뉴의 대문(FrontPage)및 로고 그림이 연결하고 있는 페이지는 config.php의 다음 변수를 설정한다.
위의 값은 기본 값이며, 각각 다르게 설정할 수 있다.
/!\ wiki.php에 정의되어 있는 WikiDB 클래스를 보면, 우선 하드코딩된 기본 설정이 있고, config.php에서 읽은 설정 사항을 그 위에 덧씌우는 방식이다.
* $hr='';로 지정하면, 페이지 상단의 <hr />과 하단의 <hr />이 출력되지 않는다.
- HelpOnEditing . . . . 12 matches
== 페이지 고치기 ==
위키위키는 기본적으로, 위키위키 내의 모든 페이지를 모든 사용자가 고칠 수 있습니다. 위키위키는 좀 더 편리하고 직관적인 페이지 편집을 지원하며 편집에 앞서 몇가지 포매팅 규칙을 배우셔야 합니다.
다음 페이지들은 위키위키를 고치는데 필수적인 규칙/문법을 설명합니다:
* [HelpOnLinking] - 페이지간 연결과 이미지 넣기
* [HelpOnTables] - 테이블
* [HelpOnProcessingInstructions] - 페이지 제어
* [HelpOnNameSpace] - 네임스페이스
* [HelpOnSubPages] - 하위 페이지
* [HelpOnXmlPages] - 페이지를 xml로 저장하고 xslt 적용하기
위키 포매팅 문법 (위키 마크업)을 테스트하고 싶으시면 WikiSandBox로 가셔서 [[GetText(EditText)]]를 누르시거나 [[Icon(edit)]] 아이콘을 누르시면 WikiSandBox에서 테스트 해보실 수 있습니다. 실제로 저장하지 않더라도 미리보기 버튼을 누르시면 위키 포매팅 결과를 그때 그때 확인하면서 연습하실 수 있습니다.
- HelpOnFormatting . . . . 31 matches
위키위키는 좀 더 직관적이면서 이해하기 쉬운 단순한 세트의 문법 규칙을 가지고 있습니다. HTML 문서를 만들기 위해서 HTML문법을 알아야 하는 것 처럼 위키위키 페이지를 만들거나 고치기 위해서 위키위키 문법을 알아야 합니다. HTML문법은 직관적이지 않고 복잡한 측면이 있습니다. 그러나 대다수의 HTML문서는 매우 간단한 문법을 알기만 하면 만들 수 있습니다. 위키위키는 이러한 문법을 좀 더 단순화 시키고 직관적이고 이해하기 쉬운 단순한 규칙으로 구성되도록 고안되었으며 조금만 시간을 투자한다면 위키위키의 문법을 쉽게 이해하고 배우실 수 있습니다.
이 세가지의 기본 문법이 있으며
몇가지 확장 포매팅 규칙이 있습니다. 확장포매팅 규칙은 잘 쓰지 않는 것이 보통입니다.
그리고 이러한 포매팅을 ''있는 그대로'' 보여주기 위해 {{{ {{{ }}} }}} 중괄호 세개를 연달아 사용하는 문법이 있습니다.
이렇게
이렇게
{{{이렇게 글을
이렇게 한 줄을 띄우면
이렇게 글을
한 줄을 띄워 쓰면 단락이 나뉘게 됩니다.
한 단락 내에서 강제로 줄 바꿈을 하고 싶은 경우에는 {{{[[BR]]}}}를 씁니다.[[BR]]이것은 위키위키의 고급 기능에 속하는 [매크로문법] 입니다.
위키위키 문법을 무시하게 하기 위해서 중괄호 세개를 {{{ {{{이렇게}}} }}} 사용하게 되면 글꼴이 고정폭 글꼴로 보여지게 되며 ({{{monospace font}}}) 만약에 이 문법을 여러 줄에 걸쳐 사용하게 되면, 중괄호 블럭의 모든 공백이 보호되어 프로그램 코드를 직접 삽입하여 보여 줄 수 있습니다.
이 경우 모든 위키 문법은 무시되고 있는 그대로를 보여주게 됩니다.
특별히 여러 줄 코드 블럭을 넣을 때 최 상단에 {{{#!php}}}, {{{#!python}}}과 같은 줄이 있으면 이것은 프로세서 해석기에 의해 해석되어
이와 같은 소스 코드 컬러링은 모니위키의 ProcessorPlugin이라 불리 고급기능중의 한가지 입니다.
- HelpOnHeadlines . . . . 5 matches
"="로 시작해서 "="로 끝나는 줄은 섹션의 제목(Heading)이 됩니다. 다섯단계 레벨까지 사용하실 수 있습니다.
/!\ {{{= 레벨 1 =}}} 제목은 <h1>으로 랜더링되지만 다른 위키위키 마크업과 통일성을 위해 '''두개'''의 "==" 부터 제목줄을 사용하시는 것을 권장합니다. MediaWiki에서도 비슷한 이유로 ``레벨1`` 제목 사용을 제한적 허용하고 있는데, 그 이유는 <h1>은 ''페이지의 제목''에 할당하고 있기 때문이라고 합니다.
- HelpOnInstallation . . . . 38 matches
`rcs`가 설치되었는지 확인한다. {{{/usr/bin/rlog /usr/bin/ci /usr/bin/co}}}등등의 실행파일이 있어야 한다. {{{/usr/bin/merge}}}도 필요하다.
PHP gettext 모듈이 필요하다.
* <!> `rcs`가 없어도 사용할 수 있으나 백업본이 저장되지 않습니다.
* 윈도우즈 사용자의 경우는 아파치 웹서버를 제외한 PHP + rcs + 기타 몇몇 프로그램이 함께 패키징 된 apmoni-setup-1.1.x.exe를 제공합니다.
압축을 풀면 moniwiki라는 디렉토리 밑에 화일들이 있는 것을 볼 수 있다.
디렉토리 이름을 원하는 것으로 바꿀 수도 있다. 예를 들어 {{{/wiki}}}라고 바꿀 수 있으며
기본 값은 {{{/moniwiki}}}이다.
monisetup.sh를 실행하여 디렉토리의 쓰기권한을 조정한다. (기본값은 2777) 이렇게 하여야 MoniSetup.php를 실행시킬 수 있게 된다.
처음 설치할 경우 MoniSetup을 이용해서 config.php를 만들게 된다.
여기서 가장 중요한 것은 {{{$url_prefix}}}를 고치는 것이다. 이 값은 초기에 자동으로 설정되며,
이 값을 제대로 지정하면 MoniSetup에서 다음과 같은 로고 그림을 볼 수 있다.
씨앗을 심는 경우는 불필요한 페이지가 들어갈 수 있는데, 어느정도 익숙해졌다고 생각되면 지워도 되며, 아예 처음부터 설치하지 않아도 된다.[[BR]]
{{{secure.sh}}}를 실행해서 다른 사람들이 자신의 Wiki 설정을 볼 수 없게,고칠 수 없게 한다.
/!\ 설치가 끝났습니다. 이제 위키위키를 즐기세요.
* [http://kldp.net/forum/forum.php?forum_id=2350 1원짜리 팁]: http://kldp.net 의 모니위키 프로젝트 홈페이지.
1. MoniSetup을 실행시킬 때, {{{$admin_passwd}}}를 설정하면 자신만 DeletePage할 수 있다. 이 값을 설정하면, 차후에 MoniSetup을 할 때 이 값을 알아야 고칠 수 있으며, config.php에 이 값이 들어가므로 수동으로 고칠 수 있다.
1. $rcs_user의 기본 값은 "root"이나, 위키를 처음 설치할 경우는 이 값을 조절할 수 있다. 한번 결정한 후에는 이 값을 계속해서 써야한다.
업그레이드를 편리하게 하려면, 플러그인을 새로 추가할 경우는 원 파일을 고치는 것보다는 새롭게 플러그인을 만들어 준다. 이렇게 하면 tar파일을 덮어쓰는 것만으로 간단히 업그레이드 할 수 있다.
== 업그레이드 ==
모니위키 1.1.3 이후 최신 버전부터는 UpgradeScript를 제공하여 보다 편리하게 업그레이드/다운그레이드를 할 수 있다.
- HelpOnInstallation/MultipleUser . . . . 10 matches
모니위키 버전 1.0.9 이후부터 모니위키는 다중사용자를 위한 좀 더 편리한 설치환경을 제공합니다.
각 사용자는 따로 설치할 필요 없이 관리자가 설치해놓은 모니위키를 단지 make install로 비교적 간단히 설치할 수 있습니다.
이렇게 하면 [모니위키] 설치에 필요한 파일이 public_html 하위에 일부는 복사되고 일부는 설치 디렉토리에 남게됩니다.
이 경우 대부분의 php파일이 설치되지 않은채로 각 사용자가 사용하게 되기 때문에, 모니위키의 php취약점이 발견되었을 경우 관리자가 설치된 [모니위키]만을 업데이트하는 것으로 문제점을 해결할 수 있게 됩니다. 물론 일부 카피된 파일 및 php 이외에 웹상에 직접 노출되는 지역 파일은 사용자가 직접 업데이트해야 하겠지요.
- HelpOnInstallation/SetGid . . . . 16 matches
보안상의 이유로 웹서버는 php 스크립트를 `nobody, www, apache` 혹은 `httpd`같은 특별히 제한된 계정으로 실행하게 됩니다. 이러한 이유로 [모니위키] 스크립트가 생성하게 되는 여러 파일 혹은 디렉토리는 이러한 특별한 계정의 소유가 되며 진짜 사용자가 소유하지 못하게 되는 일이 발생하고 어떤 경우는 이렇게 만들어진 파일을 읽을수도 지울 수도 없게 됩니다.
이런 경우를 막기 위해서 `chmod 2777` 대신에 `chmod 777`을 하는 경우도 있으나, 이로서 문제가 모두 해결되지는 않습니다.
이러한 것을 방지하기 위해서 [모니위키]가 특별한 파일을 생성하게 되는 몇몇 디렉토리에 대하여 그룹 아이디로 퍼미션을 가지게 할 수 있습니다. 이렇게 Setgid를 사용하도록 그룹 퍼미션을 주게되면 wiki.php에 의해 새롭게 만들어지는 모든 파일은 진짜 사용자의 그룹아이디와 같게 되며, 그룹 아이디가 가지는 퍼미션을 진짜 사용자도 누릴 수 있게되어 읽거나 고치거나 지울 수 있게 됩니다.
Setgid 퍼미션을 작동시키려면 간단히 "`chmod 2777 ''dir''` 명령을 내리면 되는데, 모니위키가 여러 파일들을 만들게되는 디렉토리에 대해 이 명령을 내려주면 됩니다. 모니위키를 최초 설치하는 과정에서 setgid를 사용하려면 우선 모니위키 최상위 디렉토리를 먼저 `chmod 2777`을 해 줍니다. 아마 wiki.php가 들어있는 디렉토리가 될것입니다.
그런 다음 monisetup.php를 웹상에서 실행시키면 monisetup.php는 필요한 여러 디렉토리를 만들게 되며 이 디렉토리들은 setgid에 적용을 받게 되고, 이렇게 최초 setgid 설정을 마친 후에는 최상위 디렉토리의 퍼미션을 원래의 퍼미션으로 되돌려야 합니다. (보통 `chmod 755`로)
- HelpOnInstalling . . . . 3 matches
이 위키 사이트에 있다면 여기 한 군데에 모아 정리를 하고, tarball에도 같이 배포해야 한다고 생각합니다.
- HelpOnLinking . . . . 55 matches
외부 링크는 {{{http://kldp.org}}}같이 그대로 적어놓으면 '''자동'''으로 http://moniwiki.kldp.org 라고 링크가 걸립니다. 여기서 주의할 점은, 링크를 적을때 한글 토씨를 그냥 붙여 적을 경우에 한글까지 링크가 걸리게 됩니다. 이럴 경우에는 {{{[http://moniwiki.kldp.org]}}}라고 적으면 [http://moniwiki.kldp.org]와 같이 '''강제'''로 링크될 URL을 지정해줘서 자동으로 링크가 걸리지 않게 합니다. 강제로 링크를 걸러줄 경우는 모니위키에서는 그 링크 앞에 작은 지구 아이콘이 생깁니다.
지원되는 외부 링크는 `http:`, `https:`, `ftp:`, `nntp:`, `news:`, `mailto:`, `telnet:`, 그리고 `file:`등이 있습니다.
만약 URL의 끝 부분이 이미지의 확장자일 경우는 ("{{{.gif}}}", "{{{.jpg}}}" or "{{{.png}}}") 그림이 그 위치에 삽입되게 됩니다.
예를 들어 {{{http://moniwiki.kldp.org/imgs/moniwiki-logo.png}}}라고 적으면 http://moniwiki.kldp.org/imgs/moniwiki-logo.png 처럼 보이게 됩니다. 이 경우 역시 띄어쓰기를 하지 않으면 조사까지 링크가 걸리게 되고 그림이 자동으로 들어가지 않게 됩니다. 이 경우는 강제로 꺽쇠로 묶어주면 즉, {{{[http://moniwiki.kldp.org/imgs/moniwiki-logo.png]}}}라고 쓰면 [http://moniwiki.kldp.org/imgs/moniwiki-logo.png]와 같이 되고, 그림으로 들어가지 않는 대신에 링크를 그대로 보여줍니다.
== 페이지 이름 ==
모니위키는 페이지 이름을 넣는 여러가지 링크방식을 제공합니다.
{{{WikiName}}}라고 쓰면 WikiName이 자동으로 링크가 걸립니다.
{{{[모니위키]}}}이라고 적으면 [모니위키]처럼 링크가 됩니다.
=== 이중 꺽쇠(대괄호) 링크 ===
{{{[[모니위키]]}}}라고 적으면 [[모니위키]]처럼 링크가 됩니다. 이것은 MediaWiki에서 쓰이는 페이지 이름 연결 문법으로, 모니위키에서도 호환성 측면에서 지원합니다.
/!\ 이 문법은 매크로 문법과 충돌합니다. 예를 들어 {{{[[Date]]}}}라고 링크를 걸면 Date가 링크가 되는 대신에, Date 매크로가 호출되게 됩니다. 따라서 영문으로 된 페이지 이름을 연결할 경우는 매크로 이름이 중복되어 있다면 이중 대괄호로 링크를 걸 수 없습니다.
=== 임의의 이름 연결 ===
공백을 포함하는 임의의 페이지 이름을 연결하고 싶은 경우가 있습니다.
그런데 {{{[공백이 있는 이름]}}}으로 연결하면 [공백이 있는 이름]으로 연결되며, 공백이 모두 제거 되고 정규화 된 페이지가 링크가 걸립니다. {{{[hello world]}}}라고 링크를 걸렴 [hello world]라고 링크가 걸리고 공백이 모두 사라지면서 정규화 된 페이지 이름인 HelloWorld페이지로 링크가 걸립니다.
공백이 있고 대소문자도 마음대로 지정하고 싶은 경우에는 {{{["임의의 페이지 이름"]}}}으로 링크를 걸면 ["임의의 페이지 이름"]처럼 링크가 됩니다.
위키위키에서는 외부의 위키 혹은 위키위에 준하는 다른 사이트를 좀 더 쉽게 연결하는 문법을 제공합니다. 예를 들어, {{{http://moniwiki.kldp.org/wiki/FrontPage}}}라고 링크를 거는 대신에 {{{MoniWiki:FrontPage}}}라고 링크를 걸면 MoniWiki:FrontPage 처럼 표시가 됩니다. 이를 인터위키 연결이라고 합니다.
앞부분에서도 언급한 내용이지만, 자동으로 링크가 걸릴 경우 URL 주소 되에 공백을 넣어주거나, <http://moniwiki.kldp.org/wiki.php/FrontPage>와 같이 연결해주어야 합니다. 정리해보면
* Wiki:SixSingleQuotes 를 이용한다.
- HelpOnLists . . . . 7 matches
만약 공백을 넣어 들여쓰기만 하고 {{{*}}}나 번호리스트를 지원하는 {{{1.}}} {{{a.}}} 이외의 다른 문자가 온다면, 그 단락은 들여쓰기된 단락으로 인식됩니다.
이 단락은 들여쓰기기 되지 않은 단락입니다.
이번에는 공백을 더 넣어
이 단락은 들여쓰기기 되지 않은 단락입니다.
이번에는 공백을 더 넣어
/!\ 정의 문법은 자주 쓰이지 않는 문법이며 모인모인 호환용 문법입니다. 1.1.3CVS에 포함된 monimarkup.php에서 아직 지원하지 않습니다.
- HelpOnProcessingInstructions . . . . 3 matches
* {{{#!}}}''프로세서-이름'': {{{#format}}} ''formatter''와 같다. 예) {{{#!vim}}}
* {{{#title}}} ''페이지 제목'': 좀 더 장황하고 설명적인 페이지 제목으로 바꿔준다.
- HelpOnProcessors . . . . 7 matches
다음과 같이 코드 블럭 영역 최 상단에 {{{#!}}}로 시작하는 프로세서 이름을 써 넣으면, 예를 들어 {{{#!python}}}이라고 하면 그 코드블럭 영역은 {{{plugin/processor/python.php}}}에 정의된 processor_python()이라는 모니위키의 플러그인에 의해 처리되게 됩니다. {{{#!python}}}은 유닉스의 스크립트 해석기를 지정하는 이른바 ''bang path'' 지정자 형식과 같으며, 유닉스에서 사용하는 목적과 동일한 컨셉트로 작동됩니다. (즉, 스크립트의 최 상단에 지정된 스크립트 지정자에 의해 스크립트의 파일 나머지 부분이 해석되어 집니다.)
이러한 방식으로 모니위키는 여러가지 다양한 프로세서 플러그인을 지원하고 있습니다.
- HelpOnRules . . . . 7 matches
네가이상의 "-"를 사용하면 가로줄이 됩니다. 대쉬의 개수가 증가할 수록 굵기가 두꺼워지고 10개 이상이면 굵기가 더 이상 증가하지 않습니다.
--- (가로선이 아닙니다)
--- (가로선이 아닙니다)
- HelpOnUpdating . . . . 25 matches
/!\ '''위키를 업그레이드 하기 전에 꼭 백업하세요!''' 특별한 경우가 아니라면 기존의 데이타를 잃게 되거나 하지는 않으나, 아주 사소한 실수로 예전의 데이타를 잃을 가능성도 있습니다. @)
이 문서는 모니위키를 업그레이드 하거나 다른 웹 호스팅 사이트로 이전하고자 할 때 필요한 것에 대해 설명하고 있습니다.
MoniWiki는 기본적으로 backup과 restore 액션을 지원하므로 다른 사이트로 이전하는 것을 쉽게 할 수 있으며, rcs를 설치하지 않은 위키에 대해서도 정기적은 backup만으로 자신의 위키 데이타를 비교적 안전하게 보존할 방법을 제공합니다.
== 수동 업데이트 ==
모니위키 1.0.8 버전 이전에는 간단한 업그레이드를 위한 자동화 스크립트를 제공하지 않으며, 1.0.9버전 이후에는 간단한 업그레이드 스크립트를 제공합니다 (upgrade.sh)
upgrade.sh가 하는 일은, 위키 엔진(*.php)을 업데이트하고, 기존의 위키엔진을 사용자가 변경하거나 해서 사용하고 있던 *.php는 없는지 검사하고 사용자가 변경한 *.php파일이 있다면 백업해줍니다.
아래는 upgrade.sh를 사용하지 않고 수동으로 직접 업그레이드 하는 방법을 설명합니다.
=== 업그레이드 하기 ===
wiki.php, wikilib.php는 가장 중요한 위키엔진입니다. 이것과 함께 wikismiley.php lib/*.php plugin/*.php 등등의 파일을 새것으로 교체합니다.
다음은 css/*.css imgs/* theme/* 등등의 파일을 업데이트합니다. 기존에 사용자가 변경한 파일이 있다면 반드시 백업하시기 바랍니다.
위 두가지 단계를 거치면 기본적인 업그레이드가 완료됩니다. 모니위키가 설치되어 있는 디렉토리에 위치한 config.php는 새 버전의 config.php.default를 참고해서 바뀐 점이 없는지 혹은 새로운 기능이 첨가된 것은 없는지 점검합니다.
- HelpOnUserPreferences . . . . 21 matches
위키위키를 여행하시는데에 사용자 등록을 하시면 편리합니다. 사용자 등록을 마친 후에는 우상단의 아이콘에 [[Icon(home)]]이 보이게 되며, 자신만의 [위키홈페이지]를 만들어 보실 수도 있습니다.
User``Preferences에서 설정하실 수 있는 것으로는 다음과 같은 것이 있습니다.:
* '''[[GetText(Name)]]''': 사용자의 실제 이름 혹은 별명. WikiName 형식으로 만들면 편리합니다.
* '''[[GetText(Password)]]''': 비밀번호는 다른사람이 쉽게 알거나 추측할 수 없는 것을 사용하시기 바랍니다.
* 웹상의 비번은 쉽게 노출될 가능성이 많으므로 가능한 노출되어도 큰 문제가 되지 않을 비밀번호를 사용하시기 바랍니다.
* '''[[GetText(Email)]]''': 자주 쓸 이메일 주소. 이메일 주소를 넣어주면 원하는 위키페이지에 대하여 그 변경점을 구독신청하거나 취소하실 수 있습니다. 비밀번호를 잊으셨을 경우에도 이 이메일 주소를 사용해 새로운 비밀번호를 등록하실 수 있습니다.
* 이메일 주소는 반드시 고유해야 하며, ACL 설정에 따라서는 이메일 주소를 반드시 필요로 하는 경우도 있습니다.
* '''[[GetText(User CSS URL)]]''': 자신이 원하는 CSS로 변경하고 싶을 경우에 사용합니다.
* '''[[GetText(Your time is)]]''': 원하는 시간대를 설정하면 자신이 원하는 시간대로 시간이 표시됩니다.
* '''[[GetText(Quick links)]]''': 최상단에 있는 메뉴에 자신이 원하는 링크를 추가하거나 원하는 위키페이지에 대한 링크를 넣을 수 있습니다. QuickLinks 페이지를 참조해주세요.
- I2C . . . . 38 matches
* 클럭(SCL)과 데이터(SDA)의 2라인을 사용하는 동기 양방향 2선식 Bus.
* 버스에 연결된 각 디바이스는 고유의 어드레스를 갖는다.
* transmitter: 버스에 데이터를 보내는 장치
* receiver : 버스로부터 데이터를 받는 장치
* master가 start condition을 만들면 버스에 연결된 slave 장치들이 이후 데이터를 기다린다.
* address가 일치한 장치는 acknowledge 신호 구간에서 데이터를 low로 유지해 응답을 보낸다.
* 그러면 master는 데이터를 읽거나 쓸 수 있게 된다.
* 모든 작업이 끝나면 마스터는 stop condition을 발생하고 버스를 release한다.
(클럭은 일정한 duty 사이클을 유지할 필요는 없다.)
* 클락이 Low일때 값을 변화 시키고
* 클락이 HIGH일때는 값을 유지 시켜야 함.
* 일반 데이터 전송에서는 클럭이 low일 때만 데이터의 상태를 바꿀 수 있다.
* 클럭이 high인 구간에만 유효한 데이터이다.
* master는 먼저 데이터 라인을 적당한 상태로 바꾸고 클럭 라인을 high로 한다.
* 데이터는 8bit이고 MSB가 먼저 전송 된다.
* start와 stop condition 사이에 전송되는 데이터의 길이는 제한이 없다.
* 9번째 사이클 동안 receiver는 데이터 선을 low로 유지해서 acknowledge를 표시한다.
* 데이터의 변경은 SCL이 LOW일때 이루워 지고
* SCL이 HIGH일때 읽어간다.
* START는 SCL이 HIGH, SDA가 HIGH -> LOW 일때이다.
- IPIPE . . . . 10 matches
Image Signal Processing(IPIPE)는 CCD/CMOS에서 YCbCr-4:2:2, YCbCr-4:2:0 포멧의 이미지 데이터를 뽑아내는 Programmable hardware 모듈이다.
IPIPE는 설정에 따라 resize-only mode로 동작해서 IPIPE내의 다른 모듈의 동작 없이 resized 된 YCbCr-4:2:2, YCbCr-4:2:0 포멧 이미지를 뽑아 낼 수 있다.
IPIPE는 Bayer 데이터를 지원한다.
1. IPIPE는 CCD에서 원시 데이터를 얻어와 IPIPE의 모든 기능 블럭을 통과해 YCbCr(or RGB) data를 SDRAM에 저장 한다.
1. IPIPE는 CCD에서 원시 데이터를 얻어와 White balance를 한 bayer data를 SDRAM에 저장한다.
1. IPIPE는 YCbCr-422 데이터를 edge enhance, c hroma suppression와 resize를 해서 YCbCr(or RGB) 데이터로 SDRAM에 저장한다.
- IPNC . . . . 2 matches
1. [:20100217 오디오 드라이버 점검]
1. [:20100221 BSC 드라이버 작성]
- IPNC_DHCP . . . . 1 match
ip=off로 되어 있으면 부팅 과정중에 ip할당 부분이 생략 됨.
- IPNC_EVM3 . . . . 6 matches
EVM3 SPI Interface 변경에 따른 센서 드라이버 수정 작업
3. 센서 드라이버 추가
4. SPI 드라이버 수정
5. V4L2 드라이버 연결
이름, PINMUX 넘버, 위치, 마스크, 값, 0 로 설정
* '''davinci_spi_platform.c 에서 SPI1을 사용하기 위해서 SPI 베이스 주소를 변경한다.'''
- IPNC_filesystem . . . . 1 match
target을 nfs로 부팅한 후, target에서 다음 컨맨드를 수행해서 yaffs file system을 업데이트 한다.
- IPNC_flash_utils . . . . 1 match
Flash-utils에는 UBL및 Nand Writing 프로그램이 포함 되어 있다.
- IPNC업무 . . . . 2 matches
1. [:20100217 오디오 드라이버 점검]
1. [:20100221 BSC 드라이버 작성]
- Inception_GoogLeNet . . . . 77 matches
적은 weight로 비슷한 효과를 내어주는 네트워크 구조를 제안하는 것으로 '''Going Deep with Convolutions (Szegedy et al.)'''[* Christian Szegedy et al., '''Going Deeper with Convolutions''',CVPR, 2015, <https://arxiv.org/abs/1409.4842>] 논문에서 Inception model이라는 것을 제안했고 이를 바탕으로 GoogLeNet를 구현하여 ImageNet Large-Scale Visual Recognition Challenge 2014(ILSVRC14)에서 좋은 성적을 보였다.[* 강병규, (17 Jan 2018), <https://kangbk0120.github.io/articles/2018-01/inception-googlenet-review>] 이후 Szegedy et al. (CVPR, 2016)[* Szegedy et al., '''Rethinking the inception architecture for computer vision''', CVPR, 2016, <https://arxiv.org/abs/1512.00567>]을 통해서 Inception V1를 개량한 Inception V2를 거쳐 GoogLeNet을 앞도하는 Inception V3를 만들었다. 3x3 보다 큰 필터는 그보다 더 작은 필터로 효과적으로 표현하는 것을 제안했고 심지어 7x7 필터는 1x7과 7x1 컨볼류션 레이어로 대처하는 것을 제안했다. [* JUNSIK HWANG, (12, Sep, 2017), Inception V3: Transfer Learning, <https://jsideas.net/Inception_v3_transfer_learning/>][* Nicolò Valigi, (10 Oct 2016), Short history of the Inception deep learning architecture, <https://nicolovaligi.com/history-inception-deep-learning-architecture.html>]
[:grad_cam CAM] 논문 리뷰에서도 언급 했던 논문으로 Network 모델을 구성하는데 많은 영향을 준 논문으로 '''Network in Network'''[* ''Min Lin, Qiang Chen, Shuicheng Yan.'' '''"Network In Network"'''. 4 Mar 2014. <https://arxiv.org/pdf/1312.4400.pdf>]을 꼽을 수 있다. Network In Network은 싱가로프 국립대학의 '''Min Lin'''이 2013년에 발표한 모델이다. (아카이브에만 올리고 논문 발표는 하지 않은 것으로 알고 있음.)
저자는 NIN 라는 새로운 모델이 Convolutional layer가 만들어 내는 feature map의 성능을 향상 시킨다고 말하고 있다.
아래 그림에서 처럼 기존의 Convolutional layer는 feature map을 만들기 위해서 선형 필터와 비선형 활성화 함수를 통해서 만들어 내지만, 제안한 NIN 모델에서는 더 복잡한 구조로 마이크로 신경망을 구축해서 feature map을 만들 수 있습니다. NIN에서 제안한 마이크로 신경망은 CNN의 Filter와 같이 지역적인 정보를 이용하여 Stride만큼 이동하면서 feature map을 구성하고, 이를 Mlpconv layer라고 한다.
MLP를 이용할때의 장점은 Filter를 사용할 때보다 '''Non-linear한 Activation function을 더 많이 추가할 수 있어서 Non-linear한 성절로 인해 더 좋은 Feature를 추출'''할 수 있다는 점이다. 또한, __1x1 Convoltution을 통해서 Feature map 개수를 줄임으로써 '''Parameter의 수를 줄일 수''' 있다.__
NIN에서는 Mlpconv를 통해서 충분히 효과적인 Feature를 추출했고, Average pooling만으로 Classifier 역할을 할 수 있다고 주장하고 있다. 또한 이를 통해 Overfitting과 연산량을 줄이는 효과가 있다.
보통 Convolution Neural Network에서는 Convolution 연산을 통해서 Feature map의 Width(W)와 Height(H)의 크기는 줄이고 Channel(C)는 늘리는 형태를 취한다. (이미지는 압축하고 다양한 특성을 추출한다고 생각할 수 있다.) 이 때, 1x1 Convolution 연산을 선행하여 계산하려는 C의 갯수를 줄일 수 있다. 1x1 Convolution 연산은 Channel 단위로 Fully Connected 연산을 수행하여 차원을 압축하는 효과를 얻을 수 있고 다음 연산에 적용되는 Channel을 줄여 결과적으로 학습해야할 Parameter의 수를 줄일 수 있다.
우리는 많은 실험과 딥러닝 경험을 통해서 일반적으로 네트워크가 깊어져서 Non-linear한 결합을 많이 수행할수록 네트워크의 성능이 좋아짐을 알았다. 하지만 깊은 네트워크로 인해 생기는 문제점도 있다. 오버피팅의 위험, Vanishing gradient의 위험뿐만 아니라 연산량 또한 증가한다. 이러한 문제를 해결하기 위해 Dropout을 사용하는 네트워크처럼 sparse하게 연결되는 구조는 갖는 네트워크를 만든다. '''네트워크의 성능을 위해서는 sparse한 네트워크가 좋고 컴퓨터의 계산 효율면에서는 dense한 네트워크 구조가 좋다''' 이 둘 사이의 타협을 위해 ''Inception module''이 등장했다.
Inception 모듈에서는 feature를 효율적으로 추출하기 위해 1x1, 3x3, 5x5의 Convolution 연산을 각각 수행합니다. 3x3의 Max pooling 또한 수행하는데, 입력과 출력의 H, W가 같아야하므로 Pooling 연산에서는 드물게 Padding을 추가해줍니다. 결과적으로 feature 추출 등의 과정은 최대한 sparse함을 유지하고자 했고, 행렬 연산 자체는 이들을 합쳐 최대한 dense하게 만들고자 했습니다. 그러나 위에서 언급했듯 이렇게 되면 연산량이 너무 많아지게 됩니다.^^[2]^^
이를 해결하기 위해서 논문은 1x1 Conv를 사용해 dimension reduction을 수행합니다.
* 2차원 Conv는 채널, x축, y축 3차원에 batch를 포함해서 4차원 데이터로 표기한다. 예) [B, W, H, C]
* 보통 Conv 연산을 통해서 W, H의 크기는 줄이고 C는 늘리는 형태로 네트워크를 구성한다.
* W, H는 Max-Pooling으로 줄이고, C는 Conv Filter 갯수로 정해진다.
* 1x1 Conv 연산은 C를 늘리는 것이 아니라 채널방향으로 압축하는 역할로 쓰인다. (Network in Network)^^[6]^^
* (b) 그림에서 처럼 1x1 Conv 연산으로 C를 먼저 줄이게 되면 연산량을 줄여서 계산할 수 있다.
* 레이어 초반에는 인셉션 모듈이 들어가 있지 않다. 이 영역을 Stem 영역이라고 하고, 실험을 통해서 초반에는 인셉션이 별로 효과가 없어서 사용하지 않았다고 하는데, __초반 Raw 데이터로 부터 정보를 추출하는 부분이 중요한 역할을 하는 것으로 보임__
* 그림 중간에 보이는 노란색 블록은 네트워크가 깊어짐에 따라 발생하는 vanishing 문제를 해결하기 위해 중간 층에서도 Backprop을 수행하여 weight를 갱신을 시도하는 것임. (Inception v2, v3에서는 보조 softmax가 별로 효용 가치가 없다고 해서 맨 앞단 softmax는 제거함.)
*VGG는 연산량이 많는데… 왜?? (그럼 좀 쉽게 만들던가!)
*VGG는 Alexnet보다 파라미터 수가 3배나 많단 말이야! (그럼 좀 쉽게 만들던가!)
이러한 자기반성을 통해서 더 작은 단위의 conv를 사용하자는 결론으로 아래와 같은 시도를 함.
- InterMap . . . . 1 match
# * 아래 줄은 자신의 환경에 맞게 바꿔주세요. 최상위 url이 wiki라면 /wiki/pds/ 라고 하셔야 합니다.
- IsbnMap . . . . 30 matches
/!\ 일종의 InterWiki Map인 것이죠.
알라딘 Book Catalog는 경로가 다르고 gif포맷이라 하나 추가합니다.
알라딘 같은 경우 품절이나 재발매 등으로 ISBN이 새로 배정됐을 때, 그림은 예전 껄 그대로 가져다 씁니다.
그래서 ISBN으로 링크를 걸면 규칙에 안 맞기 때문에 그림이 안 뜨죠.
이런 경우, 어떤 식으로든 그림의 주소를 전달하는 방식을 만들 수 있을까요?
2004년인가 2005년부터 새로 나온 책의 이미지 포맷과 이전 책의 이미지 포맷이 달라졌습니다.
* 이전책 : gif {{{http://image.aladdin.co.kr/cover/cover/ISBN$_1.gif}}}
IsbnMap 에서 map 을 분리해서 사용하는 방법이 있을 수 있고 - 이 경우 출판년도에 따라서 옵션을 달리 줘야 하는 불편함이 있습니다. - ISBN 매크로를 고쳐서 (가능하다면 jpg가 없을 때 gif를 찾는 어떤 로직을 넣는 방법이 있을지 않을까 하는 생각이 듭니다. 제가 coding에 능력이 전혀 없는지라, 이게 구현할 수 있는 방법인지는 모르겠지만 논리적 차원에서는 이게 사용자 정신건강에 이로운 해결책이 아닐까합니다. (제 위키에서 책목록을 관리하는데 수작업으로 바꿔 줄 생각을 하니 조금 끔직합니다. - 스크립트를 돌려도 되기는 하지만 ... )
전 이렇게 써요. -.-;
모니위키 1.1.3에서는 이와 관련된 버그가 고쳐졌고, 알라딘 같은 경우는 확장자가 jpg/gif인 경우를 자동으로 검출합니다. 이 경우 php.ini에 {{{'allow_url_fopen=1}}}같은 식으로 설정이 되어있어야 합니다. 또, config.php에 {{{$isbn_img_download=1;}}} 와 같이 옵션을 넣으면 이미지를 다운로드할 수도 있게 하여, 일부 referer를 검사하여 이미지를 보이지 않게 하는 사이트에서도 활용하기쉽게 하였습니다. -- WkPark [[DateTime(2009-01-13T07:14:27)]]
- KernelAPI . . . . 4 matches
GFP_KERNEL option으로 호출하면, kmalloc이 당장은 메모리가 모잘라도 메모리가 생길 때까지 계속 try하는 반면에...
GFP_USER option으로 호출하면, 메모리 부족하면 대충 fail로 끝나버리는 차이를 말하는 듯합니다.
mount시에 super_block을 할당받지 못하면 그냥 mount fail로 끝나도 상관없으니, GFP_KERNEL option으로 kmalloc을 호출할 필요없이 그냥 GFP_USER를 사용해도 충분하다 정도로 이해하려 합니다.
- Kernel컴파일하기 . . . . 14 matches
사랑넷은 국내 사이트이지만 접근이 되지 않는다. 로그인을 해야 하는데..
계정이 없음. ㅠㅜ
커널의 컴파일 옵션을 설정하는 방법은 make menuconfig 이외에 make config, make xconfig가 있지만 지금 사용할 방법은 make menuconfig이다.
이렇게 설정한 구성 내용은 .config에 저장 된다.
커널 컴파일은 커널 버전에 따라서 다르다. 커널 2.4에서 2.6으로 넘어오면서 컴파일이 간단해졌다.
실제 컴파일 해본 결과 버전별로 Makefile이 변경이 되서 조금씩 달랐다.
make install까지 하게 되면 커널이 /boot 드렉토리 밑으로 복사 되고
주위) 컴파일 옵션을 잘 못 설정하면 컴파일이 안 되거나 부팅이 안 될 수 있음
[리눅스 드라이버]
- LAPACK . . . . 2 matches
cmake를 수행하면 현재 시스템에 맞는 '''Makefile'''이 만들어진다.
libblas.a 가 없을 경우 BLAS 드렉토리로 이동해서
- LMA_Levenberg_Marquardt . . . . 139 matches
원래는 Levenberg-Marquardt 방법에 대한 내용을 쓰고자 했는데 글을 쓰다 보니 함수 최적화 기법들을 총 정리하는 글이 되고 말았습니다.
그동안 뉴턴-랩슨법(Newton–Raphson method), 가우스-뉴턴법(Gauss–Newton method), Gradient descent 방법 등 여러 함수 최적화 기법들을 소개한 바 있지만 사실 비선형 함수 최적화 문제에 있어서 가장 널리 쓰이는 방법은 Levenberg–Marquardt 방법입니다.
그런데 Levenberg–Marquardt 방법을 이해하기 위해서는 먼저 가우스-뉴턴법(Gauss–Newton method)과 Gradient descent 방법에 대한 이해가 필요합니다. 왜냐하면 Levenberg–Marquardt 방법은 가우스-뉴턴법(Gauss–Newton method)과 Gradient descent 방법이 결합된 형태로 볼 수 있기 때문입니다. 그리고 당연히 최소자승법에 대한 이해도 필요합니다.
관련하여 먼저 아래의 글들을 읽어보면 도움이 되리라 생각합니다.
* 최소자승법 이해와 다양한 활용예 (Least Square Method)
* 뉴턴법/뉴턴-랩슨법의 이해와 활용(Newton's method)
이 글에서는 먼저 위 내용들을 포함하여 관련 내용들을 전반적으로 정리한 후 Levenberg-Marquardt 방법에 대해 살펴보도록 하겠습니다.
관측값을 \((x_i, y_i), i=1,...,n,\)모델 파라미터를 \(p = ( p_1, p_2, ..., p_m)\) , 모델을 y = f(x, p), 관측값과 모델과의 오차(residual)를 \(r_i\)라 할때, 오차 제곱합이 최소화 되도록 모델 파라미터 p를 정하는 방법을 최소자승법(least square method)이라 한다.
만일 관측값의 신뢰도(중요도)가 서로 다를 경우에는 각각의 오차 제곱에 가중치 \(w_i\)를 곱해서 최소화시키는 방법을 사용하는데 이러한 문제를 가중최소자승(weighted least squares, WLS)문제라 부른다 (통계 쪽에서는 보통 \(w_i = 1/\sigma_i^2\)로 잡음. 단, \(\sigma_i^2\)은 \(y_i\)의 분산).
이 때 위 식의 에러합 부분을 행렬 형태로 표현하면 다음과 같다.
최소자승법은 결국 위 식에 의해 주어지는 에러 함수를 최소화시키는 p를 구하는 문제로 볼 수 있으며 이는 p에 대한 미분이 E'(p) = 0, Ew'(p) = 0인 p를 구함으로써 얻어진다.
그런데 선형(linear) 최소자승문제의 경우에는 벡터미분을 이용하여 이러한 해를 직접적으로 구할 수 있다 (closed-form solution이 존재).
☞ 최소자승 문제에 있어서 모델 f(x,p)가 모델 파라미터에 대해 선형인 경우 선형 최소자승 문제(linear least squares problem)라 부르고 그렇지 않은 경우 비선형 최소자승문제(non-linear least squares problem)라 부른다. 예를 들어 \(f(x,p) = p_1*sin x + p_2*cos x\)라면 f(x,p) 자체는 비선형 함수이지만 파라미터 p = (p1,p2)에 대해서는 선형이므로 f(x,p)에 대한 최소자승 문제는 선형(linear) 문제가 된다.
만일 f(x,p)가 p에 대해 선형인 경우에는 f(x,p)를 아래와 같이 p에 대한 일차 결합 형태로 표현할 수 있다.
따라서, 선형 최소자승문제의 경우에는 아래와 같은 행렬 표현이 가능해진다.
벡터미분을 이용하여 \(E(p), E_w(p)\)를 p로 미분한 후 0으로 놓으면
가 된다 위 식의 양변에 transpose를 취한 후 p에 대해 정리, W는 대각행렬이므로 (W^T=W), 벡터미분에 대해서는 벡터미분과 행렬미분 글 참조.
따라서, 선형 최소자승문제와 선형 가중최소자승문제의 해는 다음과 같이 closed-form 형태로 구해진다.
예를 하나 들어보면, 세점 \((x_1,y_1), (x_2,y_2), (x_3,y_3)\)를 삼각함수 \(f(x) = p_1*sin(x) + p_2\)로 근사시키고자 할 때 최소자승 해는 다음과 같이 구해진다.
'''음함수 최소자승법''' 만일 모델이 양함수(explicit function) 형태가 아니라 f(x,p) = 0와 같은 음함수(implicit function) 형태일 경우에는 최소자승 문제의 형태 및 풀이방법이 조금 달라진다. 이 경우 \(r_i = f(x_i,p)\)이며, f(x,p)가 p에 대해 선형이면 최소자승문제를 \(\sum r_i^2 = ∥Ap∥^2 \)와 같이 표현할 수 있다. 그리고, \(\sum r_i^2 = ∥Ap∥^2 \)를 최소화시키는 p는 A의 SVD(singular value decomposition)을 \(A = \sum V^T \)라 할 때 최소 특이값(singular value)에 대응하는 V의 열벡터가 된다. 자세한 내용은 선형연립방정식 풀이 글 참조.
- LRP_workPlan . . . . 1 match
[:layer_wise_relevance_propatation Layer-wise Relevance Propagation 이론 정리]
- LVC_2016_Fall_Glasgow . . . . 5 matches
글래스고에 도착하고 이틀이 지나서 이글을 작성한다.
O2 Public Plan에 대한 presentaion이 시작됐다.
bucanon쪽이 시내인듯하다.
- LaTex_guide . . . . 21 matches
문서 작업에 많이 쓰이는 LaTex에 대해서 알아보자
* 계정 사용자: 자신이 제어할 수 있는 위치에 설치할 것을 권장한다. 예를 들면 ~/.local/texlive/2015
* 설치 옵션 선택을 할 수 있다. 유의할 것은 다음 두 가지이다.
* S : installation scheme을 선택한다. scheme-full이 기본. S 키를 누르고 들어가서 medium/small 등 원하는 scheme을 선택할 수 있다. 시간과 자원이 충분하고 개별 패키지에 대해 잘 알지 못하면 scheme-full을 선택하는 것이 좋다. 시스템 관리자라면 당연히 scheme-full을 선택한다.
* O : options. 여기서 create symlinks to standard directories를 선택할 수 있다. 이것을 선택하면 texbin 폴더를 만들고 이것을 PATH에 포함하는 과정을 생략할 수 있다. 시스템 관리자라면 이 옵션을 선택할 수 있다. (다만 이것을 선택한 후에 패키지 관리자가 설치해주는 texlive와 충돌을 일으킬 가능성이 없는 것은 아니다.) 이후의 설명은 이 옵션을 선택하지 않은 경우를 전제로 한다.
* 옵션 선택이 완료되면 (R을 눌러서 설치 화면으로 돌아온 다음) I(아이)를 눌러서 설치를 시작한다.
macport를 이용하여 texlive를 설치하신 후에
명령을 내리시면 ko.tex이 설치됩니다.
양식을 만들기 위해서 대충 채워넣은 것이고 여기 있는 내용은 항목 빼고는 다 지우면 됩니다.
저장소 (repository)의 파일목록보기는 다음과 같이..
한가지 ko.tex 패키지를 설치해야 여기에 있는 fpgafft latex 소스파일의 컴파일이 가능합니다.
- LaTex_syntax . . . . 11 matches
1. 그래픽 팩키지를 이용하기위해 위와 같이 tex의 시작 부분에 아래 문구를 넣는다.
3. 그 아래 begin~end 부분은 실제 그림이 들어가는 부분이다. 보통 본문에서 그림에 대한 언급을 하는 문장이 속한 paragraph 아래에 넣는다.
p (floating)는 따로 추가의 페이지에 넣으라는 뜻
간혹 figure 말고 figure*를 쓰는 경우가 있는데 이때 그림은 two column wide로
이 경우 figure 대신 figure*를 사용하여 그림을 두 column에 걸쳐 크게 넣는다.
다음과 같이 한다: [width=20cm]. 뭐 인치단위도 가능하다:[width=20in].
scale을 이용하여 배율 조정도 가능하고, angle로 회전도 가능하다.
\caption{The parity-check matrix.}%: 그림의 캡션이다.
- Ligo_clientLigo-client설치 . . . . 8 matches
이렇게 하면 apt source list에 LIGO Client에 대한 정보가 업데이트 된다. 하지만 실제 실행해보니 Public key 문제로 정상적이 종료가 안 되는 경우가 있는데 이런 경우는 아래와 같이 Key값을 얻어오면 해결 된다. [* http://askubuntu.com/questions/20725/gpg-error-the-following-signatures-couldnt-be-verified-because-the-public-key]
모든게 문제 없이 실행 되었다면 실제로 LIGO Client를 설치 하자.
패스워드 질의 없이 바로 접속이 됨.
- Linux_device_DMA . . . . 57 matches
대량의 데이터를 고속으로 전송할 수 있도록 지원하는 DMA는 i386 시스템에서는 잊혀져 가는 방식이다.
최신의 PC에서는 DMA 대신 '''버스 마스터링'''이라는 방식을 지원하는 PCI 버스를 많이 사용하기 때문이다.
그러나 ARM이나 MIPS와 같은 임베디드용 프로세서는 아직도 DMA를 사용하고 있다.
DMA는 음성이나 영상과 같이 방대한 양의 데이터를 처리 하기 위해서 사용 된다.
프로세서로 부터 로컬 버스 제어권을 넘겨 받아 DMAC(Direct Memory Access Controller)가 데이터 전송을 하게 되고 데이터 전송이 끝나면
DMA는 대부분 채널로 구성되는데, 이 채널을 데이터를 전송하는 기본 단위이고, 하나의 채널은 다음과 같이 구성된다.
* 전송 데이터의 소스 주소
* 전송 데이터의 목적지 주소
* 전송 데이터의 크기
보통 하나의 DMAC에서 여러 채널을 관리하는데, DMA에 채널이 있는 이유는 여러 디바이스에 DMA 전송을 동시에 수행한다는 개념이 아니고,
리눅스는 디바이스 드라이버에서 DMA를 다룰 수 있는 여러 함수를 지원한다. 하지만 DMA의 구현 방식이 시스템마다 다르기 때문에 DMA 처리와 관련된 함수나 구조체를 리눅스에서 완벽하게 표준화 하는 것은 무리가 있다. 따라서 공통 함수군을 벗어난 처리는 디바이스 드라이버에서 직접 처리해 줘야 한다.
디바이스 드라이버가 DMA를 사용하기 위해서는 가장 먼저 DMA 채널에 대한 소유권을 등록해야 한다. 이 소유권 등록은 디바이스 파일이 열렸을 때 호출되는 open() 함수에서 처리 한다.
반대로 디바이스 파일이 닫혀서 더 이상 DMA 채널을 사용하지 않는다면 채널 소유권을 반환해야 한며, release() 함수에서 처리한다. 소유권의 등록과 반환은 다음 함수를 이용해 처리한다.
현재 사용되는 DMA에 어떤 것이 있는지 알고 싶다면,
최근에 사용되는 PC 시스템은 대부분의 경우 PCI 시스템을 사용하기 때문에 4번 채널에 대한 내용만 볼 수 있다. 4번은 실제로는 사용되지 않는 채널이다. PC 시스템은 DMAC 두 개가 마스터 슬레이브 관계로 연결되어 총 8개의 DMA 채널을 제공하는데, 이중 4번은 마스터와 슬레이브 관계를 연결하는데 쓰이기 때문에 실제로는 7개의 DMA 채널만 존재한다.
이런 이유로 4번 채널은 cascade라는 이름으로 항상 등록되어 있다.
== 디바이스 파일이 열렸을 때의 DMA 처리 ==
DMA를 사용하는 디바이스 드라이버는 request_dma() 함수를 이용해 소유권 등록을 하고 DMA 처리를 위한 버퍼와 DMA 처리를 종료시킬 때 발생하는 인터럽트를 처리해야 한다.
디바이스 파일이 열렸다면 다음과 같은 처리를 수행한다.
이와 같은 처리를 위해 디바이스 파일을 열었을 때 호출 되는 open()함수의 형식은 다음과 같다.
- Linux_device_Dynamic_DMA_mapping . . . . 27 matches
이를 통해 PCI 장치는 64bit 물리 주소의 어느 곳이든 32bit DMA address로 접근 할 수 있다.
드라이버의 도움을 통해서 리눅스에서 dynamic DMA mapping을 사용 할 수 있다. DMA address는 실제 사용하는 순간에 연결 되고 사용이 끝나고 해제 되도록 하자.
당신이 알아야 할 첫번째 정보는 커널의 어느 메모리를 DMA mapping에 사용하느냐 이다.
이 말은 꼭 커널 이미지 주소를 쓰지 않아도 된다는 것이다. '''결론 : DMA를 위한 주소는 어디든 상관 없다.'''
그래서 이쪽은 넘어간다. ㅎㅎㅎ
Consitent DMA 매핑 방식은 보통 드라이버 초기화시 매핑 되고 마지막에 언매핑 된다. 장치와 CPU 둘다 데이터를 접근 할 수 있다
Consistent DMA 영역을 할당 받기 위해서는 위와 같이 해야 한다. dev 인자는 어떤 장치에 할당 할지를 식별하기 위해 필요하다.
이 방법은 페이지 단위로 DMA 영역을 할당 받는다. 사용하려고 하는 메모리 사이즈가 페이지 보다 작으면 pci_pool 인터페이스를 사용하길 바란다.
이것은 두 가지 변수를 리턴한다. CPU에서 사용할 Virtual 주소와 장치에 넘길 dma_handle이다.
CPU는 주소를 리턴하고 DMA 버스 마스터 주소는 가장 작은 페이지 사이즈로 정렬 되어 있고 요청한 사이즈보다 크거나 같다.
DMA 영역을 돌릴때는 위와 같이 한다. dev, size 는 할당 받을 때와 동일하게 입력한다.
만약 작은 사이즈의 메모리 영역이 많이 필요하다면 pci_pool API을 사용하라.
- Linux_device_driver_GFP_kernel . . . . 2 matches
GFP_KERNEL과 GFP_USER의 차이점,
GFP_KERNEL 옵션은 kmalloc이 메모리가 모자를때 메모리가 생길 때까지 계속 try하는 반면
- Linux_device_module_basic . . . . 29 matches
모듈 프로그램으로 작성하는 리눅스 디바이스 드라이버에 대해서 설명한다.
모듈이 적제 되고 해제될때 호출 되는 함수들만 갖고 있는 간단하 모듈 프로그램이지만 이 간단한 부분을 잘 못 하게 되면 모듈이 적제 되고 해제 될때 문제가 발생하게 된다.
'''dmesg''' 명령이나
= 디바이스 드라이버 =
디바이스 드라이버는 file_opeerations 구조체를 통해서 동작한다.
모든 디바이스 드라이버는 사용자가 file_operations를 사용해 등록한 표준화된 인터페이스를 통하게 된다.
* {{{{color: rgb(255, 1, 1); font-size: 13px;} 디바이스 드라이버의 등록 }}}
* 디바이스 드라이버에 내부 구조체의 메모리 할당
* 여러 프로세스가 하나의 디바이스에 접근하는 경우에 필요한 사전 처리
이중에서 반드시 해줘야 하는 것은 디바이스 등록과 하드웨어 검출이다.
다른 부분들은 드라이버 호출시에 해도 무방하다.
= PCI 디바이스 드라이버 =
기본적인 형태는 케릭터 디바이스 드라이버와 같다. 하지만 장치를 찾고 활성화 시키는 부분이 좀 다른데
이 장에서는 그것을 알아보도록 하겠다. ㅎ
- Linux_environment_PATH . . . . 9 matches
각 사용자는 자기 홈폴터 아래 .bash_profile이라는 파일을 생성해서 환경 변수를 선언해서 사용 할 수 있다.
오늘 여기서 다룰 내용은 PATH 변수에 경로를 추가하는 일이다.
사용자 계정에 .bash_profile 이라는 파일이 있는지 확인하자 없다면 하나 만들도록 한다.
이렇게 하고,
이라고 하면 적용이 된다.
{{{{color: rgb(255, 1, 1); font-size: 13px;} 주의 : .bash_profile을 작성할 때 공백이 있으면 안 된다. 공백이 있게 되면 하나의 명령어로 받아 드려 에러를 낸다. }}}
- Linux_general_prompt_config . . . . 9 matches
리눅스를 사용하다 보면 경로명이 지나치게 길어져 보기 힘들 경우가 있다.
또한, 프롬프트의 생각이랑 사용자가 입력한 명령의 구분이 명확하지 않아서 가독성이 떨어질 때 프롬프트의 색상을 변경하면 좋다.
프롬프트가 명령어의 출력과 뚜렷이 구분되어 가독성이 높습니다.
가량 위의 예제에서, [32 는 '어두운 초록색'을 의미합니다. 이것을 '밝은 초록색'으로 만들기 위해, 세미콜론(;)을 찍고, 1m 을 추가했습니다.
[3m : 이탤릭체(italic)
[23m : 이탤릭체(italic)제거
- Linux_gtk_intro . . . . 7 matches
GTK와 Glade는 Linux환경에서 GUI 프로그램을 하기 위한 라이브러리쯤으로 이해 하고 있다.
GTK+라는 것이 Glade를 포함하고 있다고 한다.
'''Glade Interface Desinger''' 라는 프로그램을 찾아준다. 이 프로그램은 GTK+를 이용해서 GUI 프로그램을 도와주는 프로그램이다.
Dependency 검사를 통해서 필요한 파일을 잘 설치해주는 Ubunte는 친절하게도 GTK+관련 패키지까지 몽땅 같이 설치해준다.
- Linux_gui_installation . . . . 5 matches
ununtu 서버를 사용하다가 어느날 문득 xwindows or xserver가 필요한 순간이 왔다.
xwindows를 어찌 설치 할까에 대한 글이다.
* 재부팅 없이 네트워크만 재시작
[root@localhost] apt-get update (새로운 업데이트 확인)
[root@localhost] apt-get dist-upgrade (업데이트)
- Linux_iconv파일의언어설정변경Iconv설명 . . . . 8 matches
conv 로 데이터파일의 언어설정을 바꿀수 있습니다.
위와 같은 형식으로 변경이 가능합니다. -f 는 기존의 언어셋을 -t 는 변경할 언어셋을 설정해 주면 됩니다.
확인이 필요하겠죠..(확인하기가 제일 어려움..ㅜㅜ)
-f, --from-code=<이름> 원 문서 인코딩
-t, --to-code=<이름> 출력 인코딩
-?, --help 이 도움말 리스트를 표시함
질문사항이 있으면 댓글 남겨주세요 ㅎㅎ
맥에서는 euckr과 utf8 대신에 위와 같이 사용한다.
- Linux_kernel_source . . . . 13 matches
현제 사용하고 있는 시스템의 드라이버를 개발 할 때 현제 사용하고 있는 시스템의 커널 소스가 필요하게 된다.
이때, 어떻게 커널 소스를 갖고 오는지를 Ubuntu 환경을 기준으로 설명하겠다.
커널의 버전은 2.6.35 이다.
- /usr/src 디렉토리 안에 커널소스 파일이 들어있다.
다음 패키지가 자동으로 설치되었지만 더 이상 필요하지 않습니다:
이들을 지우려면 'apt-get autoremove'를 사용하십시오.
0개 업그레이드, 2개 새로 설치, 0개 제거 및 17개 업그레이드 안 함.
72.5M바이트 아카이브를 받아야 합니다.
이 작업 후 80.0M바이트의 디스크 공간을 더 사용하게 됩니다.
kr.archive.ubuntu.com:80에 연결할 수 없습니다 (143.248.234.110). - connect (111: 연결이 거부됨)
- Linux_kernel_system_call시스템콜이란 . . . . 10 matches
#title 시스템 콜이란?
응용 프로그램이 커널과 통신하기 위한 방법에 한가지로 시스템 콜이 있다.
사용자가 OS에 기능을 요청하고 응답을 기다리는 방식이다.
운영 체제는 커널 모드와 사용자 모드를 지원한다. 이 모드는 사실상 CPU에서 제공해 준다.
* 커널 모드 : 프로세서의 특권 레벨(privileged level)로 프로세서의 모든 명령을 처리할 수 있고, 시스템 지원이나 하드웨어들을 직접 액세스 할 수 있다.
* 사용자 모드 : 일반 응용 프로그램이 동작하는 모드로 커널 모드와는 달리 비특권 레벨(nonprivileged level)이기 때문에 하드웨어나 시스템 자원을 직접 이용할 수 없고 시스템 콜을 이용해 접근해야 한다.
- Linux_openshot리눅스동영상편집프로그램OpenShot . . . . 6 matches
리눅스에서 동영상 편집할땐 OpenShot (http://www.openshotvideo.com/)를 이용해주세요. 정말 기능이 간편하면서도 강력하네요..
우분투는 간단히 PPA등록해 주시면 APT로 최신버전이 설치가능합니다.
동영상(http://vimeo.com/50513213)을 보시면 이해가 빠르실거라는..ㅋㅋㅋ
mkv나 avi를 mp4 등으로 변환할때는 Arista (http://www.transcoder.org/)를 이용해 변환하세용(팟인코더같은 명작)
위와같이 간단히~~
- Linux_pci_driver . . . . 3 matches
PCI 드라이버에 대한 조사
= PCI 드라이버 구조 =
PCI에 대한 정보는 아래와 같이 확인 할 수 있는데 시스템 마다 표시 하는 정보가 조금씩 다르다.
- Linux_pci_driver_example . . . . 22 matches
리눅스 드라이버는 커널 버전에 따라서 중간 중간 많은 변화들을 격고 있는 것으로 보인다.
module로 작성한 드라이버를 확인하고 올리고 내리는 방법에 대해서 소개 한다.
명령어로 이루어 진다.
드라이버를 module형태로 작성해 올렸을 때 사용자가 사용할 수 있는 파일 형태로 보여주기 위한 명령이 있다.
printk() 문으로 디버깅을 하려고 하는데 화면 출력이 안 되는 경우가 있다.
이것은 printk()문의 출력이 콘솔에서만 되기 때문이다.
리눅스 시스템에서 모듈 프로그래밍을 할 때 printk()로 출력되는 문자열을 콘솔이 아닌
터미널에서 보고 싶은 사람이 있을 것입니다.
이를 설정하기 위해선 printk에 동작방식에 대해서 알아야 하는데
이때, 시스템의 syslogd 까지 전달되게 되는데 여기에서 전체적으로 로그메시지를 어디에
이 경우, 대개 syslog.conf 파일에 보면 kern.log 나 messages.log 파일에 저장되는 것을
볼 수 있습니다. 이를 바로 콘솔(console)로 출력하고 싶을 땐 /dev/console로 바꿔주면
됩니다. 하지만 이경우, x 윈도우를 사용하거나 putty 같은 클라이언트로 접속을 하게 되면
이 경우 syslog.conf 파일에서 아래 부분은 주석 해제한 뒤 syslog를 재시작 합니다.
장치의 이름으로 unique해야 하며 /sys/bus/pci/drivers에서 보여진다.
이 구조체를 등록하기 위해서 pci_register_driver()함수를 이용하는데 전통적으로 init()함수에서 호출 한다.
반대로 등록을 해지하기 위해서는 pci_unregister_driver() 함수를 이용한다.
- Linux_system_grub . . . . 7 matches
리눅스를 부팅할때 커널을 고를 수 있다. 이때 내가 사용하고 싶은 커널이 구버전일 때
이 파일을 보면 부팅하면서 보여지는 순서대로 커널 정보들이 들어 있다. 가장 앞에 있는 것이 '0'번이고 차례대로 아래쪽으로 붙어 있다.
GRUB_DEFAULT = 6 이 값을 원하는 값으로 수정하면 된다.
- Linux_system_syslog.conf . . . . 4 matches
리눅스 시스템은 로그 메세지를 관리하는 메카니즘을 제공하는데 그것을 로그 시스템이라고 한다.
로그 시스템은 busybox를 이용한 syslogd도 있고 rsyslogd도 있다.
설정 파일의 이름은 rssylog.conf 이면 사용법은 비슷한 것 같다.
- Linux_ulimit_commandUlimit명령어 . . . . 73 matches
/etc/security/limits.conf 를 참조해서 사용자마다 프로세스 사용과 메모리 사용에 제한을 두고 있는데 이것을 변경하기 위한 명령으로
이 글은 http://wiki.kldp.org/KoreanDoc/Ulimit-KLDP (문태준님 작성, 2000년 2월 24일(목))을 토대로 필자가 나름 내용을 추가하여 작성하는 글이다.
최대한 원글의 내용을 그대로 유지하되, 이미 10년이란 세월이 흘렀으므로 많은 변화가 있었다. 워낙 중요하고 좋은 글이라 그냥 그대로 가져다 쓰려고 했으나, 뭔가 아쉬운 느낌이 들어 없는 실력이지만 약간의 보충을 덧붙여보기로 했다.
* 이 글은 실제로 제가 대형서버를 운영하고 있는 상황에서 나온 글은 절대 아니며, 그냥 여기저기서 주워들은 이야기들과 자료들을 토대로 해서 작성한 것입니다. 동시접속이 몇백명에서 몇천명되는 서비스를 하려면 단순하게 커널 컴파일 한번 하고 끝나는 것이 아니라 여러가지 조정을 해주어야 할 것이 많습니다. 또한 하드웨어와 OS 제한이 있으므로 로드밸런싱(부하분산), 트래픽 분산 등을 하는 스위칭 장비, 클러스터링 시스템 구성이 필요할 수 있습니다. 그만큼 설계를 잘해야합니다. 여기에 언급한 것은 단지 쉽게 할 수 있는 맛보기 정도이지요. 이로 인해서 생기는 손해에 대해서는 본인이 절대 책임을 지지 않습니다. 또한 내용 중 틀린 부분도 많이 있을 것입니다.
예를 들어 대형 웹서버를 아파치로 서비스하는 경우를 생각해보자. 아파치는 기본적으로 프로세스 방식으로 서비스를 처리한다. 이건 사용자의 요구가 올때마다 하나의 프로세스를 띄우므로 만약 동시에 10명의 사용자가 접속을 하면 10개의 프로세스가 떠야한다는 것이다. 최근의 아파치 서버는 MaxClients 150 이라고 설정되어 있다. 이건 동시에 150 개의 프로세스를 띄울 수 있으며 결국 동시에 150명을 받아 들일 수 있다는 것이다(실제로 이정도만 하더라도 절대로 작은 규모는 아니다). 그런데 만약 nobody가 만들어낼 수 있는 최대 프로세스 개수가 그 이하라면? 당연히 문제가 생길 것이다. 물론 최근 레드햇 6.0 이상 버전은 그 이상으로 맞추어져 있어서 문제가 생기지는 않겠지만.
문제는 프로세스가 많이 뜨면 프로세스뿐만 아니라 열 수 있는 파일 수에서도 문제가 된다.
이 글을 작성하는 현재(2010.07.08) 많은 것이 바뀌어졌다. 현재 필자가 운용하는 아파치의 버전은 2.2.14 버전을 사용중이고, (원 글님이 글을 작성하셨을 10년전에는 아마 1.7.X 버전으로 사용되었으리라 생각한다) 아파치의 구동 방식도 하나의 요청마다 하나의 프로세스를 띄우는 방식이 아닌 메소드 및 기타 방식을 사용하는 형식으로 바뀌었다. 그리고 아울러 MaxClient의 수도 증가했음은 물론이다.
-c 최대 코어 파일 사이즈
-d 프로세스 데이터 세그먼트의 최대 크기
-p 파이프 크기
소프트 한도(soft)는 새로운 프로세스가 만들어졌을 때 디폴트로 적용되는 자원의 한도이다. 이것을 하드한도까지 등가시킬 수 있다. 그렇지만 이 한도를 넘어서 확장하는 것은 슈퍼유저만이 가능하다.
즉, 하드한도는 절대적인 선이다.
-> 절대 아니다. 이건 커널차원에서 지정을 해야 한다.
data seg size -> 프로세스의 데이터 세그먼트 최대크기
pipe size (512 bytes, -p) 8 -> 512-바이트 블럭의 파이프 크기
위의 내용 중 주의깊게 살펴볼 부분이 바로 한 프로세스에서 열 수 있는 file descriptor 의 갯수를 표시한 open files 항목과 한 유저가 생성 가능한 프로세스의 갯수 부분이다.
사실 이미 한 유저가 생성 가능한 프로세스의 갯수가 무한정으로 되어 있으므로 file descriptor 의 갯수는 그다지 큰 의미가 없다. 하지만 file descriptor의 갯수를 늘리고 싶다면 다음의 방법으로 가능하다.
2. /proc 를 이용하여 변경하는 방법.
사실 ulimit 명령으로 조절이 가능하나, 단지 보여주기만 할 뿐 실제적인 수정이 되지 않는다고 원글에는 나와있었다. 그래서 ulimit 관련 부분은 패스.
그러나, 프로그래밍의 경우는 ulimit 함수를 통해서 수정이 가능하다.
- Linux_vimrc . . . . 6 matches
vim을 사용하다 보면 나만의 특별한 설정이 필요할 때가 있다. 그 설정은 .vimrc 파일을 통해서 가능하다.
'\t' 의 길이를 4로 정한다.
set hlsearch " 검색어 하이라이팅
set showmatch " 일치하는 괄호 하이라이팅
- Linux_xwindows_shout_cut_keys . . . . 4 matches
{{{ 리눅스 윈도우는 기본적으로 멀치 화면을 제공한다. MS 윈도우와 비교했을때 큰 강점이라고 할 수 있는데
이 화면들을 자유롭게 이동 하는 단축키가 있다.
{{{ 시스템 재부팅 없이 X 윈도우를 재시작하려고 할때
- List_license라이센스리스트 . . . . 21 matches
KAIST 소프트웨어 라이센스 사이트입니다.
본 소프트웨어는 KAIST 소속의 사람들에게만 허용된 소프트웨어이며, 원내에서만 접속할수 있습니다.
Microsoft Windows 10 Education (Multilanguage) <-- 학교 계정은 더 이상 지원하지 않는것으로 보임.
ThinkWise Key File◈ ThinkWise 2008이름 : KAIST
이메일 : 모든 e-mail 가능
* 기존 4.5 및 5 사용자분들은 기존프로그램이 설치시 자동삭제가 되오니, 참고하시기 바랍니다.
◈ ThinkWise 5.0이름 : KAIST
* 기존 4.5 사용자분들은 기존프로그램이 설치시 자동삭제가 되오니, 참고하시기 바랍니다.
* 제품등록시 절차가 간단히 바뀌었습니다.(이름과 등록번호만 인증)
◈ ThinkWise 4.5이름 : KAIST
이메일 : 모든 e-mail 가능. (등록과는 무관합니다.)
MatLabHow to Update License 설치가이드
위 파일은 윈도우7 서비스팩 1 ,64비트 버젼이상 에서만 작동합니다.
설치시 그냥 아이디 만들기 눌러서 그냥 아이디 아무거나 만드세요. 메일주소같은거 아무거나 해도 상관 없네요.
바탕화면에 어도비 어플리케이션 메니져 실행하지 마세요. 어도비사 클라우드 깔립니다.
어도비 에어나 , 어도비 어플리케이션 매니져 , 어도비 클라우드 .. 있으시면 삭제해주세요.
포토샵 CC 실행하는데 아무런 영향이 없는 파일입니다.
주의. 업데이트 하시면 크랙이 풀립니다.
- MCMC_index . . . . 131 matches
Bayesian Inference 의 방법으로 MCMC[* 원문 <http://twiecki.github.io/blog/2015/11/10/mcmc-sampling/#Setting-up-the-problem>][* 번역 <http://mlduck.tistory.com/3>]를 사용할 수 있는데 이 문서에서는 그 방법에 대한 전반적인 내용을 설명한다.
\(x\)라는 관측 데이터가 관측 되었을 때의 모델 Parameter가 \(\theta\)일 확률을 위와 같이 표현할 수 있다.
\(\theta_1, \theta_2, \theta_3, \cdot, \theta_n\)이 표본 공간 \(S\)의 파티션일 때,
관측 데이터 \(x\)역시 \(S\)의 부분 집합이므로
전체 확률의 법칙을 이용하면
따라서 \(\theta_i\)가 \(\theta_1, \theta_2, \theta_3, \cdot, \theta_n\)중 하나라고 했을때 다음이 성립하게 됩니다.
\(x\)라는 관측 데이터가 관측 되었을때 가장 높은 확률을 갖는 \(\theta\)를 찾을 수 있다.
하지만 \(P( x )\)의 계산이 그렇게 쉽지 않다. 많은 경우 모델 파라메터 \(\theta\)를 한정해서 closed-form으로 계산할 수 있는 경우가 드물다.
이런 경우에 Markov Chain Monte Carlo라는 방법을 사용한다.
위에서 단일 모델의 경우의 베이지안 모델을 봤다면 이 번엔 각 모델에 가설 \(\def \hypo {\mathcal H} \hypo \)를 포함해서 생각해보자.[* https://link.aps.org/doi/10.1103/PhysRevD.91.042003]
모든 가설\(\hypo\)의 확률은 \(P(\hypo) \in \left[ 0, 1 \right] \) 이다.
각 가설\(\hypo\)은 \(\theta\)를 갖으며 \(P(\theta|\hypo)\)로 표현할 수 있다. \(\int P(\theta|\hypo)d\theta = 1\)이다.
가설\(\hypo\)에서 관측값 \(x\)가 발견되었을 때 Parameter 가 \(\theta\)일 확률을 구하면 아래와 같이 표현할 수 있다.
가설\(\hypo\) 중 어느 것이 더 좋은 가설인지를 비교하기 위해서는 fully marginlized likelihood나 evidence를 비교해야 한다.
식 1)을 이용해서 관측값 \(x\)가 발견 되었을 때 가설 \(\hypo_i\)와 \(\hypo_j\)중 어느 것이 우세한가를 비교하면 아래와 같이 표현할 수 있다.
베이지안은 일반적으로 현상을 표현하는 '''latent variable'''을 가정한다.[* (29 Oct 2014). <http://enginius.tistory.com/514>]
현상, 혹은 관측을 Y라 하고, 이 현상 혹은 관측의 원인을 X라 했을때 다음 세 가지를 정의한다.
- 편의상 X를 내면의 감정이라하고, Y를 외면의 표현이라고 하자.
- X는 기쁨, 슬픔, 노여움, 등이고, Y는 웃음, 울음, 짜증 등 일 것이다.
이것의 의미하는 것은 어떤 의도가 주어졌을 때 현상이 일어날 확률이다.
- MIB . . . . 20 matches
1. 관리자가 조회하거나 설정할 수 있는 정보 데이터 베이스
1. 리소스를 표현하는 Object들이 각 노드에서 같아야 한다.
1. Object를 표현하는 공통된 기법이 요구된다.
1. 문자 이름
원래는 MIB이었으니 MIB-2가 나오면서 MIB-1이라고 부른다.
MIB-1의 확장판이다.
manager와 agent 사이에 특정한 정보를 주고 받으면서 이루어 진다.
* 데이터와 데이터의 속성들을 설명하기 위한 공식 언어
* OSI참조 모델의 응용 계층에서 취급하는 다양한 종류의 데이터를 표현하기 위해 BNF를 기반으로 개발한 표기법
* ASN.1에서는 다른 대부분의 고수준 프로그램 언어에서와 같이 데이터를 데이텨형과 값으로 표현
* syntax : 객체의 데이터 유형 (INTEGER, OCTET, STRING)
* encoding : 객체의 데이터가 어떠한 비트 패턴으로 전송 되는가? (SNMP는 ANS.1의 encoding rule중 BER을 사용)
== 버전에 따른 데이터 타입 ==
|표 1. 버전에 따른 지원 데이터 타입|<tablewidth="650px">'''Data Type''' || '''SNMPv1''' || '''SNMPv2, v3''' ||
- MMPC_CCPV&IPNC . . . . 5 matches
1. [:20100217 오디오 드라이버 점검]
1. [:20100221 BSC 드라이버 작성]
1. [:HDCCTV_%EC%A1%B0%EC%9D%B4%EC%8A%A4%ED%8B%B1 5키 조이스틱]
1. [:%EB%A6%AC%EB%88%85%EC%8A%A4%EB%93%9C%EB%9D%BC%EC%9D%B4%EB%B2%84 리눅스 드라이버]
1. [:Hello%EB%93%9C%EB%9D%BC%EC%9D%B4%EB%B2%84%EC%98%88%EC%A0%9C Hello 드라이버 예제]
- MPI . . . . 5 matches
등이 있다.
---기본적인 thread 기능만을 활성화 한 상태 입니다. progress-thread 의 경우 아직 문제가 있는 것 같습니다. 또한 intel compiler 와 같이 사용할 경우 정상적인 실행이 되지 않았습니다. --- {{{{color: rgb(255, 1, 1); font-size: 13px;} 2007년도 커맨트 지금은 정상으로 보임!}}}
라이브러리 경로 ld 경로에 추가시킴
/root/lam-7.1.4/examples 에 샘플이 있음 (hello, mandelbrot 테스트)
- Mame . . . . 19 matches
#title 오락실 아케이드 게임 에뮬레이터 MAME
흔히 Retro Game이라고 해서 고전 게임 오락실 아케이드 게임 등으로 표현되는 게임들을 PC에서 돌릴 수 있도록 해주는 에뮬레이터가 있다. 에뮬레이터는 https://www.mamedev.org/release.html에서 받을 수 있는데 현재 버전 0.220 까지 릴리즈 되었다. (2020년 4월 6일) 이 링크에는 Windows Os만 나와 있는데 Linux와 Mac OS에도 Mame가 동작하는 것으로 알고 있다. 하지만 이 글에서는 Windows 10을 기준으로 테스트를 진행할 것이므로 Windows Os에 대해서만 다루겠다.
설치라고 할것도 없다. 그냥 위 링크에서 mame0220b_64bit.ext를 받아서 클릭하면 압축 파일을 추는데 그때 압축 파일을 푸는 경로에 파일이 복사되고 별도의 추가적인 설치과정 없이 실행 가능하다.
chb파일은 게임 구동 데이터 외에 비디오나 배경음 오디오트랙등을 저정한 bin/cue 계열의 이미지를 하나의 파일로 관리 하기 위해서 사용되었다. 오디오트랙이나 비디오 트랙을 압축할 수도 있고 복구 할 수도 있다.[* <https://gall.dcinside.com/mgallery/board/view/?id=emugame&no=935>]
보통은 만들어진 chb파일을 인터넷에서 구해서 사용하게 되는데 사용하다보면 mame 버전이 업데이트 되면서 구동이 안 되느데 아래와 같이 최신 버전의 mame에 포함된 chdman.exe 파일을 이용해서 변환해주면 된다.
- MariaDB . . . . 6 matches
== Nextcloud 데이터베이스 설정 ==
db이름은 'nextcloud'로 생성하고 사용자는 ''nextcloud''고 패스워드는 ''password''로 설정한 예이다. __이 설정은 nextcloud db설정에 사용될 것이기 때문에 잘 기억해두자.__
- MoniWiki/HotKeys . . . . 1 match
마우스 없이 거의 모든 기본적인 동작을 HotKeys로 쓸 수 있다.
- MoniWikiACL . . . . 48 matches
##@그룹이름 사용자리스트 [priority]
/!\ Anonymous 사용자는 @Guest로 지정되어 있으며, @Guest는 미리 정의된 그룹이 아닙니다.
* `protect`: 비밀번호 제한이 가능한 몇몇 POST액션에 대해 (모든 액션이 관리비번으로 제한가능하지는 않습니다)
* 일부 POST액션은 관리자 비밀번호로 제한을 걸어둘 수 있는 액션은 protect 가능한 액션입니다. protect 액션은 ''제한된 allow''이며, 일부 POST액션만 지원합니다. 예) do_post_savepage()는 post 액션이며, 일반 do_goto()같은 액션과는 달리 관리자 비밀번호로 액션을 제한을 할 수 있습니다.
지정 방법은 {{{*}}}는 모든 액션을 가리키며, 페이지 이름은 regex가 가능합니다.
# 페이지이름 @그룹/특정사용자 allow/deny 액션리스트
* @ALL deny * // 모든 페이지(*)를 모든 사용자(@ALL)에서 모든 액션(*)을 거부(deny)
* @ALL allow ticket // 모든 페이지를 모든 사용자에게 ticket 액션을 허락(allow)
// 모든 페이지(*)를 일반 가입 사용자에게(@User) 허락(*)
// WikiSandBox 페이지를 @Guest 그룹에 edit,info,diff 액션을 허용(allow)
# <?php exit()?> // 파일은 php이지만 형식은 php가 아닌 일반 텍스트다.
// 모든 페이지(*)를 모든 사용자(@ALL)에서 모든 액션(*)을 거부(deny)
// 모든 페이지(*)를 모든 사용자(@ALL)에게 ticket 액션을 허락(allow) ticket은 가입 폼에 나오는 로봇가입방지 captcha
// 모든 페이지(*)를 일반 가입 사용자에게(@User) 허락(*)
// WikiSandBox 페이지를 @Guest 그룹에 edit,info,diff 액션을 허용(allow)
// 모든 페이지(*)에 대해 모든 사용자의(@ALL) detetefile,deltetepage 등등의 protect 가능한 액션을 protect
// MoniWiki 페이지를 @ALL 모든 사용자에게 edit,upload,diff등의 일부 액션을 거부
== ACL이 성립되는 과정 ==
=== 마지막 ACL 항목이 적용된다 ===
explicit하게 지정할 경우 최종 ACL 항목이 적용된다.
- MoniWikiOptions . . . . 30 matches
`'''$theme='테마이름';'''`
* 기본 css의 경로를 설정한다. 기본값은 `$url_prefix.'/css/default.css'` $theme를 설정한 경우는 이 값이 자동 설정된다.
* 지정할 수 있는 값으로는 moni,moni2 등이 있다. 디렉토리를 추가하고 파일이름을 똑같게 하면 아이콘을 바꿀 수 있다.
`'''$frontpage="페이지이름";'''`
`'''$logo_page="페이지이름";'''`
* 로고를 클릭할 때 가는 페이지를 정한다. 기본값은 $frontpage.
* 수자는 accesskey를 지정하기 위해 쓰이는 값이다. "alt-1, alt-4"라는 식으로 지정된다.
* 웹 브라우저에 타이틀에 표시되는 사이트의 이름. 기본값은 {{{'UnnamedWiki'}}}
* wikismiley.php를 읽어들이게 된다. 이 값을 "foobar"로 고치고 foobar.php를 wikismiley.php 대신으로 쓰면 자신이 원하는 smiley를 설정할 수 있게 된다.
* 기본값은 0이고, 1로 하면 선별적으로 각 줄에 {{{<br/>}}}이 더해진다.
* 1로 설정하면, 블로그 아래 댓글(comment)이 함께 보인다. (기본값 0)
* Email Notification을 활성화 한다. 이 기능을 키면 SubscribePlugin을 사용할 수 있다.
* 페이지 카운터의 사용 여부를 결정한다 (See PageHitsMacro)
* 존재하니 않는 페이지 링크
* "db3, db2, gdbm"등등. php가 지원하는 dba모듈의 유형을 지정한다. 기본값은 보통 db3이며, 처음 설치시 monisetup.php에 의해 자동으로 결정한다.
* HTML meta tag를 지정할 수 있는 저수준의 옵션이다.
* favicon등을 이곳에서 직접 지정할 수 있다.
* rcs를 ~/bin같은 곳에 설치할 때 이 변수에 path를 지정한다 예를 들어 `/usr/local/bin:/usr/bin`
* 윈도우즈 환경이라면 {{{$path='./bin;c:/program files/vim/vimXX';}}}와 같은 식으로 설정한다.
- MoniWikiPlugins . . . . 6 matches
== 사용자 인터페이스 관련 ==
* FastSearch (bsd해쉬를 이용한 빠른 FullSearchMacro)
* Gallery 간단한 갤러리(UploadFile매크로 이용)
* format: 프로세서를 액션으로 이용하기위한 인터페이스 액션 (모인모인도 이 방법을 쓴다)
- MoniWikiProcessor . . . . 7 matches
MoinMoin 1.1 이하에서는 Processor와 Parser로 분리되어있었고, 1.3 이후에는 Processor Parser가 Parser로 통합되었다.
MoniWiki에서는 이미 Processor와 Parser개념을 통합및 간소화 하여 Processor라는 이름으로 쓰이고 있다.
1.1.3 이후에 지원이 추가될 예정. 예) TextileProcessor
- MoniWikiTutorial . . . . 70 matches
위키위키는 누구나, 언제 어디서나, 쉽고 빠르게, 무엇이나 고칠 수 있는 편집 시스템을 말합니다.
* '''누구나''': 모든 사람이 참여할 수 있는
* '''쉽고 빠르게''': HTML 문법을 몰라도 누구나 쉽게, 그 결과는 바로바로 웹페이지로
* '''무엇이나''': 어떠한 페이지라도 상관없이
이러한 위키의 기본 특성은 위키위키를 매우 강력하게 만들었고, 여러가지 안전장치가 더해져서 오늘날의 위키위키가 되었습니다.
* 사용자 ID: 영문으로 사용자 ID를 만들 경우 보통 소문자 구성된 사용자 ID를 만드는 것이 일반적이지만, 위키위키에서는 FooBar같은 낙타식 사용자 ID를 종종 사용합니다. 한글로 만드셔도 됩니다.
* 비밀번호: 웹상의 비밀번호는 안전한 비밀번호가 아닙니다. 자신만이 기억할 수 있는 간단한 비밀번호를 넣습니다.
* 이메일주소: 시스템이 이메일을 지원하는 경우에는 자신의 이메일을 등록합니다. 페이지를 구독하거나 비밀번호를 잃어버렸을 때 필요합니다.
== 둘째고개: 위키의 기본 페이지들 ==
* RecentChanges: 위키위키의 모든 변경된 기록이 RecentChanges에 보여집니다.
* TitleIndex: 위키위키의 모든 페이지 목록을 보여줍니다.
== 세째고개: 아이콘 ==
* [[Icon(edit)]] 이 아이콘을 누르면 편집창이 뜨게 됩니다.
* [[Icon(diff)]] 페이지가 다른 사람에 의해 고쳐졌을때 그 변화를 보여주는 3차원 입체안경 아이콘입니다.
* [[Icon(info)]] 페이지 변경 정보를 보여줍니다.
* '''[[GetText(Save)]]''': 편집이 완료되면 저장을 합니다.
한줄의 내용 전체가 같은 개수의 "=" 기호로 둘러쌓여 있는 경우. 이때 "=" 기호와 내용은 공백으로 분리되어 있어야 하며 그 줄은 "="기호의 개수만큼의 깊이를 가지는 제목줄이 됩니다. 예: [[BR]] `== 두번째 레벨 ==`
가까이 붙어있는 모든 줄은
하나의 단락이 됩니다.
가까이 붙어있는 모든 줄은
- NAS_implement . . . . 19 matches
- 가장 먼저 시도했던 녀석입니다. 저의 경우 구형 32비트 넷북이라 일반적으로 사용되는 이미지로는 설치조차 불가했고. 어렵게 구한 32비트 구형 시스템용 이미지로도 설치가 안됐습니다.
하지만 하드웨어가 호환만 된다면 가장 쉽게 설치 및 이용이 가능할 것 같습니다.
- XPENOLOGY 설치 실패 후 차선책으로 선택한 녀석입니다. 설치과정에서 역시나 문제들이 좀 있었지만 실사용에는 문제가 없었습니다. 하지만 개인적으로 사용이 불편했고 무엇보다 공유폴더를 사용자 또는 그룹별로 권한을 지정하는 것이 안되서 포기했습니다. 리눅스 명령어를 통해 이점을 수정할 수는 있는데.... 리눅스 ... 모릅니다 ㅜㅠ
말썽꾸러기 제 넷북에서도 아무런 오류 없이 설치를 마쳤으며 각종 편의성이나 성능도 매우 만족스럽습니다.
OMV 의 대략적인 소개는 홈페이지(http://www.openmediavault.org/)에서 확인하실 수 있습니다.
오류를 뱉어내기 일수였던 다른 녀석들과 달리 OMV 는 전 설치과정이 매끄럽게 진행
장점2: 사용이 쉽다
메뉴 구성이나 설정 등은 NAS4FREE 유사하며 리눅스에 '리', 나스에 '나'도 모르는 저도 편하게 쓸 수 있을정도로 사용이 쉽습니다.
포고플러그 강좌 등을 보면 쉽게 볼 수 있는 리눅스 화면이나 명령어 등을 전혀 알필요가 없습니다.
대부분 마우스 클릭으로 설치 및 제거, 설정 등이 가능합니다.
장점3: 다양한 플러그인 제공 및 업데이트
- NVML_driver_error . . . . 8 matches
Ubuntu 에서 ML, AI 관련 프로젝트를 하다 보면 nvidia 그래픽 드라이버나 관련 라이브러리가 업데이트 되면서 아래와 같은 NVML Driver/library 에러 메세지가 나타나는 경우가 있다.
이 문제는 nvidia driver kernel module 이 잘못 로딩되어 있어서 발생하는 문제로 nvidia driver kernel module 을 언로딩 & 로딩 하면 된다.
= 특정 드라이버 재 설치하기 =
# 기존 드라이버 삭제
# 특정 드라이버 설치
- Notify_job_finish작업이끝남을리모트에알려주기 . . . . 6 matches
계산이나 시간이 오래 걸리는 작업을 서버에서 진행을 하다보면 작업이 끝났는지를 보기위해서 불필요하게 들여다 볼 필요가 생긴다.
= secure shell을 이용한 명령어 전달 =
이렇게 패스워드를 물어본다. 패스워드를 입력하게 되면 명령의 실행 결과를 볼 수 있다.
ssh 접속에 password 정보를 넘겨주기 위해서는 별도의 프로그램이 필요하다.
- Nyquist-Shannon . . . . 11 matches
\(x(t) = 2\sin(29\pi t + \frac{\pi}{4}) +3\cos(30\pi t + \frac{\pi}{6})\)로 표현되는 연속시간 신호를 샘플링하여 이산시간 신호를 구하려고 할 때, 에일리어싱이 발생하지 않도록하는 샘플링 주파수의 최솟값을 구하라.
== 풀이 ==
이 신호에는 주파수가 다른 두 개의 정현파가 포함되어 있다. 두 주파수를 각각 \(f_1\)과 \(f_2\)라고 하면, \(2\pi f_1 = 20\pi\)이므로 \(f_1 = 10Hz\)이고, \(2\pi f_2 = 30\pi\)이므로 \(f_2=15Hz\)이다. 두 값 중에 최댓값은 15이고, Nyquist-Shannon의 샘플링 정리에 의해서 \(f_s \ge 2 \cdot 15 = 30\)이므로, \(f_s\)의 최솟값은 30이다.
- OSD . . . . 1 match
OSD 모듈은 DDR2/mDDR에서 여러 가지 윈도우 포멧을 읽어오고 YUV 데이터 포멧으로 바꿔준다.
- Occlusion_Sensitivity . . . . 3 matches
Zeiler의 Visualizing and Understanding Convolutional Networks 논문[* ''Zeiler, Matthew D.'', '''Visualizing and Understanding Convolutional Networks''', ECCV 2014][* https://link.springer.com/chapter/10.1007/978-3-319-10590-1_53?utm_source=getftr&utm_medium=getftr&utm_campaign=getftr_pilot]에서 Convolutional Networks의 학습 메카리즘과 내부를 분석하는 과정에서 사용한 방법으로 학습이 끝난 Convolutional Networks의 입력의 일부를 가림으로 prediction 성능이 저하되는 정도를 측정하여 입력의 어느 부분이 prediction에 기여하는지를 측정하는데 사용하였다. [* https://ferguson.tistory.com/5]
- OekakiMacro . . . . 5 matches
{{{[[OeKaki(파일이름)]]}}}을 쓰면 "OeKaki_파일이름.png"가 만들어진다.
{{{[[OeKaki]]}}}라고만 쓰면 페이지 전체를 OeKaki게시판처럼 쓸 수 있다. 단, 코멘트는 위키위키식으로 단다.
(!) 짧막한 코멘트를 달게끔 해도 괜찮을 것이다. Comment 플러그인을 만들고, Blog의 코멘트와 Vote매크로를 응용해서 페이지 임의의 부분에 좀 더 쉽게 코멘트를 덧붙일 수 있게 한다.
- PageHitsMacro . . . . 5 matches
옵션으로 제공하도록 하겠습니다. '''위키 주인'''은 여럿이 있을 수 있으니 배열로 하고 $owners=array("홍길동","철수");처럼 하면 되겠죠 ? --WkPark
PageHits에서 히트가 많은 페이지가 위에 오는데, 이를 거꾸로 해서 히트가 빈한 페이지에게도 꽃다발을 주고 싶습니다. r 옵션을 지원해서 arsort()만이 아니라 asort()도 되게 하면 어떨까요 ?
- PageListMacro . . . . 9 matches
[페이지이름]만 찾는다. 내용은 FullSearchMacro로 찾는다.
옵션을 metawiki 혹은 m으로 넣었습니다. 그런데, 서치 속도가 느립니다. metadb가 5메가 이상인데 약 2초 가까이 걸리네요. 페이지이 이 매크로를 넣으면 페이지 로딩속도가 느려지므로 그다지 바람직한 방법은 아닌 것 같습니다. 그리고, metadb를 다 서치하려면 메모리를 많이 잡아먹게 되어 멎는 경우도 생기므로, 100여개정도를 찾으면 끝내도록 되어있습니다.
- RandomQuoteMacro . . . . 4 matches
'''Q''' : 블로그를 쓰면 Calendar 밑에 이 모듈이 붙어있더군요.
그런데 이 매크로에 의해서 나오는 내용은 어디에 들어있는거죠?
이 내용을 좀 바꿔보고 싶은데 어떻게 해야 할지 알 수가 없네요. -- lordmiss
- Random_stochastic . . . . 12 matches
* 표본공간이 사상으로 구성되지 않고 추상적인 수치적 특성에 의하여 나타난다.
* 주사위를 예로 들면 확률변수 X는 1, 6 사이의 값.
* 표본공간[* 사건이 일어나는 가상의 공간, 주사위를 던진다거나 하는 랜덤한 사건이 일어나는 공간을 말함.]의 모든 값들은 특정 확률로 변수 X가 취할 수 있고, 그 확률의 합은 1이다.
* 이산확률변수와 연속확률변수
* 이산확률변수 : 변수가 취할 수 있는 값을 헤아려열거할 수 있을 때(자녀의 수, 교통사고 회수)
* 확률변수에 대하여 정의된 실수를 0과 1사이의 실수(확률)에 대응시키는 함수.
* 변수 X가 x 이하의 값을 취할 확률 : $F_x(x) = P(X <= x)$
* 이산변수의 경우 $F_x(x) = \sum_{X<=x}P(X = x)$
* X가 이산변수인 경우 :
* 확류변수들이 기대치에서 얼마나 가깝게 혹은 멀리 분포하고 있는지를 나타내는 수치적 척도
- Random_stochastic_book . . . . 1 match
= 베이즈안 =
- RecentChanges . . . . 9 matches
전체 [[PageCount]] 페이지가 있습니다
|||| [[Icon(diff)]] || 백업이 여러개 있는 페이지 (클릭하면 바뀐점)||
|||| [[Icon(updated)]] || 북마크를 한 시점에서 새로 바뀐점이 있는 페이지 (클릭하면 북마크 이후 바뀐점)||
|||| [[Icon(new)]] || 북마크 시점 이후에 새로 만들어지고 그 뒤로 편집이 안된 페이지||
- RecentChangesMacro . . . . 4 matches
class를 추가한다면 무슨 이름으로 추가할까요 ? MoinMoin에서는 class가 부여되지 않았습니다. --WkPark
이름이야 엿장수 맘이지만, 전 .rcTable, .icon, .page, .timestamp로 했습니다.
- Rosenblatt . . . . 42 matches
1957 년 Frank Rosenblatt 이 Cornell Aeronautical Lab에서 개발했다. 그것은 한개이상의 층 (layer) 을 가진 인공 신경세포 (Neuron) 으로 구성된다. 입력은 일련의 가중치를 통해 출력으로 직접 전달되며, 그것은 가장 간단한 종류의 피드포워드 (Feedforward) network 으로 고려될 수 있다. 각 노드에서 가중치와 입력을 곱한 것을 합하고, 그 값이 threshold (보통 0) 보다 크면 뉴런은 실행 (fire) 하고 값 1 을 취하고 그렇지 않으면 값 -1 을 취한다.
이런 종류의 활성화 함수 (Activation Function) 를 가지는 인공뉴런들은 맥컬럭-피츠 (McCulloch-Pitts) neurons 또는 threshold neurons 이라고도 불리운다. Perceptron 이라는 문자는 때때로 이러한 유닛중의 하나로서 구성되는 network 으로서 언급된다. Perceptron 은 보통 delta-rule 이라고 불리는 단순한 학습 알고리즘으로 훈련될 수 있다. 그것은 계산된 출력과 샘플 출력 데이터 사이의 에러를 계산하고, 그것을 가중치를 조정하는데 사용하며, 기울기 하강 (Gradient Descent) 의 형태를 구현하게 된다.
Perceptron 이 처음에는 가능성있는 것으로 보였지만, 곧 simple perceptron 은 여러 단계의 패턴들을 인식하도록 훈련할 수 없다는 것이 증명되었다. 이것은 신경망 (Neural Network) 연구를 수년동안 정체하게 만들었으며, 그 후에 3 개 또는 그 이상의 layer 를 가진 신경망이 simple perceptron 보다 훨씬 더 강력한 power 를 가진다는 것이 인식되었다. 즉 하나나 두 개의 layer 를 가진 simple perceptron 은 선형 분리가능한 패턴만을 학습할 수 있다는 것이다. 1969 년에 Marvin Minsky 와 Seymour Papert 에 의한 '퍼셉트론즈(Perceptrons)' 라는 유명한 논문에서 XOR 함수를 학습시키는 것이 불가능하다는 것을 보였다. 그들은 3 개 또는 그 이상의 layer 를 가지는 perceptron 도 유사한 결과를 낳을 것이라고 추측하였다.
multi-layer 신경망 (다층 퍼셉트론 (Multilayer Perceptron)) 은 실제로는 이러한 문제들을 가지지 않는다는 것이 1980 연대에 발견되었고, 그것으로 신경망 연구가 다시 부활하게 되었다. ....... (Wikipedia : Perceptron)
1957년 미국의 Frank Rosenblatt 에 의해 발명된 퍼셉트론은 처음 소개되었을 때 상당한 센세이션을 불러일으켰다. 퍼셉트론은 비교적 정확히 기술된, 계산에 의한 최초의 신경망 모델이었으며 여러 분야에 걸쳐 커다란 영향을 끼쳤다. 로젠블릿은 원래 심리학자였으며 퍼셉트론은 그러한 심리학적인 요구에 부응하는 것이었다. 또한 퍼셉트론이 잠재적으로 복잡한 적응행위를 할 수 있는 학습 (Learning) 머신이라는 점은 엔지니어들에게는 매우 매력적인 것이었다 ............ 그가 기술한 퍼셉트론 모델은 매우 복잡했다. 퍼셉트론, 그리고 그것과 유사한 모델들은 분석하기가 매우 어려웠으나 학습 머신으로서의 능력과 제한점에 대한 통찰력을 제공해 주었다. 퍼셉트론 이후의 연구 개발은 대부분 엔지니어와 물리학자들에 의해 진행되었다 .......... 그러나 그의 중요한 논문[ "Principles of Neurodynamics: Perceptrons and the Theory of Brain Mechanisms", by Frank Rosenblatt, 1962. ]은 읽기가 매우 어려웠다. 퍼셉트론에 대한 분석 또한 쉽지 않았다. 여러 가지 옵션과 변수와 학습 규칙들이 제대로 정리되지 않은 채 소개되어 이해에 상당한 혼란을 주었다 .......... 로젠블럿의 퍼셉트론 이후 신경망이 무엇이든지 할 수 있는 듯이 보였던 시절이 있었다. 수백개의 알고리즘이 제시되었고, 학습 머신에 대한 관심과 열기가 대단하였다. 그러나 1969년에 출판된 Minsky 와 Papert 에 의한 'Perceptrons' 란 저서가 출간되고부터 신경망 연구에 대한 열기는 급격히 냉각되었다. 퍼셉트론즈는 퍼셉트론 모델에 대해 철저한 분석을 하였으며 또한 퍼셉트론 모델의 한계성에 대해서도 논리 정연하게 파해쳤다 ....... 퍼셉트론즈는 주어진 데이터의 선형 분리 문제도 해결할 수 없다는 등의 퍼셉트론 모델의 제한점에 관하여 예리하게 분석하였다. 특히 단층 퍼셉트론은 선형 분리의 단순한 예인 XOR 문제도 해결할 수 없었다. 민스키와 파퍼트는 퍼셉트론 모델들의 계산적인 제한점들에 관한 연구를 수학과 계산 이론에 입각하여 증명하였다 ......... 그러나 이 퍼셉트론 모델은 나중에 역전파 (Back-propagation) 모델과 같은 다층 퍼셉트론 모델의 기반이 되어 문자인식을 비롯한 여러 분야에 폭넓게 응용되었으며 신경망 연구의 새로운 장을 열게 된 결정적인 계기가 되었기에 이 퍼셉트론의 기여는 매우 크다고 할 수 있다. ...... (김대수 1992)
- SIMD . . . . 83 matches
'''SIMD''' 는 ''Single Instruction Multiple Data'' 의 약자입니다. 풀어서 번역하자면 "단일 명령어로 복수의 데이터를 처리하는" 정도의 의미를 가지고 있습니다.
말 그대로 1개의 명령어가 복수의 데이터를 처리한다는 얘기인데, 말은 어렵지만 다르게 생각하면 한 명령어가 뚜렷하게 특수한 목적성을 가지고 있다는 의미입니다.
이런 것을 단 하나의 명령어로 한번에 처리하게 해주는 것이 바로 SIMD 연산입니다.
굳이 저런 예로 설명한 이유는 우리가 가장 많이 사용하는 인텔의 SIMD 집합은 가장 주요한 사용처가 바로 저런 곳이기 때문입니다.
일단 뒤에서 설명할 몇 가지 예시들을 보면 이해할 수 있으니 넘어가겠습니다.
우선 이 글에서 처음 SIMD 라는 것을 접하신 분들이 가장 크게 의문점을 가지실 거라고 예상되는 부분이, 바로 연산 속도의 차이에 대한 부분입니다.
예를 들어 어떤 4개의 정수 집합을 다른 4개의 정수 집합에 각 각 하나씩 더하는 연산이 있다고 가정해봅시다.
흔히 이 연산을 쓸 때, add 명령어를 4번 쓰는 형태 정도로 나타냅니다.
'''Fetch - Decode - Execution''' 소위 이런식으로 표현하는 처리 순서가 있습니다.
요즘 같이 CPU가 고도로 발전한 시대에야 아니지만 저 연산을 처리하기 위해서 드는 소요 과정이 당연히 많을 수 밖에 없습니다.
만약 SIMD 처럼 단 하나의 명령어가 이미 저렇게 다수의 데이터를 서로 더하도록 규정이 되어 있었다면, 불필요한 4번의 Fetch나 Decode 과정이 줄어들게 됩니다.
그리고 규정된 연산이 단 한 번에 처리되기 때문에 속도 향상이 있을 수 밖에 없습니다.
기본적으로 SIMD는 내부적으로 병렬적 처리를 함으로써 성능 향상을 이끌어냅니다.
이것은 미리 규정된 작업이기 때문에 일반 명령어를 파이프라이닝하는 것과 약간 성격이 다릅니다.
즉 쉽게 말하자면 명령어 수준에서의 병렬성이 애초부터 보장된 연산들만 모았다고 생각하면 됩니다.
흔히 일반 명령어의 이어짐에서 항상 발생할 가능성이 많기 마련인 명령어 의존성이 내부적으로 없단 얘기입니다.
그리고 원래 같은 일을 하는 일반 명령어 집합의 전체 실행 사이클보다 적은 사이클에 실행할 수 있는것은 큰 장점입니다.
그런 점에서 특수한 목적 처리를 위한 연산에서 특히 SIMD 연산을 사용하여 많은 성능 향상을 이끌어 낼 수 있습니다.
※ ''인텔 CPU는 [[CISC]] 이기 때문에 애초부터 파이프라이닝을 고려하진 않고 설계된 명령어 집합을 갖고 있습니다. 병렬 처리를 생각하고 명령어를 설계한 [[RISC]] 와는 태생이 다릅니다.''
목차에서 이 파트 제목을 "장점과 단점" 이라고 썼지만 사실 단점은 그냥 적어본 것입니다.
- SPI . . . . 2 matches
* 전송 속도는 IC의 능력에 비례하며 20Mbps이상
* 데이터의 쉬프트 방향은 MSB가 선두가 됩니다.
- SVN . . . . 10 matches
우분투 apt-get을 이용해서 패키지 설치
저장소 conf폴더 안에 있는 파일을 이용해서 권한 설정을 해줘야 한다.
anon-access : 로그인하지 않은 사용자에 대한 권한입니다. none은 읽기/쓰기 금지이고 read는 읽기만 write는 쓰기만 가능합니다.
realm = project : 사용자가 접속시 표시되는 이름입니다. 프로젝트 명을 적어주면 됩니다.
'''권한 설정이 잘 못 될 경우 txn-current-lock 오류를 발생 시킨다.'''
'''권한 설정을 변경하게 되면 데몬을 재시작해야 적용이 된다. '''
= commit 내용을 이멜로 보내기 =
1. commit 내용을 메일로 보내기 위해서는 sendmail이 필요함.
svn으로 관리할 파일이나 디렉토리를 추가 할때 사용한다.
svn에서 파일이나 디렉토리를 삭제 할때 사용한다.
- TM_Upsampler_complete . . . . 27 matches
Sampling rate를 올리기 위한 방법은 여러가지가 있는 것으로 안다. Interpolation을 이용한 방법도 있을 수 있지고 Sin()함수를 이용한 Sincfuction을 이용한 방법도 있다. 하지만 오디오 데이터의 업샘플링에서는 Sincfuction을 이용한 방법이 가장 좋은 방법으로 알려져 있다[[footnote( [:upsampling_sinc 오디오 업셈플 with sincfuction] )]].
Sincfuction을 이용한 오디오 업셈플 작업은 이미 완료 되었고[[footnote( [:upsampling_implementaion Upsampler 구현 일지] )]] [[footnote( [:TM_upsampling_implementaion OpenCL을 이용한 멀티 배율 Upsmapler] )]] 이를 최적화한 부분에 대해서 기술해 보려고 한다.
앞서 구현한 Sincfuction 기반의 업샘플러는 데이터 사이를 필요한 데이터의 배수만큼 '0'으로 패딩하고 Sincfuction을 적용하는 방식을 취함으로써 의미 없는 zero 곱셈 연산을 많이 취하게 된다는 단점이 있었다. 이것을 극복하기 위해서 zero-pedding 없이 실제 값만을 계산하겠다는 아이디어로 출발한다.
또한 앞선 방법에서는 각각의 배율에 맞는 sincfuction을 만들어 사용했는데 이번에는 가장 큰 배율의 Sinc fuction 하나만을 사용해서 계산에 사용하도록 했다.
Sinfuction은 ''sin(x)/x''라는 공식에서 출발한다. x를 얼마나 잘게 쪽게서 적용하느냐에 따라서 만들어지는 sample의 갯수가 달라진다. 몇배수의 샘플을 만들꺼냐에 따라서 sin(n/times * pi) / n/times * pi 를 통해서 얻어지는 값이 다르다.
아래 그림은 sincfuction을 그래프로 그려본 것이다. 아래 그림에서 보는 것과 같이 sincfuction는 동일하고 어느 점에서 값을 취하냐에 따른 테이블의 차이만 있을 뿐이다.
기본 아이디어는 다음과 같다. 취하려는 가장큰 뱃수로 sincfuction을 계산하고 각각의 뱃수에서 필요한 sample만을 취할 수 있도록 값들을 다시 정렬하는 것이다.
- TM_Upsampler_lib . . . . 23 matches
-lResampler 라이브러리
* filtersize : 계산에 필요한 필터의 사이즈. (''sincsize = filtersize * times'')
short형 오디오 데이터를 업셈플링하는 싱글 프로그램 함수.
double형 데이터를 정렬된 sinc function table로 계산하는 싱글 프로그램 함수.
float형의 frame구조를 갖는 데이터를 정렬된 sinc function table로 계산하는 싱글 프로그램 함수.
short형 오디오 데이터를 2X~128X까지 한번에 업셈플링하기 위한 OpenCL 초기화 함수.
* _sincsize : sinc function 사이즈 정보.
* _src_size : 업셈플로 얻게 될 데이터 사이즈.
float형 데이터를 2X~128X까지 한번에 업셈플링하기 위한 OpenCL 초기화 함수.
* _sincsize : sinc function 사이즈 정보.
* _src_size : 업셈플로 얻게 될 데이터 사이즈.
float형의 frame 데이터를 2X~128X까지 한번에 업셈플링하기 위한 OpenCL 초기화 함수.
* _sincsize : sinc function 사이즈 정보.
* _src_size : frame 데이터 사이즈.
short형 오디오 데이터를 2X~128X까지 한번에 업셈플링하기 위한 OpenCL 병렬 프로그램 함수.
* src : 업셈플할 '0'으로 패딩된 원본 데이터
float형 오디오 데이터를 2X~128X까지 한번에 업셈플링하기 위한 OpenCL 병렬 프로그램 함수.
* src : 업셈플할 '0'으로 패딩된 원본 데이터
float형 오디오 데이터를 2X~128X까지 한번에 업셈플링하기 위한 OpenCL 병렬 프로그램 함수.
* src : 업셈플할 '0'으로 패딩되지 않은 원본 데이터
- TM_opencl_tutorial . . . . 17 matches
OpenCL의 기초적인 사용법을 알아보기 위해 이 페이지를 작성함.
병렬 프로그램이라고 하기는 힘들지만 OpenCL의 가장 기본적인 프레임워크를 보기엔 좋으니 한번 따라 해보도록 하자.
* ''hello.cl'' 디바이스에서 돌아갈 OpenCL C 파일
/* 플랫폼, 디바이스 정보 얻음 */
가장 많이 사용 되는 병렬 프로그램의 예 행렬의 곱이다.
각각의 행렬의 곱을 얻는 과정은 독립적이다. 이 독립적인 과정을 하나의 Work Item으로 정의해서 병렬화 해보자.
'''kernel_baseline.cl''' - 기본이 되는 opencl 커널 파일
/*플랫폼 디바이스의 정보를 얻음*/
계산하려는 메트릭스 M_C의 사이즈만큰 work item을 생성해서 처리하는 방식
백터 연산은 모드 계산 디바이스에서 지원하는 기능은 아니다. 하지만 계산 디바이스가 지원한다면 좀 더 좋은 성능을 보장할 수 있다.
메모리 연산이 많을 경우 Local 메모리를 사용하면 메모리 액세스 속도에서 이점이 있을 수 있다. (단, Local 메모리가 존재할 경우)
- TM_upsampling_implementaion . . . . 4 matches
현재까지 구현된 바이너리 종류는 3가지 입니다.
.eddy는 GPU 플렛폼을 사용하며 resample 소스의 데이터 타입이 float형을 사용하게 설계 되어 있음.
== 원본 데이터 ==
- TableOfContentsMacro . . . . 3 matches
TableOfContentsMacro를 페이지의 상단에 {{{[[TableOfContents]]}}} 와 같이 넣으면,
* TableOfContentsMacro를 쓰지 않으면 제목줄에 번호가 붙지 않고, 이 매크로를 쓰면 제목에 번호가 붙습니다.
- Taylor_polynomials . . . . 40 matches
= 테일러 급수(Taylor series)의 이해 =
테일러[* Brook Taylor (1685–1731) described this series in 1715 in the paper Methodus incrementorum directa et inversa. Special cases of the result, and likely the result itself, had been previously known to Isaac Newton, James Gregory, and others.] 급수(Taylor series) 또는 테일러 전개(Taylor expansion)는 어떤 미지의 함수 \(f(x)\)를 아래 식과 같이 근사 다항함수로 표현하는 것을 말합니다.
테일러 급수는 모든 \(x\)에 대해서 근사를 한 것이 아님을 '''주의'''해야 한다. \(x = x_0\) 근처에서만 성립한다. 구하고자 하는 \(x\)의 값이 \(x_0\)에서 멀어지면 멀어질수록 오차가 발생하게 된다.
테일러 급수는 결국 \(x = x_0\) 에서 \(f(x)\)와 동일한 미분계수를 갖는 어떤 다항함수로 \(P(x)\)로 근사시키는 것이다.
\(P_n(x)\)는 n차 테일러 다항식이라고 하고, \(x_0\)에 대한 함수 입니다. \(R_n(x)\)는 실함수(나머지 항)으로 ''truncation error''라고도 합니다.
''[https://ko.wikipedia.org/wiki/%EB%AF%B8%EC%A0%81%EB%B6%84%ED%95%99%EC%9D%98_%EA%B8%B0%EB%B3%B8%EC%A0%95%EB%A6%AC#.EC.A0.9C2_.EA.B8.B0.EB.B3.B8_.EC.A0.95.EB.A6.AC 미적분학의 제2 기본 정리][* 함수 \(f\)가 닫힌 구간 \(a,b\)에서 연속이며, 함수 \(F\)가 \(f\)의 임의의 부정적분이면 위의 식이 성립한다.]''에 의해 아래 식이 성립한다.
위 식을 \(f(x)\)를 기준으로 이항 정리 하면 아래와 같은 관계식을 얻을 수 있다.
삼각함수와 지수함수등은 \(G(t)\)함수로 두어야 계산이 된다. 왜??
이유에 대해서는 생각을 좀 해봐야 하겠네요.
이렇게 전개를 계속하게 되면 테일러 급수를 얻을 수 있고 마지막에 없어지지 않는 잉여항이 있음을 알 수 있다.
이것을 '''[:Lagrange_note 라그랑주]의 잉여항(剩餘項, Lagrange form of the remainder term)'''이라고 한다.
라그랑주의 잉여항이 중요한 이유는 '''테일러 급수의 오차'''를 표현하기 때문이다. 적분형 평균값의 정리를 이용하면 이 최대 오차를 예측할 수 있다.
[http://ghebook.blogspot.kr/2010/07/mean-value-theorem-for-integration.html 적분형 평균값의 정리]는 어떤 함수의 적분값(\(\int_a^bf(t)dt\))과 함수값(\(f(t)(b-a)\))이 동일한 어떤 점(\(t=c\))이 반드시 존재한다는 것이다.
= 테일러 급수의 활용 / 필요한 이유 =
테일러 급수가 필요한 이유는 쉽게 말하면 우리가 잘 모르거나 복잡한 함수를 다루기 쉽고 이해하기 쉬운 다항함수로 대체시키기 위함입니다. 또한 어떤 함수를 테일러 급수로 표현하면 그 함수의 특성을 분석하기가 좀더 용이해지기 때문입니다. 그럼 그 구체적 활용예들을 하나씩 살펴보도록 하겠습니다.
부정적분을 계산하기 힘든 함수의 경우에 아래와 같이 테일러 급수를 활용하면 정적분의 계산값을 근사적으로 구할 수 있습니다.
위 식에서 \(\sin(x2)\)의 테일러 급수는 \(\sin(t)\)의 \(t = 0\)에서의 테일러 전개에 \(t = x2\)을 대입하여 얻어진 식이며, 적분 구간이 \(\bigl[0, 1\bigr]\)이기 때문에 \(x = 0\)에서의(즉, \(a = 0\)) 테일러 급수를 사용해도 근사오차가 크지 않습니다.
테일러 급수를 활용하면 함수(특히 삼각함수, 지수함수, 로그함수와 같은 초월함수)의 점근적 특성을 손쉽게 파악할 수 있습니다. 예를 들어, 아래와 같이 \(x = 0\) 근처에서 \(\sin x \sim x\) 임을 테일러 급수를 이용하면 쉽게 알 수 있습니다.
테일러 급수의 가장 일반적인 활용예로 볼 수 있습니다. 즉, 어떤 복잡한 또는 잘 모르는 함수가 있을 때, 이 함수를 저차의(1~3차) 다항함수로 근사하여 사용함으로써 문제 또는 모델을 단순화시키는데 테일러 급수가 활용될 수 있습니다. 구체적인 예를 들기는 어렵지만 테일러 급수는 논문 등에서 어떤 이론이나 주장에 대한 논리적 근거를 단순화하여 설명할 때 유용하게 사용되는 기법 중의 하나입니다. 한 활용예로 가우스-뉴턴(Gauss-Newton) 방법을 증명하는데 테일러 급수가 활용됩니다. 이에 대한 내용은 뉴턴법/뉴턴-랩슨법의 이해와 활용(Newton's method)을 참조하기 바랍니다.
- UML . . . . 11 matches
#title UML(Unified Modeling Language) 다이어그램
= UML 다이어그램 =
'''통합 모델링 언어'''를 사용하여 시스템 상호작용, 업무흐름, 시스템 구조, 컴포넌트 관계 등을 그림으로 표현할 수 있습니다. UML 다이어그램을 사용하는 이유는 프로그래밍을 단순화 시켜 표현하여 의사소통을 쉽게하고 대규모 프로젝트 구조의 로드맵을 만들거나 개발을 위한 시스템의 구조의 틀을 마려하기 위함입니다.
UML 다이어그램의 종류는 총 7가지가 있습니다. [* https://m.blog.naver.com/icbanq/221781238065]
모든 다이어그램을 다 그릴 필요는 없고 그때 그때 필요한 다이어그램을 목적에 맞게 그래서 사용하면 된다.
= 클래스 다이어그램 =
시스템에서 사용하는 객체 타입의 정의와 그들 간에 존재하는 정적인 관계를 다양한 방식으로 표현하는 다이어그램입니다.
클래스 이름, 속성, 연산 등으로 구성이 되고 다양한 선으로 관계를 기술 합니다.
- UPnP . . . . 3 matches
Universal Plug and Play 의 약자로 PC에서 사용하고 있는 PnP를 네트워크로 확장한 개념이다.
네트워크에 있는 장치나 장비를 자동으로 인식하고 사용하기 위한 방법이다.
UPnP 관련 open source들은 많은 vender들에 의해서 공개 되고 있어서 인터넷을 찾아보면 많이 보인다. 그 중에서 리눅스 버전의 오픈 소스가 있어서 보려고 한다.
- UploadFileMacro . . . . 28 matches
{{{[[UploadFile]]}}}: 이것은 자바스크립트를 전혀 쓰지 않는다. 그 대신에 간단한 여러개의 파일을 올릴 수 있는 방법을 제공한다.
{{{[[UploadForm]]}}} 혹은 {{{[[UploadFile(js)]]}}}: 이 매크로는 여러개의 파일을 올릴 수 있는 폼을 자바스크립트를 사용하여 만들어준다.
{{{[[SWFUpload]]}}} 혹은 {{{[[UploadFile(swf)]]}}}: 이 매크로는 모니위키 1.1.3CVS부터 지원하며 다중 파일 업로드를 지원한다. (Flash 10 지원)
모니위키의 {{{[[UploadFile]]}}} 매크로는 업로드 된 파일을 {{{$upload_dir}}}로 정의된 디렉토리에 각 페이지별 디렉토리를 생성시키고, 그 디렉토리에 업로드된 파일을 저장한다.
attachment:filename.ext 혹은 attachment:페이지명:filename.ext
예를 들어, {{{MyPage}}}에 들어가서 {{{MyPage?action=UploadFile}}}을 하거나, MyPage에서 {{{[[UploadFile]]}}} 매크로를 사용하여 파일을 업로드를 하면 $upload_dir='pds';라고 되어있는 경우에 {{{pds/MyPage/}}}가 새롭게 만들어지고 거기에 올린 파일이 저장된다.
config.php의 $pds_allowed라는 변수를 조정하면 업로드가능한 파일을 제한을 걸 수 있다. $pds_allowed의 기본값은 다음과 같을 것이다.
아파치 mod_mime의 문제점으로 인해서 안전하지 않은 파일 이름을 점검합니다.
예를 들어 아파치의 mod_mime이 hwp 확장자를 인식하지 못하는데, {{{my.php.hwp}}}와 같은 파일이름을 업로드할 경우, 아파치의 mod_mime모듈은 my.php.hwp를 hwp가 아닌 php파일로 인식하게 됩니다.
$pds_protected를 설정해 놓으면 {{{my.php.hwp}}} 파일 이름이 my.php.txt.hwp로 이름이 바뀌면서 파일이 업로드 됩니다.
이 값을 1로 설정하였을 경우, 업로드 할 때의 정보를 이용해서 파일 타입을 판별합니다.
안전한 업로드가 이미 보장 된 경우 사용하실 수 있을 것입니다.
모니위키에서는 모든 업로드 된 파일이 {{{$upload_dir='pds'}}} 하위 디렉토리에 보존된다. 즉 {{{pds/*/}}}에 1단계 하위 디렉토리들이 생성된다. (2단계 이상은 지원하지 않습니다.)
그러나 노스모크 모인모인에서는 {{{pds/*}}} 하위 디렉토리로 모든 파일이 저장된다. 노스모크 모인모인과 호환을 보장하기 위해서 UploadFile액션은 특별히 {{{UploadFile}}}이라는 페이지에서 파일을 업로드하면 {{{pds/UploadFile}}}라는 디렉토리가 만들어지지 않고 pds 아래로 바로 업로드 되게끔 하였다.
=== 공백이 들어있는 파일 이름 ===
공백이 들어있는 파일을 링크를 걸 경우는 {{{attachment:"hello world.png"}}}와 같이 링크를 걸어 준다.
- UploadedFiles . . . . 12 matches
모니위키의 각 플러그인은 매크로 플러그인과 액션 플러그인이 포함되어있다.
{{{UploadFile}}}은 업로드 폼(매크로)을 보여주고 업로드를 하는(액션) 플러그인이며,
{{{UploadedFiles}}}플러그인은 이미 업로드 된 파일 목록을 보여주는 플러그인이다.
{{{[[UploadedFiles]]}}} : 현재 페이지에 첨부된 파일 목록을 보여준다. pds/현제페이지이름/* 하위의 모든 파일 목록을 보여주게 된다.
{{{[[UploadedFiles(페이지이름)]]}}} : 지정된 페이지에 첨부된 파일 목록을 보여준다.
/!\ UploadedFiles 플러그인은 액션과 매크로를 동시에 지원하므로, 주소창에 {{{?action=uploadedfiles}}}를 덭붙여 주면 그 페이지에 첨부된 파일을 보여줍니다.
모니위키는 업로드된 파일의 검색(이름 및 내용)을 지원하지 않습니다.
- UserPreferences . . . . 5 matches
* 비밀번호는 6자 이상이어야 합니다.
'''[[GetText(logout)]]'''을 누르면 쿠키가 지워지고, '''[[Gettext(Login)]]'''을 하시면 쿠키가 사용되며, 다른 곳에서도 같은 설정을 유지하며 사용하실 수 있습니다. 공공의 PC에서 [필명]이 도용되는 것을 막기 위해서 '''[[GetText(Logout)]]'''을 이용해 주시기 바랍니다.
설정을 변경한 후에 '''[[GetText(Save)]]'''를 누르면 그 설정이 저장됩니다.
- Variational_inference . . . . 78 matches
#title 변분 추론(Variational Inference)의 이해
Variational Inference를 활용한 연구중에 가장 최신의 연구라면 VAE를 꼽을 수 있다. VAE는 2013년 Kingma et al.과 Rezende et al.에 의해 정의되었다. Jaan Altosaar[* Jaan Altosaar, "What is variational autoencoder?", <http://nolsigan.com/blog/what-is-variational-autoencoder/> (14 Jan 2017)]는 VAE가 뉴럴넷과 확률 모델 관점에서 서로 다른 언어로 설명하고 있기 때문에 그 사이의 간극을 줄여보려는 노력을 했다.
뉴럴넷 관점에서 VAE는 encoder, decoder 그리고 loss function으로 구성되어 있다. 뉴럴넷을 설명하는 일반적인 네트워크 모델을 네트워크 구조와 이를 학습하기 위한 loss function을 어떻게 정의하느냐로 이루워져 있다.
이 관점에서 encoder, decoder는 모두 뉴럴넷이다.
encoder는 입력으로 data x가 들어가고 출력으로 잠재된 차원(hidden representation) z가 나온다. 이 네트워크는 고차원의 문제를 낮은 차원으로 효율적으로 압축하는 것을 배워야하기 때문에 Encoder를 \(q_{\theta}(z|x)\)로 표현하자. z는 확률론적임을 확인하자. encoder는 Gaussian probability density인 \(q_{\theta}(z|x)\)에 파라미터를 아웃풋으로 내보낸다. 이 확률 분포로 부터 z를 얻을 수 있다.
decoder는 입력으로 z를 출력으로 데이터 확률분포의 파라미터 값을 내어준다. Decoder는 \(p_{\phi}(x|z)\)로 표현 된다. 예로 손으로 쓴 숫자를 판독하는 일이라고 하면 784개의 픽셀이 흑백이고 각각의 픽셀이 0, 1로 이루워져있다면 Bernoulli distribution으로 표현할 수 있다. 즉 출력값으로는 각 픽셀에 해당하는 Bernoulli distribution 확률분포의 파라미터들이 된다. 낮은 차원에서 높은 차원으로 가기 때문에 정보의 손실이 발생한다. 얼마나 손실이 발생하는가? reconstrunction log-likelihood \(\log p_{\phi}(x|z)\)를 사용하여 측정한다.
VAE의 loss function은 regularizer가 표함된 negative log-likelihood이다. 모든 datapoint가 공유하는 전역 변수가 없으므로 우리는 loss function을 하나의 datapoint \(l_i\)에만 의존적이도록 나눌 수 있다. 총 loss는 총 N개의 datapoint의 loss의 합이 된다.
앞 부분은 재생성 loss 혹은 i번째 datapoint의 negative log-likelihood 기대값이다. 기대값은 encoder의 분포와 관련이 있다. 이 부분은 decoder를 데이터를 재생성하도록 유도한다. decoder의 출력이 데이터를 잘 재생성하지 못하면 losss는 증가한다.
뒷 부분은 regularizer이다. 이 것은 encoder의 분포 \(q_{\theta}(z|x)\)와 \(p(z)\) 사이의 kullback-leibler divergence이다. q를 사용하여 p를 표현할 때 얼마나 정보가 유실 되는지를 측정한다. q가 p에 얼마나 가까운지 측정하는 방법이다.
VAE에서 p는 평균 0, 분산 1을 갖는 표준정규분포를 갖는다. encoder가 표준정규분포와 다른 z를 갖는다면 loss값에서 손해(penalty)를 본다. 이 regularizer는 z의 각 숫자를 충분히 다양하도락 만들라는 뜻이다. regularizer가 없다면 encoder는 각 datapoint에 대해 유클리드 공간상의 다른 영역을 나태내도록 편법을 사용할 수도 있다. 예로 똑같은 숫자를 나타내는 이미지(두 명이 쓴 숫자 2, \(2_{alice}, 2_{bob}\)가 각각 다른 값 \(z_{alice}\), 와 \(z_{bob}\)을 가질 수 있기 때문이다. z값이 의미 있길 원하기 때문에 이런 행동을 제한한다. 이를 통해 비슷한 숫자의 표현을 가깝게 유지할 수 있다.
확률 모델의 관점에서 VAE는 어떤 특정한 확률 모델을 갖는 data x와 숨겨진 변수(latent varialbe) z를 갖는다. 이 모델의 joint probability를 \(p(x,z) = p(x|z)p(z)\)로 표현할 수 있다. 생성과정은 다음과 같다.
이 것을 그래프 모델로 표현하면:
attachment:model.png?witdh=400px&align=center&title''VAE 의 그래프 모델. 숨겨진 변수 z 는 표준정규분포이며 data 는 \(P(X|Z)\) 에서 추출된다. 그림자 진 노드 X 는 관찰된 data 를 의미한다. 손글씨 숫자 이미지에 대해서 이 data likelihood 는 Bernoulli distribution 을 따른다.''
이 모델이 VAE를 확률 모델의 관점에서 생각할때 가장 중요한 부분이다. 숨겨진 변수는 prior \(p(z)\)로 부터 얻어진다. 데이터 x는 숨겨진 변수 z를 조건부로 하는 likelihood \(p(x|z)\)를 갖는다. 모델은 data와 숨겨진 변수에 대한 joint probability \(p(x,z)\)를 정의한다. 이를 likilihood와 prior로 분해할 수 있다. \(p(x,z) = p(x|z)p(z)\) 흑백 숫자 이미지의 경우 likelihood는 Bernoulli distribution을 따른다.
이제 이 모델에서의 inference에 대해 생각해 볼 수 있다. 목표는 관찰된 데이터로부터 숨겨진 변수를 잘 추론(infer)하는 것이다. 곧, posterior \(p(z|x)\)를 계산하는 것과 일치한다. bayers에 따르면:
분모 p(x)를 생각해보자. 이 부분은 evidence라 부르고 숨겨진 변수를 제거하여 얻을 수 있다. (추론에 대한 증거)
\(p(x)= \int p(x|z)p(z)dz\) 불행하게도 이 적분을 계산하기 위해선 모든 숨겨진 변수의 가능성을 고려해야하기 때문에 지수 시간이 걸린다. 따라서 우리는 이 posterir distribution을 근사해야 한다.
Variational inference가 \(q_{\lambda}(z|x)\) 계열의 분포를 근사할 수 있다. Variational parameter \(\lambda\)는 분포 계열을 구별할 수 있게 한다. 예를 들어, q가 Gaussian이라면, 각 datapoint \(x_i\)에 대한 숨겨진 변수의 평균과 분산이 된다. \(\lambda_{x_i = (\mu_{x_i}, \sigma^2_{x_i})}\)
목표는 divergence를 최소화하는 \(\lambda\)를 찾는 것이다. 따라서 최적의 근사 posterior는 다음과 같다.
왜 이 값을 바로 계산하는게 불가능한가? 귀찮은 evidence p(x)가 식에 나타나기 때문이다.
- ViEditer사용법 . . . . 1 match
= 관련 사이트 =
- WikiSandBox . . . . 2 matches
* 아 이것 괜 찮아 보이네요
- Write_Combining_memory . . . . 9 matches
Main Memory와 CPU사이의 처리 속도 차이에서 발생하는 지연을 해결하기 위해서 cache를 채용하였지만 완벽히 해결하지는 못하고 있다.
* CPU cache는 ''cache line''이라고 불리는 64 bytes unchained hash maps으로 구성되어 있다.
* cache 내에 있으면 ''cache line'' 메모리에 있으면 ''cache block'' 이라고 함.
cache에 더 이상 쓸 공간이 없으면(cache full), cache line 하나를 비우는데 이때 cache line에 쓰기가 있었으면 메모리에 업데이트를 한다.
cache line에 없는 것에 대해서 쓰기(Write) 동작이 발생했을 때 메모리에서 해당 값을 cache line으로 갖고 온 후 쓰기를 수행한다.
- Xavier_He_initialzation . . . . 13 matches
딥러닝에서 초기값 설정은 많이 신경 쓰지 않는 경향이 있지만 실제로 초기값 설정에 따라서 네트워크의 학습과 성능에 많이 차이가 발생한다.[* https://eda-ai-lab.tistory.com/404]
초기값을 랜덤하지 않은 특정 값으로 설정한다면 트레이닝이 되지 않을 수 있다. 간단한 예로 모든 웨이트를 '0'으로 초기화 한다고 생각해 보자 모든 입력값에 대해서 0의 결과값을 주게 된다. 모든 네트워크의 레이어와 중간 로드의 값이 0으로 일치하기 때문에 다름이 생기지 않고 네트워크는 학습이 되지 않는다.
이런 관점에서 간단하면서도 성능이 좋은 두개의 초기화 설정 방법에 대해서 알아보자.
- YOLOv8 . . . . 6 matches
신발 바닥의 패턴을 분류하고 학습하기 위해서 라벨링 작업이 필수적으로 필요하다. Object detection을 위한 라벨링 툴로 labelImg[* https://github.com/heartexlabs/labelImg]이라는 오픈소스를 사용해 보려고 한다.
설치는 간단하게 ''pip3 install labelImg''로 할 수 있다. OS별로 설치에 필요한 라이브러리가 조금씩 다를 수 있기 때문에 github를 참고하여 설치한다.
# https://076923.github.io/posts/Python-opencv-39/ 마우스 이벤트 처리
이를 위해 NMS(Non Maximum SUpression)과 Soft-NMS extension이 주로 사용된다.
- accelerator_programming . . . . 8 matches
OpenCL을 이용한 병렬 프로그램 작성을 목표로 한다.
큰 그림의 조각을 비슷한 작은 그림으로 치환해서 전체 이미지를 만드는 포토 모자이크 프로젝트를 수행한다.
이 프로젝트에서는 jpeg 라이브러리[[footnote(http://www.ijg.org/)]]를 사용한다. jpeg 라이브러리는 별도로 설치 해줘야 하는데
최신 라이브러리를 받아서 아래와 같이 설치 하면 된다.
- advaced_VAEs . . . . 6 matches
Conditional VAE(CVAE)[* ''Kingma, Diederik P., et al''. '''“Semi-supervised learning with deep generative models.”''' Advances in Neural Information Processing Systems. 2014.]란 다음 그림과 같이 기존 VAE 구조를 지도학습이 가능하도록 바꾼 것이다. encoder와 decoder에 레이블 \(y\)가 추가된 형태이다.
attachment:cvae.png?width=400px&align=center&title='''[[br]]이미지 출처''': ratsgo's blog ''Conditional VAE''[* ratsgo. (28 Jan 2018). <https://ratsgo.github.io/generative%20model/2018/01/28/VAEs/>.]
- algorithm_b . . . . 32 matches
직선알고리즘은 여러가지가 있지만 대부분 성능이 안좋은 부동소수점 나눗셈 연산을 필요로 합니다. 하지만 브레슨햄이 제안한 래스터화 알고리즘은 순수 정수의 덧셈/뺄셈 연산만으로 직선/원/타원을 래스터화하는 초고속 알고리즘입니다.
브레슨햄 알고리즘의 기본은 '오차항'의 누적입니다. 즉, 컴퓨터 화면은 색깔이 칠해진 정사각형의 거대한 2차원 배열이라고 보면 됩니다. 이때, 직선(혹은 다른 도형)을 그린다는 행위는 실수로 구성된 연속 좌표계를 불연속좌표계로 '근사'하는 과정입니다. 따라서 하나의 점을 찍으면 직선의 원래 좌표와 화면에 찍힌 불연속 좌표 사이에 오차가 존재하게 마련이며, 직선(혹은 다른 도형)을 그려 가면서 이 오차를 최대로 작게 하는 점을 선택하는 것이 브레슨햄 알고리즘의 핵심 개념입니다.
1) 직선을 나타내는 두개의 점 p1, p2을 좌표순서로 정렬합니다. 이때, 직선의 기울기가 1보다 작으면 x축 방향으로 정렬하고, 1 보다 크면 y축 방향으로 정렬합니다. (단, 여기서는 x축방향으로 정렬한다고 가정하겠습니다)
4) 다음위치를 세팅합니다. 이때 x축 방향으로 현재 픽셀의 위치를 1증가시킵니다.
5) 다음위치의 오차값을 계산합니다. 이때 오차항은 p1,p2사이의 y좌표의 차이를 더합니다.
6) 오차항을 비교하여 이 오차분이 1개 픽셀보다 더 큰지를 검사합니다. 검사는 현재까지의 오차항과 p1,p2사이의 x좌표의 사이를 비교하여 오차항이 x좌표의 차이보다 크면 y축 방향으로 좌표를 1증가시킵니다.
1) 원의 상단 정점으로부터 시작합니다. 이때, 시계방향으로 4분원을 그리고 이 4분원을 4번 반복하여 그리는 방법을 취하면 됩니다.
4) 이제 y좌표를 결정합니다. y좌표는 y, 또는 y-1 둘중의 하나로 결정됩니다. 이때,
x^2 + (y-1)^2 < x^2 + y^2 < r^2 이 성립하면 y로 다음 좌표가 결정이 되며,
r^2 < x^2 + (y-1)^2 < x^2 + y^2 이 성립하면 y-1로 좌표가 결정됩니다.
9) 이제 x좌표를 결정합니다. x좌표는 x, 또는 x-1 둘 중의 하나로 결정됩니다. 이때,
(x-1)^2 + y^2 < x^2 + y^2 < r^2 이 성립하면 x가 다음 좌표가 되며,
r^2 < (x-1)^2 + y^2 < x^2 + y^2 이 성립하면 x-1이 다음 좌표가 됩니다.
- altera_opencl_init . . . . 5 matches
설치가 되지 않고 아무것도 출력 되지 않을 경우, 혹은 라이브러리 관련 에러가 발생할 경우
설치가 끝나고 다음을 실행해서 드라이버를 올리고 설치를 확인 할 수 있음.
'''라이센스 우회하는 방법'''[[footnote(http://spherez.blog.me/60180544389 윈도우 버전)]]
이전 버전 내용으로 삭제
OpenCL_SDK/linux64/driver/reprogram.c 를 아래와 같이 수정해야 한다.
- androd_store . . . . 3 matches
3. 올레마켓을 실행한다. (설치가 정상적으로 ^#$%@$%@%@% 라고 할것이다. 무시한다.)
1. 첨부된 add_tstore_ext3.zip (cm7의 경우 system 파티션이 ext4임으로 add_tstore_ext4.zip를 사용) 를 sd카드에 넣는다.
KT사용자의 경우 모델명 MB861로 사용시 변경없이 둘다 사용가능합니다.
- androd_wifi_zone . . . . 4 matches
위에 보이는 그림은 SKT로 출시된 센세이션과 KT로 출시되 이보4G+ 의 WiFi 설정 관련 한 구문이다.
- ann_exam . . . . 6 matches
= 델타 T를 0 베이스로 변경 후 =
* △t 의 값을 0 베이스로 변경함.
= 기존 김영민씨가 만들어 놓은 데이터 =
* △t 의 값을 0 베이스로 변경하지 않음.
[:ann_exam_part2 입력 데이터를 절반으로 줄여서 테스트셋 구성]
[:ann_exam_part3 1250개의 입력 데이터를 사용해서 rbm 수행]
- ann_exam_1250input . . . . 2 matches
1250개의 입력 데이터를 이용해서 RBM을 시도해본다.
- ann_exam_part2 . . . . 4 matches
= 입력 데이터를 절반으로 줄임 =
이것을 미리 계산해서 입력 데이터를 절반으로 줄여서 트레이닝을 시도했다.
- ann_exam_part3 . . . . 3 matches
ui04에 영민씨 데이터를 사용해서 진행
OpenAnn 라이브러리를 사용한 RBM이 잘 동작하는지는 확인하지 못 했다.
- ann_index . . . . 3 matches
기계 학습법 중 인공 신경망에 대한 전반에 대한 내용을 다루고 있는 페이지
= [:roc_curves ROC Curve를 통한 데이터 분석] =
* [:MLA_SM 기계학습법과 통계적 모델의 차이?]
- ann_rnn . . . . 3 matches
RNN이라는 약자는 때때로 Recursive Neural Networks 로도 쓰이지만, Recurrent Neural Networks의 의미로 사용하는 것을 추천한다. ( 죠시아 벤지오의 Lecture Note 10장에서..)
* Recursive Neural networks는 Recurrent Neural Networks의 일반화된 버전이다.
- arXiv_1911 . . . . 347 matches
최신 간섭계 중력파(GW) 감지기[1, 2]는 매우 복잡하고 민감한 기기입니다. 각 탐지기는 중력 복사뿐만 아니라 물리적 환경, 지진 활동 및 탐지기 자체의 복잡성을 포함한 소스의 노이즈에도 민감합니다. 따라서 이러한 감지기의 출력 데이터도 매우 복잡합니다. 원하는 신호 외에도 GW 데이터 스트림에는 원래 천체 물리학이 아닌 노이즈 스펙트럼과 가우스가 아닌 과도 현상 또는 "글리치"에 날카로운 선이 포함되어 있습니다.
GW 데이터 스트림의 도구적 아티팩트는 모델링되지 않은 짧은 기간의 GW 이벤트로 오인될 수 있으며, 노이즈가 있는 데이터는 컴팩트 이진 탐지의 신뢰도를 때로는 수십 배까지 감소시킬 수 있습니다[3]. 우리는 글리치가 있는 GW 신호를 검색하는 어려움을 설명하기 위해 그림 1에서 글리치와 GW 신호 간의 유사성의 예를 보여줍니다. 따라서 글리치를 포함하는 GW 데이터를 식별하고 플래그를 지정하는 것이 중요합니다. 그런 다음 플래그가 지정된 기기 결함은 우아한 모델링 후 빼기에서 불필요하게 데이터를 낭비하는 소위 "거부권"의 조잡한 접근에 이르기까지 다양한 방법으로 처리될 수 있습니다. 기기 결함의 원인을 이해하는 것은 원인을 진단하고 감지기 및 해당 데이터의 품질을 개선하는 데도 중요합니다.
현재 Advanced LIGO 및 Virgo 감지기에서 글리치를 식별하고 특성화하는 데 사용되는 기본 파이프라인은 Omicron[7]입니다([4, 5] 참조). Omicron은 초과 전력 이벤트에 대해 단일 검출기에서 GW 변형 데이터를 검색하여 글리치를 식별합니다.
이벤트를 사인 가우스 파형과 비교하여 진폭, 지속 시간 및 주파수와 같은 속성을 특성화합니다.
GW 데이터 스트림 외에도 각 감지기는 보조 데이터의 수십만 "채널"을 기록하며, 각 채널은 감지기 구성 요소 또는 물리적 환경의 일부 측면을 측정합니다. 이러한 채널은 글리치를 진단하는 데 유용할 수 있는 감지기 상태에 대한 중요한 정보를 제공하지만 모든 것을 모니터링하는 것은 어려운 작업입니다.
잠재적인 글리치를 식별하고 플래그를 지정할 때 해당 이벤트가 모델링되지 않은 GW 이벤트가 아니라 실제로 도구에서 발생한 글리치인지 확인하는 것이 중요합니다. GW 데이터 스트림이 아닌 LIGO의 보조 채널만 고려함으로써, 우리가 플래그를 지정하는 글리치가 실제로 중력 이벤트가 아니라는 것을 더 확신할 수 있습니다. 보조 채널은 일반적으로 GW에 민감하지 않기 때문입니다[8, 9]. 보조 채널로 글리치를 연구할 때의 또 다른 이점은 특정 채널과의 상관 관계가 감지기 문제의 원인을 식별하는 데 도움이 될 수 있다는 것입니다.
글리치 세그먼트를 거부하기 위한 현재 작업에는 Used-PercentageVeto[9], HierarchicalVeto[10], Bilinear Coupling Veto[11] 및 iDQ[12–14]가 포함됩니다. Cavaglia et al. [15] 보조 채널의 하위 집합에서 도구 인공물을 식별하기 위해 유전자 프로그래밍과 결합된 랜덤 포레스트의 이중 접근 방식을 사용합니다. 또한 보조 채널을 GW 검출기의 천문 범위와 연관시켜 데이터 품질을 연구하는 작업이 있습니다[16]. 우리의 방법은 이러한 접근 방식을 보완합니다. 우리는 모든 보조 채널을 고려하여 글리치를 포함하는 세그먼트를 식별하고 이러한 세그먼트에 플래그를 지정하고 감지기 문제를 식별하는 데 사용합니다.
머신 러닝 기술은 대규모 예제 데이터 세트에서 학습하여 복잡한 문제를 분석하는 강력한 도구임이 입증되었습니다. 그들은 2006년 초부터 GW 과학에서 글리치[6, 12, 13, 18-24] 및 실시간 신호 감지[25], 신호 특성화[26]와 같은 기타 문제 연구에 적용되었습니다[17]. -28] 및 매개변수 추정 [29].
분류는 기계 학습 모델이 두 개 이상의 범주 중 하나에 속하는 데이터 샘플의 측정된 특성 집합 또는 "특징"을 고려하도록 훈련되는 기계 학습의 근본적인 문제입니다. 범주가 알려진 샘플 세트를 모델에 제공함으로써 실제 범주가 알려지지 않은 샘플의 범주를 예측하도록 모델을 훈련할 수 있습니다.
LIGO 보조 채널을 기반으로 주어진 시간에 글리치가 발생하는지 여부를 감지하는 문제를 이전 연구[13, 15]에서와 같이 간단한 2가지 분류 문제로 제시하고 잘 이해되고 효율적이며 일반적으로 적용 유망한 결과와 함께 이 문제에 대해 기계 학습 방법을 사용했습니다.
우리는 GW 검출기의 보조 채널에서 파생된 기능을 사용하여 주어진 시간에 글리치가 발생하는지 여부를 예측하는 분류 모델을 훈련합니다. 분류가 수행된 데이터는 보조 채널에서만 파생되기 때문에 우리 방법은 변형률을 분석하는 기존 방법과 독립적으로 변형률 데이터를 사용하지 않고 글리치의 유무를 확증할 수 있습니다.
아래에서는 이해를 위한 Elastic-net 기반 기계 학습(EMU 방법 또는 이후 방법)이라고 하는 방법의 변형을 설명합니다. Ⅱ; 우리는 최근 LIGO 데이터에 대해 이 방법을 테스트한 결과를 보여줍니다. III; 그리고 우리는 Sec에서 결과를 논의합니다. IV.
보조 정보를 사용하여 GW 데이터 스트림에서 글리치의 존재를 예측하려면 보조 채널에서 유용한 정보를 추출하고 이 정보를 사용하여 결정을 내리는 방법이 필요합니다.
모든 보조 채널을 고려할 때 분류를 위해 큰 고차원 데이터 세트를 생성하고 처리해야 합니다. 선형 모델은 이러한 유형의 대규모 데이터 세트에서 간단하고 효과적이며 훈련하기 쉽습니다. 이진 분류를 위한 표준 선형 모델인 로지스틱 회귀를 사용합니다. 글리치 근처(또는 글리치 부재)에서 채널 동작의 속성을 캡처하기 위해 각 보조 채널에 대한 대표적인 통계 그룹을 기능 세트로 선택합니다.
감지기 문제도 진단하려면 알고리즘의 출력을 해석할 수 있어야 합니다. 로지스틱 회귀는 이에 대한 간단한 방법을 제공합니다. 훈련 중에 각 기능에 가중치가 부여됩니다. 더 큰 가중치는 샘플에 결함이 있는지 여부를 결정하는 데 더 관련성이 높은 기능을 나타냅니다. 큰 가중치가 적은 모델은 직관적으로 더 쉽게 해석할 수 있습니다. 이 속성을 장려하기 위해 우리는 가장 관련성이 높은 기능만 모델에 의해 선택되고 정보가 없는 기능에 해당하는 기능이 0이 되도록 탄력적 순 정규화를 사용하여 가중치에 페널티를 부여합니다. 이것은 또한 다음과 같은 경우에 필요한 것보다 더 작은 데이터 세트로 훈련할 수 있게 합니다. 우리는 희소 정규화를 부과하지 않았습니다.
아래에서는 Sec.에서 관련 없는 데이터를 식별하는 예비 단계를 설명합니다. IIA, Sec의 나머지 데이터에서 특징 추출. IIB, Sec.의 데이터 사전 조정. 우리가 Sec.에서 사용하는 기계 학습 모델인 IIC. II D, Sec.의 모델 하이퍼파라미터 선택. IIE, 그리고 Sec에서 얼마나 많은 훈련 데이터가 충분한지에 대한 분석. II F.
각 LIGO 검출기에는 약 250,000개의 보조 채널이 있습니다. 이러한 채널 중 상당수는 일정하거나 항상 일관된 패턴으로 변경되며(예: 시간 추적 또는 CPU 주기 계산) 무시해도 됩니다. 처리해야 하는 데이터의 양을 줄이기 위해 분석에서 글리치에 대한 정보가 없는 이러한 채널을 제거합니다.
보조 채널 시계열 데이터는 사용자 지정 형식[30]으로 인코딩되고 각 채널에 대해 64초의 연속 데이터를 포함하는 파일에 저장됩니다. 이러한 파일을 "원시 프레임 파일"이라고 합니다. 정보가 없는 채널을 식별하기 위해 각 분석의 교육 기간에서 몇 개의 원시 프레임 파일을 선택하고 해당 프레임에서 채널을 비교합니다. 선택한 각 프레임의 각 채널에 대해 해당 프레임의 다음 값에서 채널의 첫 번째 원시 값을 빼고 결과 시계열을 선택한 다른 각 프레임의 해당 시계열과 비교합니다. 모두 동일하면 나머지 분석 동안 채널이 무시됩니다. 이 절차 후에 추가 분석을 위해 약 40,000개의 채널이 남습니다.
일부 보조 채널은 GW 스트레인 채널과 직접 연결되거나 GW 신호에 의해 다른 방식으로 오염됩니다. 이러한 채널 중 다수는 내부 LIGO "채널 안전성" 연구에서 확인되었습니다[8, 9]. 알려진 모든 채널을 제거했습니다. 또한 사전 교육 및 전문가와의 논의를 거쳐 균주에 의해 오염되었을 수 있지만 안전성 연구에서 고려되지 않은 추가 채널을 제거했습니다.
우리는 Omicron[7] 이벤트 트리거 생성기를 사용하여 모델 교육 및 테스트를 위한 글리치 시간을 식별합니다. (일단 훈련되면 우리 모델은 Omicron 및 스트레인 데이터와 완전히 독립적입니다. 아래 설명된 대로 보조 채널에서 계산된 매개변수만 고려합니다.) Omicron은 대기 시간이 짧은 스트레인 데이터를 분석하여 초과 전력 이벤트를 찾고 이러한 글리치의 매개변수를 보고합니다. 시작 시간, 피크 시간 및 지속 시간을 포함합니다.
- arduino_list . . . . 1 match
|| [:arduino_dev_env 아두이노 개발환경] || [:electronics 전기전자] ||
- artificial_neural_networks . . . . 73 matches
TLU는 퍼셉트론(Perceptron) 또는 ''Adaline''(Adpative linear element)으로 불리어져 왔고 이것의 유용성은 '''[Rosenblatt]'''[[footnote(Frank Rosenblatt : Corenell Aeronautical Lab(1957)에서 두개의 층을 가진 인공 신경망 개발. Input layer, Output layer)]]과 '''Widrow'''에 의해서 광범위하게 연구 되었다.(1962)
입력 벡터(Feature Vector) X와 TLU의 가중치 벡터 W의 내적이 \(\theta\)보다 크면 1을 출력하고, 그렇지 않으면 0를 출력한다.
\(X·W \ge 0\) 와 같이 표현할 수 있다.
가중치를 조정하여 원하는 결과가 나올 수 있도록 조절하는 과정을 학습이라고 하는데 이때 사용 되는 에러 함수는 아래와 같다.
\(d_j\)는 입력 벡터 \(X_j\)에 대한 원하는 응답 값이고 \(f_j\)는 실제 값이다.
원하는 값과 실제 값의 차이인 \(\varepsilon\)의 최소값을 '''기울기하강([:Gradient_Descent Gradient Descent])'''에 의한 탐색 과정을 수행함으로써 찾을 수 있다.
이다.
로 나타낼 수 있고 \(\frac{\partial s}{\partial W}=X\) 이므로,
이다. \(\frac{\partial \varepsilon}{\partial s} = -2(d-f)\frac{\partial f}{\partial s}\)
이다. 그러나 s에 대한 f의 편미분을 구하려 할때 문제가 되는 것은 임계 함수의 존재 때문에 TLU의 출력 f는 s에 대하여 연속적으로 미분 가능하지 않다는 점이다.
이 문제를 해결하기 위한 두가지 방법이 있다.
\(f = s\)로 놓는 것과 임계 함수를 미분 가능한 비선형 함수로 바꾸는 것이다.
1이라고 표시된 모든 훈련 벡터는 정확히 1의 내적값을 나타내고, 0이라고 표시된 모든 벡터는 -1의 내적값을 나태내도록 가중치를 조정한다고 가정하자.
이런 경우 \(f = s\)를 사용하면 제곱 에러는 \(\varepsilon = (d-f)^2 = (d-s)^2\) 이고 \(\frac{\partial f}{\partial s} = 1\)이다.
음의 기울기를 따라 가중치 벡터를 움직이고, 인수 2를 '''학습률 매개변수(learning rate parameter)''' \(c\)에 통합하면 가중치의 새로운 값은
이다.
이 방법은 ''Widrow-hoff''(1960) 또는 delta 규칙으로 알려져 있다. 가중치 집합을 찾은 후에 f가 0 또는 1의 값을 나타내도록 임계 함수를 다시 넣을 수 있다.
미분 불가능한 임계 함수를 다루는 또 다른 방법은 ''Werbos(1974)''에 의하여 제안되었고, ''Rumelhart, et al. 1986''에 의하여 임계 함수는 미분 가능한 '''시그모이드 함수'''로 바꾸는 연구가 진행 되었다.
보통 사용하는 시그모이드 함수는 \(f(s) = \frac{1}{1 + e^{-s}}\)이다.
시그모리드 함수를 사용함으로써 다음과 같은 편미분이 가능하다.
- association_rule . . . . 54 matches
어떤 사건이 얼마나 자주 함께 발생하는지, 서로 얼마나 연관되어 있는지를 표시하는 것을 '''Association rule'''이라고 한다.
'''전체 경우의 수에서 두 아이템이 같이 나오는 비율'''이다. 즉, 아래와 같이 나타낼 수 있다.
위 식에서 N은 전체 경우의 수, \(N(X \cup Y)\)은 X, Y가 동시에 일어난 경우의 수를 의미한다. 예를 들어, 차와 라떼를 주문한 고객이 머핀을 주문할 support 값을 구한다고 하면, 아래 식과 같이 차, 라떼, 머핀을 동시에 구매한 경우의 수를 전체 경우의 수로 나눠준다.
위 식을 보면 차, 라떼, 머핀의 순서를 바꿔도 동일한 결과를 얻는 것을 알 수 있다. 즉, 머핀을 주문한 고객이 차와 라떼를 주문할 경우도 동일한 support 값을 얻는다. support 값이 높으면 높을수록 더 의미가 있다고 볼 수 있다.
'''X가 나온 경우 중 X와 Y가 함께 나올 비율'''을 의미한다. 즉, 구매의 경우를 예로 들자면 X를 산 사람 중 Y도 같이 산 사람의 비율을 말한다.
차와 라떼를 구매한 고객이 머핀을 주문할 경우의 confidence 값을 위와 같이 계산할 수 있다. 이 경우도 마찬가지로 X, Y의 순서를 바꿔 볼 수 있는데 이 경우는 같은 결과를 내어주진 않는다. Confidence 값이 1에 가까울수록 관계가 더 의미 있다고 할 수 있다.
'''X와 Y가 같이 나오는 비율을 X가 나올 비율과 Y가 나올 비율의 곱으로 나눈 값'''이다. 식으로 표현하면 아래와 같다.
또 다시 차와 라떼를 주문한 고객이 머핀을 주문할 lift값을 계산하면 아래와 같다.
Lift값은 1보다 큰 값일 때 positively correlation, 1일 때 independent, 1 미만일 때 negatively correlation이라고 여긴다.
간단한 예제로 위에서 설명한 지표들을 계산해보고 의미를 파악해보자. 표 1은 5명의 고객이 마트에서 장을 본 것이다.
위 자료를 보고 Beer를 구매한 사람들에게 어떤 상품을 추천하는 것이 옳을까를 생각해보자.
각 아이템에 대해서 신뢰도를 계산해보면
신뢰도라는 지표를 뽑은 이유는 특정 수치 이상의 값만 의미가 있다고 주장할 수 있는 기준을 설정할 수 있기 때문이다. 기준을 50% 이상으로 보면 Diapers, Bread, Milk 정도가 추천 가능한 물품이 되겠네요. 하지만 뭔가 이상하죠?
신뢰도만 보고 추천하기엔 부족하 부분이 있다 우연하게 출현 빈도가 겹친 경우에 대해서도 신뢰도를 보면 높은 신뢰도를 얻을 수 있기 때문이다. 전체 거래에서 어느정도 비율을 차지하는가를 보면
신뢰도의 값을 얼마나 신뢰할 수 있는가를 지지해주는 것이라고 볼 수 있다.(우연히 일어난 일이 아님을 알 수 있다.)
__이 결과만 보면 역시 맥주엔 기저귀지할 것 같다.__
그럼 Bread와 Milk는 어느 것이 더 우위에 있을까? 여기서 하나의 지표를 더 사용해 보자.
Bread와 Milk는 신뢰도와 지지도의 값이 같다. 하지만 구지 둘 중 하나를 꼽자면 어떤 것을 추천하는 것이 좋을까?
이런 지표만 갖고 단순히 수치가 높으니 추천할 수 없음을 알 수 있다. 이러한 연관 분석에서는 가짜 결과가 존재하고 이런 가짜 결과 막기 위해서 발견한 패턴들을 평가하고 검사해야 한다.
위 3가지 척도를 이용해서 데이터셋으로 부터 의미 있는 association rule을 만들어내려면 어떻게 해야할까. 그 방법으로는 brute force, apriori algorithm, FP-growth algorithm 등이 있다.
- atrix_custom_rom . . . . 58 matches
= UBS 드라이버 설치 =
''이 telstra롬을 밀기위해선 또 RSDLite[[footnote(telstra롬은 확장자 .sbf 파일이고 RSDLite는 확장자가 sbf란 파일을 구동시키기위한 프로그램이죠.)]]란애가 필요합니다.''
전원 버튼과 볼륨 다운 버튼을 같이 누르고 있어야 합니다.
이렇게 되면 ''Fastboot'' 라는 글이 보이는 것을 확인 할 수 있다.
이 상태에서 볼륨 다운 버튼을 12번 누르면 RSD라는 모드로 변경이 되게 되는데
이 상태에서 볼륨 업 버튼을 부르게 되면 ''Starting RSD Protocol support''라는 글이 보인다.
이 상태에서 PC와 USB로 연결하게 되면 아래와 같이 장치가 연결된 것을 확인 할 수 있다.
아트릭스는 한국의 순정롬이 존재하지 않는다.
파일을 받아서 압축을 풀면 .sbf 파일이 생긴다. 경로를 지정하고 '''Start''' 버튼을 클릭하면 알아서 롭업이 시작 된다.
{{{{color: rgb(255, 1, 1); font-size: 13px; font-weight: bold;} 주의!!}}} : '''중간에 재부팅이 되는데 끝이 아니다 Finish라는 문구를 확인할 때 까지 UBS를 분리하면 안 된다.'''
아래는 완벽하지는 않지만 그래도 순정(?)으로 돌릴 수 있는 방법이다.
1. fastboot를 이용한 oem 코드 2차 언락
이 텔스트라가 핸드폰의 모든것(sd카드 제외)을 처음으로 만드는것이기 때문에 부트로더 또한 락이 되고,
이유는 부트로더 언락파일도 sbf니까요
두번째 파일을 받아서 압축을 풀면 '''intl-fix-try1.sbf'''이 나온다.
위의 sbf파일 경로 지정법과 똑같이 해주시면 됩니다.(아트릭스 rsd모드 진입 필수![텔스트라로 밀을시 부팅이 완료되어 있으므로 수동으로 종료])
(텔스트라에 비해 빠른 속도를 끝이납니다.)
이제 rsd Lite프로그램과는 바이바이~~(다시 커스텀롬을 올리려면 만나야하지만...)
== fastboot를 이용한 oem 코드 2차 언락 ==
fastboot를 받아서 압축을 풀면 cmd창에서 실행 할 수 있는 파일이 보인다.
- attribute_ex . . . . 19 matches
기존 C코드에 있는 inline은 잘 사용하면 굉장히 편리한 기능이다. inline으로 선언된 함수의 경우 컴파일 단계에서 코드가 확장이 되서 함수 호출에 의한 자원 손실을 회피할 수가 있다. 함수 호출에 의한 자원 손실의 문제는 잘 알고 있을 것이라고 생각한다. 그리고 컴파일에 따라서 사용자가 inline을 선언하지 않아도 간단한 함수에 대해선 자동적으로 inline이 적용이 되서 컴파일시 코드 확장이 되는 경우가 있다. 하지만 간혹 프로그램에 따라서 코드가 확장이 되지 않고 함수 호출에 의한 프로그램이 진행이 되야 하는 경우가 있다. 그 때 사용할 수 있는 코드가 있다.
C에서 구조체를 선언한 경우 메모리는 워드 단위로 할당이 되게 된다. 즉 4byte가 1word라고 가정을 한 경우(64bit의 경우 1word는 8byte일 수 있다. sizeof(int)가 1word의 값이다.)
의 경우 총 12byte의 메모리가 할당이 될 것이다. 하지만 선언시 packed코드를 사용을 한다면 위의 구조체는 7byte의 메모리가 할당이 되게 된다.
프로세서는 프로세스가 요구하는 수치를 1word 단위로 로드한다. 그러므로 변수를 메모리에 할당이 될 때 할당되는 위치를 정렬하는 코드도 존재를 한다.
위의 변수는 변수가 메모리에 할당되는 주소는 4의 배수로 정렬이 되어 메모리에 할당이 된다. 예제는 위의 참조 주소에 잘 나와 있다. 캐시 메모리의 크기를 알고 있다면 변수를 캐시 메모리의 크기만큼 정렬을 한다면 프로그램의 속도는 매우 큰 차이가 날 것이다.
- autoencoder . . . . 64 matches
통상적인 Neural Network는 샘플 데이터 입력값(\(x\))와 목표값(\(y\))이 모두 주어진 Labeled data를 사용해서 학습을 진행하는 지도학습(Supervised Learning)을 생각했다. Autoencoder는 목표값(\(y\))이 없이 입력값(\(x\))만 주어진 상태로 학습을 하는 비지도학습(Unsupervised Learning)이다.
기본적인 구조는 Neural network구조 이며, 다른점이라면 입력과 출력이 동일하다는 것이다. (반듯이 동일할 필요는 없지만, 목표값(\(y\))이 없기 때문에 변형된 출력값을 사용한다.)
= encoder와 decoder에 대한 이해 =
그림과 같은 네트워크 모델이 있다고 하자. 하나의 vector로 부터 확장되어 이미지가 만들어지는 네트워크 모델이다. 예로 one-hot vector [1,0,0,0]이 고양이 그림이 되고, [0,1,0,0]은 강아지 그림이 된다고 생각해보자 이 one-hot vector는 몇장의 그림을 표현할 수 있을까? 정답은 4장의 그림을 표현할 수 있다.
이 것을 조금 수정해서 one-hot vector를 실수를 갖도록 확장해서 [3.3, 2.1, 4.5, 9.1]과 같은 사용한다면 몇장의 그림을 표현할 수있을까? 아마도 무수히 많은 그림을 표현할 수 있을 것이다. 이 구조가 '''decoder'''이다. 또한 이렇게 사용된 vector는 '''latent vector''' 또는 '''latent variables'''로 생각할 수 있다.
반대로, 그림을 vector에 활당하는 일에 대해서 생각해 보자. 앞선 예와 같이 "[1,0,0,0]은 고양이 그림이고 [0,1,0,0]은 강아지 그림이다." 처럼 몇장이 안되는 그림이라면 사람이 일일이 할당할 수 있을 것이다. 하지만 할당해야할 그림이 아주 많아서 사람이 일일이 할당할 수 없다면? 누군가는 해야겠죠?
위 그림과 같이 encoder와 decoder를 붙여 하나로 학습을 진행하면 자동으로 latent vector가 학습이 된다.
앞 장에서 autoencoder의 구조와 의미에 대해서 알아보았다. 구조와 의미는 알았는데 이것을 어디에 사용할가? Variational autoencoder로 확장되면서 다양한 분야에서 여러가지 목적으로 사용되어지고 있지만 단순 autoencoder만을 가지고 응용할 수 있는 분야는 많지 않다. 가장 대표적인 응용분야를 꼽자면 차원축소(Dimensionality reduction)가 되겠다.[* Urwa Muaz. (25 Jul 2019). <https://towardsdatascience.com/autoencoders-vs-pca-when-to-use-which-73de063f5d7>.]
차원축소 알고리즘으로 가장 많이 사용되는 알고리즘은 PCA일 것이다. PCA는 데이터를 다른 공간으로 투영하는 선형변환을 학습하는 방법이다. PCA는 데이터의 분산(Variance)을 최대한 보존하면서 서로 직교하는 새로운 축을 찾아, 고차원 공간의 표본들을 선형 연관성이 없는 저차원 공간으로 변환하는 기법으로 아래 그림과 같이 2차원 공간에 있는 데이터를 하나의 주성분으로 선형변환된다. [* ratsgo. (24 Apr 2017). <https://ratsgo.github.io/machine%20learning/2017/04/24/PCA/>.]
autoencoder가 갖는 비선형성으로 인해 데이터를 복원하는 부분에서 PCA와 차이가 생긴다.
아래 그림은 2차원 데이터를 압축하고 복원한 결과이다. 데이터가 선형이면 PCA와 autoencode가 비슷하게 잘 되는 것을 확인할 수 있다. 하지만 비선형 데이터에서는 확연한 차이를 보인다.
3차원 데이터에 대한 실험 결과이다. 2차원 실험의 결과와 비슷한 결과이다.
* 학습이 끝난 autoencoder의 encoder part는 고차원 데이터를 저차원 데이터로 변환하는 차원축소기로 사용할 수 있다.
* PCA와 비교해서 Non-Linear 데이터에 대해서 차원축소와 복원력이 좋다.
- auxMVC . . . . 28 matches
라이고 초기, 아직 중력파를 관측하기 전, 레이저 간섭계를 만들고(Since 2001.) 6번의 과학관측을 시도 했다. 이 관측과정 동안 중력파는 검출 되지 않았지만 많은 데이터를 축적했고 이 것들을 활용해서 중력파 검출기 특성(Detector Characterization) 연구를 진행했다. 이와 같은 연구중 하나로 중력파 검출기 주변에 설치된 다양한 센서(Auxiliary channel)로 부터 수집된 방대한 데이터를 활용해서 중력파 검출기에 직접적으로 영향을 주는 센서와 그렇지 않은 센서(safe channel)를 분류하고 그런 센서들 중 특정 조건이나 환경에서 중력파 검출기에 영향을 주는 경우를 확인하고 센서 데이터로 부터 중력파 검출기의 신호가 잡음임을 판별하는 일을 다양한 머신러닝 알고리즘으로 수행하였다.[* Rahul Biswas et al. '''Application of machine learning algorithms to the study of noise artifacts in gravitational-wave data''', Phys. Rev. D, 2013, https://arxiv.org/abs/1303.6984]
본 논문에서는 6번째 과학관측 데이터중 10%를 갖고 수행하였으며, Random Forest, Support Vector Machine, Artificial Neural Network 등 머신러닝 알고리즘을 적용하여 비슷한 결과를 얻었다.
'''라이고 검출기의 목표''': 쌍성의 병합, 슈퍼 노바의 폭발 등과 같은 천체 현상으로 부터 중력파 검출을 목적으로 한다.
'''Gliches''': 이 논문에서 찾고자하는 것은 중력파 신호와 유사한 잡음 신호로 Short duration, Non-Gaussian 형태의 신호로 중력파와 유사한 신호이다.
'''기기의 고정 잡음''': 저주파 지진 잡음, 거울 및 서스펜션의 열 잡음, 60Hz 전력선 하모닉스, 광자 샷 노이즈
* 찾은 신호가 글리치가 아니고 중력파임을 증명하기 위한 방법으로 여러 검출기에서 동일하게 관측 되었는지를 이용해서 확인한다. 지금까지 가장 효과적인 방법임.
* 중력파 채널에 나타난 신호가 보조 채널에 반영되는 경우가 있다. 이 경우 보조 채널을 분석에 활용해서 노이즈를 검출하게 되면 중력파도 노이즈로 분석하게 된다. 이것을 막기 위해서 중력파 채널에 임의의 노이즈를 삽입한다. (Hardwhare injection) 이렇게 삽입한 신호가 보조 채널에 나타난다면 이 채널은 "unsafe"하다고 정의하고 이러한 분석에 사용하지 않는다. 사용되는 채널들은 "safe" 채널이라고 한다.
* 데이터는 'gliches'와 'clean'으로 구분된다. 'gliches'는 중력파 신호가 아닌 transient event이고 'clean'은 Gaussian detector noise와 진짜 중력파 신호를 뜻한다.
* Non-Gaussian trnsient 신호를 검출하는 방법으로 '''Kleine Welle'''이라는 방법을 사용하고 5가지 feature 데이터를 뽑아준다.
- auxcam_job . . . . 45 matches
titanv 서버 /home/wskim/work/auxcam/data 폴더에 기본적인 데이터 셋 저장, KISTI ldg-ui에 오상훈 박사님이 /data/ligo/scratch/sanghoon/AuxCAM/dataset 폴더에 작업해 놓은 파일을 복사해서 사용
Hanford safe channel list는 814개이다.
각 채널의 정보는 cis.ligo.org에서 확인 가능하다.(단, 모든 채널의 정보가 제공 되는 것이 아님으로 확인 되지 않는 채널정보는 라이고 기기 팀에게 문의해야 한다.)
767개의 채널을 모두 사용하기에는 메모리 사용량이 너무 크기 때문에 reduced channel list를 사용하고 그 중에서 데이터가 없거나 변화가 없이 일정한 값이 출력되는 채널을 제거하였다.
== 데이터 개수가 100 이상인 클리치 ==
분류에 사용할 데이터중 각 클래스에 해당하는 데이터의 갯수가 100개 이상인 샘플만 사용하려고 한다.
보조 채널 데이터는 256Hz ~ 16kHz까지 다양한 샘플링 레이트를 갖고 있다. 라이고에서는 주로 수십 Hz에서 수천 Hz까지를 분석하기 때문에 2kHz로 resample을 진행하고 화이트닝해서 데이터를 분석에 사용하려고 한다.
화이트닝은 8초 데이터중 1초 단위로 0.5초 중첩하여 fft를 계산하고 그 값중 median값의 제곱을 PSD로 사용해서 나눠주었다. [[footnote( [:iEEG_seizure 라이고 화이트닝 방법])]]
이렇게 계산된 8초 시계열데이터중 가운데 4초만 데이터 분석에 사용함. (fft 계산으로 발생하는 edge effect를 제거하기 위함)
input으로 독립적인 시계열 데이터를 사용하는 모델을 만들어서 학습을 진행해본 경험이 없기 때문에 여러가지 테스트를 진행하려고 한다.
기본적인 생각은 시계열 데이터라는 특징을 추출하는 extractor의 특성은 비슷할 것으로 생각하여 1차원 CNN을 extractor를 사용하고 weight는 공유하는 것으로 했다.
290개 채널의 특징을 뽑아내는데 몇개의 kernel이 필요할지 kernel의 수가 충분하다면 좋은 특징을 추출할 수 있을지도 의문이다.
우선은 kernel의 수가 늘어가면 학습이 더 잘 되는지 어느 정도의 kernel이 최적인지 알아보기 위해서 아래의 학습모델로 학습을 진행해 보겠다.
학습 모델은 크게는 두개의 클래스로 구별된다. ''multi_input_cnn'' 클래스는 각 채널에 대한 특성을 추출하는 클래스로 시계열 데이터에서 1차원 CNN 네트워크로 특성을 추출하고 하나의 대표값으로 값을 압축한다.(여기서 대표값을 하나 이상으로 하면 어떨지 체크 포인트!)
이전에 진행했던 AuxMVC에서 처럼 채널마다 2개에서 5개 사이의 대표값을 추출하는 것으로 생각할 수 있다.
이후 네트워크는 각 채널별 특징을 이용해서 Classification하는 Fully-Connected Network이다.( FC를 하나만 설정했는데 2개 이상으로 확장해볼 수 있다. 체크 포인트!)
다중분류를 위한 대표적인 손실함수, CrossEntropyLoss[[footnote( [http://www.gisdeveloper.co.kr/?p=8668 다중분류를 위한 대표적인 손실함수, torch.nn.CrossEntropyLoss])]]를 사용했다. torch에 구현된 torch.nn.CrossEntropyLoss는 nn.LogSoftmax와 nn.NLLLoss 연산의 조합이다. nn.LogSoftmax는 신경망 말단의 결과 값들을 확률개념으로 해석하기 위한 Softmax 함수의 결과에 log값을 취한 연산이고, nn.NLLLoss는 nn.LogSoftmax의 log 결과값에 대한 교차 엔트로피 손실 연산(Cross Entropy Loss)이다.
num_class = model.fc.out_features #모델의 마지막 레이어의 아웃을 Class Number로 사용
- auxcam_paper . . . . 16 matches
알베르트 아인슈타인은 1916년 일반 상대성 이론에 기초하여 중력파를 예측했습니다. 약 100년 후인 2015년 9월 14일, 우리는 블랙홀 이진 병합인 첫 번째 중력파를 관찰했습니다.[1] 레이저 간섭계 중력파 관측소(LIGO)는 첫 번째 관측부터 마지막 관측까지 총 67번의 중력파를 관측했다(O3b).
이러한 성공적인 검출을 위해서는 검출기 특성화에 대한 연구가 필요하다. 이러한 연구 중 하나는 시민 과학을 사용한 "Gravity Spy"입니다.[2] 이 프로젝트는 중력파가 아닌 LIGO 감지기의 글리치로 알려진 노이즈 특성의 분류를 제시합니다. 지금까지는 이미지 글리치의 형태학적 분류만 수행되었습니다. 또 다른 연구로 LIGO 보조채널 데이터만을 이용하여 중력파 채널의 신호가 글리치인지 아닌지를 판단하는 연구가 있었다.[3] 다시 말하지만, 이것은 결함인지 깨끗한 것인지에 대한 단편적인 정보만 제공할 수 있습니다. 그래서 두 연구를 통해 얻은 지식을 바탕으로 LIGO 보조채널 데이터를 이용하여 딥러닝 모델을 학습시키고 글리치 분류 작업을 수행하였다.
이 연구에서 우리는 형태학적으로 분류된 글리치와 LIGO 보조 채널 데이터 사이의 상관 관계를 연구합니다.
- auxcam_script . . . . 155 matches
오늘은 '''중력파 보조채널 데이터를 이용한 중력파 잡음 분류 연구'''에 대한 소개와 본 연구에서 사용한 딥러닝 알고리즘에 대해 말씀 드리겠습니다.
발표 순서는 LIGO Detector에 대한 간단한 소개와 본 연구에서 사용한 데이터 전처리 과정에 대해서 말씀드리고 이 연구에 사용한 딥러닝 알고리즘을 소개하는 것으로 마치겠습니다.
= 라이고 디텍터 설명 =
저보다 더 잘 아시는 분들도 계시겠지만 간단하게 중력파 검출 원리에 대해서 알아보겠습니다. 본 영상에서 보시는 것과 같이 빛이 가로 세로로 일정 거리를 지나 합쳐 졌을 때 보강 간섭과 상쇄 간섭 발생하게 됩니다. 이러한 간섭 현상이 발생하기 위한 조건으로 광원은 일정한 위상을 갖고 단일 파장을 가져야 하는데 이미 라이고 검출기는 모든 조건을 충족하고 있습니다.
검출기 끝에 거울이 설치 되어 있는데 거울은 중력 방향으로 자유 낙하를 끝없이 하고 있는 상태로 중력 변화가 발생하는 중력 경사면을 따라 움직이게 됩니다. 이로 인해 빛의 경로차가 발생하게 되고 보강 간섭과 상쇄 간섭이 발생하게 됩니다. 이를 이용해서 h of t 를 측정합니다.
이것은 이론적인 경우이고 실제는 다양한 노이즈로 인해 중력파 검출이 쉽지는 않습니다.
라이고 검출기는 미국 hanford와 livingston에 설치 되어 있고, 유럽에 VIRGO 검출기가 O2기간 부터 관측가동을 함께하고 있습니다.
지상에 설치된 중력파 검출기들은 필현적으로 지구의 영향을 받을 수 밖에 없습니다. 그리고 검출기 자체가 갖는 기기 노이즈에도 영향을 받습니다. 오른쪽 그림은 이 두 가지 노이즈를 고려한 검출기의 디자인 센서티비티입니다. 검출기를 가동하면 이 정도 수준의 배경 잡음이 발생합니다.
이 신호를 타임-프리퀀시맵으로 보면 아래 그림과 같이 주파수가 올라가면서 엠플리튜드가 같이 증가하는 것을 확인 할 수 있습니다.
전형적인 중력파 신호의 그립니다. 이 외에도 검출기에는 수 많은 신호들이 잡힙니다. 배경 잡음 보다 큰 Non-Gaussian, Transitent Noise를 Glitch라고 합니다.
관측 가동중 검출기에 검출된 중력파가 아닌 신호들을 많이 모으다 보니 형태적으로 비슷한 모양을 갖는 노이즈들이 발생한다는 것을 알게 되었습니다. 원인은 모르지만 형태적으로 분류가 가능하니 나중에 유용하게 쓰일 수 있도록 형태적 분류라도 해보자는 목적으로 Glitch에 이름을 붙이고 분류하는 일을 했습니다. 프로젝트 명은 Gravity Spy 라고 Cityzen sience라는 형태로 진행 중입니다.
지금 보시면 Low Frequency Line, Whistle, Helix, Low Frequency Burst, Blip, Scratchy 등의 예를 보실 수 있습니다. 이 외에도 다양한 형태의 글리치가 존재합니다.
검출기는 각 분야에서 최고의 기술력을 집약해서 만들어졌습니다. 각 모듈마다 기능을 검증하고 모니터링하기 위한 센서들을 포함하고 있습니다. 센서마다 측정하는 것이 다른고 단위가 다릅니다. 또한 중력파 검출기와 직접적인 상관성이 있을 수도 있고 그렇지 않을 수도 있습니다. Input mode clearer와 output mode clearer처럼 중력파 검출기와 직접적으로 연관이 있는 모듈들의 센서는 중력파 채널과 상관성이 높은 센서들이 다수 존재할 수 있습니다. 이러한 센서들을 unsafe channel이라고 하고 직접적인 연관성이 없는 센서들을 safe channel이라고 합니다.
지금 보시는 채널들은 PEM 채널로 대표적인 safe channel들 입니다. PEM은 Physics Environment Monitoring의 약자로 검출기 주변의 설치된 진동계, 온도계, 습도계, 자기장 측정기 등등으로 구성되어 있습니다. 이런 것들은 중력파와 직접적인 상관성이 없는 것들이기 때문에 이런 보조 채널들의 신호와 중력파 채널의 신호가 강한 상관성을 보인다면 그 신호는 중력파에 의한 것이 아니라 주변 환경에서 온 신호라고 볼 수 있습니다.
이렇게 중력파 채널에 발생한 신호를 노이즈로 판단하고 제거하기 위해서 중력파 보조채널을 사용할 수 있는데 이런 목적으로 사용해도 안전하도고 해서 safe channel이라고 합니다.
지금까지가 배경 설명이였습니다. 중력파 데이터 분석을 일을 진행하면서 가장 어려운 부분이 이 배경 설명 입니다. 실제 한 일에 비해서 설명해야 할 내용이 많고 복잡해서 항상 이 부분에서 시간을 제일 많이 사용하는 것 같습니다.
사용한 데이터는 O1기간 중 리빙스턴 관측소의 보조 채널 데이터만을 사용했습니다.
290개의 센서 데이터는 측정하는 물리량도 다르고 단위도 다르고 sampling rate도 다릅니다.
딥러닝 알고리즘의 input data로 사용하기 위해서 화이트닝과 rasamping을 했습니다.
중력파 채널에 글리치가 발생한 시점과 일치하는 보조채널 데이터를 8초씩 취해서 INPUT DATA로 만들고 해당 글리치로 라벨링을 했습니다.
- bandwidth_test . . . . 70 matches
본 문서는 ''AMD Accelerated Parallel Processing OpenCL Programming Guide ver 2.7''을 기준으로 쓰여지고 있으며, 본인이 확인한 내용들을 정리하고자 하는 목적임.
= 런타임이 사용하는 메모리 타입(Type of Memory Used by the Runtime) =
호스트 프로그램에서는 당연히 접근가능하나 디바이스에서는 접근이 불가능하다. 디바이스로 전달하기 위해서는 '''clEnqueuReadBuffer/ClEnqueueWriteBuffer'''를 통해서 전달해야 한다.
이 과정주에 ''pinning''이라는 과정이 들어가는데,
전달하려는 Host Memory의 사이즈에 따라서 '''Runtime'''이 아래와 같이 동작한다.
* <= 32KB: Host에서 Device로 복사를 할때, CPU가 Host Memory에서 pinned host memory로 복사를 하고, DMA 엔진이 Pinned host memory에서 device memory로 복사를 한다. 반대의 경우는 역순이다.
* > 32KB && <= 16MB : 별도의 pinned host memory에 복사가 이루워지지 않고 host memory 자체가 pinned된다. 그리고 DMA 엔진에 으해서 device memery로 복사가 이루워진다. 그 후 pinned 되었던 host memory는 unpinned 된다.
'''Tip:''' Host Memory는 준비 버퍼에 복사를 해야하거나 pinning /unpinning cost 때문에 Device Memory로 전송할때 성능이 좋지 않다.
Pinned Host Memory는 물리적으로는 Host PC의 DDR3메모리에 위치한다. Host CPU에서는 full memory bandwidth로 접근이 가능하다. 기타 Device에서는 인터페이스(PCI_E)의 bandwidth로 접근이 된다.
Runtime이 pinned Host Memory를 Device로 전송할 때, Host Memory를 전송할 때 처럼 복사를 하거나 pinning/unpinning을 반복하지 않고 바로 전송한다. 이 점을 이용하면 조금 더 향상된 전송 성능을 얻을 수 있다.
CPU 입장에서는 로컬 메모리로 인식 되기 때문에 Pinned Host memory를 접근할때 cache를 사용해서 접근하게 된다. 이 때문에 GPU는 '''CPU cache coherency protocol'''[[footnote(Pinned Host Memory는 호스트 메모리를 CPU와 GPU가 같이 사용하게 되는데 실제 사용할 때 CPU는 cache를 사용해서 호스트 메모리의 일부(''cache line'')를 복사해서 사용하게 된다. 이 때 GPU가 DMA를 통해서 메모리를 업데이트 하게 되면 CPU와 GPU가 사용하는 메모리의 값의 불일치가 이러나게 되는데 이것을 해결하기 위한 방법이 필요하게 된다. 보통의 경우 snoopy protocol, directory-based protocol 같은 하드웨어 CPU cache coherency protocol을 사용한다(MSI, MESI, MOESI... etc). 프로그래머가 접근할 수 있는 방법으로는 명시적 캐시 플러시(flush)나 invalidate 명령어를 사용한다.)]]을 사용해서 접근해야 한다.
결국은 Host Memory인데, Pinned Host Memory와 차이라면 Runtime이 GPU가 '''CPU cache coherency protocol'''을 사용하지 않고 바로 접근 할 수 있도록 해준다는 것이다.
GPU 입장에서 Pinned host memory보다 조금 더 높은 대역으로 접근이 가능하다는 것이고, CPU 입장에서는 접근은 가능하지만 Cache 사용이 없다는 점을 염두해 둘 필요가 있다.
APU 디바이스의 경우 별도의 Device 메모리를 갖고 있지 않기 때문에 device-visible host memory를 global device memory로 사용한다.
Host위치 하기 때문에 Host에서는 읽고 쓰기가 가능하지만 CL_MEM_READ_ONLY로 선언했기 때문에 디바이스에서는 읽기만 가능하다.
GPU 는 GDDR5와 같은 별도의 dedicated memory를 Device Memory로 갖고 있다. 이 영역은 Host CPU에서는 접근할 수 없다.
APU의 경우엔 CPU와 GPU가 물리적으로 동일한 메모리를 Share 하기 때문에 둘 사이의 메모리 접근은 Zero Copy로 이루워진다.
(실제로, BIOS에서 GPU가 사용하는 메모리 공간을 할당하고 CPU에서 보이지 않게 설정하고 있지만 Zero Copy로 접근 가능하다.)
Device 쪽에 있는 메모리로 디바이스에서는 Full bandwidth로 접근이 가능하나, Host CPU에서는 PCIe bus를 통해서 접근하게 된다.
'''clCreateBuffer'''로 메모리 객체를 선언할때 CL_MEM_USE_PERSISTENT_MEM_AMD flag를 사용해서 선언하는데 사용할 수 있는 버퍼의 용량이 제한 된다.
- batch_normalization . . . . 92 matches
Batch Normalization[* ''Sergey Ioffe, Christian Szegedy'', '''"Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift"''', ICML (2015) <https://arxiv.org/abs/1502.03167>]은 2015년 ICML에 발표되어 지금까지 많이 사용되고 있는 기술이다. 딥러닝의 학습 속도 향상을 위해 사용되는 기술이지만 속도 향상뿐만 아니라 다양한 이슈에 적용되고 있기 때문에 하나씩 정리해 보려고 한다. 이와 유사한 Self-Normalizing Neural Networks (NIPS,2 2017)[* https://pod3275.github.io/paper/2019/03/27/SELU.html]논문도 있는데 이건 다음 기회에...
Shallow Neural Network를 사용하던 초창기에는 Step function의 미분 가능한 형태인 Sigmoid function을 Activation function으로 사용하였다.[* 인공신경망의 이해 <https://whansun.iptime.org/wiki.php/artificial_neural_networks>] ''이유는 생물학적 뉴런을 모방했기 때문''인데 이것이 layer가 많은 Deep Neural Network 구조의 학습을 방해하는 요소로 작용해서 현재는 hidden neuron에는 사용하지 않고 마지막 output layer에서만 사용되고 있다. 이유는 아래 그림에서 보듯이 \(x\)가 너무 작거나 크면 기울기가 0에 가까워져 학습이 너무 느려지게 된다. 다시 말해, Gradient가 작다는 것은 back-propagation의 update도 작다는 것을 의미하게 된다. __update 값은 Gradient와 Learning rate에 의해서 결정된다.__
예로 다층 구조를 갖는 fully connected network이 있다고 하자. 이 네트워크 구조를 식으로 표현하면 아래와 같이 쓸 수 있다. (bias term은 weitht에 숨겼다고 생각하고 생략했다. --실제로 입력차원에 항상 1의 입력을 주는 차원을 추가해서 사용한다.--)
총 3개의 레이어로 구성되어 있고 각 레이어는 \(f\)라는 activaion function을 사용하고 있습니다. 이 식을 어떤 loss function에 대입해서 Gradinet를 계산한다고 하면 아래 식과 같이 체인룰을 사용해서 분해할 수 있습니다.
위 식에서 activation function \(f\)에 대한 미분이 곱으로 연결됨을 확인할 수 있다. 레이어가 많아질수록 1보다 작은 숫자의 곱이 많아져 점점 0에 가까워 지게된다. 이것이 Gradient Vanishing의 원인이 된다.
이 문제를 해결하기 위한 대안으로 ReLU(Nair & Hinton, 2010)를 사용하거나, cafeful initialization (Bengio & Glorot, 2010; Saxe et al., 2013)을 통해서 안정적인 초기값을 설정하거나 learning rate를 작게 취하는 등의 전략을 사용했다. 하지만 이러한 것들이 문제를 해결하는 실질적인 방법은 되지 못했다.
이러한 문제를 해결하기 위한 획기적인 방법이 두개가 있는데, 그것이 바로 2015년에 발표된 BN(Batch Normalization)과 Residual Network이다.
보통의 경우 BN이 Internal Covariate Shift를 잡아줘서 학습이 잘 된다고 말하는데 그렇지 않다고 주장하는 논문도 있다.[* https://ml-dnn.tistory.com/6]
다층 구조를 갖는 Deep learning에서 학습 시 현재 레이어의 입력은 모든 이전 레이어의 파라미터의 변화에 영향을 받게 되고, 망이 깊어질수록 이전 레이어에서의 작은 파라미터 변화가 증폭되어 뒷단에 큰 영향을 주게 될 수도 있다.
이처럼, 학습하는 도중에 이전 레이어의 파라미터 변화로 인해 현재 레이어의 입력 분포가 바뀌는 형상을 ''Internal Covariate shift''라고 한다. 이것은 마치 TV 예능에서 귀마개를 하고 상대방의 입 모양을 보고 무슨 말인지를 알아내는 게임과 비슷하다.[* http://blog.naver.com/PostView.nhn?blogId=laonple&logNo=220808903260&parentCategoryNo=&categoryNo=21&viewDate=&isShowPopularPosts=true&from=search]
또한, Quora에 Dr. Debiprasad Ghosh의 답변이 Batch Normalization을 설명하는데 많이 인용된다. 건축에서 하중에 의해 기둥이 휘는 것을 Buckling라고 하는데 이것을 방지하기 위해서 fixed나 pinned라는 공법을 사용하는 것처럼 학습을 진행하면서 생기는 Internal Covariate Shift를 보정하는 것으로 설명했다.
Covariate shift나 dataset shift는 데이터의 분포가 변하는 것을 말하는데 dataset shift가 발생하는 원인은 장소, 시간 등 환경적인 요인이 변했을 경우 흔히 발생할 수 있다. 예로 선풍기의 판매량 데이터를 보면 여름과 겨울철에 상이한 데이터 분포를 갖을 것이다. Dataset shift는 아래와 같은 3가지 타입으로 나눌 수 있다.
이 중 Covariate Shift는 이러한 머신러닝에서 나타나는 Shift 타입이다. training 과 test의 dataset의 분포가 다룰 수 있다. 실제 응용에서 trainging dataset을 이용해서 학습을 진행하고 실제 문제에 적용했을 경우 흔하게 발생할 수 있다. [* ''Kaggle - Covariate shift'', <https://www.kaggle.com/pavansanagapati/tutorial-covariate-shift-sberbank-housing-eda>]
= Internal Covariate Shift 줄이기 =
Internal Covariate Shift를 줄이는 대표적인 방법 중 하나는 각 layer로 들어가는 입력의 각 차원을 whitening 시키는 것이다. 여기서 whitening을 시킨다는 의미는 평균 0, 분산 1로 바꿔준다는 것이다.
--하지만 단순하게 whitening만을 시키면, whitening 과정과 parameter를 계산하기 위한 최적화 과정이 무관하게 진행되기 때문에 특정 파라미터가 계속 커지는 상태로 whitening이 진행이 될 수 있다. 논문에서 나오는 것처럼 whitening을 통해 loss가 변하지 않게 되면, 최적화 과정을 통해서 특정 변수(논문의 b)가 계속 커지는 현상이 발생할 수 있다.--
그러므로 단순하게 whitening을 통해 평균과 분산을 조정하는 것보다는 좀 더 확실한 벙법이 필요하다.
BN은 평균과 분산을 조정하는 과정이 별도의 process로 있는 것이 아니라 신경망 안에 포함되어 training 시에 평균과 분산을 조정하는 과정 역시 같이 조절이 된다는 점이 whitening과 구별된다.
위 알고리즘과 같이 평균 분산을 구해서 정규화 시키고 다시 scale과 shift를 해주는 것을 알 수 있다. scale과 shift는 학습을 통해서 결정된다. 이 말은 원래 갖고 있던 평균과 분산이 아닌 새로운 scale과 shift를 데이터에 입히는 것처럼 보인다.
위 그림에서 보는 것과 같이 weight와 input의 dot product 후에 BN Layer가 들어가고 Hidden Layer로 연결 되는 것을 볼 수 있다. 레이어에 대한 식을 \(l = f(y)\) 와 같이 표현한다면, 이때, backpropagation에 사용되는 \(\gamma, \beta\) 그리고 레이어 \(l\)에 대한 chain rule은 다음과 같이 계산된다. [* 천상혁 (25 aug, 2015)<http://sanghyukchun.github.io/88/>]
- bayes_formula . . . . 19 matches
#title 베이즈 정리
== 베이즈 정리 ==
토마스 베이즈(Thomas Bayes)[* http://hanmaths.tistory.com/24]
베이즈 공식 (Bayes' formula)는 다음의 식을 뜻합니다.
[조건부 확률의 활용] 양성반응일때 실제 병에 걸려있을 확률? - 이해편
병에 걸릴 확률, 양성반응이 나올 확률 그리고 병이 있을때 양성반응이 나올 확률을 이용하여
양성반응이 나왔을때 병에 걸려있을 확률을 알 수 있습니다.
\(A_1,~A_2,~\cdots,~A_n\)이 표본 공간 \(S\)의 파티션일때
사건 \(B\)는 \(S\)의 부분 집합이므로
전체 확률의 법칙을 이용하면
따라서 \(A\)가 \(A_1,~ A_2, \cdots, ~A_n\)중 하나라고 했을때 다음이 성립하게 됩니다.
이 식이 베이즈 공식 혹은 베이즈 정리를 찾을때 가장 많이 나오는 식입니다.
- bicycle . . . . 20 matches
GPX 파일에 고도 정보를 추가 해주는 사이트 http://www.gpsvisualizer.com/elevation
= 타이어 =
로드 튜브리스 타이어 리스트
초기 장작시 실수로 타이어에 잔 구멍이 발생하여 수명이 단축됨(높은 PSI(200 PSI 이상)로 공기를 주입하여 타이어에 미세한 구멍 발생)
타이어 무거움, 튼튼한 느낌, 구름 저항 높음
타이어를 림에 장착하는 과정에 굉장이 힘듬, 공기 주입은 장 펌프로 가능할 정도로 쉽게 됨.(림 테이프를 2바퀴 정도로 두껍게 감음)
Rolling efficiency 2.5, Wet Crip 3, Robustness 3, 3x120 TPI[* Tread Per Inch - 단위 인치당 트래드의 수, 타이어를 만들때 들어가는 섬유의 수로 높은 TPI 값을 가질 수록 가느다란 섬유질을 사용하여 구름 저항(rolling resistance)가 낮아지고 지면과의 밀착력이 좋아짐], 235g(25c)
* 자이언트 가비아 레이스 2 33,000원
* 자이언트 가비아 SL 45,000원
60 TPI, 310g(25c), 레이싱
* 자이언트 코스 0 60,000원
* 자이언트 기바아 올컨디션 0 65,000원
- big_file_copy . . . . 1 match
복사하려는 위치로 이동하고 압축하고 복사할 장소에서 압축을 푸는 행위를 동시에 진행함으로서 복사가 수행된다.
- blacklist . . . . 5 matches
소속 : 조선일보 (대표이사 사장)
2003 한국데이터베이스진흥센터 이사장
2002 아시아신문재단(PFA) 한국위원회 이사
- bldc_motor . . . . 11 matches
모터라고 하면 가장 흔하게 생각할 수 있는 것이 DC모터 일꺼다. 장난감에 들어가는 모터로 + - 극에 전원만 연결하면 돌아가는..
장난감에 사용할 수 있을 정도로 구동이 간단하지만 모터 안에 브러시가 들어 있어 수명이 짧고 소음이 발생한다. 이런 단점을 보안하기 위해서 나온 모터가
BLDC 모터 이다. '''Brushless DC Motor'''
1스텝당 60도씩 돌아서 6스텝이면 한바퀴(360도)를 돌게 된다.
참고로 위 그림은 CCW방향이며, 반대로 구동 시키려면 전류를 반대로 흘려주면 된다.
4극의 경우 모터안의 rotor가 N극과 S극이 각각 2개씩입니다.
그리고 바깥쪽의 스테이터(Stator) 또한 6개로 늘어났다.
극 수가 늘어나면 회전각이 작아져서 그만큼 정밀하게 제어가 가능하다.
- bucket_sort . . . . 3 matches
for( int j=0; j < MAX; j++ ) // 해당 digit 를 해당 row 로 이동
if( bucket[i][j] != 0 ){ // 배열이 비어있지 않다면 값을 원래 배열로 복사
break; // 빈값일시 다음 row 로 이동
- c_1_ans . . . . 66 matches
'''해석''' Colby Tucker는 CEO에 의해 홍보부 부장으로 임명되었으며, 현재의 부장이 다른 지사로 전근 갈 때 그의 직책을 맡을 것이다.
주어(Colby Tucker)와 동사(designate)가 ‘Colby Tucker는 CEO에 의해 홍보부 부장으로 임명되었다’라는 수동의 의미 관계이므로 보기 중 수동태인 (D) was designated가 정답이다.
'''해석''' 그 관리자는 회사의 휴대전화 부속품에 대한 수요를 충족시키는 데 도움이 되고자 추가 교대 근무조를 두었다.
빈칸이 동사(satisfy)의 목적어 자리이므로 명사인 (A)와 명사 역할을 하는 동명사인 (B)가 정답의 후보이다. ‘수요를 충족시키는 데 도움이 되고자 추가 교대 근무조를 두었다’라는 문맥이 되어야 하므로, ‘수요’라는 뜻을 지닌 명사 demand의 복수형 (A) demands가 정답이다. (B)를 쓸 경우, ‘요구하기를 충족시키는 데 도움이 되고자 추가 교대 근무조를 두었다’라는 어색한 의미가 된다. 동사 (C)와 준동사 (D)는 명사 자리에 올 수 없다.
‘음식 평론가가 그가 먹은 음식에 대해 비판적으로 평가했을 때 요리사는 망연자실했다’라는 문맥이 되어야 하므로 ‘비판적으로, 불리하게’라는 뜻의 부사 (D) unfavorably가 정답이다. 참고로 (A) ultimately는 ‘결국, 궁극적으로’, (B) appreciably는 ‘눈에 띄게’, 그리고 (C) exclusively는 ‘배타적으로, 독점적으로’의 의미임을 알아둔다.
'''해석''' 자금 제공에 관하여 관리자에 의해 추천된 기획안이 그들의 것이었음을 알게 되자 그 팀은 완전히 놀라워했다.
be동사(was)의 보어 자리에 올 수 있는 것은 소유대명사이므로 (A) theirs가 정답이다.
'''해석''' 많은 사람들이 이용하는 주요 도로를 따라 지어지는 새로운 지하철 노선의 공사는 늦어도 3월 19일에는 완공될 것이다.
‘새로운 지하철 노선의 공사는 늦어도 3월 19일에는 완공될 것이다’라는 의미가 되어야 하므로 빈칸 앞의 no later와 함께 쓰여 ‘늦어도 ~까지’의 의미를 완성하는 (A) than이 정답이다.
'''해석''' 스마트폰과 태블릿 기술의 이용이 가능해진 이후로, 사람들은 그들의 메시지와 이메일을 훨씬 더 자주 확인한다.
‘사람들은 그들의 메시지와 이메일을 훨씬 더 자주 확인한다’라는 문맥이 되어야 하므로 ‘자주, 흔히’라는 뜻의 부사 (D) frequently가 정답이다. 참고로 (A) anxiously는 ‘근심하여, 걱정스럽게’, (B) consequently는 ‘그 결과, 따라서’, 그리고 (C) obviously는 ‘명백히, 분명히’의 의미임을 알아둔다.
'''해석''' available 이용할 수 있는 message 메시지, 문자
'''해석''' 그 발표자는 프로젝트의 최종 승인을 내리고 투자를 유치할 이사진에게 수익 계획을 설명했다.
‘그 발표자는 이사진에게 수익 계획을 설명했다’라는 문맥이 되어야 하므로 ‘설명하다’라는 뜻의 동사 explain의 과거형 (A) explained가 정답이다. 참고로 (B)의 limit은 ‘제한하다, 한정하다’, (C)의 excuse는 ‘변명하다, 용서하다’, (D)의 convert는 ‘전환시키다, 바꾸다’라는 의미임을 알아둔다.
'''해석''' presenter 발표자, 진행자 profit 수익, 수입 scheme 계획, 설계 the board of directors 이사진 confer 주다, 하다 approval 승인, 인가 capitalization 투자, 자본화
'''해석''' 일반식과 특별식이 기내에서 제공될 것이지만, 승객들은 적어도 1주일 전에 식사 주문서를 반드시 제출해야 한다.
and와 함께 상관접속사를 이루는 (A) Both가 정답이다. 참고로 상관접속사 Both A and B가 명사구(regular meals)와 명사구(special meals)를 연결하고 있음을 알아둔다.
'''해석''' 많은 학생들이 경력관리에 대한 무료 세미나에 참석하기 위해서 도착했지만, 주최자들은 자리 부족 때문에 그들 중 일부를 돌려보내야만 했다.
‘많은 학생들이 무료 세미나에 참석하기 위해서 도착했다’라는 문맥이 되어야 하므로 ‘많은’의 뜻을 지닌 형용사 (B) Numerous가 정답이다. 참고로 (A) Extended는 ‘길어진, 늘어난’, (C) Common은 ‘공통의, 보통의’, 그리고 (D) Excessive는 ‘지나친, 과도한’의 의미임을 알아둔다.
그 여행 단체는 박물관 안내원에게 전시된 공예품에 대하여 질문했으며, 기념품들이 할인 중이었는지도 물어보았다.
- caffe_installation . . . . 5 matches
이번에 서버 하드교체를 하면서 Caffe clean 설치법에 대해 정리할 기회가 생겼다. Caffe는 가장 잘 나가는 deep learning framework으로 dependencies가 꽤 있는 편이다.
protobuf의 autogen.sh를 실행시키기 위해서는 autotools-dev autoconf libtool이 필요하다.
Ubuntu 14.04에서는 아래와 같이 쉽게 설치 가능하다. 12.04는 여기를 참조.
이제 github에서 Caffe를 받아서 컴파일을 할 수 있다.
- capenter_tools . . . . 2 matches
목공용 직각 바이스(바이스 클램프),
- centos_chrome_yum_install . . . . 5 matches
아쉽게도 구글 크롬 28 이후 버전부터는 더 이상 CentOS를 지원하지 않습니다.
이는 CentOS 6.4에서는 GLIBCXX 3.4.13 버전까지만 설치가 되어 있기 때문입니다.
chrome은 더 이상 공식 지원을 하지 않기 때문에 대신 chromium을 설치해 보겠습니다.
2. 그리고 나서 yum을 이용해서 설치
- cl_mem_object_experiment . . . . 13 matches
실험의 내용은 간단하다. User 영역에 있는 데이터를 디바이스에 전달해서 간단한 연산 후 돌려 받는 과정을 몇몇 시나리오를 통해서 실험하고 결과를 비교한다.
1. User 영역에 malloc으로 할당 받은 '''usermem'''이라는 버퍼에 데이터가 들어 있다.
1. '''usermem'''의 데이터를 디바이스로 전달하고 모든 값에 100을 더한다.
1. 디바이스로 부터 값을 전달 받아 확인한다.
Device Memory(Default)를 사용할 경우는 clEnqueueReadBuffer/clEnqueueWriteBuffer, clEnqueueMapBuffer/clEnqueueUnmapBuffer 를 사용해서 디바이스로 값을 전달하고 받아오는 테스트를 진행하였다.
Pinned Host Memory를 사용하는 경우에는 clEnqueueMapBuffer/clEnqueueUnmapBuffer 만을 사용하였고 CL_MEM_ALLOC_HOST_PTR를 사용한 경우엔 Runtime이 메모리를 할당하여 주무로 '''usermem'''을 전달하기 위해서 clEnqueueMapBuffer/clEnqueueUnmapBuffer 과 memcpy를 사용하였다.
CL_MEM_USE_HOST_PTR의 경우는 '''usermem''' 자체를 Pinned Memory로 사용하여 값을 전달하기 위한 clEnqueueMapBuffer/clEnqueueUnmapBuffer 과 memcpy 부분이 생략 된다. (값을 전달하기 위한 Overhead 없음, Zero Copy)
64MB에서 256MB 구간에서는 Default Memory를 사용하는 '''Map/Unmap'''이 가장 좋은 성능을 보인다.
Data Size가 512이상이 되면 Default Memory를 사용하는 '''Read/Write'''가 가장 좋은 성능을 낸다.
- cluster_install_work . . . . 20 matches
이전 사용하던 시스템을 클러스터로 구축해서 사용하려고 함.
== 이전 시스템 정보 ==
unetbootin-linux-608.bin을 이용해서 만들었음.
클러스터를 구성하기 위해서는 NFS와 NIS를 설치 해야 하는데 이 두 프로토콜은 Sun Microsystem사에서 개발 되었다.
gparted를 사용하면 쉽게 파티션을 나누고 특정 파티션으로 포멧이 가능하다. 여기서는 ext4 파일 시스템을 사용하는 두개의 파티션으로 구성하였다.
여러 시스템을 하나의 계정정보로 묶어 사용하기 위해서 계정정보를 통합 관리해야 할 필요가 있다. 이 역할을 NIS가 수행해준다.
'''서버와 클라이언트 설치는 동일하고 사용하는 파일과 설정이 다음.'''
NIS가 사용할 도메인을 설정해준다. 서버와 클라이언트가 동일한 도메인을 사용한다.
2. node 이름 설정
/etc/hostname 에 사용할 노드의 이름을 적어준다.
이 파일을 열어 보면
이라고 되어 있는 것을 볼 수 있는데 DNS 보다 NIS를 먼저 참조 하도록 bind 앞에 nis를 추가해줘야 한다.
nis 설정파일에 서버 노드의 이름을 설정해준다.
사용자가 추가 되거나 변경 되었을 경우 새로이 컴파일해야 한다.
컴파일하면 도메인에 해당하는 드렉토리가 생성되고 관련 파일이 생성된다.
3. 노드 정보 업데이트
nis서비스를 사용할 노드의 정보를 업데이트 한다.
클러스터를 조금 더 잘 사용하기 위한 방법은 스케줄러를 사용하는 것이다.
[:linux_init_setup 리눅스 서버 설치 가이드]
- cnu_digital_signal . . . . 1 match
양자화(Quantization) - 크기의 정도를 일정하게 나누고 가장 가까운 크기로 원래 신호를 mapping하는 과정에서 실제 값과의 차이가 발생하게 된다.
- cnu_phd . . . . 1 match
컴퓨터공학과 일반대학원[* https://computer.cnu.ac.kr/computer/index.do] 데이터 및 소프투웨어공학
- coding_role . . . . 4 matches
* 단어 사이를 언더바로 구분한다.
* 단어 사이에 언더바 없음.
* 소문자로 시작하며 이후 연결 되는 단어는 대문자로 시작한다.
* 단어 사이에 언더바 없음.
- coffee . . . . 8 matches
* 커피콩이 큼, 병충해에 약함.
* 게이샤 품종:
* 1500~1700 고도에서 좋은 품종이 나옴.
* 커티버 사람들이 만든 품종, 맛보다는 생산량에 중점을 둠.
* 에티오피아 원종 렌드레이스 계열
* 티피카 처럼 커피콩이 크고 특이한 모양
* 콩이 작음
- coffee_index . . . . 3 matches
= 이르가체페 (Yirgacheffe) =
= 자메이카 블루 마운틴 (Jamaica Blue Mountain No.1) =
= 하와이안 코나 (Hawaiian Kona) =
- config.php . . . . 20 matches
/tools/mkpasswd.pl 을 이용해서 암호를 생성하고 생성된 암호를
== 페이지 읽기 권한 설정하기 ==
위 옵션이 읽기를 막아주는 것은 아닙니다. 읽기를 콘트롤 하는 것이
가능하게 해주는 것 뿐입니다. 이 옵션이 있어야 읽기를 허가하거나
금지하거나 하는 것이 가능해집니다.
== 페이지별 권한 설정 ==
각 페이지별 주소창에 아래 문구를 넣으면 페이지별 권한 설정창으로 이동한다.
== ACL을 이용한 접근권한 설정 ==
|| 페이지 || 사용자 || 권한 || Action ||
1번이면 wiki text 입력
2,3번이면 wikiwyg 사용
== 서브 페이지 설정하기 ==
서브 페이지를 설정할 수 있다. 설정하게 되면
하위에 딸린 서브 페이지를 표시해준다.
섹션 제목을 클릭하면 섹션이 접힙니다. 긴 문서일 경우 유용하게 사용할 수 있게 되었습니다.
1과 2는 Folding을 사용할 것을 설정하는 것이다.
- contrastive_self_supervised_learning . . . . 28 matches
Ankesh Anand의 블로그를[* https://ankeshanand.com/blog/2020/01/26/contrative-self-supervised-learning.html] 번역한 글인 이민경님의 블로그
여러 최신 ML들은 학습 과정에서 사용되는 학습 신호 형식으로 사람이 제공하는 레이블(label)이나 보상(reward)에 의존하는 경향이 크다. 그러나 Direct-Semantic Supervision의 과도한 의존성에는 몇 가지 문제들이 다음과 같이 있다:
:기본 데이터는 희소 레이블이나 보상이 제공할 수 있는 것보다 더 풍부한 구조를 가지고 있기에 Supervised Learning 알고리즘을 위해 다량의 샘플들이 필요하고, 이는 다루기 힘든 솔루션으로 수렴하는 결과를 야기한다. (관찰하는 실험의 데이터를 다 수집할 수 없고 수집된 데이터 샘플이 대표성을 갖기 힘들 수 있는 경우가 많다. 이런 경우 수집된 샘플로 모델을 학습하게 되면 모델이 엉뚱한 방향으로 수렴하던가 샘플 데이터에 오버피팅되기 쉽다)
:고차원 문제에서는 Direct Supervision에 의존할 수 없고, RL과 같은 문제에서는 레이블을 획득할 수 있는 마진가가 비싸다.
:용도 변경이 가능한 Knowledge 별 솔루션이 아닌 Task-specific 솔루션을 제공한다.(제공된 트레이닝 데이터에만 작동하는 솔루션을 만들어 내기 쉽다.)
이러한 문제에 대해 Self-Supervised Learning은 데이터 자체가 학습 알고리즘에 대한 Supervision을 제공할 수 있는 방안을 제안한다. 그럼 이제부터 다른 Self-Supervised Learning 기술과 어떻게 다른지 비교하며 최근 논문들을 살펴보도록 하자.
Contrastive 방법은 긍정적인 사례와 부정적인 사례를 대조하여 representation을 학습한다. 새로운 패러다임은 아니지만, Unsupervised Contrastive 사전 훈련으로 컴퓨터 비전 분야에서 큰 경험적 성공을 이끌었다.(RBM의 학습 알고리즘과 유사한것 같은데.. 조사가 필요함)
- cpp_algorithm_median_finding . . . . 15 matches
어떤 데이터가 있을때 이 데이터의 평균과 분산을 사용해서 데이터의 특성을 이야기 하곤하는데 데이터의 분포에 따라서 평균보다 '''중간 값'''을 사용하기도 한다.
'''중간 값'''의 의미는 데이터를 크기에 따라 정렬했을때 중간에 의치하는 값을 의미한다.
따라서 데이터의 개수가 홀수이면 자연스럽게 '''중간 값''이 정해지지만
짝수이면 '''중간 값'''은 두 수 사이에 존재하게 된다.
n/2 -1 과 n/2 사이 값이 '''중간 값'''이 된다.
- cpp_programming_boost_lib . . . . 10 matches
Boost[[footnote( http://www.boost.org/)]]는 C++ Library로 우리가 자주 사용하는 알고리즘을 모아놓은 것입니다. 여러 개발자들이 만든 오픈 소스 라이브러리로, 사용할 수 있는 OS는 Windows, Linux 입니다. 저는 개인적으로 서버를 운영하여 리눅스에 설치해 사용 중입니다만, 몇몇 Windows 유저들은 Visual Studio와 연동하셔서 하는데, 최근에 나온 2012 버전에는 잘 안된다는 얘기도 있더군요...
Boost Library의 최신 버전은 1.53버전으로, 2013년 2월에 마지막으로 릴리즈 되었으며, 포함된 라이브러리는 다음과 같습니다.
우분투 리눅스 12.10에서 Boost Library 설치할 때, 버전 없이 설치할 경우 의존성 여부로 인해 설치를 해주지 않습니다. 반드시 버전 숫자를 입력해주시기 바랍니다.
위 코드는 rand48 함수를 사용하여 난수를 생성한 방법입니다. 1,100까지 아무 숫자나 뽑아서 20개의 숫자를 출력하는 방법입니다. 더 나아가서 time 함수를 쓴다면 프로그램 실행할 때마다 숫자가 바뀌겠지요? 처음부터 설명해보자면, 먼저 난수 발생기 하나를 정해줍니다. rand48을 정해줬지요. 그 다음 int면 int, double이면 double 등 자료형을 정해 랜덤으로 뽑아올 숫자의 범위를 지정해줍니다. 여기서는 1에서 100까지를 지정해줬지요. 중간과정이 빠져있지만 나중에 seed라는 값을 멤버함수로 넘겨줘서 쓰는 방법이 있는데, 여기서는 빠진 상태입니다. 만들어준 generator와 범위를 variate_generator (여기서는 using namespace를 사용)로 전달하여 마지막으로 출력을 하였습니다.
그 외에도 여러 함수를 사용하여 난수를 생성하는 방법이 있으니 참고하셔서 사용해보시기 바랍니다.
lrand48 (C 기본 라이브러리와 같음)
아래로 갈 수록 랜덤의 성능이 좋아지지만, 메모리소모가 커지고 속도가 느려집니다.
- cprogramming_file_inout . . . . 30 matches
open() 함수와 fopen() 함수의 차이는 라이브러리에 있습니다.
fopen() 함수는 ANSI-C 규정에 준수하는 라이브러리 함수로, 컴파일러에 의해 표준 라이브러리를 사용하여 동작하므로 어플리케이션 수준에서 동작합니다.
다시 말해보면, fopen() 함수는 ANSI-C 규정에 따르는 그 어떤 컴파일러에서라도 사용할 수 있습니다만, open() 함수는 POSIX.1 규정에 따르는 운영체제에서만 사용할 수 있습니다. 따라서 이 둘은 기종간 이식성과 호환성에서 차이가 있습니다. fopen() 함수가 좀 더 호환성이 좋다고 봐야겠죠. POSIX.1 표준을 따르지 않는 운영체제는 많이 있습니다만 ANSI-C 표준을 따르지 않는 C 컴파일러는 없으니까요.
char s[MAX_COLS]; // 행이 1줄씩 임시로 저장될 버퍼
// 파일 입출력에서는 open, read, write, close 함수가 기본이다.
pathname : 열고자 하는 파일이름
O_CREATE 해당파일이 없으면 파일을 생성한다.
O_EXCL 해당파일이 존재하면 오류를 발생시키고 파일을 열지않는다.
O_TRUNC 해당파일이 존재하면 파일의 길이를 0으로 만든다. 즉, 파일의 내용을 모두 지운다.
O_SYNC 쓰기 동작시 물리적인 쓰기동작이 완료될때 까지 기다린다.
기능: 파일로 부터 데이터를 읽는다.
buf : 읽어온 데이터를 저장 하는변 수
nbytes : 읽어올 데이터의 바이트 수
성공: 읽은 바이트 수
//읽을 데이터가 없으면 read 함수는 0을 리턴하게된다.
기능: 파일에 데이터를 쓴다.
buf : 데이터를 저장하고 있는변수
nbytes : 쓸 데이터의 바이트 수
성공: 파일에 쓴 데이터의 바이트수
- cprogramming_malloc . . . . 9 matches
위에서 보는 두가지 명령이 메모리를 활당해주는 명령이다. 두 명령의 차이는 초기화를 해주냐 안 해주냐의 차이점과 할당 받는 메모리 사이즈의 전달 방법이다.
* malloc은 할당 받는 메모리를 초기화 해주지 않으면 할당 받을 메모리의 사이즈를 바이트(Byte)단위로 입력 받는다.
* calloc은 할당 받는 메모리를 '0'으로 초기화 해주고 할당 받을 메모리 사이즈를 두가지 인자의 곱으로 입력 받는다.
- cross_entropy . . . . 51 matches
평균, 기댓값이라고 하면 보통은 어떤 값(변수)에 대한 기댓값만을 생각하는데 함수에 대한 기댓값도 계산할 수 있다.[* Kiho Hong (5 Apr 2017). <https://www.slideshare.net/lovelykihohong/variational-inference-intro-korean-ver>. (16 Jan 2018)]
* Shannon이 정의한 개념
* 확률 함수를 이용하여 정의.
* 주사위 눈금이 1이 나올 확률에 대한 정보량
* 희귀한 데이터를 얻게 되면 정보량은 늘고, 흔한 데이터에서 얻는 정보량이 별로 없다.
* 정보량은 데이터의 희귀도에 비례한다.
* 빈도가 높은(흔한) 데이터에 대해서는 정보의 bit수를 줄이고, 희귀한 데이터에 대해서는 정보의 bit수를 늘리면 최적의 bit로 표현할 수 있다.
* \(p(x)\)는 확률이기 때문에 (0,1) 사이 값을 갖고 \(log_2(p(x))\) 는 (\(-\infty, 0\)) 사이의 값을 갖는다.
* 특정 사건의 확률이 1인 또는 0인 으로 사건의 변화가 없을 경우의 엔트로피 계산은 \(\lim_{p\to0}p\log_2p=0\)로 로피탈의 정리로 구할 수 있다.
* 클래스가 \(2^K\)개이고 이산 확률변수가 가질 수 있는 엔트로피의 최대값은 각 클래스가 모두 같은 확률을 가질 때이다.
* 잘 못된 information gain을 사용하게 되면 Enropy 값이 늘어나게 된다.
* 정보 손실량의 기댓값이 KL-Divergence이다.
* 앞서 KL-Divergence에 대해서 알아보았는데 수식에서 알수 있듯이 \( D_{KL}(p||q) \neq D_{KL}(q||p)\)이다. 이 때문에 KL-Divergence 거리라고 표현할 수 없다.
* 이를 해결하기 위한 KL-Divergence의 Symmertric 버전이라고 보면 된다.
가능도는 주어진 표본(\(x\))에서 가장 가능한(likely) 모수를 추정하는 척도이다. 가능도(likelihood)를 확률과 비교해 보면, 확률은 모수(parameter)가 특정값(fixed value)으로 정의 되어 있을 때 확률을 계산한다. 반면 가능도는 표본을 통해서 모수를 찾는다. 예로 동전 던지기를 상상해 보자 우리는 일반적으로 동전의 앞면 또는 뒷면이 나올 확률을 1/2로 알고 있다. 그래서 동전을 3회 던져서 앞면이 3번 나올 확률을 1/8이라고 한다. 가능도에서는 이미 던져진 동전의 결과를 보고 동전의 확률이 1/2일 가능도는 얼마인지를 계산한다.
확률변수 X가 모수 \(\theta\)에 대한 확률분포는 Pr(X)를 가질때, 표본으로 x가 나왔을 때, 가능도 함수는 다음과 같이 표현을 할 수 있다.
\(\mathcal{L}(\theta|x)\)는 표본 x에 대해서 모수 \(\theta\)의 가능도이다. 이것은 모수 \(\theta\)에 대한 확률 변수 X가 x의 값을 가질 확률인 \(Pr(X=x|\theta\)로 나타낼 수 있다. 위 값은 모수 \(\theta\)에 대해서, 모든 변수 x에 대한 가능도으 합으로 나타낼 수 있다.
최대 가능도 방법(Maximum Likelihood Method)은 표본 x가 있을 때, 가장 가능한 모수 \(\theta\)의 확률분포를 구하는 것이다. 가능도 함수의 계산을 위해서, 함수에 로그를 씌워서 계산을 하기도 하는데 이를 '로그가능도함수'라고 한다.
maximum log-likelihood를 구하기 위한 방법으로 ELBO를 최대화 하는 방법을 사용한다. lower bound를 끓어 올림으로서 자연스럽게 log-likelihood의 값도 상승하기 때문이다.
이렇게 하면 Monte calro estimation으로 계산할 수 있다.
- cscope설정하기 . . . . 11 matches
cscope는 드렉토리에 있는 text에서 함수 정의, 함수 호출, 문자열, 파일 등을 쉽게 찾아주는 프로그램이다.
아래 메크로를 이용해서 cscope index를 만들어야 한다.
아래 메트로르 보면 알수 있듯이 c, cpp, cc, h 등의 파일 묶어서 index를 만든다.
아래 메크로를 실행하게 되면 '''cscope.files'''와 '''cscope.out''' 파일이 생성되고 그 이후 부터는 '''cscope 명령어'''만 실행하면 바로 볼 수 있다.
메뉴에 찾고자 하는 문자열이나 함수등을 입력하게 되면
아래와 같이 찾은 문자열을 포함하고 있는 파일들을 찾아 준다.
메뉴와 파일의 이동은 Tab키를 사용하고
이것은 cscope가 unix 시스템에서 개발 되면서 생기는 문제로 문장의 끝에 ^M을 처리 하지 못 하는 문제가 있다.
^M을 지우거나 추가 해주는 방법으로 해결 할 수 있다. 아래는 tofrodos라는 프로그램을 사용하는 방법이다.
find 명령을 이용해서 recursive 하게 모든 파일에 적용 할 수 있다.
- ctags . . . . 1 match
= 관련 사이트 =
- cubic_spline_interpolation . . . . 27 matches
cubic spline은 주어진 점을 매끄럽게 연결하는 알고리즘이다. 왜 cubic 이냐 하면, 두 점을 잇는 곡선을 3차 다항식\((a_0 + a_1x + a_2x^2 + a_3x^3)\)으로 사용하기 때문이다. 즉, 다시 말해, 서로 떨어져 있는 두 점 사이를 연결해야 하는데(그래서 interpolation), 그 연결하는 선을 3차 다항식으로 만들고자 하는 것이다. 이와 같은 목적에 부합하는 알고리즘 중 널리 사용되는 것의 원리는 다음과 같다.
우리가 갖고 있는 점은 위의 녹색점 뿐이라고 하자. 그 중간을 곡선으로 매끄럽게 연결하고 싶다. 즉, 각 데이터 \(x_i, x_{i+1}\)은 곡선 \(S_i\)로 연결을 시키는데, 각 \(S_i\)가 3차 다항식이라고 가정하는 것이다. 이 상황에서, 각 \(x_{i+1}\)에서 두 곡선 \(S_i\)와 \(S_{i+1}\)이 부드럽게 연결되기 위해서는 어떠해야 할까? 상식 선에서 크게 벗어나지 않는 다음과 같은 조건들을 생각해 볼 수 있다.
1. 각 점에서 원래의 데이터의 값 \(x_i\)을 곡선이 지나간다.
2. 각 점에서 두 곡선이 만나야 한다. 즉 각 점 \(x_i\) 에서 두 곡선의 함수값이 같아야 한다.
3. 각 점에서 두 곡선의 매끄럽기가 같게 한다. 즉, 각 점 \(x_i\)에서 두 곡선의 미분값이 같게 한다.
4. 두 곡선이 '더욱' 매끄럽게 만나게 하자. 즉, 각 점 \(x_i\)에서 두 곡선의 이차미분값을 같게 한다.
위 사안 중 1,2 번은 당연히 필수적인 것이고, 나머지 사안들은 '부드럽게 연결'시키기 위해 사용할 수 있는 조건들이라 할 수 있겠다. 4번은 3차 다항식의 계수값을 계산할 수 있게 하기 위해 사용하는 목적도 있다. 또한 양 끝 쪽에서의 조건도 필요한데, 가장 양 끝에서 두 번 미분한 값이 0 이거나, 한 번 미분한 값이 원래의 데이터의 미분값과 같다는 조건 둘 중 하나를 이용하곤 한다. 위 조건은 수학적으로 다음과 같이 표현할 수 있다.
- cv_report1 . . . . 13 matches
Harris measure를 계산하기 위해서 두개의 수식을 사용하였는데 아래의 수식이 더 좋은 결과를 보여줬음.
ordfilt2함수를 사용해서 일정 영역 안에서 가장 큰 값을 취하고 취해진 값이 설정한 threshold 이상인 경우의 좌표를 구함.
가우시안 필터[* https://stackoverflow.com/questions/27499057/how-do-i-create-and-apply-a-gaussian-filter-in-matlab-without-using-fspecial-im]는 시그마와 필터의 길이를 입력으로 받도록 했고 필터의 길이는 홀수가 되도록 강제했다. 가우시안 필터의 중앙이 대상 픽셀에 위치하기 위함.
* 위에서 구해진 Diffence of Gaussian에서 자기 자신을 중심으로 위 아래 3x3x3 영역을 설정하고 자기 자신이 가장 크거나 적은 경우를 extrema로 취함.
* \(|D(X)| < 0.5\) 이면 제거.[* https://courses.cs.washington.edu/courses/cse576/06sp/notes/Interest2.pdf]
* \(H = \left [ \begin{matrix} D_{xx} \ \ D_{xy} \\ D_{xy}\ \ D_{yy} \end{matrix}\right ]\), \(r=\cfrac{\text{Trace}(H)^2}{|H|}\) r이 threshold보다 크면 extrema 제거.
위 식을 이용해서 magnitude와 angle을 구했다.
angle를 구하는 과정에서 atan을 사용했는데 atan을 출력 범위가 \(-\pi/2, \ \pi/2\)이기 때문에 위 식을 약간 변형해서 atan2를 사용해서 \(-\pi, \ \pi\)의 결과를 얻었다.[* http://blog.daum.net/aero2k/42]
이렇게 만들어진 orientation histogram을 합쳐 128 dimensions feature vector를 구성하고
아래 과정을 통해 normalization을 수행하고 gradient가 0.2 이상인 것을 0.2로 보정해서 다시 re-normalization을 수행하였음.
- cv_report2 . . . . 23 matches
이미지 두장에서 특징점을 추출하고 매칭하여 하나의 이미지로 합치는 과정에 대해서 설명한다.[* https://www.cs.ubc.ca/grads/resources/thesis/May09/Dubrofsky_Elan.pdf] 이 과정 중에 사용한 함수와 알고리즘에 대해서 설명하고 각각에 결과를 보이도록 하겠다.[* https://cvl.gist.ac.kr/wp-content/uploads/2014/09/lecture03_projective1.pdf]
sift로 추출한 디스크립터로부터 유사도를 측정하여 가장 가까운 점을 찾고 두번째로 가까운 점과의 유사도 차가 일정 수준 벗어나지 않으면 매칭이 느슨한 것으로 판단해서 제거하는 방법으로 정교한 매칭점을 찾았다. 이 과정을 통해서도 완벽한 메칭점을 찾기는 쉽지 않음을 확인 했다.
== 이미지 warping ==
이미지를 붙이기 위해서 매칭점을 이용해서 affine transform[* http://darkpgmr.tistory.com/78]과 homography transform[* http://blog.daum.net/shksjy/229]을 구하고 이미지 변화를 해서 두 이미지를 붙여 보았다.[* http://b.mytears.org/tag/warping] 이 경우 미스 매칭에 따른 Outlier가 존재하게 되는데 이로 인해 이미지가 원하는 위치에 붙기 힘들다. 이런 Outlier를 제거하기 위한 방법으로 ransac[* http://darkpgmr.tistory.com/61]을 사용할 수 있다.
1. inliner의 비를 계산하여 inlinerCntThres 이상이면 loop를 중단하고 지금의 trasformation matrix를 반환한다.
1. inlinerCntThres 이면 bestH와 bestInlinerFrac를 갱신하고 1번 부터 5번까지를 N번 반복한다.
1. 위 과정을 통해서 찾은 inliner가 4개 이상이면 inliner만을 이용해서 trasformation matrix를 계산한다.
1. inliner를 4개 이상 찾지 못했다면 현재까지 가장 좋은 trasformation matrix을 반환한다.
- cv_report3 . . . . 30 matches
수평으로 얼라인 되어 있는 두 대의 카메라로 찍은 영상으로 사물간의 깊이(depth)를 구하는 방법에 대해서 알아보자.
census transform은 자기 자신을 중심으로 하는 3x3 윈도우를 설정하고 주변 이웃 픽셀과 비교했을때 자기 자신보다 작으면 '1', 그렇지 않으면 '0'로 정의되는 8개의 바이너리를 내어준다. [* R. Zabih, J. Woodfill, "Non-parametric Local Transforms for Computing Visual Correspondence", ECCV, 1994] 이렇게 찾은 바이너리쌍을 Hamming distance로 비교해서 intensity difference를 계산한다.
Matching cost를 계산할때 단순의 점대점으로 비교하는 것이 아니라 비교하는 점을 중심으로 윈도우를 설정하고 aggregation을 하게 되는데 이때 설정하는 윈도우의 크기에 따라서 번짐현상이 발생할 수 있다. 이것을 보안하기 위한 방법으로 설정한 윈도우에 색상 정보와 위치 정보를 이용해서 weighted window를 설정하는 방법을 Locally weighted window method[* K. Yoon, I. Kweon, "Locally Adaptive Support-Weight Approach for Visual Correspondence Search", CVPR, 2005]라 한다.
거리에 대한 weight는 모든 pixel에 동일하게 적용되기 때문에 한번만 계산해서 사용하면 된다. 색상에 대한 정보는 기준이 되는 pixel을 중심으로 윈도우를 설정하고 중심 pixel과 차이를 계산해서 weight를 주도록 했다.
padding된 부분의 cost를 임의로 큰 값을 넣었기 때문에 edge부분에 큰 값이 필터의 분산을 크게 만들 수 있기 때문에 분산을 30으로 제한했다.
위 과정까지 거치면 disparity에 따른 cost 계산이 끝났다. 이것을 가지고 각 점에서 비용이 최소가 되는 점을 disparity로 결정하면 된다. 이렇게 했을 경우 원하는 결과와 많이 다름을 확인 할 수 있다. 이것을 보완하기 위해서 Optimazation 과정이 필요하다.
이 부분은 Chris McCormick의 "Stereo Vision Tutorial - Part I"[* Chris McCormick. (10 Jan 2014). "Stereo Vision Tutorial - Part I". <http://mccormickml.com/2014/01/10/stereo-vision-tutorial-part-i/> (7 Dec 2017)]을 참고해서 만들었다.
Chris McCormick는 패널티를 3가지로 구분해서 7개를 비교하는 것으로 구현했다.[* http://mccormickml.com/assets/StereoVision/Stereo%20Vision%20-%20Mathworks%20Example%20Article.pdf] 이 모델을 Potts model로 수정해서 결과를 비교해 보았다.
cost aggregation만 해서 최소가 되는 disparity를 그대로 출력해서 그려본 것이다. 대충 모양은 확인 할 수 있지만 만족할만한 결과물이 나오진 않았다.
cost aggregation에 시간이 너무 오래 걸려서(대략 3시간쯤 소요) cost aggregation을 생략하고 dp(패널티 3 적용)를 수행해 보았다.
아직은 점점이 흩어진 결과가 보인다.
작은 윈도우를 설정하고 cost aggregation 수행 aggregation을 수행하지 않을때 보다는 좋은 결과를 얻었지만 노이즈가 보인다.
윈도우 크기를 조금 더 키워서 테스트 해보았다. 경계면이 조금 더 부드럽게 처리됨을 확인 했다.
아래 그림은 패널티 모델을 potts 모델을 적용한 것이다. 조금 더 많은 경계면이 잘 구분 된다.
- dailynote_01_12_2014 . . . . 5 matches
이는 바이오스에서 특정 무선랜카드만 사용하도록 검증 장치를 두고 있어서 발생하는 문제이다.
문제해결 방향은 바이오스를 해킹해서 검증 정치를 우회하는 방법으로 잡았다.
아래 링크는 바이오스를 편집하기 위한 방법으로 사용할 유틸리티를 담고 있다.
- dailynote_24_11_2014 . . . . 7 matches
* 우주에는 핵력, 전자기력, 약력, 중력의 4가지 기본 힘이 존재한다.
* 하나의 물체에 위의 4가지 힘이 복합적으로 상호 작용하여 물체에 힘을 작용하여 속도 변화를 일으키게 된다.
* 지표면에서 낙하하는 물체의 경우 중력의 영향을 받아 운동 가속도가 발생한다. 이를 특별히 중력가속도라고 한다.
* 질량이 \(m\)인 물체에 대해 질량 M의 행성이 가하는 중력은[[footnote(반지름 : 약 6,400km, 질량 : 약 \(6 × 10^24kg\), 평균 밀도 : \(5.5g/cm^2\), 중력상수 : \( G = 6.673×10^{-11}Nm^2/kg^2\) )]]
(단 \(\widehat{r}\)은 물체 중심과 행성 간 중심을 연결하는 크기 1의 단위 벡터이며 방향은 지구 중심 방향이다.)
- dailynote_25_11_2014 . . . . 21 matches
* EPUB(electronic publication)은 국제 디지털 출판 포럼(IDPF, International Digital Publishing Forum)에서 제정한 개방형 자유 전자서적 표준이다. 보통 epub, 또는 ePub 으로 표기하곤 한다.
* ePub는 HTML과 CSS릐 일부분을 차용한 오픈된 파일포멧 표준이다.
2007년 부터 기존 전자책 표준을 승계하여 나온 표준이다. 기존의 전자책은 텍스트(txt)에 가까운 원시적인 형태를 갖고 있었고 이를 개선하기 위해서 HTML과 CSS를 도입하여 새롭게 만든 것이다. 표준화가 서양에서 부터 이루워졌기 때문에 2.0.1까지는 세로 쓰기 및 다국어 표시에 제한적이였다. 3.0 이후 버전 부터는 다국어 기능과 CSS3의 일부 기능을 체용하여 문제를 해결하고 있다.
파일의 크기는 TXT > epub > doc 정도이다.
똑같다. 웹에서 쓰는 HTML, CSS와 구문 및 사용방법이 완전히 똑같다. 애초에 HTML과 CSS를 별다른 변형 없이 필요한 기능만 그대로 가지고 왔기 때문이다. 이 때문에 웹 기반으로는 epub 뷰어를 만들기도 쉽다. 애초에 epub는 zip 파일 안에 HTML, CSS와 전자책에 쓰는 각종 이미지 및 미디어를 내장하고 있기 때문에, zip 파일만 풀어낸다면 웹 브라우저에 그냥 뿌리는 것이 가능하기 때문이다. 실제로 zip 파일을 풀어서 나온 html 파일을 웹 브라우저에서 열면 웹과 비슷한 화면이 뜨는 것을 볼 수 있다.
물론 그 반대는 어렵다. 애초에 HTML과 CSS에서 전자책에 필요한 기능만 가져온 것이 epub이기 때문이다. 일종의 하위 호환격.
epub 2 버전의 기반은 XHTML 1.1과 CSS 2.1인데, XHTML 1.1은 너무 엄격해서 웹에서는 잘 쓰지 않는 규약이다. 새로 나온 epub 3 버전은 요즘의 트렌드에 맞게 HTML5와 CSS3을 기반으로 하고 있다.
- data_mining_weka . . . . 11 matches
#title 데이터 마이닝 알고리즘 비교 분석
"UCI machine learning repository"[* http://archive.ics.uci.edu/ml/datasets.html] 에서 ''Pen-Based Recognition of Handwritten Digits''[* http://archive.ics.uci.edu/ml/machine-learning-databases/pendigits/pendigits.names]와 ''letter recognition''[* http://archive.ics.uci.edu/ml/machine-learning-databases/letter-recognition/letter-recognition.names] 데이터 [* https://github.com/renatopp/arff-datasets] 사용해서
* 두 데이터에 대해서 모두 K-NN의 분류 성능이 가장 좋은 것으로 나왔다. K-NN의 경우 '''K'''의 값을 '1'로 했을 경우 가장 좋은 분류 성능을 보여 주었다. 이는 두 데이터 모두 분류가 잘 되는 데이터셋임을 알 수 있다.
* Simple Logistic과 Multilayer Perceptron의 경우 Class의 수가 적은 ''Pen-Based Recognition of Handwritten Digits'' 에서 Simple Logistic이 Multilayer Perceptron보다 조금 더 좋은 분류 성능을 보여주었다.
* 상대적으로 모델 복잡도가 높은 Multilayer Perceptron이 ''letter recognition'' 문제에서 Simple Logistic 보다 조금 더 높은 분류 성능을 보여주었다.
* 모델 복잡도가 높은 Multilayer Perceptron이 가장 긴 model building time을 보여주었다.
- data_mining_weka2 . . . . 26 matches
#title 데이터 마이닝 알고리즘 비교 분석 #2
SuperMarket 데이터로 216개의 아이템을 갖고 있다. 마지막 total field는 100 이상이면 'high' 그렇지 않으면 'low' 값을 갖도록 처리 되어 있다.
이 데이터에 대해서 '''Apriori''' 과 '''FP growth''' 두 가지 '''Association rule mining''' 알고리즘 적용해 보았다.
데이터는 ''The University Medical Centre, Institute of Oncology, Ljubljana, Yugoslavia.''의 유방암 데이터로 2가지 클랙스로 분류되며 9개의 속성값과 하나의 label를 갖는다.
수치형 데이터는 아래와 같이 각 구간별로 discretization 되었다.
데이터 중간에 존재하는 '?'는 missing value를 의미한다.
K-Means 알고리즘 특성상 초기 Centroid의 위치에 따라서 상이한 결과를 내여줌을 확인 하였음.
주어진 Epsilon과 MinPoint 값으로 '''Core Point''', '''Border Point''', '''Noise Point'''를 결정하고 이웃한 Core Point를 연결해서 클래스를 나누고 그 클래스에 인접한 Border Point를 추가하는 것으로 클러스터를 완성한다. 이 과정에서 Noise Point는 버려진다.
데이터의 분포와 밀도에 따라서 Epsilon과 MinPoint 값을 잘 설정해 줘야 한다.
Epsilon이 크면 분류하는 정도가 약해지고 작으면 클래스의 수가 많아지게 된다. MinPoint에 따라서 노이즈에 대해서 둔감해지고도 하고 민감해지기도 한다. 아래 결과는 Epsilon과 MinPoint에 따라서 분류 성능과 미분류 정도를 표로 나타낸 것이다.
계산 시간이 오래 걸리기 때문에 모든 경우의 수를 다 실행할 수는 없었기 때문에 Epsilon을 작게 설정해서 원하는 클래스의 수가 나오도록 천천히 올려가면서 수행했고 MinPoint를 조절하면서 미분류도와 정확도를 알아 보았다.
* Epsilon을 0.2로 설정했을 경우는 설정값이 데이터의 밀도에 비해서 너무 작게 설정 되어 있어서 대부분의 데이터 포인트가 noise point로 분류됨.
* Epsilon을 0.4로 설정하고 MinPoint 값을 서서히 늘리면서 데이터의 분류 성능이 좋아짐을 확인함.
- debian_release_info . . . . 8 matches
이 배포본은 데비안의 프로덕션 릴리스입니다. 이 배포본을 사용하기를 권합니다.
testing 배포본은 stable 릴리스에 아직 들어가지 않았지만 곧 들어갈 패키지를 포함하고 있습니다. 이 배포본을 사용해서 얻을 수 있는 이점은 더 많은 최신 소프트웨어를 사용할 수 있다는 것입니다.
testing이란 무엇인가와 어떻게 stable이 되는가에 관한 더 자세한 정보는 데비안 FAQ를 보세요.
unstable 배포본은 개발중인 데비안 배포본입니다. 이 배포본은 개발자와 위험을 마다하지 않는 사용자들이 사용합니다.
- deep_learning_transformer . . . . 6 matches
트랜스포머(Transformer)[* https://wikidocs.net/31379]는 2017년 Google의 '''"Attension is all you need"'''에서 나온 모델로 기존 seq2seq의 구조인 인코더-디코더를 따르면서도, 논문의 이름처럼 어텐션(Attention)만으로 구현한 모델이다.
= 생성형 언어모델 이해 =
KISTI 교육 과정 - 이승우(swlee@kisti.re.kr)
Transformer 모델을 이용해서 MNIST 데이터를 구분하는 문제를 pytorch로 구현했다.[* https://velog.io/@vantaa89/PyTorch%EB%A1%9C-Vision-Transformer-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0][* https://seojune.site/post/pytorch-vision-transformer]
- dft_fft_fourier_seriees_Transform . . . . 28 matches
= 이산 시간 푸리에 해석 =
시스템이 선형이고 시불변일 때 (LTI : linera time-invariant) 가장 유용한 신호의 표현 방법으로 복소 지수 신호의 집합\({e^{jwn}}\)에 기초하며 '''이산 신간 푸리에 변환'''(DTFT : Discrete-time Fourier Transform) 이라고 한다.
\(x(n)\)이 절대 가합(absolutely summable)하면 이산 시간 푸리에 변환을 아래와 같이 정의 할 수 있다.
식 1.1 양변에 \(e^{jwm}\)을 곱하고 이산 시간 주파수 변위 \(-\pi, \pi\) 혹은 \(0, 2\pi\) 로 적분하면 다음과 같다.
여기서 복소 지수 함수의 직교성을 이용하면
식 1.2와 식 1.3을 합하여 정리하면 역 이산 시간 푸리에 변화(IDTFT : inverse discrete-time Fourier transform)을 구할 수 있다.
임의의 유한한 에너지를 값는 신호 \(x(n)\)은 정현파 신호 혹은 복소 지수 신호의 모든 주파수 합으로 나타낼 수 있음을 의미하며, 이때 \(X(e^{jw})\)은 주파수 \(w\)에서의 신호 크기를 나타낸다. 따라서 신호 \(x(n)\)의 주파수 영역에서의 표현이라 할 수 있다.
\(\mathcal{F}\left[ \cdot \right]\)은 이산 신호 \(x(n)\)의 디지털 주파수라고 불리는 신변수 \(w\)극 가진 복소수 연속 함수 \(X(e^{jw})\)로 변환 한다.
일반적으로 이산 시간 푸리에 변환은 \(w\)의 복소 함수이다. 이것을 직각좌표 형식으로 쓰면 아래와 같다.
이다.
이산 시간 프리에 변환으로 시간에 대한 (time domain) 신호를 각 주파수 \(w\)를 갖는 \(X(e^{jw}\)의 신호로 변환하였다. 이것을 \(w_k\) 로 확장해서 각각의 각 주파수 성분을 계산하는 것으로 확장해보자.
위 식은 주파수 \(\left [ 0, \pi \right ]\) 사이의 (M +1)개의 등간격 주파수들이다. 이 각각의 주파수들에 대해 프리에 변환을 적용하면 식 1.1을 아래 식으로 확장할 수 있다.
각 요소를 벡터와 메트릭스로 치환해서 보면 식 2.2와 같이 W 메트릭스와 x 행렬 곱으로 표현될 수 있다.
게다가 \(\{k\},\ \{n_l\}\)을 각각 행 벡터 k 와 n 으로 배열하면 다음과 같이 표현할 수 있다.
\(n^Tk\)는 \(N \times (M+1)\) 행렬이다.
식 1)을 이용해서 연속 함수를 불연속 함수꼴로 변환하는 과정을 설명한다.
델타 함수를 이용한 inverse fft
- diffusion . . . . 5 matches
이미지를 백터화 할 수 있는 방법으로 Clip을 이용해서 feature vector를 생성하는 방법을 사용하고 생성된 vector를 cosine simularity를 사용해서 비교한다.
위 와 같이 cudatoolkit을 별도로 설치하면 설치하는 tensorflow와 pytorch에 맞는 cuda를 같이 설치하는 공간이 만들어지는 듯하다.
- dm365_isif . . . . 6 matches
DM365의 Image sensor interface(ISIF)에 대해서 알아보고 센서나 기타 입력으로 부터 영상을 받아 들이는 과정을 설명한다.
ISIF는 sensor로 부터 RAW image/video data를 받아 들이거나, video decoder devices로 부터 YCbCr 포멧의 영상 데이터를 받아 들이는 것을 담당한다.
RAW 영상 데이터에 대해서는 별도의 처리를 거쳐 최종 output data를 얻게 되는데 이 과정은 IPIPE에서 처리 되게 된다.
- dm365_wdr_driver . . . . 3 matches
#title WDR 드라이버 수정 작업
continuous mode를 추가 해서 wdr 드라이버 업데이트
- dnn_study . . . . 3 matches
아래 내용은 Geoff Hinton에 의해서 제안된 DNN(Deep Neural Network)을 구성하고 훈련시키는 방법에 대한 내용이다. [[footnote( [http://www.youtube.com/watch?v=vShMxxqtDDs#t=2480 Geoff Hinton - Recent Developments in Deep Learning])]]
두 개 이상의 히든 레이어를 갖고 있고
- docker_influxdb . . . . 36 matches
개인적으로 Docker 이미지를 활용할때 Bitnami의 도커 이미지를 많이 사용하는것 같다. Kafka나 Zookeeper등등 ..
항상 Docker를 작업하는데 있어 Docker Run으로 실행하기 보다 대부분 docker compose 로 작성하는 편이다 따라서 InfluxDB 이미지도 docker compose로 설치하고 사용하도록 하겠다
INFLUXDB_ADMIN_USER_PASSWORD 이며 기본 아이디 값은 admin 이다
따라서 웹에서 로그인하는 아이디 패스워드는 다음 아래와 같다
||<tablewidth="350px"> 아이디 || 패스워드 ||
docker-compose.yml파일을 다음 아래와 같이 작성해준다.
이미지는 해당 시점에서 최신버전을 다운받으며 Influxdb:2.2 버전이다
다음 아래와 같이 Docker Compose파일을 실행시켜 준다
혹시나 docker-compose.yml 파일을 다른 이름으로 작성했다면 다음 아래와 같이 실행시켜준다.
실행된 InfluxDB를 접속하기 위해 이미지가 실행된 PC의 아이피와 compose파일에서 적어주었던 포트번호(8086)으로 접속해준다
그럼 아래와 같은 이미지의 화면이 나오며 아이디와 패스워드를 작성하여 로그인!😎
이미 실행된 컨테이너에 대해 자동 재시작을 설정하는 방법도 있습니다.
우선 데이터 베이스를 하나 생성하고 SQL의 Table에 해당하는 measurement 하나 생성하자.
위와 같이 데이터베이스와 measurement (test_table)을 생성했다. 여기서 tag key와 field key를 알아보자.
tag key와 field key는 공백으로 구분하고 tag key, field key 내부는 콤마를 사용하여 공백 없이 연결한다.
위 명령어를 실행하면 tag key는 ''name'', ''text''이고 field key는 ''number1'', ''number2'', ''value''임을 알 수 있다.
하나의 데이터 베이스에 여러개의 measurement가 있을 수 있는데, 각 데이터는 Point라는 틀을 갖는다.
이 key에는 tag key, field key, time key가 있다.
field key는 데이터 자체로고 time key는 측정 시점의 시간이 들어가는데 자동으로 입력될 수도 있고 수동으로도 할 수 있다.
- docker_mariadb . . . . 1 match
!title 도커를 이용해서 MariaDB를 설치하자.
- docker_mongodb . . . . 14 matches
MongoDB는 [* https://jsonobject.tistory.com/484] 대표적인 NoSQL[* https://fors.tistory.com/402] 데이터베이스이다.
-v ~/data:/data/db는 호스트(컨테이너를 구동하는 로컬 컴퓨터)의 ~/data 디렉터리와 컨테이너의 /data/db 디렉터리를 마운트시킨다. 이처럼 볼륨을 설정하지 않으면 컨테이너를 삭제할 때 컨테이너에 저장되어있는 데이터도 삭제되기 때문에 복구할 수 없다.
= 데이터 베이스 =
데이터 베이스에 접속하고 편집하기 위한 GUI 클라이언트[* https://www.mongodb.com/try/download/compass]를 설치해서 사용하면 편하다.
- docker_redis . . . . 21 matches
In-Memory 방식의 NoSQL로 Key-Value 구조의 비정형 데이터를 저장한다.
과거 램디스크와 같이 파일이나 데이터를 메모리에 올려서 사용하는 DB로 생각할 수 있음.
; 한번에 하나의 명령만 수행이 가능하므로 '''Race Condition'''이 거의 발생하지 않음
; Single Threaded(싱글 스레드) 사용으로 한번에 하나의 명령만 수행이 가능하므로 처리 시간이 긴 요청의 경우 장애가 발생할 수 있음.
; 크고 작은 데이터를 할당하고 해제하는 과정에서 메모리의 파편화가 발생하여 응답 속도가 느려질 수 있음.
; 메모리 사용량이 너무 많으면 Redis 서버의 성능 저하나 장애로 이어질 수 있기 때문에 주기적인 모니터링을 통해 메모리를 관리해줘야함. (vmstat -s)
이미지만을 다운 받기 위해서는 아래와 같은 명령으로 이미지를 다운 받을 수 있다.
다운 받은 이미지를 확인하는 방법은 아래와 같다.
다운 받은 이미지로 container를 생성하는 방법은 아래와 같다. (이미지가 프로그램에서 정의라고 하면 container는 인스턴스와 같은 개념을 갖는다.)
* --name: container 이름을 지정하는 옵션으로 redis라고 명명한다. [* https://velog.io/@juhyeon1114/Docker-%EB%AA%85%EB%A0%B9%EC%96%B4-%EB%AA%A8%EC%9D%8C]
* -d: 컨테이너를 백그라운드에서 실행 시킨다.
시스템을 재시작하면 redis docker container가 자동으로 실행되지 않아서 위에 있는 과정을 다시 수행해야만 하는 불편함이 발생한다. 이를 극복하기 위해서 redis docker container 재시작하는 루틴을 서비스로 등록하자.
''/etc/systemd/system/redis.service'' 파일을 생성하고, redis docker container의 실행을 위한 서비스를 아래와 같이 정의했습니다.
- docker_ssh . . . . 3 matches
도커 컨데이너 내에서 SSH 서버를 설정하는 방법[* https://github.com/anti1346/docker-ubuntu-sshd]
위 명령어는 인자로 SSH_USER, SSH_PASSWORD를 'ubuntu'라고 설정하는 방법에 대해서 기술한 것이다.
도커 컨테이너 실행
- docker_tutorial . . . . 347 matches
도커(Docker)는 2013년에 등장한 새로운 컨테이너 기반 가상화 도구입니다. 도커는 계층화된 파일시스템(AUFS, BTRFS 등)을 사용해 가상화된 컨테이너의 변경사항을 모두 추적하고 관리합니다. 이를 통해서 컨테이너의 특정 상태를 항상 보존해두고, 필요할 때 언제 어디서나(단, Docker가 설치만 되어있다면) 이를 실행할 수 있도록 도와주는 도구입니다. 이 글은 Docker 입문자를 위한 튜토리얼로, 도커의 기본 개념들과 사용법에 대해서 소개합니다.[* http://blog.nacyot.com/articles/2014-01-27-easy-deploy-with-docker/]
클라우드와 같이 잘 짜여지고, 잘 나뉘어진 거대한 시스템에서야 그렇다 치더라도 가상 머신은 여러모로 손실이 많은 수단 중 하나입니다. 가상 머신은 격리된 환경을 구축해준다는 데서 매력적이긴 하지만, 실제 배포용으로 쓰기에는 성능 면에서 매우 불리한 도구라고 할 수 있습니다. 당연한 이야기입니다만 일단 운영체제 위에서 또 다른 운영체제를 통째로 돌린다는 것 자체가 리소스를 비효율적으로 활용할 수밖에 없습니다.
이런 가운데 가상 머신의 단점은 극복하면서 장점만을 극대화하기 위한 최적화가 계속해서 이루어지고 있습니다. 도커 역시 이런 단점을 극복하기 위해서 나온 가상화 어플리케이션입니다. 도커는 단순한 가상 머신을 넘어서 어느 플랫폼에서나 재현가능한 어플리케이션 컨테이너를 만들어주는 걸 목표로 합니다. LXC(리눅스 컨테이너)라는 독특한 개념에서 출발하는 Docker의 가상화는 기존에 운영체제를 통째로 가상화하는 것과는 접근 자체를 달리합니다. 가상 머신이라고 하기에는 격리된 환경을 만들어주는 도구라고 하는 게 맞을 지도 모릅니다.
예를 들어 보죠. 우분투에서 CentOS라는 Docker를 통해 가상 환경을 구축하는데 얼마만큼의 시간이 걸릴까요? 먼저 여기서는 Ubuntu 상에서 작업을 한다고 가정하겠습니다.
실제로 도커는 LXC를 사용하기 때문에 특정 리눅스 배포판에서 사용할 수 있고, 윈도우나 맥에서는 사용이 불가능합니다. Docker가 설치되어 있다는 가정 하에 Ubuntu에서 CentOS 가상 머신을 띄우는 데는 아래 두 명령어만 실행시키면 됩니다.
먼저 위의 pull 명령어를 통해서 centos 이미지를 다운로드 받습니다. 그리고 이 이미지에 쉘 명령어를 실행시킵니다. 이걸로 끝입니다. 먼저 첫번째 명령어를 실행시키는데 제 컴퓨터에서 12초 정도가 걸렸습니다. 아래 명령어를 실행시키는데 0.3초가 걸리지 않았습니다. 쉘이 실행되면 bash 쉘로 바뀐 것을 알 수 있습니다. 실제로 CentOS인지 확인해보도록 하겠습니다.
어떻게 이런 일이 가능할까요? 원리적인 부분은 이미 좋은 문서들이 있습니다. 한국어로 된 좋은 자료로는 [http://wiki.nacyot.com/documents/deview Deview] 2013에서 김영찬 님이 발표하신 [http://deview.kr/2013/detail.nhn?topicSeq=45 이렇게 배포해야 할까? - Lightweight Linux Container Docker 를 활용하여 어플리케이션 배포하기] 세션과 xym 님이 쓴 [http://spoqa.github.io/2013/11/22/docker-the-cloud.html docker the cloud]를 추천합니다. 하지만 분명한 건 VMWare를 사용한다고 해서 가상화 기술에 빠삭해야하는 것이 아니듯이, Docker 역시 기본적으로는 툴이라는 사실을 이해해야합니다. 제 생각에 도커의 원리를 이해하는 것도 중요하지만, 막상 이 도구를 사용하는 동안엔 컨테이너와 이미지의 차이를 이해하는 게 더 중요하고, [http://wiki.nacyot.com/documents/dockerfile Dockerfile]을 만들어 자신만의 배포 프로세스를 저장하는 법을 익히는 게 더 중요합니다.
이 글에서는 바로 이러한 시점에서 개발 환경이자 배포 툴로써의 도커를 이해하기 위한 개념들을 소개하고 모니위키 어플리케이션을 도커로 설치하는 부분까지 다뤄보도록 하겠습니다. 각 부분에 대한 좀 더 자세한 이야기는 기회가 된다면 따로 다뤄보도록 하죠.
각 운영체제 별 Docker의 설치 방법은 공식 홈페이지에 잘 정리되어 있습니다. 제가 사용하는 Ubuntu의 경우에는 Docker에서 제공하는 스크립트 파일 하나를 통해서 원큐에 정말 쉽게 Docker를 설치할 수 있습니다. 가상 머신에서도 설치가 가능하니, 가능하다면 Ubuntu 환경을 사용하길 권장합니다. 네, 글을 쓰는 편의상.
단, 당연히 curl이 설치 되어있어야합니다.1 1월 현재 12.04 / 13.10에서도 같은 방법으로 설치가 가능했습니다만, 설치 과정에 문제가 있거나 다른 운영체제를 사용하시는 경우엔 설치 문서를 꼼꼼히 읽어보시고 진행해나가시기 바랍니다. 설치가 끝나면 설치가 잘 됐나 확인해봅니다.
기본적으로 docker의 대부분의 명령어를 실행 시 root 권한이 필요합니다. 따라서 sudo를 사용해야하는 번거로움이 따라오는데, 이를 위해 현재 유저를 docker 그룹에 포함시켜 줍니다.
명령어들을 실행하고 재로그인을 하게 되면 더 이상 sudo 명령어를 앞에 붙이지 않아도 docker 명령을 사용할 수 있습니다. 단, 이 방법을 사용할 경우엔, 공식 문서에서도 경고하고 있듯이 docker group은 root와 같은 권한 가지고 있다는 사실을 인지하고 있어야합니다.
= 이미지 이해하기 =
설치만 끝났다면, 이제 끝이 보입니다. 대단해보이지만 정말 별 게 없습니다. 먼저 도커를 시작하면 이미지 개념을 이해할 필요가 있습니다. 처음에 보여드린 예제를 보면 centos 이미지를 다운로드 받고, 이 이미지에 shell을 실행시킵니다. 그런데 여기에 약간의 함정이 있습니다. Docker에서 실제로 실행되는 건 이미지가 아닙니다! 이미지는 추상적인 개념입니다. 실행되는 건 이미지를 기반으로 생성된 컨테이너입니다. 먼저 어떤 일이 일어나는지 확인해보도록 하겠습니다.
먼저 docker images 명령어로 시스템에 어떤 이미지가 있는지 확인해보죠.
docker images 명령어는 현재 시스템에서 사용가능한 이미지 일람을 보여줍니다. 이미지가 어디서 오는지 궁금하게 느껴지실지도 모릅니다. 이미지는 크게 세 가지 방법을 통해서 추가할 수 있습니다.
하나는 처음 예제에서와 마찬가지로 docker pull <이미지 이름>을 통해서 가져오는 방법입니다. 바로 이 명령어를 사용하면 docker.io의 공식 저장소에서 이미지를 다운로드 받아옵니다. 쉘을 활용하는 개발자라면 이런 개념이 낯설지는 않을 것입니다. 리눅스에서 apt-get이나 yum 혹은 gem이나 pip, cpan, npm 같은 명령어를 사용해보셨다면 바로 이해하실 수 있을 겁니다. 이런 유틸리티를 사용해본 적이 없다고 하더라도 마찬가지 개념으로 docker 이미지 파일들을 관리하는 중앙 저장소가 있다고 이해하셔도 무방합니다. 독특한 점은 intsall이 아닌 pull 명령어를 사용한다는 점입니다. 이에 대해서는 개념적으로 VCS(버전 관리 시스템)을 알고 계신다면 추가적인 설명이 필요없겠습니다만, 어쨌거나 단순히 다운로드라고 이해하셔도 현재 단계에서는 무방합니다.
(두 번째 방법 커밋을 하는 방법입니다. 아래에서 설명합니다. 또 다른 방법은 Dockerfile을 통해서 기술된 과정을 거쳐 도커 이미지를 생성하는 방법입니다. 이에 대해서는 맨 마지막에 자세히 다룹니다.)
여기서는 편의상 ubuntu 이미지를 다운로드 받아오겠습니다. 이 이미지에 대한 정보는 웹을 통해서 확인하실 수 있습니다. 공식 저장소에 있는 이미지 정보들은 https://index.docker.io에서 확인할 수 있으며 우분투 이미지에 관해서는 이 페이지에서 찾을 수 있습니다.
= 컨테이너 이해하기 =
- dsp_report . . . . 2 matches
[:dsp_report7 z-translator 연습문제 풀이]
[:dsp_report8 FFT 연습문제 풀이]
- dsp_report10 . . . . 4 matches
= 예제 풀이 =
이 식에서 N =3, \(\Omega_c = 0.5\)를 얻을 수 있다.
이제 \(H_a(s)\)를 구할 수 있다.
\(H_a(s)\)에는 4개의 극점이 있다.
- dsp_report7 . . . . 20 matches
= 예제 풀이 =
\(\text{ROC}_1 : 1 < |z| < \infty\) 이 경우 극점이 모두 \(\text{ROC}_1\)의 내부에 있음으로 표1.[* attachment:img.bmp?width=400px '''표''' 1. 일반적인 z-변환 쌍]을 참조하면 아래의 식을 얻을 수 있다.
이는 우측 신호이다.
\(\text{ROC}_2 : 0 < |z| < \frac{1}{3}\) 이 경우는 극점이 모두 \(\text{ROC}_2\)의 외부에 있다. 표1. 을 참조하면 아래의 식을 얻을 수 있다.
이는 좌측 신호이다.
\(\text{ROC}_3: \frac{1}{3} < |z| < 1\) 이 경우는 극점 \(z_1\)는 \(\text{ROC}_3\)의 외부에 있고, \(z_2\)는 \(\text{ROC}_3\)의 내부에 있다. 이 역시 표1. 을 참조하면 아래의 식을 얻을 수 있다.
이 식호는 양측 신호이다.
이 식을 표1.을 참조해서 변환하면 아래식을 얻을 수 있다.
MATLAB을 이용해서 pole을 구하면 아래와 같이 구할 수 있다.
위 식을 표1 을 이용해서 변경하면 아래와 같은 식을 얻을 수 있다.
MATLAB을 이용해서 그려보자.
표1을 이용하면 아래의 식을 얻을 수 있다.
= 연습문제 풀이 =
- dsp_report8 . . . . 17 matches
= 예제 풀이 =
위 신호의 기본 주기는 N=4이다.
기하수열의 합 공식을 이용해서 간략화 하면 아래와 같이 할 수 있다.
\end{align*} 이라 하자.
a. 이의 이산 시간 푸리에 변화 \(X(e^{j\omega})\)을 계산하라.
b. \( X(e^{j\omega})\)을 \(k\omega_1 = \frac{2\pi}{4}k, k = 0,1,2,3\)에서 샘플링하고 이것을 예제 5.1과 같음을 보여라.
\end{align*} 이라 하자.
이의 DTFT \(X_1(e^{j\omega})\)은 DFS 신호 \(\tilde{X}_2(k)\)를 구하기 위해 다음에서 샘플링된다.
DTFT, DFS 또는 역 DFS를 계산하지 않고 에일리어싱 공식을 이용함으로써 \(\tilde{x}_2(n)\)을 구할 수 있다.
\(x(n) = (0.7)^nu(n)\)이라 하자. 이의 z-변환을 단위원에서 N = 5, 10, 20, 50으로 샘플링하고 이의 시간 영역에 대한 영향을 조사하라.
\(x(n)\)이 다음과 같은 4점 신호라 하자.
a. 이산 시간 푸리에 변환은 다음과 같다.
= 연습문제 풀이 =
- dsp_report9 . . . . 16 matches
= 예제 풀이 =
M = 11, 홀수이고 \(h(n)\)는 \(\alpha = (11 -1)/2 =5\)에 대칭이므로 제1형 선형 위상 FIR 필터이다.
M = 12, 짝수이고 \(h(n)\)는 \(\alpha = (12 -1)/2 =5.5\)에 대칭이므로 제1형 선형 위상 FIR 필터이다.
M = 11, 홀수이고 \(h(n)\)는 \(\alpha = (11 -1)/2 =5\)에 대칭이므로 제1형 선형 위상 FIR 필터이다.
M = 12, 짝수이고 \(h(n)\)는 \(\alpha = (12 -1)/2 =5.5\)에 대칭이므로 제1형 선형 위상 FIR 필터이다.
사양이 다음과 같은 디지털 FIR 저역통과 필터를 설계하라.
예제 7.8의 사양에 대한 카이저 창함수를 사용하여 저역통과 필터를 설계하라.
사양이 다음과 같은 디지털 대역통과 필터를 설계하라
- earthquakeWithAI . . . . 26 matches
딥러닝 및 인공지능의 발전은 다양한 분야에서 활발히 진행중에 있다. 지진과 관련해서도 다양한 접근이 있었다. 그 중 하나로 하버드(피비 드 브리스, Phoebe M. R. DeVries)와 구글(마틴 와튼버그, Martin Wattenberg)의 공동연구가 있다.
내용은 큰 지진이 발생후 수개월 동안 발생하는 여진에 관해서다. 주 지진에 의한 직접적인 피해도 있지만 더 걱정이 되는 것은 주 지진에 의해서 약화 된 구조물들이 여진에 의해서 무너 지면서 발생하는 피해다. 이 때문에 구조작업이나 피해복구에 상당한 어려움을 격고 있다. 과학자들은 여진의 크기와 시기를 예측하기 위한 많은 연구를 진행해왔다. 그럼에도 예측성능이 그리 좋지 않았는데 구글과 하버드 연구팀이 딥러닝을 적용해서 예측성능을 획기적으로 높일 수 있는 방법을 제안했다. 기존 “Coulomb failure stress change.”로 알려진 가장 유용한 모델보다 좋은 성능을 내는 것으로 보고 했다. 정확도를 0에서 1사이로 했는때 1은 완벽하게 예측한다고 하면 0.5는 랜덤한 예측을 의미한다. 기존 Coulomb모델은 0.583으로 랜덤 예측보다 약간 좋은 성능을 보이는 반면 새로운 AI 시스템은 0.849를 기록했다.[1]
다음으로는 하버드와 MIT 연구팀이 지진을 모니터링하기 위한 딥러닝 알고리즘 ConvNetQuake 연구이다.
이 연구는 Convolutional Neural Network 모델을 사용한 딥러닝 알고리즘에 서로 다른 위치에서 측정된 지진계의 파형을 입력으로 받아서 지진 유무와 위치까지를 예측하는 연구로 Oklahoma Geological Survey earthquake catalog에 기록된 것보다 17배 많은 지진을 탐지하였다고 발표했다.
이 연구소가 선보인 인공지능 기반 지진 조기경보 시스템은 인공지능 딥 러닝 기술을 사용, 축적된 지진 데이터를 바탕으로 지진 예측의 정확성을 높인 것이 특징이다. 지면에 설치된 센서를 통해 사람이 느낄 수 없고 매우 빠르게 전파되는 미세 지진(microseismic)의 P파(지진파의 일종)를 감지, 3초 이내에 지진 발생 지역과 진도 규모를 예측할 수 있다.
특히 위험한 수준의 지진이 예측되면 즉시 주민들이 대피하고 지진 피해에 대처할 수 있도록 조기 경보를 스스로 발령할 수 있도록 구성됐다.
또한, 이 시스템은 최근 도입이 늘고 있는 다양한 스마트 시티, 스마트 홈 및 스마트 방재 솔루션에 함께 도입될 수 있으며, 제조업체와 보안 서비스 업체, 빌딩과 같은 대형 건물 관리 책임자들이 빠르게 지진 상황을 파악하고 대비할 수 있도록 도와준다고 연구소 측은 밝혔다.
한편, NARLabs는 이번 전시회에서 인공지능 지진 조기경보 시스템 외에도 건물의 구조를 실시간으로 모니터링, 지진 발생 후 5분 만에 건물의 안전 평가를 자동으로 수행하는 시스템도 함께 선보였다. }}}[3]
[3] IT Chosun, 인공지능이 5초만에 지진 예측.경보.. 대만서 AI지진 조기경보 시스템 공개
- embaded_nand_flash_memory . . . . 38 matches
- byte 혹은 word 단위로 읽고 쓸 수 있는 NOR flash에는 없는 개념이다. 즉 일기 쓰기가 byte단위로는 불가능하기 때문에 driver에서 이를 고려하여 주어야 한다.
- Page마다 따라오는 수~수백 byte 정도 크기의 extra 데이터 영역으로 16의 배수 byte인 경우가 많다. spare 영역이라고도 불린다.
- 이 영역은 사용자에게 숨겨진 영역으로 아래와 같은 용도로 사용된다.
1. Bad Block Marking : 특정 블록이 Bad block일 경우 한 Block 안의 첫 page 혹은 마지막 page의 OOB에 이를 표시함.
이는 NAND flash별, 제조사별로 다르며 해당 디바이스의 data sheet에서 학인해야 한다.
1. File system Info : 특정 file system은 이부분을 사용하여 구현됨.
- 이 영역은 대부분 r/w가 모두 가능하다. 하지만 이 영역에 공장 출하시부터 존재하는 Bad Block Marking 정보가 지워질 경우 이 정보를 다시 살릴 수 있는 방법이 없으므로 절대로 OOB 영역의 Bad block 정보를 지워서는 안 된다. 필요시 이 정보를 사용하여 BBT를 작성하게 됨.
'''SLC/MLC- NAND flash'''의 type에는 SLC/MLC가 있는데 이는 각각 Single Level Cell/Multi Level Cell을 뜻함.
- SLC는 MLC보다 수명이 10배가량 길지만 가격이 비쌈. 따라서 write가 자주 발생하는 데이터용으로 적합.
- MLC에는 고용량이면서 write가 자주 발생하지 않는 데이터에 적합. (ex, MP3, video등 multimedia files)
- BBT를 만들어 놓으면 특정 block의 bad 여부를 빨리 확인할 수 있지만, BAD block 데이터가 OOB의 데이터와 항상 sync.가 되도록 주의하여야 하며, BBT를 기록하려는 block이 BAD block일 경우 어떻게 처리해야 할 지 등도 고려하여야 함.
- BBT는 두 개의 Block을 사용하며 NAND flash내의 마지막 Block에서부터 거꾸로 non-bad block을 찾아, 첫번째 발견된 non-bad block이 primary BBT, 두번째로 발견되 non-bad block이 secondary BBT가 됨.
'''그 외 특성''' - NAND flash로 부팅하기 위해서 첫번째 sector에 boot loader가 위치해야 하는데, 첫 sector가 bad block이면 boot loader가 위치할 수 없으므로, 대부분의 제조사는 1st block이 bad block이 아님을 보증함.
- NAND는 NOR와 달리 읽기 횟수에도 제한이 있다. NAND에서는 매번 특정 블럭을 읽을때마다 해당 정보를 저장하는 전하가 약해진다. (물론 정보를 잃은 block은 erase후 다시 사용가능하다) 따라서 읽기 전용 파일이라 하더라도 해당 정보를 너무 여러번 읽어 데이터가 지워지기 전에 다른 곳으로 옮겨서 저장하는것을 고려하여야 한다. 또한 전체 파일 시스템 내에 읽기 전용 블록이 고정되어 있을 경우, 쓰기 가능한 영역에 erase가 집중되어 해당 영역의 수명이 짧아지는 문제도 발생할 수 있다(NOR도 마찬가지). 따라서 NAND용 flash file system은 설계 시 읽기 전용 블록의 읽은 횟수를 count하여 데이터가 유실되기 전에 다른 블록으로 옮겨 줌으로써, 데이터의 유실을 막고 flash erase가 읽기 쓰기 영역에만 집중되는 것을 피하도록 설계되어야 한다.
- NAND flash를 부팅 장치로 사용하는 경우 부트로더와 OS 영역은 일반적으로 file system의 관리를 받지 못하는 영역으로, flash의 읽기 수명이 해당 제품의 예상 수명보다 짧을 경우에는 해당 영역을 주기적으로 지운 후 다시 기록하여 주거나, 부팅 실패시 backup 영역에서 부팅을 재시도하도록 하는 등의 대책을 세워야 한다. 이는 해당 시스템의 NAND controller와 부트로더의 구현에 따라 적절히 설계되어야 한다.
- energy_model_based_restrict_boltzmann_machines . . . . 149 matches
위해 사용되면서 RBM은 머신러닝에서 빼놓을 수 없는 모델로 자리잡게 되었습니다. 물론 학습 알고리즘 그 자체로만은 어렵지는 않다고 볼 수 있지만, RBM의 경우 Energy Based Model(EBM)의 한 종류로써 다른 기계학습 모델들에서는 잘 사용하지 않는 개념을 사용한다보니, 처음 접하는 사람들에게는 이해하기 어려운 부분이 있는 것이 사실입니다. EBM과 RBM을 그 컨셉인 물리학적인 접근을통해서 설명하므로써 처음 접하는 많은 이들에게 도움이 되기를 바랍니다.
확률모델링을 비롯하여 다수의 기계학습 모델들은 변수들 사이의 “상관관계”를 수치적으로 계산하는 것에서 시작한다. 예컨데 가장 기초적인 분류를 위한 확률모델을 살펴보자.
\(x_i\)라는 변수들에 대해 가능한 클래스 변수들 \(C_j\)의 조건부 확률 \(p(C_j |x_i)\)를 구함으로써 분류를 수행하였다. 우리가 가장 보편적으로 알고 있는 나이브 베이지안 모델의 경우 그 “상관관계”를 [:bayes_formula 베이즈 통계]를 사용하므로써 연산하였다. 이는 단순히 모델 특정적인 성격이 아니다. 생성적 모델에서 \(p(x|C_j )\)를 사용하는 것 역시 변수들간의 상관관계또는 상관성을 사용하는 것으로 생각할 수 있다. 또한 비확률적 모델에서, 예컨데 선형판별경계를 갖는모델에서, 데이터 변수와 클래스 변수간의 상관관계는 판별경계로부터의 거리로 정의할 수 있기도 하다.결국 주어진 데이터에 대해서 가능한 출력 변수들 사이의 상관관계를 어떤 방법으로 ‘인코딩’할 것인가에 따라서 다소 다른 모델들로 나뉜다는 뜻이며 이는 결국 기계학습을 바라보는 방법론적인 문제이기도 하다.
우리가 살펴볼 에너지 모델 역시 변수들 사이의 상관관계를 인코딩하는 것에서 시작한다. 본질적으로는 다름이 없기도 하지만, 에너지 모델은 변수들 사이의 상관관계를 ‘에너지’라는 스칼라값으로 인코딩하는 것에서 시작한다. visible 데이터 공간에서의 변수 \(x_i\)에 대해서 출력 공간에서의 변수 \(y_j\)들 사이의 상관관계를 다음과 같이 표현할 수 있다.
이를 입력 데이터 공간의 집합 X의 원소 \(x\)와 출력 공간의 집합 Y의 원소 \(y\)의 모든 배열(configuration)에대해서 확장할 경우, 가능한 모든 배열에 대한 상관관계에 대한 모델링이 되었음을 의미할 것이다. 에너지 모델에서는 에너지가 낮을수록 연관성이 높음을 의미한다. (통계물리학에서의 Principle of minimum energy 의 컨셉을 차용한 것으로 보이며 이는 다음 장에서 논의하도록 하자.) 즉 주어진 데이터 \((x ∈ X )\) 에 대해서 가능한 모든 출력 변수(∀y ∈ Y)들의 배열들 {(x, y1), (x, y2), (x, y3) ...} 의 에너지인 {E(x, y1), E(x, y2), E(x, y3) ... } 는 각 배열의 연관성(negative)를 의미하며, 즉 모델이 제시하는 출력값은 에너지값이 가장 작은 배열의 y가 된다.이를 정리하면 다음과 같다.
여기서 \(y^∗\) 는 모델이 출력하는 변수가 된다. 즉 모델은 가능한 모든 배열에 대한 에너지값을 알고 있어야 한다는 뜻이다. 이는 단순히 사람이 수작업으로 모든 배열에 대한 에너지값을 정해주는 것이 아니라(원칙상으로는 그래도 상관이 없기는 하지만, 그렇다며 더 이상 기계학습이라고 할 수 없으니) 수학적인 에너지 ‘함수’가 필요함을 의미하며, 여기서 ‘학습’이란, 주어진 학습 데이터들에 대해서 ‘좋은’ 에너지 함수가 되도록 에너지 함수의 파라미터를 수정하는 과정을 의미한다. 즉 에너지 함수의 파라미터 W에 대해서, 데이터 \(x_i\)에 대한 옳은 출력값을 \(y_i^{correct}\)라고 했을 경우,
가 되도록 W를 수정하는 과정이 에너지 모델에서의 학습과정이다. 에너지 함수를 정의하고, 또 위의 ‘좋은’ 에너지 함수를 (qaulity) 측정하기 위한 손실함수(loss function)을 정의하여, 손실함수를 최소화 시키는 방향으로 기계학습이 진행된다. [[footnote(Yann LeCun, Sumit Chopra, Raia Hadsell, Marc’Aurelio Ranzato, and Fu Jie Huang (2006) A Tutorial on Energy-Based Learning. in Bakir et al. (eds) “Predicting Structured Outputs”, MIT Press)]]
에너지 모델 설명을 입력변수 x 와 출력변수 y와의 연관성을 인코딩하는 교사학습 모델을 통해 설명하였지만, 교사학습만이 에너지 모델의 관점으로 설명할 수 있는 것은 아니다. 에너지 모델의 중점은 결국 변수들 사이의 연관성 또는 어떠한 배열들의 연관성을 에너지라는 스칼라값을 이용하여 인코딩한다는 뜻으로, 비교사학습 역시 에너지 모델의 관점에서 기술할 수 있다. 입력공간의 변수 x역시 N차원의 벡터로 본다면, 이 역시 N개의 원소를 갖는 배열로 볼 수 있다는 뜻이며, 이 배열에 대한 에너지 함수를 정의할 수 있을 것이다.
위의 교사학습에서의 에너지함수는 옳은 배열(correct configuration) \((x, y^{correct})\)에서의 에너지가 최저점을 갖도록 했다면, 비교사학습에서는 실제 데이터 \((v \in training set)\)에서의 에너지가 최저점을 갖는
것을 목적으로 한다. 즉 실제 데이터에서의 에너지 함수를 낮추고, 그 외의 입력 공간에서의 에너지 함수를 높임으로써, 실제 데이터의 패턴을 학습한다는 것과 비슷한 의미로 이해할 수 있다. 은닉변수 z를 모델에 추가하여도 크게 달라지지 않는다. 배열 (x)에서 배열 (x, z)로 확장시켜서 생각해봤을 경우, 이 배열의 연관성 역시 에너지값으로 인코딩하였을때,
가 될 것이며, 에너지 모델에서 에너지의 최저점은 연관성이 제일 높은 배열이므로, 모든 공간에서 정의된 에너지함수에 대해서 (x)의 에너지는 다음과 같다.
또한 마찬가지의 이유로, 주어진 데이터 v에 대해서 은닉변수의 값은 에너지의 최저점에서의 값이다.
즉, 입력변수의 공간과 은닉변수의 공간 내의 배열에 대한 ‘연관성’을 에너지 함수를 통하여 정의하고, 에너지함수의 파라미터를 ‘실제데이터의 에너지값이 최저값이 되도록’ 학습시키므로써, 에너지 모델 관점의 비교사학습을 진행할 수 있게 된다.
이 쳅터의 소제목을 (거창하게) 통계물리라고 써놓았기는 하지만 이 쳅터에서 다루고자하는 것은 EBM과 RBM의 이해를 돕기위한 고전 열통계역학의 극히 컨셉적인 내용입니다. 혹시 통계물리학에 대한 더 깊은 이해를 원하시는 분들은 물리학과 학부 수준의 교재인 reference [[footnote(Walter Greiner, Ludwig Neise, Horst St¨ocker Thermodynamics and Statistical Mechanics. Springer (November 14, 2001))]]를 읽어보시기를 권합니다.
어떠한 기체의 ‘상태’에 대해서 논할때는 두가지의 다른 관점이 존재한다. 거시적인(macro) 관점과 미시적인(micro) 관점이 그것이다. 관점에 따라서 기술하고자 하는 내용이 많이 달라진다. 거시적인 관점으로 기술하는 기체상태, 즉 거시상태(macro state)의 경우 문자 그대로 거시적으로 확인할 수 있는 상태를 의미한다. 예컨데, 기체의 부피(V), 기체의 온도(T), 기체의 분자 수(N) 등이 그러하다. 반면 미시적인 관점으로 기술하는 기체상태, 즉 미시상태(micro state)의 경우 기체 분자 개개의 위치, 운동량 등 거시적인 관점에서는 확인할 수 없는 차원의 상태를 의미하게 된다. 이런 두 관점에 대한 통계적인 접근이 통계역학의 시작이 된다고 볼 수 있다.
한 기체의 거시상태는 물리적으로 측정이 가능하다. 예컨데, 어떠한 기체의 부피가 V, 온도가 T, 분자의 수가 N이라고 해보자. 이러한 기체는 겉으로는(거시적으로는) 하나의 상태이지만, 미시적인 관점에서는 가능한 여러개의 미시상태를 갖고 있음을 알 수 있다. 가장 간단한 예를 들면, 거시적으로는 부피, 온도, 분자의 수가 정해져 있지만, 기체의 공간을 왼쪽 절반과 오른쪽 절반으로 나누어 분자의 위치 상태에 접근해보았을 때는, \(2^N\)개의 가능한 미시상태가 존재한다. 물론 이것보다는 훨씬 복잡하다. 고전적으로는 분자의 수 N개에 대해서 (x, y, z)축의 위치와 운동량의 6N차원의 phase 공간 내의 가능한 state들에 대해 고려를 해야 한다. 하지만 이 부분은 생략하기로 하고 결과로 넘어가 보자.
다시 언급하자면, 어떠한 한 거시상태(T, V, N)에 대해서 수 많은 미시상태들이 존재하며 각각의 미시상태를 s라고 하고, 그 중 \(i\)번째의 미시상태를 \(s_i\)라고 했을 경우, 결국 우리가 알고 싶은 것은, 이 기체가 과연 어떤 미시상태로 있을까 하는 것이다. 이를 계산하기 위한 가상의 개념이 앙상블(ensemble)이다. 한 거시상태를 만족하는 무수히 많은 미시상태의 집합이라고 이해할 수 있는데, 이를 이용하여 확률을 계산 할 수 있다. 결국 한 거시상태 Macro(T, V, N)의 가능한 미시상태들 {s1, s2, ....}에 대해서, 미시상태의 에너지가 {1, 2, ....} 일 경우, 이 거시상태가 \(i\)번째 미시상태로 존재할 확률 \(p(s_i)\)는 다음과 같다.
모든 미시상태에 대해서 확률의 합은 1이 되어야 함으로(normalize)
이며, 여기서 \(Z = \sum_j{e^{−\beta_{ei}}}\) 으로 카노니컬 앙상블의 파티션 함수가 된다. 즉, 수 많은 미시상태들에 대해서 각각의 확률은 각각의 미시상태의 에너지값에 반비례하며, 에너지값이 최소인 상태가 가장 가능성 있는(probable) 상태가 되며, 이 것이 위의 에너지 모델에서 변수들의 ‘연관성’과 ‘에너지값’이 반대가 되도록 설정한 이유 중 하나가 된다.
어떠한 배열 v에 대해서 에너지 함수 E(v)가 있다고 가정해보자. 가능한 모든 배열의 집합 V = {v1, v2, ...}에 대한 에너지 \({E(v_1), E(v_2), ...}\) 가 에너지 함수에 의하여 계산이 가능하며, 이를 위에서 언급한 미시상태로써의 앙상블을 구상하였을때, 이 배열이 V의 i 번째 배열일 확률은 앙상블의 볼츠만 분포를 따른다고 볼 수 있다. (실제 물리학적 수치가 아니므로 편의를 위해서 β = 1 로 단순화 했을 경우)
- error_zlib_h . . . . 1 match
위와 같이 zlib 개발 패키지를 설치 해주면 된다.
- etri_LLM . . . . 4 matches
Mixture of Experts(MoE)의 학습을 위해서 Auxiliary Loss[* https://technical-support.tistory.com/87] Load balancing을 통해서 학습이 고르게 되도록 하는 방법을 도입.
Weight decay[* https://light-tree.tistory.com/216][* https://m.blog.naver.com/fbfbf1/222426175698]에 대한 이해를 통해서 최적화를 수행하면 좋을 듯.
2. Fine-Tuning with PEFT에서 torch.float16을 bfloat16 또는 float[* https://velog.io/@pearl1058/torch.float16-%EA%B3%BC-bfloat16%EC%9D%98-%EC%B0%A8%EC%9D%B4]으로 수정해야 하는 이유
attachment:lecture.ipynb (일반 기계학습 이론)
- factorized_vae_and_annealed_vae . . . . 84 matches
이 논문은 Matrix, Tensor factorization method의 방법을 개선하기 위한 방법으로 VAE를 응용한 '''비선형 텐서 분해 방법'''에 대한 연구이다.
이 논문에서는 영화 관람 관객 (1600만 명 이상의 얼굴)의 얼굴 표정에 대한 대규모 데이터 세트에 적용하여 기존 __선형 인수 분해 방법__과 본 논문에서 제안한 __비선형 인수 분해 방법__을 비교했다.
attachment:fvae_intro.png?width=500px&align=center&title='''[[br]]이미지 출처''': ''Factorized Variational Autoencoders for Modeling Audience Reactions to Movies 논문''
먼저 데이터에 대해 살펴보자. 이 문제는 '''사용자'''와 '''상품'''이라는 두 가지 요소가 존재한다. 사용자 \(u\)가 상품 \(i\)를 얼마나 좋아할지를 나타내는 것이 rating \(r_{ui}\)라 하자. 이때, 이 rating은 Netflix처럼 1부터 5 사이의 숫자일수도 있고, 아마존이나 페이스북처럼 "좋아요"의 클릭일 수도 있다. 전자의 경우는 사용자가 얼마나 이 상품을 좋아하는지 '''명시적으로''' 나타냈기 때문에 explicit feedback이라 부르며, 후자의 경우는 사용자가 해당 상품을 좋아했는지 싫어했는지 표현을 직관적으로 하지 않으므로 implicit feedback이라고 한다. 지금 사용하는 실험 모형에서는 explicit feedback이고 noise가 없다고 가정하겠다. 대략 아래와 같은 방식으로 matrix를 표현하자. [* http://sanghyukchun.github.io/73/]
이때 *는 아직 사용자가 평가하지 않은 데이터를 의미한다. 이제 recommendation problem은 이 매트릭스의 비어있는 부분의 값을 예측하는 문제로 바꿔서 생각할 수 있다. 수식으로 표현하면 아래와 같은 형태로 표현 가능하다.
이때 \(R\)은 정답에 해당한다. 즉, *에 해당하는 부분을 이상적인 값으로 채운 matrix 이다. \(\hat R\)은 *에 해당하는 값을 추정한 값으로 채워서 만든 matrix이다. 이상적인 정답과 추정치(prediction) 사이를 error로 정의하고 이를 줄이는 문제로 치환되며, 이와 같이 비어있는 matrix를 완성하는 문제를 '''Matrix Completion'''이라고 한다.
'''Matrix Completion''' 문제를 풀기위한 방법은 여러가지가 있을 수 있는데 단일 모델로 가장 우수한 성능을 보이는 것이 '''Matrix factorization'''이다.
Matrix factorization은 원본 데이터 \(R\)이 ''low rank matrix''라는 가정으로 출발한다. 즉, 원본 데이터를 보다 저차원으로 표현 가능하다는 것이다. 이는 SVD를 사용해서 원본 데이터를 저차원 데이터로 압축하는 방법으로 잘 알려져 있다.
예로 원본 데이터 \(R\)이 \(n\) by \(m\) matrix라면 \(n, m\)보다 작은 \(k\)를 이용해서 \(n\) by \(k\) matrix \(P\)와 \(m\) by \(k\) matrix \(Q\)의 곱 \(R = PQ^T\)으로 표현할 수 있다.
이 사실로부터 user \(u\)가 item \(i\)의 점수를 주는 방식은, user \(u\)의 item들에 대한 latent interest \(p_u\)와 그에 대응하는 item들에 대한 latent interest \(q_i\)에 의해 결정된다는 것을 알 수 있다.
attachment:mf.png?width=450px&align=center&title='''[[br]]이미지 출처''': ''<http://sanghyukchun.github.io/73/>''
본 논문에서는 N명의 청중이 T시간 동안 영화를 보면서 짓는 표정 변화 측정했다. 표정은 \(D = 136\) Demensional vector로 표현했다. 이렇게 관촬한 데이터를 \(N \times T \times D\) tensor \(X\)라 하자. 이를 Tensor Factorization 알고리즘인 PARAFAC decomposition[* https://www.cs.cmu.edu/~pmuthuku/mlsp_page/lectures/Parafac.pdf]을 사용해 \(K\) rank(latent facrots)를 갖는 3개의 matrix로 분활했다. \(U \in \mathbb{R}^{N \times K}\), \(V \in \mathbb{R}^{T \times K}\) 그리고 \(F \in \mathbb{R}^{D \times K}\)
식 1을 K 차원과 D 차원 vector와 matrix 연산으로 바꾸면 아래의 식과 같이 표현 된다.
attachment:fvae.png?width=500px&align=center&title='''[[br]]이미지 출처''': ''Factorized Variational Autoencoders for Modeling Audience Reactions to Movies 논문''
이 논문에서는 이러한 선형 조합으로 X tensor를 쪼게고 다시 조합하는 것에 문제가 있다고 설명하고 있다. rank에 해당하는 K latent vactor가 충분히 크다면 별문제가 없을 것으로 생각되는데 아무래도 데이터가 갖는 rank값 보다 더 저차원의 latent vactor를 생성하고 그로부터 복원을 하려는 목적이 있지 않을까 생각한다.
그래서 필자가 제안하는 방법은 딥러닝을 이용한 '''Nonlinear Tensor Factorization(NLTF)'''과 Variational Autoencoder를 이용한 '''Factorized VAE'''이다.
논문에서는 Tensor를 쪼게는 방법으로 Nonlinear Tensor Factorization을 실험했다. 이 실험은 딥러닝을 이용해서 Tensor를 nonlinear한 방법으로 쪼게는 것이였는데 데이터 사이즈가 큰 문제에 대해서는 적합하지 않다는 결론을 얻었다. 이유는 유연하지 않다는 것인데 딥러닝은 트레이닝이 끝나고 나면 모든 결과가 하나로 정해진다. 이러한 점에서 유연하지 않다고 해석하는 것으로 보인다. 그래서 다음의 방법을 제안하고 있다.
Tensor를 쪼게는 방법으로 Variational Autoencoder를 응용하는 것이다. 기본 데이터 흐름은 VAE와 같다. 위 그림의 오른쪽 그림에서 Training part를 보면 U, V 블럭을 제거 하면 완벽하게 VAE 구조를 따른다.
VAE 역시 PCA와 Tensor Factorization 처럼 차원 축소를 할 수 있지만 이 역시 축소된 Latent vector가 의미적으로 해석하기 힘들다는 것이다. 때문에 앞서 살펴본 Tensor Factorization과 VAE를 융합해서 사용해 보려고 한다.
attachment:g_fvae.png?width=500px&align=center&title='''[[br]]이미지 출처''': ''Factorized Variational Autoencoders for Modeling Audience Reactions to Movies 논문''
- fastapi . . . . 7 matches
= python 데이터베이스 비동기 처리 =
FastAPI를 이용한 로그인 구현하기 [* https://www.youtube.com/watch?v=oBWVRjU0SP0] [* https://dingrr.com/blog/post/python%EC%9C%BC%EB%A1%9C-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0-jwt-x-fastapi][* https://backend-intro.vlpt.us/3/]
회원 가입이나 로그인에서 필요한 비밀번호를 만들기 위한 라이브러리로 bcrypt 라이브러리[* pip install bcrypt]를 사용한다.
간이 로그인 기능 구현 실제 사용하기엔 부족한 코드, JWT(JSON Web Token)[* https://pronist.dev/143]을 사용해서 인증하는 코드
- fastapi_project . . . . 5 matches
#title FastAPI를 이용한 웹서버 구축
# 파일 이름에서 날짜와 시간 추출
# 파일 날짜와 시간이 시작 날짜와 끝 날짜 사이에 있는지 확인
# 클라이언트에게 전송 후 zip 파일 삭제
- fft_signal_processing . . . . 17 matches
엄밀히 말하면 FFT는 "Discrete Fourier Transformation"(DFT)[* https://sanghyu.tistory.com/23?category=1120070][[footnote( [:fpga_fast_fourier_transform DFT C언어 코드])]]구현을 위한 최적화된 알고리즘 입니다. 신호는 일정 시간 동안 샘플링되어 주파수 성분으로 나뉩니다. 이러한 구성 요소는 각각 고유한 진폭 및 위상을 갖는 개별 주파수에서 단일 정현파(사인파) 입니다. 이 변환은 다음 다이어그램에 설명되어 있습니다. 측정된 기간 동안 신호에는 3가지 별개의 주된 주파수가 포함 됩니다.
간단하게 22 Hz, 60 Hz, 100 Hz의 세 가지 다른 주파수 성분을 갖는 신호를 만들었다. 각 주파수 성분의 진폭은 1, 2, 1.5로 설정 했다. 아래 그림은 이 파형이 시간 영역에서 FFT로 주파수 영역으로 변환했을때의 결과를 보여준다.
Sampling Rate는 500 Hz(초당 500 샘플)으로 0.1초 데이터를 수집했을 경우, 데이터 포인트의 갯수는 50개, 이것을 5배 확장해서 0.5초, 데이터 포인트 갯수를 250(Sampling Frequency /2)으로 했을 때를 비교했다. 50개의 데이터 포인트만 있을 경우엔 진폭을 정확히 계산하지 못하는 것을 확인 했다. 반면 250개의 데이터 포인트를 사용한 경우엔 정확하게 진폭을 계산할 수 있었다.
마지막으로 원래 신호에 노이즈를 추가했을 경우, 진폭 계산에 오차가 생기지만 명확하게 주파수 성분을 분리해 내는 것을 볼 수 있습니다.
Spectrogram을 그리는 방법은 여러가지가 있을 수 있다. Wavelet을 이용한 방법도 있고 STFT를 이요한 방법도 있다. STFT의 magnitude를 db스케일로 변환해서 그리기도 한다. [* https://sanghyu.tistory.com/37]
[:dft_fft_fourier_seriees_Transform 푸리에 급수와 푸리에 정리에 대한 이론]
[:fftw_tutoral C언어 fftw 라이브러리 사용 예제]
[:fpga_fft_structure FPGA를 이용한 FFT 모듈 구현]
- filesystem_yaffs_jffs2 . . . . 39 matches
MTD 관련 공식 사이트는 http://www.linux-mtd.infradead.org/ 이다
임베디드 리눅스 장비에서 램디스크를 이용하여 푸트 파일 시스템을 구현 하였을 경우에는 보드 동작 중에 파일로 기록된 내용이 전원이 꺼짐과 동시에 소실된다. 기록된 내용을 연구 저장 하기 위해서는 일반적으로 플래시 메모리에 기록하여야 한다.
플래시 메모리를 리눅스의 루트 파일 시스템으로 사용하기 위해서는 MTD (Memory Technology Devide) 블록 디바이스 드라이버를 사용하여야 한다.
== MTD 드라이버 ==
MTD는 두 가지 형태의 디바이스 드라이버를 지원하는데 Char형과 Block형이다.
캐랙터형은 플래시자체를 접근 가능하게 하는 부분이 구현되어 있다. 그러므로 플래시를 직접 지우거나 할 경우에 접근한다.
블럭형은 플래시를 파일 시스템에서 접근하게 한 것이다. 단연히 이 장치파일은 응용 프로그램에서 직접 접근하면 곤란하다. mount 명령을 통해서 접근 한다.
jffs2 파일 시스템 이미지를 만들기 위해서는 mkfs.jffs2 프로그램이 필요하다.
1. mtd-snapshot 파일이 필요
1. mkfs.jff2 실행 파일이 있음을 확인.
== jffs2 파일 시스템 이미지 생성 ==
NAND Flash에서 사용을 목적으로 만들어진 파일 시스템으로 YAFFS 파일 시스템의 업그레이드 버전이다.
'''git을 이용해서 소스 얻어오기 '''
패치 스크립트를 실행하게 되면 자동으로 yaffs2 파일 시스템이 추가 되는데 사용 법은 다음과 같다.
마지막으로 커널이 들어 있는 경로명을 알려주면 자동으로 패치가 이루워 진다.
* Linux-2.6.32 버전에서 single 버전이 컴파일 되지 않음
* multi version 컴파일시 ''moduleconfig.h'' 파일이 없다는 에러 발생.
== Yaffs2 이미지 만들기 & 퓨징하기 ==
YAFFS2 이미지를 만들어 주는 mkyaffs2image
mkyaffs2, unyaffs2 명령으로도 이미지를 만들 수 있다.
- flask . . . . 18 matches
python으로 웹서버를 만들기 위한 방법중 Flask 라이브러리를 사용한 방법에 대해서 알아보려고 한다.[* https://www.fun-coding.org/flask_basic-3.html]
궁극적으로는 연구소에서 진행하려고 하는 전직원 식사 이벤트를 진행하는 것에 대한 웹페이지를 어떻게 할까? 하는 생각에서 시작하게 되었는데 생각보다 일이 복잡하여 정리를 하면서 진행하겠다.
신청 페이지는 구글 폼을 사용할까 한다. 구글 폼에서 신청을 받고 신청 받은 양식을 csv 파일로 다운 받아 서버에 넣고 그걸 데이터 베이스에 저장하고 진행에 관련한 일련의 로그 역시 데이터 베이스로 저장할 계획이다. 데이터 베이스는 저장하고 관리해야 할 데이터의 크기나 양이 적을 것으로 예상 되어 sqllite3을 사용하려고 한다. 이와 관련해서는 [:python_chat_program 이전 쳇팅 프로그램 작성]에 관련 글이 있어서 참고 하려고 한다.
= 웹 페이지 =
- food_beef_treatment . . . . 41 matches
쇠고기를 건강하고 맛 있게 먹기 위해서 '''숙성'''이라는 과정을 갖는다.
정육점, 마트에서 사 먹는 쇠고기도 숙성된 고기이다. 호주와 미국등지에서 수입되는 쇠고기는 한국까지 오는 유통기간이 길어 어느정도 숙성된 상태이고
이렇게 숙성을 시키는 이유에는 육질을 부드럽게 하는 것과 풍미를 끌어 오리는 데 있다.
'''숙성'''에는 웻 에이징과 드라이 에이징으로 나눠서 볼 수 있다.
== 드라이 에이징(Dry Aging) ==
드라이 에이징은 통풍이 잘 되는 곳에 고기를 매달아 놓는 것인데 이 과정에서 겉은 육포처럼 말라 수분이 날아가지만 아미노산의 농축된 향은 속으로 응축돼 진한 육향을 느낄 수 있다.
하지만 이러한 드라이 에이징은 상당히 까다로운 조건을 만족해야 한다.
* 1~2도 사이 온도에서 4~6주간의 숙성 기간을 거친다.
* 진공 포장한 '웻에이징과 달리 포장이 안 된 고기를 공기 중에 그대로 노출 시켜야 한다.
* 70~85% 사이의 습도를 유지해야 한다.
* 통품이 잘 되는 장소에 두거나 혹은 인공적인 통풍 효과를 내기 위해 선풍기를 돌려야 한다.
이렇게 숙성하면 겉은 비틀어지고 곰팡이가 필수도 있어 상당부분을 잘라내고 먹어야 한다.
이런 이유로 일반 가정에서하기엔 힘이 든다.
== 웻 에이징(Wet Aging) ==
우리가 마트나 정육점에서 사다 먹는 쇠고기는 전부 웻 에이징이라고 보면 된다. 진공 포장으로 공기의 노출을 차단해서 수분 증발을 막고 촉촉한 상태로 숙성한다.
드라이에이징은 육즙이 적은 대신 육향이 최고조에 달해 맛과 풍미가 진하지만, 웻 에이징은 육즙이 많고 촉촉해 부드러운 질감을 갖는다.
마트나 정육점에서 구입한 쇠고기는 이미 숙성이 된 상태인데. 또 숙성을 하느냐?
낮은 등급의 쇠고기를 숙성이라는 과정을 더해 맛을 끌어올리려는 목적입니다.
- fpga_fast_fourier_transform . . . . 6 matches
FFT를 구현하기 위한 공식과 이론을 정리하자!!
int leg_diff;// leg 차이
/* 데이터 수는 2 이상 */
/* N이 2의 제곱수인가 검사 */
[:dft_fft_fourier_seriees_Transform Fourier Transform 이론 정리]
- fpga_fft_structure . . . . 11 matches
=== 다중 클럭을 이용한 메모리 접근 ===
--DCM과 메모리IP를 이용한 한 클럭에 두개의 데이터를 넣고 빼는 구조틀-- (디자인 변경)
클럭 동기가 안 맞는 문제가 발생해서 원클럭에 동기를 맞게 하기위해서 출력 신호를 반 클럭 딜레이 시켰다.
하지만, 메모리에서 값을 읽어 오는 과정이 half 클럭에 처리 되지 않는 것으로 보임 출력 신호에서 timming error 발생!
=== 테이블을 이용한 FFT 입력 구조 ===
두개의 주소를 받아서 실수와 허수로 이루워진 두개의 데이터를 출력하는 모듈
=== 테이블을 이용한 twiddle vector 구조 ===
- fpga_fifo_core_gen . . . . 6 matches
본인이 사용하고 있는 Virtex-6 대한 내용에 포커스하여 알아보기 때문에 여타 다른 칩에 대한 내용은 없을 수 있음을 상기하기 바란다.
Read mode를 선택할 수 있는데 standard fifo와 FWFT(First-Word Fall-Through)이다.
standard fifo는 출력이 3클럭쯤 딜레이를 갖고 있는것에 반해 FWFT는 바로 출력이 나온다는 차이가 있다.
- fpga_index . . . . 1 match
* [:fpga_test_guide FPGA 프로젝트 설치 및 테스트 가이드]
- fpga_test_guide . . . . 17 matches
#title NIMS FFT 작업 가이드
dirver 폴더는 드라이버와 드라이버를 테스트하기 위한 간단한 fft 테스트 코드를 포함하고 있습니다.
드라이버가 올라가 있지 않을 경우 드라이버를 올립니다.
드라이버는 ''./compile'' 스크립트로 간단히 올릴 수 있습니다. 드라이버는 루트 권한이 있어야 올릴 수 있습니다.
컴파일이 되면 '''app'''라는 실행 파일이 생성 되는데 소스는 ''app_xbmd.c'' 입니다.
fft_loader() 파일로 부터 계산할 값을 읽어 들이는 함수, size변수에 읽어 드린 파일의 사이즈를 반환합니다.
fft() 함수는 실제 fft를 수행하는 함수 입니다. 계산할 데이터와 결과 같을 받을 포인터 변수와 전체 데이터 사이즈를 인자로 갖습니다.
여기서 fft length는 fft주기를 뜻하고 데이터 사이즈는 전체 계산 할 data size 입니다.
- fpga_tutorial . . . . 28 matches
첫번째 정의된 모듈은 output port를 wire로 선언하고 내부에 별도의 req c_out_i를 선언해서 포트와 연결 시킨 것이고
아래 두번째 정의된 모듈은 output port를 reg로 선언해서 바로 사용한 경우이다.
''둘의 차이는 무엇일까?''
포트는 모듈이 외부 환경과 소통하는 ''인터페이스'' 이다.
포트 선언은 다음과 같이 정의 된다.
게이트 수준의 설계를 구조적 설계라 할 수 있는데 물리적 wire의 연결이나 게이트의 나열등을 정의 하는 설계를 말 한다.
'''reg에 값을 변경하는 일들은 always 구문 안에서만 이루워 진다. '''
'''또한 wire의 assign과 같은 구조적 설계 요소는 always 구문 밖에서 이루워 진다. '''
Verliog에서도 배열을 지원한다. 배열은 특정 자료형의 집합이다.
'' 자료형 배열의이름[갯수]'' 로 표현할 수 있다.
wire [7:0] w_array[5:0] //8 bit 벡터 와이어가 6개 있음.
일반적인 C 프로그램에서는 배열과 메모리를 특별히 구분하지 않지만 Verliog에서 메모리라는 것이 따로 존재한다.
'''wire'''와 reg는 c언어에서는 보이지 않는 자료형이다.
하드웨어 특성을 반영하고 있는 자료형으로 wire는 넷(Nets)를 정의하기 위한 키워드이다.
wire는 게이트와 게이트를 연결하는 물리적인 전선으로 보면 된다.
레지스터는 다른 논리값이 들어오기 전까지 값을 유지한다.
block 에 이름을 명시하지 않을때 나는 경고 메세지이다.
'''begin:init_loop''' 과 같이 블럭의 이름을 명시 할 수 있는데 생략했을 경우 볼 수 있는 경고
== n 비트 데이터를 m 클럭 만큼 딜레이를 주는 예제 ==
- fpga_ucf_ex . . . . 35 matches
############################################## # "#" 도형은 주석문자 입니다. 이 예제 파일을 사용하려면, 필요한 규격을 찾아서, 행의 시작에 있는 주석#
# 타이밍 규격은 전체 디자인(global)에 적용이 될 수 있거나 여러분의 디자인내의 특정 그룹(time
# groups)에 적용이 될 수가 있습니다. 타임 그룹은 두 가지 기본적인 방법으로 선언될 수 있습니다.
# 방법 1 : 네트 이름을 이용하여, my_net라는 net가 logic_grp라는 group에 속해 있는 모든 logic에
# 연결이 되어 있다면 예를 들면
# 방법2 : 'TIMEGRP' 라는 key word를 사용하여 그룹화하고 여러분 디자인의 로직의 이름을 사용하여 선
# U1으로 불리는 계층구조 안에 있는 모든 flip-flop에 위한 'group_name'이라 불리는 그룹을
# Grouping은 여러분이 software에게 디자인의 어느 부분이 어떤 속도로 동작하는지를 알려 주기 때문에
# 여러분이 사용하는 grouping constraint의 형태는 여러분이 사용하고 있는 합성 툴에 따라 변할 수 있습
# 화 되는 synchronous RAM에서 시작하거나 끝나는 모든 타이밍 경로를 담당한다. 또한 다른 요소(ex.
# FROM:TO style timespecs은 time groups사이의 경로를 제한(constrain)하는 데 사용되어 집니다.
# 사용방법은 먼저 원하는 TIME GROUP을 정의하고 TIMESPEC이름을 정의하여 사용하시면 됩니다.
# 위의 문장들에서 TIMESPEC 다음에 나오는 것이 TIMESPEC 이름이 되는 데, 여기서 규칙은 TS는 항상 나오
# 는 것이며 나머지는 사용자가 알아서 마음대로 하시면 됩니다. 예를 들면 TS_SP1, TS01, TS_FIRST 입니
# 'PERIOD'와 'FROM:TO' 형태의 time specification에 대한 조합이 필요하다.
# 위의 문장을 해석하면 TS_clk1이라는 TIMESPEC은 clk1_grp라는 TIMEGROUP에 주기 50NS을 할당하고
# 있음을 알 수 있으며, 나머지도 CLK1 과 CLK2사이의 시간 관계를 정의하고 있습니다.
# 25 ns 이면:
# OFFSET constraint을 사용하는 것이다.
# 만일 여러분이 path(경로)의 timing을 무시할 수 있다면, Timing Ignore(TIG)을 사용하시오. 주의 사
- game_pvpgn_install . . . . 2 matches
베틀넷 서버를 에뮬레이션 해주는 프로그램의 한 종류인 PVPGN에 대해 설명한다.
위 사이트에서 최신 소스를 얻을 수 있다.
- git_client_user_guide . . . . 15 matches
본인이 사용하고 있는 git 버전은 1.7.x를 사용중이다.
하지만 git이 설치 되어 있지 않다면 사용하는 리눅스 배포판[[footnote($yum install git or $apt-get install git)]]에서 제공하는 것을 설치하던 소스[[footnote(http://git-scm.com)]]를 받아서 설치하길 바란다.
git으로 소스를 원격지에서 받아오고 올리기 위해서 사용하는 프로토콜이 몇가지가 있는데 그 중에서 ssh를 사용하려고 한다.
''ssh-keygen -t rsa'' 라는 명령으로 본인이 사용하는 컴퓨터의 ssh 공개키를 생성해서 관리자[[footnote(관리자 메일 : iou78@nims.re.kr)]]에게 보내주고 공개키 등록을 요청해야 한다.
위 명령어를 수행해서 공개키를 생성하게 되면 '''id_rsa''', '''id_rsa.pub'''라는 파일이 생성이 되는데 id_rsa는 본인의 홈 드렉토리 아래 .ssh 폴터에 넣어두고 id_rsa.pub는 관리자에게 보내주면 됨.
이렇게 하면 upsampler라는 디렉토리가 생성 되면서 소스와 저장소가 생성 된다.
아래와 같이 하게 되면 git의 표기를 컬러로 할 수 있다. 꼭 해야 하는 것은 아니지만 좀 더 보기 편하다.
지금 git의 상태를 알려준다. 어느 브렌치에서 작업을 하고 있고 수정된 파일이 있는지등 현재 상태를 알려줌.
'''git commit'''이라는 명령으로 staged 상태에 있는 파일들을 하나의 revision으로 저장하게 된다.
'''git add''' 명령으로 staged상태로 전이 되지 않은 파일들은 commit 명령에 적용 되지 않고 revision에 들어가지 못 한다.
'''git add'''명령으로 파일을 staged 상태로 만들었다. 하지만 그 파일을 다시 unstaged 상태로 돌리고 싶을때가 있을 것이다. 이럴때 사용할 수 있는 명령이다.
- google_tensorflow . . . . 32 matches
구글이 2015년 11월 11일 자신들의 머신러닝 라이브러리를 공개했다.
라이브러리의 이름은 TensorFlow이며 오픈소스로 외부 개발자들이 사용하는 것은 물론이고 프로젝트에 참여하여 코드를 수정할 수도 있다.
설치 방법은 바이너리를 받아서 바로 설치하는 방법과 소스코드를 받아서 직접 컴파일하는 방법이 있다.
파이션은 모든걸 할 수 있는 언어라고 한다. 어떤 기능이든 import하면 되니 말이다.
파이션은 사용자에게 많은 편의를 제공해주지만 계산 성능(속도)는 떨어진다. 이 점을 보완하기 위해서 계산 부분을 외부에서 할 수 있도록 허용한다. 이렇게 계산 부분을 외부에 놓더라도 파이션 내부와 외부에 데이터를 주고 받는데 여전히 오버헤드가 존재하게 된다.
텐서플로우는 이런 오버헤드를 줄이기 위해서 최대한 많은 부분을 파이션 외부에 두려고 했다.
'''placeholder'''라는 변수(객체)를 사용해서 텐서플로우의 입력 데이터를 정의해서 사용할 수 있다.
실수형 32비트 데이터 타입을 갖는 2차원 텐서를 정의한다.
텐서플로우에서는 변수를 아래와 같이 정의해서 사용한다. 텐서플로우가 동작하면서 값을 변경할 수 있는 부분을 구분해서 사용한다.
입력 x와 웨이트 W의 곱에 바이어스 b를 더한 것을 softmax activation function에 전달한다는 내용이다.
머신러닝 초입에 들어서면서 가장 많이 접하게 된다는 예제이다.
트레이닝 데이터중에서 mini-batch 사이즈만큼 렌덤하게 선택해서 러닝을 수행할 수 있다.
범위는 0부터 x <범위까지가 되며, 시작점을 정해주게 되면 시작점을 포함해서 끝점보다 적은 값 사이의 값으로 난수를 내러주게 된다.
- google_tensorflow_index . . . . 4 matches
텐서플로우[* https://www.tensorflow.org] 설치와 활용은 Anaconda 환경에서 사용하기를 권한다. 파이션 설치가 간단하고 관련 패키지와 TensorFlow의 설치도 쉽기 때문이다.
새로 만들어진 conda환경에 들어가게 되면 Prompt가 환경의 이름을 포함하는 형태로 변경된다.
이 상태에서 필요한 패키지들을 설치하면 분리된 환경에서 각종 패키지들을 설치해서 사용할 수 있다.
- google_tersorflow_installation . . . . 19 matches
구글이 2015년 11월 11일 자신들의 머신러닝 라이브러리를 공개했다.
라이브러리의 이름은 TensorFlow이며 오픈소스로 외부 개발자들이 사용하는 것은 물론이고 프로젝트에 참여하여 코드를 수정할 수도 있다.
설치 방법은 [http://www.tensorflow.org/get_started/os_setup.md#installing_from_sources Tensorflow home]에 자세히 설명 되어 있다. 여기에는 본인이 직접 실행해본 결과를 기준으로 작성하도록 하겠다.
설치 방법은 바이너리로 설치하는 방법과 소스를 받아서 직접 컴파일하는 방법이 있다. 본인은 후자인 소스를 받아서 컴파일하는 방법을 선택했다.
아무래도 소스코드를 직접보고 수정더 해봐야 하기 때문이다.
Tensorflow는 파이션 2.7기반으로 만들어졌기 때문에 파이션 2.7이 설치 되어 있어야 한다.
리눅스 환경에서 설치하기 위해서는 Bazel이라는 별도의 프로그램을 사용하게 된다. Bazel의 설치 역시 소스를 받아와서 설치하도록 한다.
이렇게 컴파일을 하고 나면 output 디렉토리에 bazel 실행파일이 생성된걸 확인할 수 있다.
== CUDA 라이브러리 설치 ==
Nvidia의 그래픽 카드를 사용하고 있다면 CUDA라이브러리를 설치하면 tensorflow에서 GPU를 사용할 수 있다.
- google_tersorflow_start . . . . 3 matches
# Numpy 랜덤으로 100개의 가짜 데이터 채우기. (float64 -> float32로 변환)
# 학습 레이블(목표값) 계산
# 1x2 형태의 웨이트 변수
- grad_cam . . . . 89 matches
초기 인공신경망 및 딥러닝에서는 네트워크 모델을 블랙박스로 표현하며 해석불가능한 것으로 치부했다. 이때문에 Deterministic한 해석을 하는 사람들로 부터 공격을 받았다. 하지만 더 이상 네트워크 모델은 블랙박스가 아니다. 딥러닝의 역사가 길지 않은 것을 감안하면 비교적 오래 전부터 네트워크 모델과 그 모델의 결과 도출 과정을 설명하려는 연구(Zeiler, Fergus et al., 2013)[* M. D. Zeiler and R. Fergus, “''Visualizing and understanding convolutional networks''”, in European conference on computer vision. '''Springer''', 2014 <https://arxiv.org/abs/1311.2901>][* http://cs231n.github.io/convolutional-networks/]는 꾸준히 있어왔다. 여러 가지 시도중 CNN기반으로 Multi-Class Classification의 Prediction의 원인(근거)을 해석하는 방법으로 '''GAP(Global Average Pooling)'''[* ''Min Lin, Qiang Chen, Shuicheng Yan.'' '''"Network In Network"'''. 4 Mar 2014. <https://arxiv.org/pdf/1312.4400.pdf>]를 도입해서 Prediction에 기여를 한 feature map을 계산하는 연구인 CAM(Class Activation Mapping)[* ''Bolei Zhou et al.'' '''"Learning Deep Features for Discriminative Localization"'''. CVPR (2016) <http://cnnlocalization.csail.mit.edu/Zhou_Learning_Deep_Features_CVPR_2016_paper.pdf>]과 이로부터 파생되어 GAP구조를 제거하고 일반화한 '''Grad-CAM'''[* ''Ramprasaath R. Selvaraju ea al.'' '''"Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization"''', (ICCV), 2017, pp. 618-626 <http://openaccess.thecvf.com/content_ICCV_2017/papers/Selvaraju_Grad-CAM_Visual_Explanations_ICCV_2017_paper.pdf>][* <https://arxiv.org/pdf/1610.02391.pdf>]과 이를 더욱 발전시킨 '''Grad-CAM++'''[* ''Aditya Chattopadhyay'', ''Anirban Sarkar'', "'''Grad-CAM++: Improved Visual Explanations for Deep Convolutional Networks'''", <https://arxiv.org/pdf/1710.11063.pdf>]에 대해서 알아보고자 한다.
일반적인 CNN 구조에 대해서 생각해 보자. CNN은 입력으로 받은 데이터를 Convolution layer와 pooling layer를 반복하면서 feature map을 만들고 이렇게 추출된 feature map을 Flatten과정을 거쳐 FC(Fully Connected layer)로 넘기고 softmax를 통해 어느 클래스에 해당하는지 확률값을 얻어 내는 구조를 갖는다.
attachment:cnn.jpg?width=600px&align=center&title='''[[br]]이미지 출처''': MathWorks ''<https://it.mathworks.com/discovery/convolutional-neural-network.html>''
CNN뿐만 아니라 모든 FFNN(Feed-forward Neural Network)은 네트워크를 Feature Learning(Feature extraction)과 Classification으로 나눌수 있다. 나누는 시점은 네트워크 내부 어디든 상관 없다. 어디서 부터 어디까지를 Feature extraction이고 Classification인지는 input을 포함하고 있는 앞단을 Feature extraction이 되고, 출력을 포함하고 있는 부분이 Classification으로 생각할 수 있다. 레이어 하나 하나는 입력 차원을 다른 새로운 차원으로 mapping하는 function으로 볼 수도 있고 여러 레이어를 묶어서 볼 수도 있기 때문이다.
CAM 논문에서는 일반적인 CNN 구조의 Flatten 부분 부터 이후 과정을 GAP로 변경한다. GAP는 마지막 Convolution layer의 출력인 각 feature map의 평균값을 계산하여 하나의 벡터로 만들어준다. 아래 그림은 3x3 feature map이 3장 있을 경우이다.
attachment:gap.png?width=650px&align=center&title='''[[br]]이미지 출처''': JUNSIK HWANG님 블로그 ''<https://jsideas.net/class_activation_map/>''
* 마지막 Convolution layer를 거쳐서 얻은 feature map에 집중해 보자. 여러장의 feature map을 채널이라고 하는데 \(k\)번째 채널의 값들 중 \((x,y)\)에 위치한 값을 \(f_k(x,y)\)로 표현하자.
* \(k\)번째 채널에 대해서 GAP를 계산한 것을 \(F^k\)라 하자 위 그림 기준으로 \(F^1 = 4\) 이다.
* 이렇게 만들어진 벡터에 weight를 곱해서 각 클래스의 softmax의 입력으로 사용하는데 이것을 \(S_c\)라 하자.
* \(F_k=\sum_{x,y} f_k(x,y)\)이므로, \(S_c = \sum_kw_k^c\sum_{x,y} f_k(x,y)\)이 된다. \(F_k\)는 평균이라고 했기 때문에 전체 픽셀의 수로 나눠줘야 하지만 실제 구현에서 모든 경우 픽셀의 수는 동일하기 때문에 나누기는 생략 했다.
* Summation의 위치를 바꾸면, \(S_c = \sum_{x,y}\sum_kw_k^c f_k(x,y)\) 이 된다.
* 이 식에서 뒤쪽 Summation을 Class Activation Map \(M_c(x,y)\)로 정의한다.
* 위 수식을 말로 풀이하면 아래 그림에서 보는 것과 같이 각 feature map에 weight를 곱하고 하나의 이미지로 합치면 CAM이 된다는 것이다.
attachment:CAM.png?width=650px&align=center&title='''[[br]]이미지 출처''': ''Learning Deep Features for Discriminative Localization (일명 CAM 논문)''
앞서 살펴본 CAM은 CNN 내부를 이해하는데 좋은 도구임에 틀림이 없다. 하지만 GAP를 사용하는 방식때문에 태생적인 단점이 있다. 너무도 당연하게 GAP를 사용해야 하고 마지막 Convolution layer에만 적용할 수 있다. 이러한 문제로 Object detection 외에 Visual Question Answer(VQA)나 Captioning처럼 다양한 목적을 수행하는 CNN에는 적용할 수 없다.
이러한 단점을 보완하고 CAM을 일반화하여 CNN뿐만 아니라 다양한 네트워크 모델에 적용 가능한 Grad-CAM에 대해 알아보자.
attachment:grad_cam.png?width=730px&align=center'''[[br]]이미지 출처''': ''Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization 논문''
위 그림을 CAM과 비교해 보면, Convolution layter를 통과해서 만들어진 feature map을 '''A'''로 표현했다 개별 feature map은 \(A^k\)로 표현 할 수 있다. 이는 CAM 구조와 동일하다. (CAM에서는 k번째 feature map \(A^k\) 를 \(f_k(x,y)\)로 표현했고 Prediction \(y^c\)는 \(S^c\)로 표현했다.)
feature map '''A'''를 목적에 맞는 다양한 네트워크 모델의 입력으로 사용했다. 이때 네트워크 모델을 GAP를 사용했다면 CAM과 동일한 네트워크를 갖는다.
차이가 있다면 CAM에서는 학습된 GAP와 softmax 사이의 weight를 갖고 localization map을 계산했다면 grad-CAM에서는 아래 식과 같이 feature map의 각 pixel의 gradient의 합으로 계산된다. __논문에서는 \(\cfrac{1}{Z}\)가 들어가지만 실제 weight 계산에서는 \(\cfrac{1}{Z}\)는 없다.__
- gunplot_tutorial . . . . 3 matches
이 부분이 Latex로 출력하기 위한 코드 부분이다. 나머지 부분은 그래프를 그리기 위한 코드!!
- gw_ml_review . . . . 37 matches
이 논문에서는 Simulated NR Data에 Noise를 단계적으로 입혀 트레이닝 시키고 이것을 통해서 Heavy noise 속에 들어있는 중력파 시그널의 유무를 Classification하고 그 시그널의 Parameter를 Prediction하는 일을 진행하였다.
트레이닝 데이터는 시뮬레이션[* effective-one-body(EOB) waveforms, quasi-circular, non-spinning BBHs]을 통해서 만들어진 데이터를 사용했고 바이너리 블랙홀 쌍성의 질량 파라메터만들 고려해서 진행 되었다.
질량 범위는 \(5M_{\bigodot}\)에서 \(75M_{\bigodot}\)까지 이다.
8192Hz로 샘플링 되었으면 1초 단위로 트레이닝 데이터를 잘라서 사용했다.
아래 그림에서 처럼 4000개의 templates of BBH mergers 에 white noise을 더해서 100,000개의 데이터 샘플을 만들었다.
붉은색 점으로 표시된 질량 파라메터를 갖는 신호는 트레이닝에 사용되었고 파란색 점으로 표시된 부분은 검증으로 사용 되었다. 트레이닝 데이터 사이에 존재하는 파란색 점에 대해서 잘 찾아짐을 확인했다.
아래 그림은 SNR=0.5[* SNR 계산은 cbc에서 사용하는 SNR 계산과 다르게 노이즈와 신호의 peak amplitude의 비율로 정의해서 사용했다.]의 신호를 기존 방법으로는 구분하기 힘들지만 본 논문의 방법으로는 분류해 낼 수 있다는 주장이다.
'''Predictor'''는 위 네트워크 구조에서 마지막 softmax 함수만 제거하여 트레이닝 시키고 트레이닝이 끝나고 나면 이 네트워크의 최종 weight값을 '''Classifier'''의 pre-train으로 사용한다.
'''Classifier'''는 50%의 노이즈 데이터를 트레이닝 세트에 추가해서 트레이닝을 진행한다. 이렇게 하면 '''Classifier'''의 트레이닝 시간을 상당히 단축시킬 수 있다.
본 논문에서는 노이즈가 있는 데이터의 트레이닝에서 작은 노이즈로부터 점차 노이즈의 정도를 높혀가는 것이 트레이닝에 효과적이라는 주장이다.
- hawkes_process . . . . 19 matches
포아송 프로세스의 기본 전제는 모든 구간에 대해서 \(\lambda\)가 고정이라고 가정한다. 이 가정에 의해서 서로 독립인 두 사건 A, B 구간의 발생 빈도 \(N(A) \sim \int_A \lambda(t)dt\) 와 \(N(B) \sim \int_B \lambda(t)dt\)가 동일한 포아송 분포를 따른다.
* \(\mu\): backgroun intensity \(\mu > 0\) \(t\) 시간 이전에 발생한 이벤트의 평균 값 (선형적 의존관계)
* \(\varphi()\): triggering kernel function, 현재 시간과 이전 이벤트의 타임 스탬프 사이의 지연 함수이고 nonnegative 이다. \(\varphi(x) \ge 0, \forall x \ge 0\), \(\varphi(x) = 0, \forall x < 0\)
아래 코드는 \(\lambda^*(t)\)의 그래픽 표현이다. exponential decay 함수는 \(\varphi(x) = \alpha \beta \exp (-\beta x)\)를 사용했고 새로 도착할 때마다 강도가 확률적으로 흥분됨을 알 수 있다.[* https://github.com/canerturkmen/hawkeslib]
지금까지 일도량, 분포가 변량이 하나인 경우에 대해서 알았다면, 다변량에 대해서 알아보자.
Univariate Hawkes Process에서는 self-excitatory만 있었다면 여기서는 다른 이벤트에 의해서도 exciting이 된다.
여기서 A는 infectivity matrix이고, \(A_{l, k}\)는 type-l 이벤트로 인해 발생할 수 있는 type-k 이벤트의 수로 해석할 수 있다.
예로 8가지 물건의 가격 변동이 서로 어떻게 영향을 주웠는지 Multivariate Hawkes Process로 알아보자.
결과를 보면 2번 상품의 변동에 의해서 0번 상품의 가격 변동이 있었다와
3번 상품의 가격 변동이 1번 상품의 가격 변동에 영향을 준 것으로 보인다.
- hdf5 . . . . 10 matches
file directory 구조와 유사한 방식으로 데이터를 저장하기 위한 데이터 구조로 '/' 루트로 부터 directory-file 구조와 유사하게 group-dataset 구조를 사용해서 트리형태로 데이터를 저장한다. 각 group과 dataset는 metadata로 attribute를 사용해서 사용자가 부연 설명을 넣을 수 있다.
* 그룹(Group): 데이터셋이나 다른 서브그룹을 포함할 수 있는 드렉토리와 같은 역할을 한다.
* 데이터셋(Dataset): 실제 데이터를 갖고 있는 leaf node에 해당한다.
* 속성(Attribute): 그룹과 데이터셋의 부연 설명을 위한 주석과 같은 역할을 한다.
기존에 파일이 있거나 신규로 생성하거나 경우에 따라서 파일을 오픈하는 옵션이 달라진다.
- health_food . . . . 2 matches
철분제 - 피가 걸죽해질 수 있다. 수분이 빠지면 역시 피가 걸죽해져 심장 질환의 원인이 된다.
- hecto_pascal . . . . 4 matches
#title 1기압은 1013.25hPa이야!
대기압의 국제단의 '''__파스칼(Pa)__'''은 \(1m^2\)의 넓이에 1N(뉴턴)[* 1kg의 물제가 작용하여 \(1m/s^2\)의 가속도를 발생시키는 힘]의 힘이 작용할때의 압력을 나타낸다.
헥토파스칼은(hecto Pascal)은 그리스어의 '100'을 뜻하는 헥토(hecto)를 붙여 1hPa = 100Pa 을 뜻하는 단위이다.
- history_computer . . . . 29 matches
톱니바퀴를 이용한 기계식 계산기
== 1673 - 라이프니츠(독일) ==
논리 대수를 창조하여 전보 이론에 대한 매우 중요한 기분을 구축
데이터를 카드에 천공하는 방식을 고안.
* 미국 하버드대학 에이컨 교수가 개발(5년).
* 1백만 개의 진공관 사용하여 길이 17m, 높이 2.4m로 제작
* 수학자 폰노이만의 보고서에서 제시함.
* 프로그램 내장 방식이란 처리할 문제의 해결 방법과 순서를 작성하여 컴퓨터에 기억 시킨 후, 자동적으로 저장된 명령을 하나씩 꺼내어 순서대로 수행하는 방식.
* 2진법이 아닌 10진법을 사용한 오늘날의 대형 컴퓨터의 구조와 비슷 (현대 컴퓨터의 기원)
* 1초 5000회의 덧셈연산, 두 숫자를 3/1000초에 곱셈(마크-I 보다 300배 빠름) 내부기억장치가 없는 계산 순서를 지시하는 프로그램을 배선판에 일일이 배선하는 외부프로그램 방식을 채택하였기 때문에 배선판 교체 작업과 계산 명령을 사람이 직접해야 함.
* 진공관을 사용하여 발열이 심함, 냉각기 필요
* 주기억장치로는 수은 지연 회로가 있고 보조기억장치로는 자기드럼, 자기 테이프가 있었음.
* 트린지스터를 사용하여 열이 적게 발생하고 소비전력이 적어 가격이 저럼함.
* 주기억장치로는 자기 코어가 있고 보조기억 장치로는 자기드럼, 자기 테이프, 자기 디스크가 있음.
* 다중프로그램 시스템을 사용하여 온라인 실시간 처리 시스템이 실용화되기 시작.
* 집적회로(IC, Integrated Circuit)를 사용하여 가격이 저렴하고 전력소비가 적어짐.
* 컴퓨터가 급속도로 보급 되었고, 시분할 시스템이 실현되었으며 동일 기종간 호완성이 가능하게 되었으면 통신회선을 이용한 실시간 처리 방식 도임.
* 고밀도 집적회로(LSI, Large Scale Integrated Circuit)를 사용하여 가격이 저렴함.
* 입력 장치로 사용 되던 천공카드시스템이 자기테이프나 자기디스크로 대체됨.
* 일관처리 방식(일정시간 동안 처리해야 할 업무를 모았다가 한꺼번에 처리하는 방식)이 실시간 처리 방식으로 변경 됨.
- homebrew . . . . 9 matches
맥을 사용하면서 App Store를 통해서 소프트웨어를 설치하는 것은 기본이지만 리눅스처럼 개발툴이나 라이브러리를 설치하는 것은 좀 다르다. 그 중에 가장 많이 쓰는 패키지 관리 툴은 Macport와 Homebrew[* http://brew.sh/index_ko.html]이다.
로 사용할 컴파일러를 설정해서 라이브러리를 설치해야 컴파일러에서 라이브러리를 갖다가 쓸 수 있다.
컴파일러와 연동해서 라이브러리 설치하는 방법은 아래와 같다.
이렇게 하면 소스를 받아서 지정된 컴파일러로 재컴파일해서 설치 한다.
- hub_gardening . . . . 5 matches
원산지는 동아시아이고 민트과에 속하는 1년생 식물로 이탈리아와 프랑스 요리에 많이 사용된다
약효로는 두통, 신경과민, 구내염, 강장효과, 건위, 진정, 살균, 불면증과 젖을 잘 나오게 하는 효능이 있고, 졸림을 방지하여 늦게까지 공부하는 수험생에게 좋다.
화분에 배양토만 넣어서 씨를 뿌렸는데 찾아보니 씨를 조금 흙으로 덮어줬어야 하지 않았나 하는 생각이 든다. 씨를 흙 위에 뿌려서 인지 씨가 보인다. ㅠ
- iEEG_seizure . . . . 28 matches
CHB-MIT Database[* https://physionet.org/content/chbmit/1.0.0/]는 Children's Hospital Boston의 23명의 뇌전증 환자의 Scalp EEG 데이터를 수집한 것으로, __3세에서 22세 남자 5명과 1.5세에서 19세 여자 17명__의 데이터이다. 각 데이터의 나이와 성별 정보는 [https://physionet.org/content/chbmit/1.0.0/SUBJECT-INFO SUBJECT-INFO]에 기재되어 있다.
데이터는 아래 명령어로 터미널에서 받아 볼 수 있다.
EEG 데이터는 fif, edf 파일 포멧으로 저장되어 사용되는데 mne python library를 통해서 다양한 처리가 가능하다.
파일의 위치와 파일명을 알고 있다면 바로 파일만 읽으면 되겠지만 특정 폴더에 있는 파일을 모두 처리하기 위해서는 아래와 같이 파일 리스트를 작성하는 것이 편하다.
channel name, sampling frequency 등 eeg 데이터를 처리하기 위한 정보들을 확인 할 수 있다.
edf의 데이터 구조는 측정 데이터와 시간의 tuple로 되어 있어서 측정 데이터를 분리해서 신호처리를 하기 위해서 위와 같이 분리했다. 분리하게 되면 23개의 channel에 1시간 시계열 데이터가 들어있는 numpy array 형태가 된다.
화이트닝 방법은 여러가지 방법이 있으며 그 중 ligo에서 사용하는 화이트닝 방법을 선택했다.
우선 학습을 위한 데이터를 준비하기 위해서 신호를 모양을 유지한체 0과 1사이에 놓이게 조절했다.
학습 데이터는 1초씩 잘라서 사용하도록 하겠다. sampling frequency 기준으로 256개씩 잘라서 사용할 수 있도록 reshape을 진행했다. dimension 정보는 (batch, channel, data)순으로 channel은 edf의 channel이 아니고 convolutional neural network에서 사용하는 channel이다.
모델은 1차원 cnn을 사용하였으며 MaxPooling을 사용해서 데이터의 사이즈를 절반씩 줄이고 다시 ConvTranspose1d를 사용해서 복원했다.
모델의 학습을 위해서 loss function과 optimazer를 설정해야 하는데 최적화 알고리즘은 adam을 사용했고 loss function은 MSE와 Cosine Similarity에 분산을 추가 했는데 이부분에 대해서는 조금 더 연구가 필요하다.
- iGrave . . . . 3 matches
* 센서가 설치되는 베이스먼트 1x1 25cm 콘크리트 베이스먼트 (바닥과 하나로 연결하기 위한 철근 앙카 작업 필요)
지하수에 대한 고려, 지하수 유동에 대한 데이터를 조사할 필요가 있음.
- iir_filter . . . . 12 matches
입니다. 즉 임펄스 응답이 무한히 계속되는 필터입니다. 같은 모습의 감소 특성 필터를 실현할 경우, IIR 필터는 FIR 필터에 비해서 필요한 계산량이 약 1자리 적어지나, 연산 오차 영향이 크고, 불안정 해지는 경우가 있으므로, FIR 필터에 비하여 취급에 주의가 필요합니다.
입력 신호를 x[n], 출력 신호를 y[n]이라고 하면 입출력 관계는 다음과 같은 차분 방정식이 됩니다.
이 필터의 전달함수 H(z)는 다음과 같습니다.
..식을 보면 알 수 있듯이, IIR 필터에는 피드백이 있습니다.. FIR에는 없죠..
이 식은 곱셈으로 되어 있으므로, 순번을 바꿔도 같은 결과를 얻을 수 있습니다.
이는 다음과같은 차분 방정식으로 나타낼 수 있습니다.
이를 코드로 나타내면 다음과 같습니다.
이 필터계수는 차단주파수 1khz를 가지며 저지역 감쇠량 60db를 갖는 필터입니다.
- index_2010 . . . . 11 matches
[:dm365_wdr_driver WDR 드라이버 수정 작업]
[:dm365_filter_change Filter Change 드라이버 작업]
[:ipnc_rs485_pelco-d RS485를 이용한 PELCO-D 프로토콜 운용]
||[:embaded_nand_flash_memory NAND Flash 메모리의 구조 이해하기]
[:programming_cli_ex 컨멘드 라인 인터페이스 간단 예제]
|| 윈도우 드라이버 || 기타 ||
||[:windows_driver_development_env 윈도우 드라이버 작성] || ||
= 사이트링크 =
[http://torrentsection.com/ 외국 토렌토 사이트]
[http://anytorrentsdownload.com/ 외국 토렌토 사이트]
[http://blog.naver.com/jing0228/ 공부하는 아이]
- index_2012 . . . . 10 matches
#title 2012년도 작업 테이블
* [:Linux_system_syslog.conf 리눅스 로그시스템의 이해]
* 드라이버 관련
* [:Linux_device_DMA 디바이스에서 DMA 사용하기]
* [:Linux_pci_driver PCI 드라이버]
* [:Linux_pci_driver_example PCI 드라이버 작성하기 Tip]
* [:programming_cli_ex 컨멘드 라인 인터페이스 간단 예제]
* [:programming_gettimeofday gettimeofday를 이용한 코드 실행 시간 구하기 예제]
* [:windows_util_acronis_true_image Acronis True Image를 이용한 하드 디스크 백업]
= 사이트링크 =
- index_2016 . . . . 13 matches
||<width="50%"> [list_license 라이센스 리스트] || 위키가 만들어진지 [[DueDate(20100117)]]
[[PageCount]]페이지를 보유 중.||
4. [:python_index 파이션 입문]
6. [:linux_port_forwarding SSH를 이용한 Port Forwarding 방법]
13. [:rsync_cron_data_backup Rsync와 Cron을 이용한 데이터 백업]
||1. [:Linux_device_module_basic xbmd pci 드라이버 작업]
8. [:ann_exam 인공신경망 실험 데이터]
9. [:google_tensorflow Google의 TensorFlow 라이브러리]
12. [notify_job_finish 작업이 끝남을 리모트에 알려주기]
3. [:ppsspp_install_guide PSP 애뮬레이터 설치]
6. [:LaTex_guide 레이텍 설치 가이드]
- index_2019 . . . . 5 matches
* [:Variational_inference Variational Inference 변분 추론의 이해]
* [:math_index 수학적 이론 정리]
* [:python_chat_program 파이썬 채팅 프로그램 작성기]
총 생성된 페이지 : [[PageCount]] 페이지를 보유 중.
- index_2023 . . . . 25 matches
|| [:index_2012 2012] || [:index_2016 2016] || [:index_2019 2019] || [:index_2023 2023] ||[:arduino_list 아두이노 관련] ||
[:variational_autoencoder Variational Autoencoder과 기초 이론]
[:raspberrypi4 라즈베리 파이 4]
[:data_mining 데이터 마이닝]
[:pyinstaller Pyinstaller를 이용한 실행파일 만들기]
[:fastapi_project FastAPI를 이용한 프로젝트]
[:raspberry_pi_cluster 라즈베리파이 클러스터 구축 ver 0.1]
[:raspberry_pi_ntp_server 라즈베리파이 GPS를 이용한 NTP 서버 구축]
[:raspberry_pi_dht22 라즈베리파이 DHT22 온습도 센서]
[:raspberry_pi_pyAudio 라즈베리파이 pyAudio를 이용한 마이크 녹음]
[:raspberry_Yemigo 라즈베리파이 예미랩 센서 설정 로고]
[:raspberry_Grafana 라즈베리파이 MQTT influxDB Grafana로 센서 측정 결과 그리기]
[:raspberry_sensor_installation 라즈베리파이 센서 설치 및 운용]
[:raspberry_video_audio 라즈베리파이 블랙박스 만들기]
[:raspberry_wireguard 라즈베리파이 Wireguard 설정하기]
[:hecto_pascal 1기압은 1013.25hPa이야!]
[:hdf5 hdf5 계층적 데이터 형식]
[:etri_lecture_deep_learning ETRI 기계학습 이론 수업]
[:slack_api_chatbot SLACK API with Python을 이용해 메세지 보내기]
총 생성된 페이지 : [[PageCount]] 페이지를 보유 중.
- index_2025 . . . . 3 matches
|| [:index_2012 2012] || [:index_2016 2016] || [:index_2019 2019] || [:index_2023 2023] || [:index_2023 2023] || [:arduino_list 아두이노 관련] ||
총 생성된 페이지 : [[PageCount]] 페이지를 보유 중.
- ipnc_release_mode . . . . 1 match
[:%EB%A6%AC%EB%88%85%EC%8A%A4%EB%93%9C%EB%9D%BC%EC%9D%B4%EB%B2%84 리눅스 드라이버 추가하기]
- ipnc_true_day_night . . . . 2 matches
현제 필터의 상태와 day_night_flag를 비교해서 변경이 발생하면 동기를 맞춰 움직인다.
[:dm365_filter_change Filter Change 드라이버 작업]
- iptables_cross . . . . 5 matches
패킷 필터링 기능을 추가 하기 위해서 리눅스에서 iptables라는 프로그램을 사용하는데 이것을 임베디드 시스템에 포팅해 보자
iptables-1.4.8.tar.bz2 프로그램을 다음과 같이 다운로드 받습니다.
압축을 해제한 디렉토리로 이동 합니다.
Make를 이용하여 컴파일 하기
Make install 을 이용하여 설치 하기
- iterative_solver . . . . 5 matches
사용할 BLAS 패키지에 따라서 make.inc 파일의 내용이 다름을 짐작할 수 있다.
acml, atlas, goto, macos, mkl-gcc, mkl-icc, mkl-ilp64, mkl-shared등 총 8가지 make.inc 파일이 있다.
인텔 icc[[footnote(https://registrationcenter.intel.com/RegCenter/NComForm.aspx?ProductID=1517&pass=yes)]]와 ifort[[footnote(https://registrationcenter.intel.com/RegCenter/NComForm.aspx?ProductID=1322)]]를 설치하면 다른 것들은 크게 신경 쓸게 없이 설치가 된다.
물론 cuda 5.5는 이미 설치 되어 있기 때문에 따로 설치하지는 않았지만 필요하다.
= 관련 사이트 링크 =
- julia . . . . 18 matches
Julia를 실행하면 ''read evaluate print loop'' ('''REPL''') 환경이 시작되는데 여기서 ']'를 눌러서 패키지 관리 모드로 들어간다.
생성된 Project 환경을 사용하려면 ''activate'' '''Project_name'''을 입력하면 프롬포트의 이름이 프로젝트명으로 변경되고 프로젝트 환경이 활성화 된다. 이 상태에서 프로젝트에서 사용할 패키지들을 추가해주면 된다.
* --project: 옵션에서 프로젝트 경로를 알려주면 프로젝트가 활성화된 상태로 줄리아 REPL이 열린다.
* using은 네임스페이스의 개념으로 Module 내에 export로 설정된 함수나 변수를 직접 사용할 수 있다. using 키워드 뒤에는 Module이나 Package가 와야한다.
* import는 Module은 Python의 import와 같다. Module이나 Package 뿐만 아니라 함수는 변수 단위로 접근해서 사용할 수 있다.
* '''Main''': Julia를 실행했을 때, 상위-계층(top-level)이 되는 모듈, 현재 작업 중이게 되는 모듈
* '''Core''': 언어에 내장된 모든 기능이 포함된 모듈
* Core Module은 말 그대로 Core입니다. 이 언어에 내장된 모든 식별자들을 담고 있습니다. 이 모듈이 없으면 아무것도 못하기 때문에 모든 모듈은 암시적으로 using Core가 돼있습니다.
* '''Base''': 대부분의 상황에서 유용한 기능들이 포함된 모듈
* Base Module은 계산과학에서 쓰이는 것과 모든 언어에서 공통적으로 쓰는 함수들과 매크로들이 들어있습니다.
- jupyter_notebook . . . . 8 matches
다음과 같이 jupyter notebook을 서버에서 실행해고 다른 컴퓨터에서 서버에 접속하는 방식으로 사용할 경우 token 혹은 password를 입력하라는 표시가 뜬다. [* https://financedata.github.io/posts/jupyter-notebook-authentication.html]
토큰 확인은 아래와 같이 확인 할 수 있다.
또 다른 방법으로 jupyter Notebook 서버에 프로파일을 생성하고 자신이 원하는 패스워드를 설정하는 방법이다.
~/.jupyter 드렉토리가 생성되고, 하위에 jupyter_notebook_config.py 파일이 생성된다.
생성된 파일에 아래 처럼 설정을 추가하면 토큰이 아니라 패스워드로 접속이 가능하며 jupyter 실행시 별도 옵션을 설정하지 않아도 사전에 설정한 옵션으로 실행 된다 .
Jupyter 환경에서 프로그램을 실행 시키기 위해서 Python 뿐만 아니라 R, Julia, Matlab 등 다양한 언어를 사용할 수 있다. Python도 다양한 버전을 활용할 수 있는데 Python이 설치된 가상환경을 kernel로 사용할 수 있다.
- kolmogorv_arnold_network . . . . 47 matches
MLP는 현대 딥러닝 알고리즘의 근간이 되는 네트워크 모델이다. 가중치 행렬 \(W\)를 사용한 선형결합과 비선형 활성함수(Activation Function)를 이용하여 임의의 비선형 함수를 근사합니다. 이는 '''Universal approximation theorem'''으로 설명되는데, 이는 임의의 비선형 함수를 주어진 오차 내에서 몇개의 레이어와 뉴런으로 구성된 fully-connected network으로 근사할 수 있음을 의미한다.[* https://ddangchani.github.io/KAN/]
반면, KAN의 경우 '''Kolmogorov-Arnold representation theorem'''을 근간으로한 모델을 전개한다.(완벽하게 따르지 않음.) 무언간 거창한 정리와 모델로 보일 수 있지만 저자는 KAN이 ''nothing more than combinations of splines and MLP'', 즉 spline과 MLP의 결합에 불과하다는 말이다.
위 정리의 의미를 생각해보면, n차원 다변량 함수를 n개의 단변량 함수 \(\phi\)들의 합으로 나타낼 수 있다는 의미가 된다. 증명에 대해서는 따로 찾아봐야 할 문제지만, KAN에서 주목해야 할 부분은 MLP처럼 고차원 함수를 학습하고자 할 때 n개의 단변량 함수로 치환해서 학습할 수 있다는 점이다.
위 표는 MLP와 KAN을 비교한 논문에 개제된 표이다. MLP를 그래프 구조로 표현하면 왼쪽의 (a)와 같이 각 노드에 활성함수(Activation function)을 대응시키고, 각 엣지에 가중치(\(\omega\))를 대응시킬 수 있다. 반면, KAN은 각 노드에 함수값이 대응되고, 각 엣지에 임의의 함수 \(\phi, \Phi\)가 대응 된다. 또한, 가중치를 학습하는 MLP와 달리 임의의 함수 \(\phi, \Phi\)를 학습시킨다는 차이점이 있다.
우선, 입력 데이터 \(x_0 = {x_{0,1}, x_{0,2}}\)가 2차원으로 주어졌다고 가정하면, 식 (KRT)는 다음과 같습니다.
이 경우 KAN의 computation graph는 아래와 같다.
입력 데이터의 각 성분 \(x_{0,1}, x_{0,2}\)가 계산 그래프의 아래 첫번째 노드에 대응한다. 첫번째 엣지는 \(\phi_{q,1}, \phi_{q,2}\)에 대응하기 때문에 입력 \(x_{0,1}, x_{0,2}\)와 연결되는 것을 확인할 수 있다. 이후, 이들이 합해질 때는 식과 같이 q값이 동일한 함수값들끼리 더해지는 것을 확인할 수 있다. 이로부터 얻은 \(x_{1,1}, \cdots, x_{1,5}\) 5개의 성분을 갖는 '''hidden layer'''가 된다. 마지막으로 \(\sum_q\Phi_q\) 연산이 이뤄지기 위해 각각의 은익층 성분에 함수값들을 더하고 이것이 최종 output \(x_{2,1}\)이 된다. (임의의 함수 \(\phi, \Phi\)는 구분하지 않고 통일해서 \(\phi\)로 나타낸다.)
또한, 각각의 임의의 함수 \(\phi, \Phi\)는 학습이 가능해야 함으로 spline을 이용하며, 각 함수들의 계수(coefficient)를 학습한다. KAN에서는 '''B-splien'''을 이용한다.
위에서 살펴본 KRT를 기반으로 한 KAN 구조를 일반적인 MLP 구조와 같이 확장해 보자.
입력 벡터가 N차원이고 출력 벡터가 M차원인 KAN layer는 다음과 같이 1차원 함수(Univariate function) \(\phi_{q,p}\)로 구성된 행렬로 정의할 수 있다.
따라서 위에서 살펴본 KRT 수식에 대응하는 네트워크 구조는 \( 2 \rightarrow 5 \rightarrow 1\) 차원으로 순차적으로 변환되므로, 2개의 KAN layer로 구성된 것으로 볼수 있다. 이를 논문에서는 \([n, 2n+1, 1]\)-KAN으로 표현했다. 또한, 이를 바탕으로 KAN layer를 순차적으로 쌓는 것으로 Deep KAN을 구성한다.
위 Simple KAN식 (1)을 일반화된 위 식처럼 표현하면 아래 식 (2)와 같이 표현할 수 있다.
논문에서는 앞에서 언급했던 activation function \(\phi\)를 학습 가능한 B-spline을 이용하였다. (미분 가능한 함수꼴이면 다른 것을 사용해도 됨을 의미한다.)
여기서 \(b(x)\)는 basis function이라고 부르며(spline basis와 다른 의미를 갖음), 일종의 '''residual connection'''[* https://channelai.tistory.com/2]역할을 수행한다. 다음과 같이 silu function(swish)[* https://medium.com/@akp83540/silu-sigmoid-linear-unit-activation-function-d9b6845f0c81]로 주어진다.
Spline의 경우는 다음과 같이 B-Spline의 선형결합으로 주어진다.
\(\omega\)는 activation function의 출력값의 스케일을 조절하기 위해 사용되는 factor이다.
각 scale \(\omega\)는 Xavier initialization으로 초기화하며, 각 activation function \(\phi\)는 spline(x) ≈ 0이 되도록 초기화한다. 이는 각 계수 \(c_i\)들을 \(N(0, \sigma^2)\)로부터 샘플링하는 것으로 수행한다. (KAN에서는 \(\sigma = 0.1\)을 사용한다.)
각 spline의 격자점을 업데이트하여, 활성함수의 함수값이 학습 중 고정된 범위를 넘어서는 것을 방지한다.
- ksc2016 . . . . 24 matches
= 딥러닝의 이해 - 이홍석 =
하이퍼시스 - 가설
가설을 업데이트 하는 과정을 학습이라고 한다.
딥러닝과 같이 노드들이 많은 경우 시그모이드 처럼 미분값이 0에 가까운 값을 갖게 되었을때 값을 잃어버리는 경향이 있다. ( 때문에 계산 중간에 있는 히든 노드의 activation function은 ReLU를 사용하고 종단에 시그모이드나 소프트 멕스를 사용한다.)
w와 b를 업데이트 해서 하이퍼시스를 없데이트 한다.
데이터를 확보하고 라벨을 정하는 것이 중요하다.
데이터를 통해서 얻어 낼 수 있는 정보가 무엇인지..
session이라고 자원을 관리하는 추상화 오브젝트에 Computation Graph를 넣어서 실행한다.
one_hot : 레이블을 하나의 스칼라 값을 사용하게 되면 각 레이블 사이의 거리차가 발생하게 된다. 이 거리는 실제 데이터의 거리라고 할 수 없기 때문에 거리를 균일하게 정의 하기 위해서
* 변수들의 이름 정하기
- kullback-Leibler_vs_cross-entrypy . . . . 24 matches
기계 학습 모델에서 손실 기준이 가장 중요한 것 중 하나임은 의심의 여지가 없다. 다중 라벨 분류 작업에는 수많은 선택사항이 있다. 가장 적합한 기준을 선택하는 데 문제가 있을 수 있다: 교차 엔트로피 손실, 가중 교차 엔트로피 손실, Kullback-Leibler 분산, ML 프레임워크는 문제를 훨씬 더 복잡하게 만들기 위해 다소 지저분한 미로적 공식을 제공한다. 이러한 손실 기능을 살펴보면서 차이점을 강조해 보십시오.
교차 엔트로피 손실 기본은 단순히 대상 라벨에 대한 모델별 부정 로그 확률 점수 출력이다. 마이너스 로그의 성격상 문제가 발생할 수 있다. 특히 잘 분류된 표본의 경우, 점수가 나쁜 표본에 비해 처벌은 매우 가혹하다. 이것을 해결하기 위해, 종종, 긴장을 푸짐한 상실처럼 적용했다.
이름에서 알 수 있듯이 가중 교차-엔트로피 손실은 대상 등급의 가중치에 의해 가중되는 교차-엔트로피 손실에 불과하다. 라벨의 중요도를 반영하기 위해 사용된다.
이제 가장 환상적이고, 가장 강력한 KL의 분산이 온다. 기본적으로 두 확률 분포 사이의 거리 측정: 모델 및 지면 진실의 확률 분포에 의해 클래스 라벨에 대한 ML 확률 점수의 경우. 하지만 후자는 지상-진실 클래스의 핫코딩 벡터가 아닌가?
그래서 우리 손에는 꽤 많은 자유가 있다. 즉, 대상 클래스 라벨을 컨버전스 시 모델의 전진 패스에서 나타날 수 있는 적절한 분포로 변환하는 것이다.
예를 들어, 각 샘플에 대한 정량화 수준(8비트=256레벨)을 예측하는 FFTNet 또는 Wavenet 변형을 통한 오디오 생성을 고려해보자. 의심할 여지 없이, 이 문제에 대해 잘 훈련된 모델은 대상(희망적으로) 수준 주위에 가우스와 같은 분포를 반환한다. 이러한 분포를 목표로 삼아 KL 분산의 성과를 관찰하는 것이 이로울 수 있다. 공간적으로 관련된 라벨에 더 많은 문제를 제공할 수 있다.
포장: ML이 출시될 때, 대안에 대한 개방성을 유지한다. 특히 여기에서 논의된 바와 같이, 하이퍼 파라미터 튜닝 방법, 최적화 도구, 학습 속도 체계 및 기타 일반적인 것들이다. 가장 잘 어울리는 방법을 찾고, 옵션의 본질을 파악하며, 강력한 정교한 표현이 당신을 익사시키지 않도록 하라.
- lalsuite_info . . . . 7 matches
LALSuite는 LIGO 데이터 분석을 목적으로 사용하는 여러가지 라이브러리의 모음[* http://smirshekari.wikidot.com/lal]이다.
바이너리 설치[* http://www.lsc-group.phys.uwm.edu/daswg/download/repositories.html]는 데비안 계열 리눅스와 멕 OS만 지원한다.
--소스는 Git repository로 관리되며 python 2.6을 기반으로 하기 때문에 python 2.6이 시스템에 설치 되어 있어야 설치가 가능하다.--
소스를 이용한 설치방법은 [https://www.lsc-group.phys.uwm.edu/daswg/docs/howto/lal-install.html#lalsuite uwm]에 잘 정리 되어 있다.
make의 -j 옵션은 의미를 알수 없지만 옵션에 따른 차이는 못 느꼈다.
- lasso_regression . . . . 16 matches
= 회귀분석이란? =
무슨 일이던 정확한 정의를 알고 시작하느냐 그렇지 않느냐에 차이가 크다. 회귀라는 말은 일상에서 사용하지 안는 말이기 때문에 정확한 의미가 전달 되지 않는다.
회귀분석이란 어떤 변수(Y)가 다른 변수(X)에 의해 설명된다고 보고, 그 변수간의 관계(f)를 조사하는 해석방법이다.
간단한 예로 상점의 판매량을 예측하는데 판매량에 영향을 줄 수 있는 변수가 무엇인지 생각해보자. 그 중 하나인 '매장의 크기'가 판매량에 영향을 미칠 것이라고 생각할 수 있다고 하자.
매장들의 크기와 판매량을 기록해 보았더니 정말로 선형 관계가 있었다고 하자. 이를 이용해서 얻어낸 일차 함수식을 얻어 낼 수 있을 것이고, 이렇게 얻어낸 함수식에 대입해서 어떠한 상점의 판매량을 예측할 수 있을 것이다. __이것이 바로 선형회귀이다.__[* https://zimkjh.github.io/ml/Lasso-Regression]
선형 회귀는 사용하는 특성의 갯수에 따라 단순 선형 회귀, 다중 선형 회귀로 분류할 수 있고, ''Lasso는 선형 회귀의 단점을 극복하기 위해 개발된 방법''이다.
- latex_lyx_installation . . . . 7 matches
#title LaTex & LyX 설치 가이드
Linux 환경에서 LaTex 편집기를 사용하기 위한 설치 가이드
= LaTex 설치 가이드 =
Ubuntu 환경에서 레이텍을 설치하도록 한다. [* http://faq.ktug.org/faq/Ubuntu%BF%A1%BC%ADTeX%C7%CF%B1%E2]
ko.TeX/Download에서 ko.TeX의 배포판을 내려 받는다. 컴파일 없이 바로 설치하고 싶은 사람은 util-bin 피일도 내려 받는다.
LyX[* https://launchpad.net/~lyx-devel/+archive/ubuntu/release] 는 레이텍을 편하게 사용할 수 있는 편집기에 해당한다.
/etc/apt/source.list 에 아래 주소를 추가하고 키를 업데이트 한다.
- layer_wise_relevance_propatation . . . . 92 matches
인공신경망, 혹은 딥러닝은 기본적으로 블랙박스로 생각되며 계산 과정을 들여다 보기 힘든 구조를 갖고 있다. 하지만 이러한 딥러닝의 결론이나 계산 과정을 설명 가능('''Explainable''') 혹은 해석 가능('''Interpretable''')하도록 많은 연구들이 진행되었다. [:grad_cam CAM], [:grad_cam Grad-CAM] 과 유사한 방법론인 Layer-wise relevance propagation(LRP)[* ''Bach S, Binder A, Montavon G, Klauschen F, Müller KR, et al''. '''"On Pixel-Wise Explanations for Non-Linear Classifier Decisions by Layer-Wise Relevance Propagation"'''. PLOS ONE 10(7): e0130140. (2015) <https://doi.org/10.1371/journal.pone.0130140>] 을 설명하도록 하겠다.
인공신경망 내지 딥러닝의 동작을 이해하기 위한 연구들은 크게 두 가지로 분류할 수 있다. 첫 번째는 모델 자체를 해석하는 연구이고, 두 번째는 "외 그런 결정을 내렸는지"에 대한 연구이다. [* 공돌이의 수학정리노트. (18 Aug 2019). <https://angeloyeo.github.io/2019/08/17/Layerwise_Relevance_Propagation.html>. (7 Nov 2019).]
'''Layer-wise Relevance Propagation (이하 LRP)'''는 두 번째 종류인 ‘왜 그런 결정을 내렸는지’ 파악하는 방법에 속하며, 그 중에서도 decomposition을 이용한 방법이다.
LRP의 목적은 뉴럴네트워크의 결과물을 이해할 수 있게 도와주는 것이다. 아래 그림에서 처럼 훈련이 된 뉴럴네트워크에 임의의 샘플 \(x\)를 넣었을 때의 결과를 \(f(x)\)라 하자.
이러한 결과를 도출하기 위해 기여한 요소들의 기여도(relevance score)를 \(R_i\)라 하면 \(\sum_iR_i = f(x)\)와 같이 쓸 수 있다. 각 요소의 기여는 입력 \(x\)의 각 성분 혹은 Pixel의 중요도로 계산된다.
attachment:lrp.jpg?width=600px&align=center&title='''[[br]]이미지 출처''': Dr. Wojciech Samek ''http://iphome.hhi.de/samek/''[* ''Wojciech Samek, Thomas Wiegand, Klaus-Robert Müller''. '''"Explainable Artificial Intelligence: Understanding, Visualizing and Interpreting Deep Learning Models"'''. CoRR abs/1708.08296 (2017) <https://arxiv.org/pdf/1708.08296.pdf>.]
attachment:relevance.png?width=400px&align=center&title='''[[br]]이미지 출처''': Dr. Wojciech Samek ''http://iphome.hhi.de/samek/''[* ''Wojciech Samek''. '''"Towards explainable Deep Learning"'''. Talk at CoSIP Intense Course on Deep Learning in Berlin, Germany <http://iphome.hhi.de/samek/pdf/CoSIP2017.pdf>.]
재분배시 기여도가 보존된다는 말은, 특정 입력 \(x\)에 대해서 \(f(x)\)가 0.9였다면 각 layer의 뉴런들은 0.9라는 출력에 대한 기여도를 모두 조금씩 갖고 있으며, 이렇게 분배된 relevace score의 합은 0.9가 되어야 한다는 뜻이다.
attachment:network.png?width=400px&align=center&title='''[[br]]이미지 출처''': ''공돌이의 수학정리노트.''\(^{[2]}\)
위 그림과 같은 뉴럴 네트워크를 생각해보자. 앞서 설명한 것과 같이 뉴럴 네트워크의 예측값 혹은 출력값을 \(f(x)\)라 하고 이것을 수학적으로 어떻게 분해하고, '''기여도'''로 정의할 수 있는지 알아보자.
이 문제를 해결하기 위해서 앞장에서 설명한 '''기본적인 가정과 동작 방식'''에 따라 각 뉴런의 출력과 입력의 관계를 이용하여 기여도를 수학적으로 정의해보자.
attachment:neural.png?width=350px&align=center&title='''[[br]]이미지 출처''': ''공돌이의 수학정리노트.''\(^{[2]}\)
위 그림과 같은 뉴런이 있다고 생각해보자. 수학적으로 relevance score라는 것은 '''입력의 변화에 따른 출력의 변화 정도'''로 볼 수 있다.
다시 말해, 위 그림의 output \(f(x)\)에 대한 각 입력 \(x_1, x_2\)의 기여도는 다음과 같이 표현될 수 있다.
그러므로, 어떻게든 식과 같이 \(f(x)\)와 \(\cfrac{\partial f}{\partial x_1},\cfrac{\partial f}{\partial x_2}\) 간의 관계를 설명할 수 있는 적절한 식을 도출할 수 있다면, 출력을 relevance score로 분해하여 생각할 수 있다. LRP에서는 Taylor Series를 도입하여 설명하고 있다.
__언듯 보면, 학습과정의 back-propagation처럼 보이나 미분하는 관점이 weight가 아닌 입력값임을 주목하자.__
테일러 급수(Taylor series) 또는 테일러 전개(Taylor expansion)는 어떤 미지의 함수 \(f(x)\)를 아래 식과 같이 근사 다항함수로 표현하는 것을 말합니다.
여기서 error term \(\epsilon\)을 이용해 first-order Taylor series를 쓰면 다음과 같다.
즉, d차원 input에 대해서는 다음과 같이 first-order Taylor series를 쓸 수 있다.
위 식에서 우변의 두 번째 term이 의미하는 것이 바로 \(x_i\)가 변했을 때 \(f(x)\)는 얼마나 변했는가이다.
- lecture_note_machine_learning . . . . 100 matches
#title 기계학습법:알고리즘과 이론
나는 잠시동안 머신러닝에 대해서 배우길 원했다. 나는 강화학습에 익숙한만큼 머신러닝 기본에 대해서는 알고 있다. 아래 노트는 내가 머신러닝을 이해하기 위해 정리한 것들이고 대부분의 강의 자료는 Cal Tech CS 1156을 참고 했고 보조적으로 Stanford CS 229 Courera를 참고 했다.[* Aka Blaenk.Denum <https://www.blaenkdenum.com/notes/machine-learning/>]
우리가 존재할 수 있는 모든 데이터를 다 알고 있다면 모든 데이터를 원하는데로 나눌 수 있을 것이다. 하지만 현실적인 문제에서 존재할 수 있는 모든 데이터를 아는 것은 쉽지 않은 것이다. 때문에 샘플링이라는 것을 통해서 문제에서 정의하고 있는 데이터의 분포가 이럴 것이라는 추정을 한다.
때문에 학습이 가능하다는 것을 보이기 위해서는 아래의 가정을 만족해야 한다.
Hyporthesis g가 in-sample의 에러와 out-sample의 에러를 따름을 보여줌으로 학습이 가능하다는 것을 보였다.
하지만 이것으로 충분할까?
우리는 학습을 미지의 target function f와 유사한 Hyporthesis g(\(g \approx f\))를 찾는 것으로 정의했다. 또한 out-of-sample의 에러가 '''0'''에 가까워져야 한다. 에러가 크다면 학습이 되었다고 볼 수 없다.
정리하면 '''학습이 잘 되었다'''는 것은 아래와 같이 정리 된다.
Training과 Testing은 연습문제를 풀이를 하는 것과 기말시험으로 비유할 수 있다.
Testing 시나리오에서 일반적으로 학생이 기말시험을 얼마나 잘 보았느냐로 그 학생이 수업을 얼마나 잘 이해하고 있는지를 평가할 수 있다. 이 평가를 조금 더 잘 하기 위해서는 시험문제의 수\(N\)가 많아야 한다.
아래 수식은 Hoeffding's inequality이다.
Training 시나리오에서 \(E_{in}\)은 연습문제 풀이에서 얼마나 잘 했는지를 나타낸다.
Hyporthesis set \(h_i \in H\) 각각의 \(P(|E_{in}(h_i) - E_{out}(h_i)| \gt \epsilon )\) 확률의 합이 가장 좋은 Hyporthesis \(g\)의 \(P(|E_{in}(g) - E_{out}(g)| \gt \epsilon )\)의 upper bound임을 보였다.
Sample space에서 가능한 Hyporthesis의 수 M은 무한대이기 때문에 위의 수식의 upper bound는 의미가 없다.
위 수식에서 \(M=\infty\) 이기 때문에 M을 조금 더 의미 있는 것으로 바꾸려고 한다.
Bad Event \(B_m\)을 아래와 같이 정의 하자.
각 Bad Event들을 벤다이어그램을 그려서 보면 서로 Overlapping 되어 있을 것이다.
결과적으로는 각각의 Bad Event의 확률을 합보다는 적을 것이다.
실제로 Perceptron의 Hyporthesis를 보면 대부분의 Error에서 Overlap이 됨을 알 수 있다.
Hyporthesis를 셀때 모든 input space를 고려하게 되면 무한대의 수가 될 것이다. 때문에 모든 input space를 고려하는 대신에 선택된 Sample만을 구분하는 Hyporthesis의 수를 세는 것으로 바꿔보자.
- lecture_note_machine_learning_exercise . . . . 43 matches
SVM은 Decision Boundary에 가장 가까이 있는 support vector만을 고려하고 그 이외의 점에 대해서는 Decision Boundary의 결정에 고려하지 않는다. 반면 logistic reression은 모든 데이터 포인트에 가중치를 결합하여 Decision Boundary를 결정하기 때문이다.
분류 결과와 의도한 값이 같은 부호를 가지면 loss는 0가 되고 다른 부호를 가지면 0 보다 큰 값을 갖게 된다.
부호는 갖는데 y의 값이 1보다 작으면(예로 0.5) margin 여역에 포함된 것으로 판단하여 페널티 0.5를 부여한다.
커널 함수는 선형분류가 어려운 저차원 데이터를 고차원 공간으로 매핑하는 함수다.
하지만, 만약 차원이 아주 큰 고차원으로 변환한다면, 고차원 데이터를 SVM으로 연산(내적)하는 것은 많은 계산비용을 소모한다.
이것을 해결하기 위해서 '''커널 트릭(Kernel Trick)'''을 활용한다.
수학적으로 고차원 데이터를 내적하는 것과 내적한 결과를 고차원으로 보내는 것은 동일하다.
이 특성을 활용해서 비교적 계산비용이 저렴한 저차원에서 내적을 계산하고 그 결과를 고차원에 매핑하는 방법을 사용한다.
leave one out cross validation(LOOCV)은 샘플 수 만큼 모델을 만들고, 각 모델을 만들 때에 하나의 샘플만 제외하면서 그 제외한 샘플로 Test set performace를 계산하여 평균을 내는 방법이다.
각 웨이트에 reqularization factor \(\mathcal{C}\)를 아주 큰 값을 곱하면 사실상 그 역활은 없어짐을 알고 있다. 이때 각 웨이트별로 영향에 대해서 알아보면
에러가 증가한다. \(w_2\)가 작아짐으로 \(x_2\)의 값은 결정에 영향을 덜 주게 됨으로 \(x_1\)값만 사용해서 결정하는 형국이 됨으로 분류 성능이 떨어짐.
에러는 변하지 않는다. \(w_1\)이 작아짐으로 \(x_1\)의 값은 결정에 영향을 덜 주게 되지만 문제 자체가 \(x_2\)값만으로도 분류가 잘 되는 문제이기 때문에 에러에는 큰 변화가 없음.
에러가 약간 증가한다. \(w_0\)가 0에 가까워짐으로 bias term이 없어져 분류곡선이 (0, 0)을 중심으로 움직임으로 자유도가 떨어져 약간의 에러가 증가함.
시그모이드 함수의 출력범위는 0 ~ 1 사이의 값을 갖는다. 0.5를 기준으로 두 그룹을 나눈다면, \(e^{-z} = 0\)일때 0.5의 값을 가짐으로 z가 0이 되는 점을 classification boundary로 값는다.
Classification boundary는 \(z = w_7 + h_1w_8 + h_2w_9 = 0\) 이다.
히든 레이어에 activation function을 liner function을 사용하면 선형 결합에 의해서 레이어가 유지 되지 않음.
히든 레이어에 activation function을 liner function을 사용하면 선형 결합에 의해서 레이어가 유지 되지 않음.
문제 자체가 선형이기 때문에 선형 모델로 표현가능
문제 자체가 선형이기 때문에 임의의 두점만 사용해도 모든 점을 표현할 수 있음.
문제 자체가 선형이기 때문에 임의의 두점만 사용해도 모든 점을 표현할 수 있음.
- lets_encrypt_ssl . . . . 7 matches
키 생성은 도메인과 이메일 정보등을 넣어서 만들어준다.
인증과 키 생성은 생각보다 빨리 된다. 인증이 완료되면 dhparams 키도 추가로 생성하자
아주 오래걸림. 이것까지 완료되면 whansun.iptime.org에 대해서 ssl을 사용할 수 있고 모든 설정에 대해서 ssl 접속이 된다.
인증서가 갱신되면 웹서버도 재시작해줘야 한다. 이를 자동으로 해주는 방법은 아래와 같다.
이것이 잘 안된다면 stackoverflow[* https://stackoverflow.com/questions/42300579/letsencrypt-certbot-multiple-renew-hooks] 등을 찾아보고 수정해야 한다. 아직 정상 동작하는지 확인 되지 않았다.
- linux_Voyager_install . . . . 17 matches
설치 USB를 만들기 위해서는 프로그램이 필요한데
음악 플레이어와 연동해서 바탕화면에 플레이정보를 보여주는 툴
https://launchpad.net/covergloobus <------ 공식 사이트
http://covergloobus.deviantart.com/ <------- 테마 사이트
소스는 공식 사이트에서 구할 수 있고 배포 버전은 테마 사이트에 가면 알 수 있다.
지금 현재 1.7버전이 릴리즈 되어 있다.
우분투 버전의 바이너리를 Software Center를 통해서 설치 할 수 있도록 하고 있지만 지금 현재 정상 동작하지 않음.
받은 파일을 압축 해제하면 libflashplayer.so 파일이 나오는데 이걸 '''/usr/lib/mozilla/plugins''' 폴더에 넣어주면 된다.
동영상 볼 때 아 주 유용 터미널에서 실행할 수 있어서 편한(?) 점이 있음.
mpv와 마찬가지로 터미널에서 실행이 된다는 점이 흥미롭다.
윈도우와 리눅스의 문자 코드가 상이해서 mp3 tag에 있는 한글이 깨지는 경우가 많음 이를 해결하기 위해서는 [:mp3_unicade_change 유니코드를 리눅스용]으로 변경해줘야 한다.
- linux_apache2_init . . . . 6 matches
sites-available - 사용가능한 사이트 설정들
sites-enabled - 적용된 사이트 설정들
available 이라는 디렉토리들은 보통 사용가능한 설정 파일들을 저장하고 여기서 enabled 라는 디렉토리로 심볼릭 링크를 걸어서 사용하는 경우가 많습니다.
모니위키는 php기반으로 php가 필요하다. 단순 php만 있어야 하는 것이 아니라 아파치용 모듈도 필요로 한다.
보통의 경우 libapach2-mod-??? 이런식의 모듈을 함께 설치해줘야 한다. nginx와 같은 웹서버를 쓴다면 해당사항이 없겠다.
- linux_apt_get . . . . 14 matches
패키지 인덱스 인덱스 정보를 업데이트 : apt-get은 인덱스를 가지고 있는데 이 인덱스는 /etc/apt/sources.list에 있습니다. 이곳에 저장된 저장소에서 사용할 패키지의 정보를 얻습니다.
설치된 패키지 업그래이드 : 설치되어 있는 패키지를 모두 새버전으로 업그래이드 합니다.
'''sudo apt-get install 패키지이름'''
'''apt-get --reinstall install 패키지이름'''
'''sudo apt-get remove 패키지이름'''
'''sudo apt-get --purge remove 패키지이름'''
'''sudo apt-get source 패키지이름'''
'''sudo apt-get build-dep 패키지이름'''
'''sudo apt-cache search 패키지이름'''
'''sudo apt-cache show 패키지이름'''
apt를 이용해서 설치된 deb패키지는 /var/cache/apt/archive/ 에 설치가 됩니다.
- linux_compiler_assembler_process . . . . 552 matches
gcc는 예전에는 GNU C Compiler의 약자였으나 지금은 GNU Compiler Collection의 약자로 다양한(?) 언어의 컴파일러들의 집합체이다. gcc는 한마디로 GNU에서 개발된 ANSI C 표준을 따르는 C 언어 컴파일러라고 말할 수 있다. gcc는 ANSI C 표준에 따르기는 하지만 ANSI C 표준에는 없는 여러 가지 확장 기능이 있다. 또한 gcc는 통합개발환경(IDE)을 가지고 있지 않은 command line 컴파일러이다. 옛날 Turbo-C를 주로 사용해 보셨던 분들은 tcc.exe와 비슷하다고 생각하면 된다.
GCC 동작 과정을 통해서 컴파일러의 기본 동작을 이해한다.
오브젝트 코드 파일과 실행 코드 파일 이라는 두 바이너리 파일의 구분이 애매해서 차이를 찾아봤습니다.
왜냐하면, 여러 개의 소스코드를 모아 하나의 실행코드를 생성할때, 어떤 오브젝트코드들이 연결(링크) 될지 모르기 때문입니다.
(하나의 C소스코드만 작성했을지라도, 표준함수들이 정의되어있는 모듈들, 그리고 특히 C0.obj 라는 Start-up 코드와 결합(링크) 되어야 합니다.)
링크 과정을 거치면 실행 가능한 코드로서, EXE 파일이 만들어집니다.
그럼 EXE 파일이 주소를 가지고 있을까요? 네 가지고 있습니다. 하지만, 확정된 주소는 아닙니다.
여러개의 프로그램을 메모리에 동시에 로드해서 실행시킬수 있는 이유 역시 이런 EXE 구조 때문이라고 합니다.
프로그램 이라는 것은 메모리에 배치가 되고, CPU가 프로그램의 시작점에서부터 접근할때 의미가 있습니다.
EXE 파일의 배치 정보에는, 코드의 시작부분, 로드할 정보, 위치, 변수이름, 함수이름, 포인터의 주소 등 입니다. (오브젝트파일일때는 의미가 없는 정보들입니다.)
즉, 이 둘의 차이는 메모리 주소와 관련이 있습니다.
어 떤 정보가 object 파일 안에 들어있을까? 당연히 code와 data가 들어 있다. C 컴파일 과정에서 C 언어 함수 안에 있는 내용들이 assembly mnemonic 들로 바뀌었고 그것이 assemble되어 기계어(machine language)가 되었을 것이다. 그 부분이 code를 이룬다. C 언어 소스 코드에 있는 나머지는 전역 변수(external variable)와 정적 변수(static variable)들이 data를 이룰 것이다. 또한 문자열 상수를 비롯한 상수도 data에 들어 있다. 또한 프로그램 수행에 쓰이지는 않고 단순한 정보로서 들어 있는 data들도 있다. 예를 들어 -g 옵션을 주고 컴파일 하면 프로그램의 디버깅 정보(변수, 함수 이름, C 소스 파일이름, line number 등)가 data에 속한다고 볼 수 있다. 그런데 code와 data가 무질서하게 섞여 있는 것은 아니고 section이라고 불리우는 단위로 서로 구분되어 저장되어 있다. Code는 text section에 들어 있고, data는 성격에 따라 data section, bss section, rodata section 등에 나누어져 저장되어 있다.(text, data, bss, rodata 등의 section 이름은 그냥 관습적인 것이다.) 아무튼 section 이야기는 이 정도만 우선 알아두면 될 듯 싶다.
== Symbol 이야기 ==
relocatable object code안에 code와 data가 들어 있다고 했는데, 아주 중요한 것을 빠뜨렸다. 이 이야기는 linking 과정을 이해하기 위해 꼭 필요한 부분이므로 반드시 읽어야 할 것이다. 우선 Symbol이 무엇인지 알 것이다. C 언어 컴파일 과정에서 identifier와 함께 설명했는데 잠시 다시 말씀하자면 Symbol은 함수와 변수 이름이다. 변수 중에 특히 관심두어야 할 것 들은 자동 변수(?,auto variable)들이 아닌 전역 변수(external variable)와 정적 변수(static variable)이다. 자동 변수는 함수의 stack frame에 존재하는 변수이기 때문에 현재 stack pointer(sp, 보통의 CPU의 register중에 하나)에 대한 offset으로 표현된다. 즉 현재 함수에서 자동 변수(auto variable)를 access(read/write)하고 싶으면 sp+상수의 어드레스를 access하면 된다. 하지만 전역 변수와 정적 변수는 그냥 32bit(32bit CPU기준) 어드레스를 읽어야 한다. stack pointer랑은 전혀 관계 없다. 아무튼 여기서 관심을 두는 Symbol은 함수, 전역 변수와 정적 변수의 이름이라고 할 수 있다.
이제 생각해 볼 것은 C 언어 소스 파일을 C preprocessing, C 언어 컴파일, assemble 과정을 거치면 완전한 기계어로 바꿀 수 있느냐 하는 점이다. 완전히 기계어로 바꿀 수 있을까? C 언어 소스 파일 하나로 이루어지는 프로그램이라면 완전히 기계어로 바꾸는 것이 가능하겠지만 일반적으로는 불가능 하다. 다음과 같은 예제를 살펴보자.
위 의 예제를 컴파일 한다고 생각해보자. test1.c에서 func1()의 내용을 기계어로 바꾸고 싶은데 func2()를 호출하는 시점에서는 별로 문제가 안된다. func2()는 같은 소스 코드 내에 존재하고 func2()를 호출하는 instruction과 func2()의 실제 위치(어드레스)의 차이를 계산해 낼 수 있으므로 상대 어드레스를 이용하는 함수 호출 instruction으로 완전히 기계어로 바꿀 수 있다. 그런데 문제는 func3()를 호출할 때는 func3()의 실제 위치(address)를 계산할 수 없다는 문제점이 있다. 당연히 동일한 파일에 존재하는 함수가 아니므로 그 함수가 존재하게 될 어드레스를 계산할 수 없다. 어드레스를 모르는데 함수 호출 instruction을 완전히 만들 수 있을까? 만들 수 없다. 당연히 전역 변수 mydata를 access하는 부분도 마찬가지로 mydata의 어드레스를 모르므로 완전히 instruction으로 바꿀 수 없다. 그럼 어떻게 해야 될까?
그때 assembler는 그냥 함수 어드레스 없는 함수 호출 instruction을 기계어로 바꾸어 놓는다. 그런 다음에 그 instruction에 “func3()를 호출한다”라는 표지를 붙여 놓는다. 그럼 그 후의 과정(linking)에서 func3()의 address를 계산했을 때 그 빈 공간을 채워 넣게 된다. mydata와 같은 전역 변수도 마찬가지로 동작한다. test1.c을 컴파일할 때는 “func3()”, “mydata” 라는 표지를 사용해야 한다. 그럼 test2.c를 컴파일 할 때는 무엇이 필요할까? 상식적으로 생각하면 “func3()”, “mydata”가 여기 있다라는 정보를 가지고 있어야한다.
정리하면 object 파일 안에는 그 object 파일에 들어있는 symbol들(test1.o에서는 func1과 func2, test2.o에서는 func3와 mydata)에 대한 정보가 들어있고, 그 object 파일이 reference하고 있는 symbol들(test1.o에서 func3와 mydata 사용)에 대한 정보가 들어 있다.
위 에서 object 코드라고 하지 않고 relocatable object 코드라고 지칭했는데 relocatable이 뜻하는 것을 잠시 집고 넘어 가자. Relocatable을 사전에서 찾아보면 “재배치가 가능한” 정도의 뜻이다. “재배치가 가능한” 이라는 의미는 상당히 모호하다. 좀 더 구체적으로 말하자면 위에서 설명된 symbol들의 절대 어드레스가 정해지지 않았다는 뜻이다. 즉 test1.c의 func1()이 절대 어드레스 0x80000000에 존재해야 한다라고 정해지지 않고 어떤 절대 어드레스에 존재해도 관계 없다는 뜻이다. 그런데 이 말과 헷갈리는 말이 한가지 더 있는데 그것은 position independent code이다. C 언어 컴파일 과정에서 설명한 옵션중에 -f 시리즈가 있었다. 그 중에 -fpic라는 position independent code를 만들라고 강제하는 옵션이 있다. position independent code도 역시 절대 어드레스상에 어느 위치에 있어도 무방한 code를 지칭한다. 하지만 두 가지는 분명 차이가 있는데, 그냥 넘어가기로 하자. 쉽게 relocatable은 절대 어드레스가 결정되지 않았다는 뜻, 그러나 position independent code와는 다른 말이다.
Linking 과정은 ld라고 하는 실행파일이 담당하고 있다. Assemble을 담당하는 as와 마찬가지로 binutils 패키지의 일부분이다. 보통 어플리케이션을 컴파일하는 경우에는 gcc(실행파일)를 이용하여 ld를 호출하나, 특별한 경우에 있어서는 ld를 직접 수행하여 linking을 하는 경우가 종종 있다.
- linux_dasom_installation . . . . 3 matches
이제 다솜 입력기가 10월9일에 나왔습니다.
아직은 경우에 따라 제대로 작동하지 않는 경우들이 있다고 합니다.
한/영 키를 shift + space 와 한/영키 두 개로 지정하실 분들은 이렇게 해보세요
- linux_environ_variable . . . . 10 matches
* 환경변수(Environment Variable)는 리눅스의 쉘스크립트나 프로그램들이 실행 될때 참조하는 변수들이다.
* 이러한 변수들은 프로그램 내의 사용자 변수들과 구분하기 위해서 일반적으로 대문자로만 구성하는 관례가 있으며, 환경변수들은 사용자마다 개인설정에 따른 다른 값을 갖는다.
* 대표적인 환경변수에는 사용자의 홈드렉토리를 가르키는 $HOME, 명령을 검색할 드렉토리 목록인 $PATH, 전달된 매개변수의 개수를 나타내는 $# 등이 있다.
* 환경변수들은 '''이름 = 값 ''' 의 문자열 형태로 저장되어 있다.
* 해당 이름의 환경변수가 존재하지 않을 경우 null을 반환하고, 환경변수는 존재하나 값이 비어 있을 경우 빈문자열을 반환한다.
'''"이름=값"''' 형태의 문자열을 입력받아서 그것을 환경변수에 추가하는 함수.
* 메모리 부족이나 시스템적인 이유로 환경변수를 추가, 확장할 수 없는 경우에는 함수 호출 실패(-1)을 반환하고, 정확한 에러의 원인은 오류변수인 errono에 설정한다.
- linux_environment_module . . . . 1 match
받은 파일의 압축을 풀면 소스를 얻을 수 있는데 소스를 컴파일 하기 전에 tcl이 설치 되어 있는지 확인해서 없다면 설치 해줘야 한다.
- linux_exfat_ubuntu . . . . 4 matches
이전에는 exfat를 우분투 배포판에서 정식으로 제공하지 않았는데 14.04부터는 정식으로 제공하는 듯 합니다.
배포판에서 제공하는 exfat-utils 의 버전이 2.6까지 밖에 제공하고 있지 않은 상황에서 fuse-exfat가 2.7이상 버전을 요구하고 있기 때문이다.
- linux_fstab . . . . 21 matches
fstab은 이번 소개에서 배웠던 mount와 연관이 있습니다. 기존에 소개해드렸던 mount방법은 임시적이죠. 컴퓨터를 재부팅 하게되면 mount했던 설정들은 다시 초기화가 됩니다. fstab은 mount 설정을 영구적으로 할수있도록 존재하는 설정파일이에요.
먼저 fstab을 설정하기전에 예전에 하드디스크를 추가하면서 생성해놓은 파티션들이 존재하는지부터 확인하겠습니다. 그리고 파티션이 존재한다면 마운트가 되있는지 확인도 해야겠죠. 안되있어야 정상입니다!
파일시스템장치명은 곧 파티션들의 위치를 말합니다. 위에 fdisk -l를 처서 나온 부분을 보시면 /dev/sdb1~6까지의 파티션장치의 위치 즉, 주소를 나타내는것이 보일겁니다.
이러한 장치면을 써주는 필드입니다. 그대로 /dev/sdb1이런식으로 쓸수도있지만
라벨(Label)을 이용해서도 사용 가능합니다. 다른 항목들 소개후 라벨과 장치명 모두 사용하는 예를 들어보도록 할께요.
파티션 생성시 정해줬떤 파일시스템의 종류를 써주는 필드입니다. 저희는 ext3으로 파일시스템을 설정하였기때문에 ext3을써줘야 합니다. 일단 파일시스템은 무슨 종류들이 있는지 소개해드리도록 할께요.
ext2 -현재도 사용하며, 긴~파일시스템이름을 지원하는것이 특징입니다.
ext3 -저널링 파일시스템, ext2보다 파일시스템의 복수/보안기능을 크게향상되었고 현재 기본 파일시스템으로 쓰이고 있습니다.
exec - 실행파일이 실행되는것을 허용
noexec - 실행파일이 실행되는것을 불허용
quota - Quota설정이 가능
noquota - Quota설정이 불가능
0,1,2 총 3가지 옵션이 존재합니다.
대부북 루트부분이 1이기때문에 루트부분 검사후 검사합니다.
- linux_git_install_guide . . . . 14 matches
공식 사이트[[footnote(http://git-scm.com/)]]에서 소스를 받아서 컴파일해서 설치 한다.
저장소는 만드는 것은 공통으로 다음과 같이 간단히 만들 수 있다.
git init --bare는 Working Directory가 없는 순수 저장용 폴더를 만드는 것으로 이렇게 하게 되면
등의 파일들이 생기는 것을 확인 할 수 있다.
git서버가 계정을 다 갖고 있는다는 것도 경우에 따라서는 좋은 방법이 아닐 수 있다. 그래서 공통의 계정 하나를 생성하고 같이 쓰도록 설정하자. (git 계정 생성)
이렇게 하면 git 계정 하나로 git 서버에 접근할 수 있다. 하지만 또 하나의 문제가 모든 사람이 접근할 수 있다는 문제가 생긴다. 이것을 방지하기 위한 방법으로 ssh 공개키를 사용한 보안 설정을 하도록 하겠다.
접속 하려는 PC의 ssh 공개키를 git 계정에 등록해서 접근을 제어하는 방법이다.
위와 같이 ssh 공개키를 생성해서 git 서버에 등록해주는 방식을 취한다. 공개키를 생성할때 엄호를 넣지 않고 만들면 별도의 암호 입력이 필요 없어짐.
이 과정은 한번만 실행하면 되며 commit할 때마다 위에서 설정한 서명으로 올라가게 된다.
[:git_client_user_guide Git 클라이언트 사용 설명서]
- linux_gitweb_install_guide . . . . 3 matches
저장소를 /repo로 했을 경우의 설정이다.
를 실행서서 gitweb 웹관련 파일을 갖고 오면 끝이 난다.
아파치는 사용하는 모듈을 별도로 추가 설정해줘야 한다. cgi도 사용하기 위해서는 별도의 설정이 필요하다.
- linux_iconv . . . . 7 matches
conv 로 데이터파일의 언어설정을 바꿀수 있습니다.
위와 같은 형식으로 변경이 가능합니다. -f 는 기존의 언어셋을 -t 는 변경할 언어셋을 설정해 주면 됩니다.
확인이 필요하겠죠..(확인하기가 제일 어려움..ㅜㅜ)
-f, --from-code=<이름> 원 문서 인코딩
-t, --to-code=<이름> 출력 인코딩
-?, --help 이 도움말 리스트를 표시함
질문사항이 있으면 댓글 남겨주세요 ㅎㅎ
- linux_ifconfig . . . . 23 matches
시스템 관리자를 할때 가장 기본이 되는것이 네트워크 설정이지 않을까 한다.
X 윈도우 환경이 있을 수도 있지만 서버의 경우 윈도우 환경이 없이 사용 하는 경우도 있다.
이런 경우 네트워크 설정을 하는 것은 난감한 일이다.
= ifconfig 를 이용하여 특정 이더넷의 네트워크 설정하는 방법 =
ifconfig 명령을 이용해서 네트워크 설정을 변경하는 방법이다.
이 방법은 시스템 메모리상의 네트워크 설정 값을 바로 변경하는 것이기 때문에 네트워크 설정과 동시에 적용 되지만 시스템이 재부팅 되게 되면 사라진다는 점을 주의해야 한다.
= system-config-network 유틸리티를 이용하여 X 윈도우 환경에서 네트워크 설정방법 =
= X 윈도우 환경에서 네트워크 설정과 새로운 이더넷 추가방법 =
= 네트워크 설정 파일들을 이용하여 네트워크를 설정하는 방법 =
이 방법은 가장 기본적이면서도 가장 중요한 설명이므로 정확히 이해하여야 합니다.
네트워크 설정 파일에는 여러가지의 파일이 있습니다.
- linux_index . . . . 9 matches
1. [:linux_init_setup 리눅스 개발 환경 구축 가이드]
1. [:linux_git_install_guide GIT 설치 가이드]
= 프로그래밍 가이드 =
1. [:programming_openmp OpenMP 프로그래밍 가이드]
1. [:programming_mpi MPI 프로그래밍 가이드]
1. [:opencl_guide OpenCL 이론]
1. [:opencl_reqd_work_group_size attribute을 이용한 워크 그룹 사이즈 설정]
[:python_tip 파이썬 초보자가 흔히 저지르는 실수]
- linux_init_setup . . . . 46 matches
Linux 개발 환경을 구축하기 위한 가이드
설치는 특별한 설명이 없어도 설치가 가능할 정도로 아주 쉽다.
외부에서 터미널 접속을 지원하기 위해서 가장 먼저 해줘야 할 것이 SSH 설치이다.
/etc/sudoers 파일을 확인해서 자신이 추가한 user나 구룹이 추가 되어 있는지 확인해야 한다.
자동으로 추가 되지 않기 때문에 확인이 필요하다.
서버와 클라이언트 둘다 설치 해준다.
네트워크 토폴로지를 작성해 줘야 한다. (서버, 클라이언트 둘 다)
(rw) : NFS클라이언트에서 read와 write가 가능하도록 합니다.
(ro) : NFS클라이언트에서 read만 가능하도록 합니다.
(noaccess) : NFS클라이언트에서 NFS마운트를 허용하지 않도록 합니다.
(rw, root_squash) : NFS클라이언트가 root권한으로 NFS마운트를 하면 nfsnobody 권한을 부여하게 됩니다.
(rw, no_root_squash) : NFS클라이언트가 root권한으로 NFS마운트를 하면 root권한을 부여하게 됩니다.
(rw, no_all_squash) : NFS클라이언트가 NFS서버로 마운트를 할 경우에 동일사용자가 존재한다면 root를 제외한 일반사용자는 동일한사용자로 매핑이 됩니다.
(rw, all_squash) : NFS클라이언트가 NFS서버로 마운트를 하면 일반사용자도 nfsnobody 권한을 부여하게 됩니다.
NFS 설정 파일을 편집합니다. 원격에서 접속할 경우 방화벽 정책에 의하여 해당 연결이 되지 않을 경우가 있어, 해당 포트를 고정을 합니다.
(rw) : NFS클라이언트에서 read와 write가 가능하도록 합니다.
(ro) : NFS클라이언트에서 read만 가능하도록 합니다.
(noaccess) : NFS클라이언트에서 NFS마운트를 허용하지 않도록 합니다.
(rw, root_squash) : NFS클라이언트가 root권한으로 NFS마운트를 하면 nfsnobody 권한을 부여하게 됩니다.
(rw, no_root_squash) : NFS클라이언트가 root권한으로 NFS마운트를 하면 root권한을 부여하게 됩니다.
- linux_kernel . . . . 38 matches
리눅스 커널은 C언어와 AT&T 어센블리[[footnote(Intel 어셈블리 언어와 차이가 있음. 리눅스 커널 프로그램밍 이준희 저.)]] 언어를 사용해서 만들어졌다.
'''일반 응용 프로그램 개발과의 차이점'''!
1. 일반 응용 프로그램시에 우리는 C언어 라이브러리[[footnote(C언어 라이브러리는 libc를 말함.)]]를 사용하는데 커널 프로그래밍 환경에서는 libc 라이브러리를 사용할 수 없다.
물론 커널 코드 내에 libc 라이브러리를 포함 시킬 수도 있다. 그러나 libc를 포함 시킬 경우 커널 이미지 사이즈가 커지고 성능 저하가 일어난다.
때문에 중요한 몇 가지 라이브러리만을 커널 내에서 사용하도록 한다.
2. 커널 프로그램에서는 메모리 보호 기능을 사용할 수 없다. 응용 프로그램에서는 메모리 참조를 잘 못 하게 되면 "segmentation error"라는 메시지를 출력하며 응용 프로그램이 종료 되지만 커널 프로그램에서는 시스템의 치명적인 결과를 초래 할 수 있다.
3. 커널 내에서는 float형 변수를 사용하기 어렵다[[footnote(float형은 하드웨어 아키텍처에 의존적이므로 커널 내에서는 float형 연산을 지원하지 않는다.)]].
4. 스택 공간을 고려해서 써야 한다. 인텔 x86 아키텍처에서는 커널 스택은 8KB 이하이다. 만약, 큰 데이터 공간이 필요하다면 kmalloc 함수를 사용하여 커널 동적 메모리를 할당 받거나 전역 변수를 사용하는 방안을 고려해야 한다.
이 명령으로 옵션을 설정하게 되면 해당 디렉토리에 .config 라는 옵션 설정 저장 파일이 생성 된다.
이 파일을 재설정하려면 '''make oldconfig''' 명령을 수행하면 된다.
make mrproper를 수행하면 이 .config 파일이 지워진다.
기존 컴파일 시 생성된 오브젝트 파일과 같이 이전 컴파일시에 생성된 파일들을 삭제한다.
실제 커널 이미지를 만들기 위한 과정. 커널 이미지는 zImage나 bzImage 두 가지를 선택 할 수 있다.
zImage나 bzImage는 gzip으로 압축 되어 있고[[footnote(압축이 안 된 커널 이미지는 arch/i386/boot/vmlinux 파일로 존재한다.)]] 그 차이는 압축된 이미지의 사이즈가 1MB 이하이냐 아니냐의 차이다. '''b'''는 ''big''을 의미한다.
make bzImage를 수행하면 arch/i386/boot 디렉토리에 bzImage 파일이 생성 된다. 이 파일을 /boot로 복사해서 사용한다. 복사할때는 고유한 이름을 갖도록 변경해서 복사한다.
''/lib/modules/커널 버전'' 드렉토리에 컴파일된 모듈들이 복사 된다.
[linux_kernel_system_call 시스템콜 이란?]
- linux_kernel_asmlinkage . . . . 19 matches
asmlinkage는 어셈블리 코드에서 직접 호출(링크)할 수 있다는 의미이며
커널 소스의 <include/linux/linkage.h>에 다음과 같이 정의되어 있다.
일반적으로 C 함수는 어셈블리 코드에서 별 어려움없이 호출할 수 있지만
함수의 인자를 넘기거나 리턴값을 받는 부분 등의 호출 규약이 필요하다.
레지스터에 여유가 있는 ARM이나 MIPS 등의 아키텍처에서는
함수의 인자를 넘길 때 특정 레지스터를 사용하도록 호출 규약이 정의되어 있지만,
당연히 인자를 레지스터에 저장하여 넘기는 방식이 빠르기 때문에 (fastcall)
이 경우 GCC를 통해 자동 생성되는 코드는 적절히 변환되므로 문제가 없을테지만
이 경우를 방지하기 위해 어셈블리 코드와 링크되는 함수는
인자를 (레지스터를 이용하지 않고) 스택을 이용해서 전달하도록
선언하는 데, 이 때 asmlinkage가 사용된다.
대부분의 아키텍처에서 이 파일은 asmlinkage를 정의하지 않지만
i386에서는 다음과 같이 정의한다.
regparm 속성은 레지스터를 이용하여 전달한 인자의 수를 지정한다.
asmlinkage로 선언된 경우 모두 스택을 이용하고 (레지스터로 0개의 인자 전달)
(이 경우 EAX, EDX, ECX 레지스터를 이용하며, 인자는 정수형이어야 한다.)
- linux_locale . . . . 10 matches
로케일을 변경할 수 있는 방법은 세 가지가 있습니다.먼저 로케일이 시스템에 설치
이 명령은 시스템에 설치된 모든 로케일을 출력합니다. 필요한 로케일이 설치되어
있지 않은 경우에는 해당 패키지를 설치해야 합니다. 패키지 정보에 대해서는 이 문서의
참고:사용자 환경에 다른 로케일이 설정되어 있는 경우 위의 시스템 설정은 무시됩니다.
옵션 없이 locale 명령을 실행하여 로케일이 변경되었는지 확인하십시오.
참고:사용하려는 로케일이 설치되어 있지 않은 경우 자세한 내용은
다음 문서는 이 사이트에서 제공하는 것으로 로케일 설치 지침 및 로케일에 대한 자세한
- linux_openshot . . . . 6 matches
리눅스에서 동영상 편집할땐 OpenShot (http://www.openshotvideo.com/)를 이용해주세요. 정말 기능이 간편하면서도 강력하네요..
우분투는 간단히 PPA등록해 주시면 APT로 최신버전이 설치가능합니다.
동영상(http://vimeo.com/50513213)을 보시면 이해가 빠르실거라는..ㅋㅋㅋ
mkv나 avi를 mp4 등으로 변환할때는 Arista (http://www.transcoder.org/)를 이용해 변환하세용(팟인코더같은 명작)
위와같이 간단히~~
- linux_port_forwarding . . . . 18 matches
#title SSH를 이용한 Port Forwarding 방법
ssh를 이용해서 터너링을 할 수 있는데 그 방법에 대해서 알아보도록 하자.
이 방법은 로컬호스트의 특정 포트를 원격지에 있는 포트와 연결해서 원격지에 있는 서버를 로컬에 있는 것과 같이 사용할 수 있도록 해주는 것이다.
->로컬의 포트 8080에 원격지 210.119.60.156 서버의 80 포트를 연결하는 것으로 우회통로는 grid.nims.re.kr로 하겠다는 것이다.
그리드는 게이트역할을 하는 오픈된 서버이다.
이렇게 ssh로 grid.nims.re.kr 접속하게 되면 방화벽 안쪽에 있는 156번 아이피 주소의 서버의 웹(80 port)를 로컬 포트 8080에 접속하는 것으로 연결할 수 있다.
위의 방법은 게이트 역활을 해주는 서버에 접근 할 수 있는 권한이 있을 경우에 가능한 방법이다. 하지만 게이트 서버가 없다면 방화벽 안 쪽에 있는 서버에 접속할 방법이 없을까?
ssh -R 2222:localhost:22 ncity.net (ncity.net이라는 외부 호스팅 업체)
이렇게 접속을 유지하고 있으면 원격지에 있는 서버의 Port 2222과 방화벽 안 쪽에 있는 서버의 22번 포트가 연결 되게 된다.
이 상태에서 원격지 서버에 접속하고
- linux_programming_EXPORT_SYMBOL . . . . 18 matches
리눅스 커널에서 사용되는 모듈은 응용 프로그램에서 소스 형태로 컴파일되어 사전에 포함되는 정적 라이브러리와 달리 수행중에 삽입될 수 있다.
그래서 리눅스 커널에는 심볼릭 링크에 필요한 링크 처리 루틴이 있어야 하고 이를 참조하기 위한 심볼 테이블이 있다.
이 심볼 테이블은 커널이 컴파일되면서 자동으로 생성된다.
디바이스 드라이버에서 만든 함수와 변수도 이 심볼 테이블에 포함되는데, 이는 무조건 포함되는것이 아니라 매크로를 통해야 한다.
그 매크로 함수에는 다음과 같은것들이 있다.
이 매크로를 사용하려면 매크로 함수에 외부 참조를 허용하는 변수나 함수만 써넣으면 된다.
즉, 변수를 먼저 선언하고 그 이후 아무데서나 EXPORT_SYMBOL 매크로를 써주면 된다.
이 심볼을 사용하고자 하는 모듈에서는 extern 변수or함수명; 선언하고 사용한다.
- linux_smbfs_mount . . . . 2 matches
mount -t cifs -o user='사용자이름',password='패스워드' //서버주소/공유폴더 마운트경로
사용자 이름 : testuser
- linux_ssh_keygen . . . . 24 matches
키가 저장될 곳과 이름을 물어 오는데 디폴트로 그냥 엔터를 치고 넘어가면, 다음과 같이 인증키 암호를 물어온다. 원하는 암호를 두번 반복해서 입력해주면 키가 생성된다.
인증키 생성시 인증키 암호를 공백으로 (passphrase 를 물어올때 그냥 엔터를 치면 된다) 만들수도 있는데, 이것은 ssh 접속시 암호를 입력하지 않아도 그냥 접속이 되므로 편리할수는 있으나, 만약 당신의 인증키가 어떠한 경로로든 유출되었을 경우를 생각 해보면 피해야 할 것이다. 그리고 ssh-add와 ssh-agent를 사용하여 접속시마다 인증키 암호를 입력하지 않는 방법이 있다.
이제 ~/.ssh/ 안에 한쌍의 키(id_rsa 와 id_rsa.pub)가 생성되어 있을것이다. .pub 확장자가 붙은 것은 공개키로 이 파일을 접속할 리모트 서버들의 ~/.ssh/ 에 authorized_keys 라는 이름으로 복사해준다.
이제 ssh 접속을 진행 해보면 계정암호가 아닌 인증키 암호를 물어볼 것이다. 만약 계정 암호를 물어본다면 원격 서버상의 ~/.ssh 디렉토리나 공개키 권한의 문제이므로, 일단 접속후 chmod 755 ~/.ssh 그리고 chmod 644 .ssh/authorized_keys 해준다.
rsa1 방식의 ssh1 프로토콜의 사용할 것이라면 ssh-keygen -t rsa1 으로 키를 만들고, 공개키 (identity.pub)를 같은 방법으로 원격 서버의 ~/.ssh/authorized_keys 에 추가해 주면 된다.
키 파일을 다른 이름으로 저장했거나 서버마다 다른 키를 사용하려면 ssh에 -i 옵션을 사용해 키 파일을 직접 지정해 주면 된다.
다음과 같은 메세지를 보여줄 것이다.
이제 ssh-add 를 입력하면
이제 인증키를 복사해둔 ssh서버에 접속하면 이 세션에서는 더 이상 암호를 묻지 않을 것이다.
서버가 지원한다면 되도록 SSH2 프로토콜을 사용하도록 한다. SSH2는 SSH1과는 전혀 다른 프로토콜이며 더욱 안전하고, 성능이 좋다.
192.168.0.121과 관련한 ssh key를 제거 하는 명령이다.
- linux_system_guid . . . . 28 matches
시스템 관리자를 위한 리눅스 바이블[[footnote(시스템 관리자를 위한 리눅스 Bible 2002, 강기봉 저, JOYBOOK 출판)]]을 스터디 하면서 나름 적용해 보고 2013년에 맞게 재구성한 내용을 적어보려고 한다.
NIS의 정식 명칭은 NIS version 2를 말한다. 그러나 NIS+와 구별짓기 위해 YP(Yellow Page) system이라는 이름이 많이 쓰인다. NIS는 Network Information System의 약자이다. 1980년대 중반, Sun Microsystem에서는 두가지 protocol을 내놓았는데, 바로 NFS(Network File System)와 NIS이다. 이들은 Network를 통해 여러 개의 Workstation들을 하나의 시스템을 사용하는 것처럼 작동시켜주는 핵심적인 방법이다. 즉, NFS는 사용자들의 home 드렉토리들이 어느 시스템에서나 동일하게 보여지도록 하며, NIS는 passwd나 group 등의 네트워크 정보 파일들을 하나의 서버에서 관리하도록 하여 나머지 시스템에서 서버에서 제공하는 새로운 정보를 받을 수 있도록 하는 것이다.
NIS System은 네트워크 기반 위에서 구축 되기 때문에 네트워크 상태가 안정적이어야 한다.
네트워크 상태가 불안정하면 data의 손실 및 클라이언트들의 오작동 등 여러가지 안좋은 편상들이 일어나게 된다. 보통 하나의 서브넷에 서버와 클라이언트들이 같이 물려 있으면 괜찮다.
추천해주고 싶은 환경은 하나의 네트워크 덩어리를 만들어 주는 것이다. 외부 네트워크와 별개로 돌아가게 만들고, 외부와 내부를 연결하는 곳에 서버를 두면 최상의 상태를 유지하게 된다.
=== NIS서버와 클라이언트의 공통으로 해주어야 할 일 ===
NIS는 기본적으로 DNS를 사용하지 않는 것으로 되어 있다. 굳이 dns를 이용하고 싶다면 yp 설정에서 변경하지 말고 /etc/host.conf에서 바꿔주는 것이 좋다.
그렇기 때문에 /etc/hosts 파일에 각각의 서버 클라이언트의 호스트들을 등록해 두는 것이 사용이 원할하다.
NIS를 구성하기 위해서는 도메인을 하나 설정해야 하는데 아래와 같이 nims라는 nis 도메인을 설정한다.
위 방법은 일시적이다. 부팅시마다 설정하기 위해서는 /etc/sysconfig/network 에
/etc/rc.d/init.d/ypserv를 보면 /etc/sysconfig/network를 호출하기 때문이다.
- linux_ubunt_subversion . . . . 13 matches
프로젝트들이 저장 될 베이스 어드레스가 된다.
프로젝트는 코드가 될 수도 있고 기타 다른 것들이 될 수 도 있다.
현제 디렉토리에 있는 모든 파일들을 저장소에 저장한다는 뜻이다.
우선 작업이 된 파일을 확인 하기 위해서 '''status'''라는 명령을 사용한다.
변경된 파일이나 추가/삭제된 파일을 보여주는데 이것은 아직 저장소에 적용된 것이 아니다.
또한, 변경된 파일의 내용을 비교해서 보고 싶을때가 있을 것이다.
이때는 '''diff''' 명령을 사용한다.
이렇게 저장 될 때마다 리비전이 하나씩 증가하게 되는데 지난 기록을 보고자 할때는 '''log''' 명령을 사용한다.
기본으로 설정된 포트를 변경하게 되면 __svn://143.248.156.84:6548__ 과 같이 포트를 명시해줘야 한다.
- linux_ulimit_command . . . . 73 matches
/etc/security/limits.conf 를 참조해서 사용자마다 프로세스 사용과 메모리 사용에 제한을 두고 있는데 이것을 변경하기 위한 명령으로
이 글은 http://wiki.kldp.org/KoreanDoc/Ulimit-KLDP (문태준님 작성, 2000년 2월 24일(목))을 토대로 필자가 나름 내용을 추가하여 작성하는 글이다.
최대한 원글의 내용을 그대로 유지하되, 이미 10년이란 세월이 흘렀으므로 많은 변화가 있었다. 워낙 중요하고 좋은 글이라 그냥 그대로 가져다 쓰려고 했으나, 뭔가 아쉬운 느낌이 들어 없는 실력이지만 약간의 보충을 덧붙여보기로 했다.
* 이 글은 실제로 제가 대형서버를 운영하고 있는 상황에서 나온 글은 절대 아니며, 그냥 여기저기서 주워들은 이야기들과 자료들을 토대로 해서 작성한 것입니다. 동시접속이 몇백명에서 몇천명되는 서비스를 하려면 단순하게 커널 컴파일 한번 하고 끝나는 것이 아니라 여러가지 조정을 해주어야 할 것이 많습니다. 또한 하드웨어와 OS 제한이 있으므로 로드밸런싱(부하분산), 트래픽 분산 등을 하는 스위칭 장비, 클러스터링 시스템 구성이 필요할 수 있습니다. 그만큼 설계를 잘해야합니다. 여기에 언급한 것은 단지 쉽게 할 수 있는 맛보기 정도이지요. 이로 인해서 생기는 손해에 대해서는 본인이 절대 책임을 지지 않습니다. 또한 내용 중 틀린 부분도 많이 있을 것입니다.
예를 들어 대형 웹서버를 아파치로 서비스하는 경우를 생각해보자. 아파치는 기본적으로 프로세스 방식으로 서비스를 처리한다. 이건 사용자의 요구가 올때마다 하나의 프로세스를 띄우므로 만약 동시에 10명의 사용자가 접속을 하면 10개의 프로세스가 떠야한다는 것이다. 최근의 아파치 서버는 MaxClients 150 이라고 설정되어 있다. 이건 동시에 150 개의 프로세스를 띄울 수 있으며 결국 동시에 150명을 받아 들일 수 있다는 것이다(실제로 이정도만 하더라도 절대로 작은 규모는 아니다). 그런데 만약 nobody가 만들어낼 수 있는 최대 프로세스 개수가 그 이하라면? 당연히 문제가 생길 것이다. 물론 최근 레드햇 6.0 이상 버전은 그 이상으로 맞추어져 있어서 문제가 생기지는 않겠지만.
문제는 프로세스가 많이 뜨면 프로세스뿐만 아니라 열 수 있는 파일 수에서도 문제가 된다.
이 글을 작성하는 현재(2010.07.08) 많은 것이 바뀌어졌다. 현재 필자가 운용하는 아파치의 버전은 2.2.14 버전을 사용중이고, (원 글님이 글을 작성하셨을 10년전에는 아마 1.7.X 버전으로 사용되었으리라 생각한다) 아파치의 구동 방식도 하나의 요청마다 하나의 프로세스를 띄우는 방식이 아닌 메소드 및 기타 방식을 사용하는 형식으로 바뀌었다. 그리고 아울러 MaxClient의 수도 증가했음은 물론이다.
-c 최대 코어 파일 사이즈
-d 프로세스 데이터 세그먼트의 최대 크기
-p 파이프 크기
소프트 한도(soft)는 새로운 프로세스가 만들어졌을 때 디폴트로 적용되는 자원의 한도이다. 이것을 하드한도까지 등가시킬 수 있다. 그렇지만 이 한도를 넘어서 확장하는 것은 슈퍼유저만이 가능하다.
즉, 하드한도는 절대적인 선이다.
-> 절대 아니다. 이건 커널차원에서 지정을 해야 한다.
data seg size -> 프로세스의 데이터 세그먼트 최대크기
pipe size (512 bytes, -p) 8 -> 512-바이트 블럭의 파이프 크기
위의 내용 중 주의깊게 살펴볼 부분이 바로 한 프로세스에서 열 수 있는 file descriptor 의 갯수를 표시한 open files 항목과 한 유저가 생성 가능한 프로세스의 갯수 부분이다.
사실 이미 한 유저가 생성 가능한 프로세스의 갯수가 무한정으로 되어 있으므로 file descriptor 의 갯수는 그다지 큰 의미가 없다. 하지만 file descriptor의 갯수를 늘리고 싶다면 다음의 방법으로 가능하다.
2. /proc 를 이용하여 변경하는 방법.
사실 ulimit 명령으로 조절이 가능하나, 단지 보여주기만 할 뿐 실제적인 수정이 되지 않는다고 원글에는 나와있었다. 그래서 ulimit 관련 부분은 패스.
그러나, 프로그래밍의 경우는 ulimit 함수를 통해서 수정이 가능하다.
- linux_util_tar . . . . 3 matches
엄밀히 말하면 Tar은 파일을 압축하는 것이 아니라 하나로 묶어주는 유틸이지만 gzip과 함께
사용할 수 있기 때문에 압축이 된다고 볼 수 있다.
- mAP . . . . 17 matches
mAP는 이진 분류기의 성능 지표로 사용되는 정밀도와 재현율을 이용한 지표이며 객체 검출 알고리즘의 성능을 평가하는데 널리 사용합니다.[* https://inspaceai.github.io/2017/11/07/Mean_Average_Precision/]
* 재현율(Recall)은 실제 값이 참인 것 중 판정이 양성인 것의 비율을 나타냅니다. ‘참 양성 / (참 양성 + 거짓 음성)’으로 정의됩니다.
재현율은 민감도(sensitivity)라는 이름으로도 불립니다.
딥러닝 객체 검출 알고리즘에서는 검출된 상자가 참일 가능성(확률)이 같이 출력됩니다. 확률이 몇 퍼센트 이상일 때 양성으로 판정할지의 기준선인 ‘임계값’을 몇으로 정하는지에 따라서 예측 결과가 참인지 거짓인지가 달라지기 때문에 정밀도와 재현율도 모두 달라지게 됩니다. 임계값을 바꿔가면서 실제로 참인 객체가 임계값 내에 포함될 때마다 정밀도와 재현율을 모두 측정하면 실제로 참인 객체 만큼의 정밀도, 재현율 쌍이 생기게 됩니다. 여기서 정밀도만을 골라 내어 평균을 낸 것이 평균 정밀도(AP; average precision)입니다.
객체 검출에서 출력되는 경계 박스는 참인지 거짓인지가 출력되지 않고 경계 박스의 위치만이 출력됩니다. 이 경계 박스를 실제로 참으로 볼지 거짓으로 볼지는 실체 위치(ground truth)와 검출된 객체 상자 간의 IoU 값이 일정 이상인지를 평가하여 이루어집니다.
- make_clock_skew_detected . . . . 4 matches
git을 사용해서 각기 다른 시스템에서 작업하고 commit을 반복하다 보니 컴파일하는 시스템과 소스의 시간이 달라서 이런 에러가 발생하는 것을 알게 되었다. 컴파일 하는 것에는 큰 문제는 아니지만 컴파일시 지저분하게 출력되는 것이 보기 싫어서 아래와 같이 해결 했다.
- mamory_leak_valgrind . . . . 1 match
간단한 사용법으로 아래와 같이 사용할 수 있다.
- math_Euler_number . . . . 52 matches
전파거북이님[* https://ghebook.blogspot.com/2010/10/eulers-number.html]의 블로그에서 발취한 글입니다.
아이에게 수에 대해서 알려주려고 생각해보니 사람들이 왜 수를 사용하게 되었고 수를 사용함으로 어떤 것들이 가능하게 되었는지를 생각하게 되었습니다.
숫자 자체의 기호의 의미로 사용하는 numbering이 있을겁니다. 루이 13세, 철인 28호와 같이 기호적 의미가 있을테고,
또 다른 사용으로는 개수가 있을겁니다.(counting) 같은 것이 중복해서 여러 개가 있을때 수를 사용하지 않고 이것들을 표현한다면 어떤까요?
예로 계란이 30개 있다고 생각해 봅시다. 계란, 계란, 계란, ... 계란을 30번 외치면 될까요?
계란이 30개 들어가는 판이 있습니다. 계란이 가득 담긴 계란판이 10개가 있다면 계란은 몇 개 일까요?
더하기로만 표현하니 사람이 인식하기에 너무 길죠? 이것을 다시 확장하는 개념으로 곱하기를 사용해서 표현하면
30 x 10 = 300 이 됩니다.
곱하기는 동일한 덥샘이 몇개 있는지를 표기하는 것으로 간단히 표현 됩니다.
그러면 여기서 잠깐 동일한 곱셈이 덥셈처럼 많으면 어떻게 표현하면 좋을까요?
이것을 표현하기 위한 방법이 '''지수'''입니다.
때문에 밑수가 동일한 지수의 곱은 지수끼리의 덧샘으로 표현됩니다. 단순의 밑이 같은 수의 곱셈의 수가 얼마큼 있는지를 세는 것이기 때문입니다.
이 성질을 잘 이용하면 곱셈을 덧셈 관점으로 바꿀 수 있기 때문에 수학에서 많이 사용하고 조금더 편하게 사용하기 위해서 지수 함수의 역함수인 로그 함수의 가장 중요한 성질이 됩니다.
로그는 지수의 밑보다는 지수 자체에 관심을 갖는다. 밑을 통일하고 지수 관점에서만 보면 복잡한 곱셈이 단순 덧셈으로 치환되기 때문이다.
전파거북이님[* https://ghebook.blogspot.com/2010/06/differentiation.html]의 블로그에서 발취한 글입니다.
미분을 하는 이유는 해당 곡선의 기울기(slope)를 알기 위해서이고 일차 함수인 \(y =ax +b\)에서 a에 해당하며 변화율을 이용하면 아래 식과 같이 정의한다.
식 (1)에서 \(x_1\)이 \(x_2\)로 가까이 가면 이를 미분 혹은 미분값으로 정의할 수 있다.
2. '''미분소'''(differential) : 차분의 극한, \(x_1\)이 \(x_2\)로 한없이 가까이 가면 미분소라 한다. \(\lim_{x_1 \rightarrow x_2} =dx\)
3. '''미분법'''(diffentiation) : 미분소의 비율을 미분값으로 정의하고 이런 미분값을 구하는 방법을 미분법이라고 한다.
전파거북이님의 극한[* https://ghebook.blogspot.com/2010/07/limit.html]관련 글에서 시작합니다.
- math_complex_analsys . . . . 156 matches
#title 복소 함수론(Complex analysis)의 쉬운 이해
수학 분야에 멋지고 아름다운 이론이 많지만 수학적 아름다움의 최상은 복소 함수론(complex analysis)이다. 인간이 지금까지 제안한 이론 중에서 가장 단순하면서도 심오하고 그러면서도 너무나 아름다운 이론이 복소 함수론이다.
복소 함수론의 시작과 끝이며 가장 중요한 정리는 다음 식 (1)에 제시한 '''코쉬의 적분 정리'''(''Cauchy's integral theorem'')이다. 이 정리는 복소 함수론을 만든 수학자 '''코쉬'''(''Augustin-Louis Cauchy'')가 1814년에 제안하고 1825년에 증명했다[* A.-L. Cauchy, "Mémoire sur les intégrales définies prises entre des limites imaginaires (Memorandum on definite integrals taken between imaginary limits)," Académie des Sciences, Feb. 28, 1825.]. 자, 그럼 복소 함수론의 아름다움을 느낄 수 있는 다음 식을 보자.
여기서 닫힌 경로 \(c\)는 '''단순 연결'''(simply connected) 경로이며, \(f(z)\)는 닫힌 경로 \(c\)가 만든 내부 면적에서 항상 ''해석적인 함수''(analytic function)이다.
단순 연결 경로는 '''그림 1'''. 처럼 경로를 줄여갔을 때 점으로 수축될 수 있는 경로이다. '''그림 2'''.처럼 경로 내부에 구멍이 있으면 단순 연결이 아니다.
해석 함수의 원뜻은 해석학(analysis)으로 분석가능한 함수이다. 해석학이라는 학문은 '''무한'''(infinity)과 '''극한'''(limit)을 다루는 학문이므로 해석 함수는 우리가 생각하는 영역에서 극한이 존재하고 무한 급수(infinite series)로 표현가능해야 한다. 따라서 '''실해석 함수'''(real analytic function)라면 반드시 식 (2)의 '''테일러 급수'''(Taylor series)로 표현가능하고 수렴해야 한다.
식 (1)의 \(f(z)\)는 정확하게는 복소 해석 함수이지만 간단하게 해석 함수라고도 한다. 식 (3)를 이용하면 식 (1)을 쉽게 증명할 수 있다. 닫힌 경로를 반지름이 \(R\)인 원(circle)이라 가정하면 다음이 성립한다.
식 (4)가 0이 되는 이유는 분명하다. '''복소 지수 함수'''(complex exponential function)의 의미가 [그림 4]처럼 복소 평면을 회전하는 것이므로 \(m>0m>0\)인 경우는 항상 0이다. (∵ ''복소 지수 함수에 대한 경로 \(c\)의 시작점과 끝점이 같기 때문에 적분하면 당연히 0이 된다. 또는 식 (4)의 적분 자체가 회전을 의미하는 것이므로 아무리 돌려도 제자리로 돌아오기 때문에 0이 된다. 한 바퀴, 두 바퀴, 혹은 아무리 많이 돌더라도 정수배로만 돈다면 항상 제자리이므로 적분값은 항상 0이 된다.'')
여기서 가져야 하는 또 하나의 의문은 폐곡선의 내부와 외부를 어떻게 나누는가이다. 아주 일반적인 경우라면 '''조르당 곡선 정리'''(''Jordan curve theorem'')를 이용해 폐곡선의 내부와 외부를 정의할 수 있겠지만, 우리가 고민하는 것은 단순한 경우이므로 오른손 법칙만으로도 충분하다. 즉, 폐곡선이 휘어진 방향으로 엄지를 제외한 오른쪽 손가락을 위치시켰을 때 엄지가 위치한 부분이 폐곡선의 내부이다. 예를 들어, 오른손으로 돌려보면 [그림 1]의 폐곡선은 엄지가 구의 위쪽에 위치하므로 오른손 법칙에 의해 구의 위쪽이 폐곡선의 내부가 된다. 폐곡선이 휘지 않은 직선인 경우라면 폐곡선의 내부와 외부를 결정할 수 없다. 일반적으로 가면 더 어려워진다. 우리가 폐곡선의 내부와 외부를 판단하는 기준은 곡선이 휜 특성이다. 이 부분은 미분과 관련되기 때문에 미분할 수 없는 곡선(''예를 들면 프랙털 곡선(fractal curve)'')이라면 상황은 더 복잡해진다.
그런데 복소 함수를 미분하든지 적분하려면 그 미분이 반드시 존재해야 한다. 복소수는 2차원 복소 평면에 존재하기 때문에 복소수의 미분은 2차원 평면에서 정의되어야 한다. 따라서, 복소 평면에서 미분할 수 있는 방법은 [그림 5]처럼 무한히 많다.
복소 함수의 미분이 정상적으로 정의되기 위해서는 어떤 경로를 따라 미분하더라도 그 값이 같아야 한다. (''이런 함수는 정칙 함수(正則函數, holomorphic function)라고 한다. 로랑 급수(Laurent series)를 이용하면 복소수 범위에서 정칙 함수와 해석 함수는 서로 등가라는 것을 증명할 수 있다.'') 예를 들어 실수축(x축)과 허수축(y축)을 따라 미분하면 다음을 얻는다.
식 (6)은 복소 함수론에서 매우 중요하기 때문에 이름도 붙어있다. 바로 '''코쉬-리만 방정식'''(Cauchy-Riemann equation)이다[* B. Riemann, Grundlagen für eine allgemeine Theorie der Functionen einer veränderlichen complexen Grösse (Foundations for a General Theory of Functions of One Variable Size Complex Number), Inaugural Dissertation, Göttingen, Dec. 1851.]. 코쉬-리만 방정식은 리만(Bernhard Riemann)의 박사학위 논문[1]에 처음 등장한다. 이토록 중요한 방정식을 스물다섯살 청년 리만이 제안했다는 것이 놀랍다. 박사학위 지도교수인 가우스(Carl Friedrich Gauss)가 입이 닳도록 칭찬한 논문이 리만의 박사논문이다. 성격 자체가 까칠한 가우스가 리만을 칭찬한 것 자체가 리만의 위대성을 나타낸다. 수학책에도 나오는 데데킨트(Richard Dedekind)는 가우스의 마지막 제자였다. 하지만 가우스 교수는 리만 학생과 비슷한 시기에 심사를 받은 데데킨트 학생의 논문에는 별다른 평을 하지 않았다. 그만큼 수준 차이가 났다는 뜻이다. 그도 그럴 것이 리만의 논문에는 코쉬-리만 방정식, 가지 자름(branch cut) 방법, 등각 사상(等角寫像, conformal mapping), 리만 표면(Riemann surface) 등이 있었다. 리만은 코쉬의 복소 함수론을 기하학(geometry)적 관점으로 새롭게 봤다. 이 점을 가우스가 높게 본 것이다.
복소 함수는 \(x,y\) 이변수 함수이므로 '''완전 미분'''(exact differential)을 이용해 '''미분'''(differentiation)을 구해야 한다. 이 점을 이해하지 못하면 코쉬-리만 방정식의 의미를 알 수 없다.
식 (10)은 어떤 미분 경로를 택하더라도 미분값은 고정이므로 '''코쉬-리만 방정식'''이 잘 성립한다. 물론 이런 방식으로 리만이 증명한 것은 아니다. 이것은 수학적으로는 부실하지만 코쉬-리만 방정식이 성립하는 것을 편하게 보일 수 있다. 실제 리만은 '''켤레 복소수'''(complex conjugate)를 이용해 식 (6)을 증명했다.
미분 경로 \(dz\)에 관계없이 복소 함수의 미분이 일정하기 위해서는 식 (12)의 세째줄이 0이 되어야 한다. 이 조건이 바로 식 (6)의 코쉬-리만 방정식이다.
코쉬-리만 방정식은 복소 함수론에서 풍성한 결과를 만들어낸다. 대표적인 것이 식 (1)의 증명이다. 코쉬의 적분 정리를 실수부와 허수부로 쓰면 다음을 얻는다.
식 (14)를 이용하면 식 (13)은 다음의 면적적분(surface integral)으로 바뀐다.
식 (15)가 0이 되려면 반드시 복소 함수 \(f(z)\)가 식 (6)의 '''코쉬-리만 방정식'''을 만족해야 한다.
식 (4)의 원형 경로 선적분이 0이 되는 결과를 이용하면 식 (1)의 코쉬 적분 정리를 더욱 직관적으로 증명할 수 있다. [그림 6]처럼 임의 경로({{{{color:rgb(255,0,0);}빨간색}}})를 원형 경로({{{{color:rgb(0,255,0);}녹색}}})의 무한합으로 완벽히 표현할 수 있기 때문에(∵ 유한한 원형 경로로 표현하면 [그림 2]처럼 내부에 구멍이 생기지만 그 구멍을 다시 원형 경로로 만들면 구멍 크기를 한없이 줄일 수 있으므로) 임의 경로의 선적분은 식 (1)처럼 0이 된다.
이상 소개한 코쉬-리만 방정식과 코쉬의 적분 정리를 바탕으로 복소 함수론의 다양한 정리들을 증명해보자. 식 (1)의 코쉬 적분 정리로부터 직접 유도가 되는 유수 정리(residue theorem)를 먼저 살펴보자. 유수 정리는 코쉬가 1831년에 증명했다. 하지만 유수(留數, residue)라는 말은 코쉬가 이미 1826년에 제안했었다.
- math_complex_number . . . . 40 matches
실수(實數, real number)는 연산이 잘 정의되어 누구나 사칙 연산과 대수(代數, algebra)를 손쉽게 사용할 수 있다. 하지만, 복소수는 식 (1)의 규칙에 따라 계산을 해야 원하는 답을 얻을 수 있다.
숙달이 되면 그리 어렵지는 않지만 식 (1)의 규칙으로 인해 초보자들은 복소수 계산을 제대로 하지 못하는 경우가 많다. 단지, 식 (1)과 같이 \(i\)와 \(i\)가 곱해지면 실수 -1로 바꾸면 된다. 이 규칙만 기억하면 복소수 계산은 실수 계산과 거의 동일하다.
하지만 이런 복잡한 숫자인 복소수는 도대체 왜 사용할까?
'''이차 방정식'''(二次方程式, ''quadratic equation'': \(ax^2+bx+c=0\))의 해(解, solution)를 구할 때 실수만 고려하면 해가 존재하지 않는 문제가 발생하기 때문에 모든 이차 방정식의 해를 항상 찾을 수 있도록 도입한 상상의 수가 복소수이다. 즉, 식 (2)를 만족하는 새로운 수를 찾은 것이 식 (1)에 제시한\(i = \sqrt{-1} \) 상수이다.
실수는 항상 같은 수를 곱하면 0보다 크거나 같으므로 실수 범위내에서 식 (2)는 틀린 부등식이다. 하지만, 이차 방정식(\(ax2+bx+c=0)\)에는 식 (2)의 첫째줄과 같은 경우가 생길 수 있다. (예를 들면 \(x^2+1=0 \rightarrow x^2=−1\) 처럼 제곱한 값이 0보다 작은 경우이다.)
식 (2)와 같이 원식을 변형해 가고 식 (1)의 허수를 상수처럼 취급하면 식 (2)의 세째줄은 논리적으로 의미 있는 부등식이 된다. 왜냐하면 제곱한 값이 0보다 크기 때문이다.
따라서, \(ix\)는 실수값이 되므로 식 (2)의 답\((x)\)은 0을 제외한 허수축에 있는 모든 수이다. (∵ xx가 실수라면 \(ix\)는 실수가 될 수 없다. 따라서 \(x\)는 실수 이외의 수이다.) 하지만, 복소수 자체는 식 (2)의 첫째줄 같이 제곱한 값이 0보다 작아서 부등식 자체가 성립하지 않기 때문에 복소수는 크기 비교를 할 수 없다. (∵ 크기 비교는 실수축에서만 한다는 것을 생각하자. 그림 1 을 보면 허수축은 원점 좌우가 아닌 위아래에 존재한다. 허수는 크지도 작지도 0도 아니다.)
즉, 식 (1)의 상수는 0보다 크지도 않고 0보다 작지도 않다. 그렇다고 0인 것도 아니다. 허수 상수는 크기를 정의할 수 없다. 만약 식 (1)의 상수가 0보다 크다고 가정하고 식 (1)의 상수를 서로 곱하면 0보다 커야 하나 0보다 작다. 반대로 식 (1)의 상수가 0보다 작다면 서로 곱한 수도 여전히 0보다 커야 하나 0보다 작아진다. 식 (1)의 허수 상수는 부등식이 맞지 않는 이상한 수이다. (단순하게 보면 \(i\)가 양수든 음수든 \(i \times i\)는 0보다 적어 논리적으로 모순이다.)
복잡하게 새로운 기호 \(i\)를 도입하는 것보다는 \(\sqrt{-1}\)을 사용하는 게 더 쉬울 것 같다. 하지만 \(\sqrt{-1}\)을 이용해 다음 계산을 하면 복소수 계산의 오류가 생긴다.
그래서 \(\sqrt{-1}\)로 쓰지 않고 기호 \(i\)를 이용해 다음처럼 복소수 계산을 해야 한다.
복소수\((z=x+yi)\) 정의에 쓰이는 식 (1)의\(\sqrt{-1}\)을 단순 상수(常數, constant)라고 가정하면 실수와 동일하게 교환 법칙, 결합 법칙, 배분 법칙이 성립한다. 이때 실수와 차이나는 부분은 식 (1)이 성립한다는 가정이다.
이를 이용하여 복소수의 사칙 연산을 계산하자.
\(w=x_w+y_wi\)인 경우 나눗셈 (10)의 우변을 '''행렬'''(行列, matrix)로 표현하면 식 (11)이 된다.
[:math_complex_analsys 복소 함수론의 쉬운 이해]
- math_eigenvalue . . . . 12 matches
만약 Aχ = λχ 인 0이 아닌 벡터 χ가 존재하면 스칼라 λ를 A의 고유값이라 한다.
λ가 A의 고유값이면 Aχ = λχ 인 0이 아닌
1. ''A가 역행렬을 가지는 특이행렬일때만 0이 아닌 해를 갖게 된다.''
λ가 A의 고유값이면
'''(λⅠ - A)χ = 0''' 는 0이 아닌 해공간을 가지게 된다.
이를 λ에 대응하는 A의 고유공간이라고 한다.
그것은 λ에 대응하는 A의 고유벡터인 0이 아닌 벡터들의 집합이다.
- math_index . . . . 4 matches
#title 수학적 이론 정리 페이지
= [:math_complex_analsys 복소 함수론의 쉬운 이해] =
= [:math_line_to_point_length 점과 직선사이의 거리] =
- math_line_to_point_length . . . . 3 matches
#title 점과 직선 사이의 거리 공식
점 P\((x_1, y_1)\)와 직선 \(ax +by + c = 0 \ (a \neq 0, b \neq 0)\) 사이의 거리를 구해 보자.
이다.
- math_liner_algebra . . . . 1 match
아래는 mpif90을 테스트한 것이다.
- math_log_history . . . . 64 matches
우리들이 알고 사용하는 수는 18세기를 기준으로 많은 변화가 있었다.
일과 십, 백, 천, 만 까지는 일상적으로 통용되는 수이지만, 억이라는 단위 부터는 10의 8제곱이 되고 조는 10의 12제곱이 된다. 조라는 단위는 국가 예산이나 대 기업에서나 사용되는 수이지만, 좀더 큰 규모의 예산이 되면 경이라는 10의 16제곱이 사용될 날도 멀지 않을 것 같다. 그러나 우주공간을 계산하는 천문학적인 수라면, 10의 20제곱인 해, 10의 24제곱인 자, 양이라는 10의 28제곱도 사용될 수 있을 것이다. 그리고 심오한 종교의 세계에 들어가면, 구라는 10의 32제곱, 간이라는 10의 36제곱, 정이라는 10의 40제곱이 사용되며, 특히 불교의 세계에서는 10의 44제곱인 재, 10의 48제곱인 극, 10의 52제곱인 항아사, 10의 56제곱인 아승기, 10의 60제곱인 나유타, 10의 64제곱인 불가사의, 10의 68제곱인 무량수를 사용한다.
18세기 이전에도 이런 명칭은 있었으나, 조부터 10의 8제곱씩 늘어나 무량수는 1에 0을 무려 128개를 붙인 10의 128제곱수가 되었다. 반면에 작은 수도 소수 한자리를 분, 소수 이하 두 자리 수는 리 이고, ''호, 사, 홀, 미, 섬, 사, 진, 애, 묘, 막'', 순서이고 다음 수인 모호는 소수점 이하 13자리수를 의미한다. 그리고 다음으로 준순, 수유, 순식, 탄지, 찰라, 육덕, 허공, 청정 까지가 있다. 우리가 잘 사용하는 말인 순식간이라는 순식은 소수이하 16자리수를 말하며, 찰라 는 소수 이하 18자리 수, 허공은 소수 이하 20자리 수, 청정은 소수이하 21자리수를 말한다. 물론 18세기 이전에는 청정이 없는 대신 정이라는 소수이하 128자리까지 큰 수와 같은 수가 대칭적으로 있었다.
하지만, 실용주의 사상이 들어온 18세기 이후 이렇게 큰 수나 적은 수는 실질적인 의미가 없다는 생각으로 많이 축소되어 버렸다. 이렇게 엄청나게 크거나 작은 수를 실제로 계산되는 방법이 있는가? 또 이런 계산이 우리 생활에 실제로 응용이 되는가? 그 답은 모두 그렇다 이다. 수학자들은 이런 엄청난 큰 수를 쉽게 계산하는 방법을 고심하였고, 이런 계산법이 나왔으며, 이런 큰 수나 작은 수를 계산하기 위한 방법으로 고안된 것이 이른바 '''로그'''(''log'') 계산법이다.
17세기는 수학사에서 가장 빛나는 시기였다. 17세기 초 ''네이피어(Napier,J.:1550 ~ 1617)''는 로그를 고안하여 발표하였고, ''비에트(Viete, F. :1540 ~ 1603)''의 지수 표기법을 개선한 ''해리엇(Harriot,T. :1560 ~1621)''과 ''오트레드(Oughtred,W.:1574 ~ 1660)''는 대소의 기호화와 체계화에 기여하였으며, ''갈릴레이(Galilei, GaliLeo; 1564 ~ 1642)''는 이 로그를 응용하여 역학의 기초를 세웠고, 케플러는 행성의 운동 법칙을 발표하였다. 또한 17세기 후반에 ''데자르그(Desargues, G. ;1593~1662)''와 ''파스칼(Pascal, B. ;1623~1662)''은 순수 기하학의 새로운 장을 열었고, 직각좌표계를 창안한 ''데카르트(Descartes, R. ; 1596~1650)''는 해석기하학을 창시하였으며, 페르마의 마지막 정리로 유명한 ''페르마(Fermat, P. ; 1601~1665)''는 현대 정수론의 기초를 확립하였고, ''호이겐스(Huygens, C. ; 1629~1695)''는 확률론 등의 분야에서 두드러진 업적을 남겼다.
또한, 17세기말 ''뉴턴(Newton, I. ; 1642~1727)''과 ''라이프니츠(Leibniz, G.W. ; 1646~1716)''는 이전의 많은 수학자들의 기초 위에서 하나의 신기원을 이루는 창조물인 미적분학을 창시하여 근대 해석학을 열었다. 이와 같이 수학 연구의 새롭고 다양한 분야들이 17세기부터 시작되었다.
로그의 개념은 ''슈티펠(Stifel, M. ; 1487~1567)''의 책에서 처음 시작되어 스코틀랜드의 수학자 네이피어에 의해서 본격적으로 연구되었다. 그는 1614년 ‘경이적인 로그 법칙의 기술’에서 처음으로 로그 계산법에 관해 설명하였다. 오늘날 수학에서 사용되는 로그(logarithm)와 진수(antilogarithm)라는 낱말은 바로 네이피어가 만들어 낸 용어이다. 그러나 실제로 셈이 이용할 수 있는 로그표는 10을 밑으로 하는 상용로그를 고안한 ''브리그스(Briggs, H. ;1556~1631)''에 의해 만들어졌다.
- 김인수[[FootNote(전북대 수학과 김인수 교수 - '신문에서 읽은 수학 이야기', '수학의 세계' 저자.)]] 교수
- math_trigonometric_function . . . . 12 matches
디지털 신호처리를 공부하면서 주파수에 대해서 공부하다 보니 삼각함수에 대한 이해가 필요해서 정리한다.
보통 생활에서 사용하는 각도를 재는 단위로 도(degree, ˚)를 많이 사용한다. 하지만 미적분학 등에서 사용하기에는 불편한(?) 점이 발생해서 라디안(Radian)이라는 단위를 만들어 사용한다.
위 그림처럼, __반지름과 원주의 길이가 같아지는 각을 1라디안이라고 한다__. 같은 중심각이라면 반지름과 원주의 길이는 비례하므로, 이것으로 각도가 정의될 수 있다. 반지름이 1인 원의 둘레의 길이는 \(2\pi\)이므로, 360도와 \(2\pi\)라디안의 크기는 같다.
- math_variational_formulation . . . . 12 matches
자연현상을 수학적으로 표현하게 되면 거의 대부분 시간 그리고 공간에 대한 변화율을 포함하는 미분 방정식(differential equation)으로 귀착된다. 그런데 이러한 미분 방정식으로 표현된 수식을 강형(strong form)이라고 부르는데, 그 이유는 미분 방정식이 너무 높은 차수의 변화율을 요구하기 때문이다. 예를 들어, 분포하중을 받는 보(beam)의 처짐량은 4차 미분방정식으로 표현되기 때문에 보의 처짐량 분포는 4차 미분이 가능하여야 한다. 하지만 실제로 보의 처짐은 이보다 절반에 해당되는 2차까지 미분이 가능하면 된다.
변분 정식화는 물체 거동을 수학적으로 표현하는 또 다른 표현식으로써 요구되는 미분 차수가 강형의 절반에 해당된다. 이 표현식은 미분 방정식에 가상 변위(virtual displacement)를 곱한 다음 물체 전 영역에 대해 적분(integration)을 취하고, 부분적분(integration by parts)을 통해 미분 차수를 절반으로 감소시켜 구하게 된다. 표현식에 포함되어 있는 가장 높은 미분차수가 강형의 절반 수준이라는 측면에서 변분 정식화를 약형(weak form)이라고 부르기도 한다. 변분정식화는 물리적인 측면에서 가상일의 원리(principle of virtual work)와 일맥 상통하며 이 원리에 대한 수학적 표현식에 해당된다.
- math_지수함수_삼각함수 . . . . 15 matches
, 반지금이 1이면, \(h=1, a = \sin A, b = \cos A \)이 된다.
이것을 n승으로 확장하면 아래와 같이 정리된다. 이를 '''드 므아브르'''의 정리라 한다.
''오일러의 수'' \(e\)는 수열 \( \left( 1+ \cfrac{1}{n}\right )^n\)의 극한이다.
정의에 의해서 아래와 같이 쓸 수 있다.
이제 \(n \rightarrow \infty\)일 때, 극한값을 살펴보자.
\(r = \sqrt{a^2 + b^2} = \sqrt{1+\bigg(\frac{\phi}{n}\bigg)^2} \)의 극한값은 1이다.
이므로
이다.
이므로 두식을 더해
와 같이 지수함수와 삼각함수가 다르지 않은 하나임을 알 수 있다.
[:math_complex_analsys 복소 함수론의 쉬운 이해]
- metamaterial . . . . 97 matches
메타물질은 넓은 의미로 '자연계에 존재하지 않는 물성을 가진 가공된 인공적 물질'을 말한다. 또 다른 정의로, '물질' A와 B가 구조적으로 섞여서 나타나는 '복합물질'의 '유효물성'이 물성 A와 B의 단순 합으로 나타나지 않을 때를 이르기도 한다. 보다 정교한 정의로 메타물질은 '메타원자'(meta-atom)로 구성된 물질을 칭한다. 메타원자는 목적에 따라 설계된 내부구조를 가지며, 그 구조와 크기, 주기적(periodic), 혹은 준주기적(quasi-periodic) 배열 등에 따라 다양한 유효물성을 발현시키게 된다.[1]
1990년대 말, John Pendry 교수에 의해 이론이 정리되기 시작하여 20년이 조금 안되는 동안 연구가 진행 되었다. 기술이 발전하면서 해결되지 않은 몇가지 난제가 존재한다.
1. 대역폭(Operation bandwidth): 공진기(Resonator) 구조를 채용하는 경우, 공명대역 부근에서만 메타물질의 물성이 특화될 수 있다. 이를 극복하기 위한 방안으로, 서로 다른 공명주파수를 갖는 공진기들을 함께 사용하거나, 비공명(Non-resonant) 구조의 메타원자를 사용하는 기술 등의 연구가 필요하다.
2. 손실(Loss): 전자파 메타물질의 재료로서 주로 사용도는 금속을 한 예로서 들면, Ohmic loss에 의한 전자파의 손실은 메타원자의 공명특성을 연화시킬 뿐만 아니라, 설계된 메타물질에 손실을 수반한다. 이를 극복하기 위해서 금속보다 손실이 작은 Highly doped semiconductor와 같은 물질을 개발/사용하거나, 손실이 작은 유전체 기반의 메타원자를 설계하는 연구가 진행중이다.
3. 설계(Design): 지금까지의 메타물질 설계방식은 거의 대부분 trial-error/retro-fit 방식으로 이루어지고 있다. 메타물질의 구조를 반복적으로 수치해석/실험을 통해 원하는 물성이 나올 때까지 변경하는 방식을 주로 사용하였다. 이런 방식은 통합된 시각에서 top-down 설계가 불가능하고, 따라서 실현 가능한 물성의 영역을 원리적으로 파악 및 구현이 힘들다는 단점이 있다. Full/semi-analytic한 방식으로 목표물성값을 주는 메타원자의 내부구조를 도출하는 것은 메타물질의 자유로운 구현에 있어서 중요한 과제이다.
4. 가공(Fabrication): 방향성이 있는 메타물질의 응용범위는 매우 넓지만, 등방성(isotropic)을 가지는 메타물질을 구현하는 것은 그 응용을 더욱 확장시켜줄 것이다. 따라서 3차원구조의 메타물질, 더블어서 파장이 작은 가시광 영역의 메타원자에 사용되는 수십 nm 크기의 구조체를 원하는 모양대로 가동하는 것은 현재의 나노공정 기술에 있어서도 쉽지 않은 일이다. 이를 위해서 대면적 공정기술과 더 높은 해상도의 구조물 가공기술이 개발되어야 한다. 이를 위해서 자가조립 방식의 조립기술이나 nano-imprint 방식의 기술들이 시도되고 있다.
앞에서 서술한 기술적 난제들을 극복한다면, 완벽한 메타물질의 구현이 가능할 것이다. 그러나 현 상태에서도 파장이 긴 파동, 음파, 마이크로파, THz파 등의 구조체가 쉽게 만들어질 수 있는 분야와 매질의 손실이 크게 중요하지 않은 흡수채, 차단재 및 파동집속 기술 등의 응용분야에서는 기술적인 실현이 어렵지 않게 빠른 시일 내에 응용기술들이 선 보일 것으로 전망한다.
메타물질의 응용분야가 폭넓고, 경우에 따라서 특수한 목적을 가지고 사용될 것이 예상되기 때문에, 산업화의 난제는 각개의 기술별로 상이할 것으로 판단된다. 대규모생산이 필요하지 않으며 원가나 수요에 민감하지 않은 특수한 응용 분야와, 구조체가 큰 메타물질의 경우는 (마이크로파 협대역 흡수체 등) 수년 이내에도 산업화가 가능할 것이나, 대량 생산과 나노구조 기술이 필요한 경우에는 (예를 들어 광대역 태양전지를 위한 완전흡수, 전도성 메타물질) 실험실 수준을 벗어난 대 면적, 저가가공기술의구현과, 사용가능한 원천 소재의공급, 대체재 (예로서 화석연료) 존재 여부 및 가격 등에 따라서 산업화 여부와 그 시기가 영향을 받으리라 생각된다. 파장이 긴 통신대역 안테나는 이미 2009년 Netgear, Rayspan, LG 등에 의해 일부 상용화되어 사용되고 있으며, 메타물질 안테나를 개발하는 Kymeta라는 회사는 빌 게이츠 등의 투자를 받기도 하였다[1]
또한, 129억 달러의 시장을 지니고 있는 초음파 진단 시장, 20억 달러의 시장을 지니고 있는 방진 소재 시장, 360억 달러의 무선통신 및 전자소자 시장, 390억 달러의 조명 및 태양전지 시장, 154억 달러의 의료용 이미징 시장 등에서 극한물성 시스템을 이용한 지속적 시장 성장과 신제품의 창출이 가능할 것으로 전망되며, 2022년에는 1,554억 달러 규모의 연관 시장이 형성될 것으로 전망되고있다. (출처: Energy Harvesting and Storage for Electronic Devices (IDTechEx, 2009), Metamaterials: Technologies and Global Markets (BCC Research, 2012), Ultrasonics: Global markets and technology (BCC Research, 2008))
2014년 한국기계연구원 내에 파동에너지 극한제어 연구단이 출범하여 9년 동안 미래창조과학부로 부터 매년 약 100~130억원의 연구비를 지원 받고 있다. 사업단은 총 3개의 핵심 과제를 수행중이며 극한물성 시스템 이론정립과 제조, 측정, 평가 플랫폼을 구축하여 파동과매질의 상호작용을 극한제어하는 극한물성시스템을 구현하고, 기계, ICT, 에너지, 바이오/의료 융합화를 통한 실용화로 6T(NT, IT, ET, BT, CT, ST) 신산업을 창출하는 것을 목표로 하고 있다.
진동 메타물질 - 저주파 대역에서의 광대역 진동을 차단하는 것은 다양한 기계 분야에서의 지속적인 이슈이다. 실제로 자연계에 존재하는 모든 물질은 질량 법칙(mass law)으로 '큰 파장의 파동을 차단하기 위해서는 매우 큰 질량과 거대한 부피의 구조가 필요하다.' 자연계에 존재하지 않는 음의 밀도나 음의 강성을 갖는 메타물질이 있다면 질량 법칙에 구애받지 않고 매우 가볍거나 얇은 구조로 파동 차단이 가능하다는 것이 밝혀졌다.
메타물질을 통한 파동 및 진동 차단은 크게 미소구조의 주기성 특성을 응용한 음향양자 결정구조(Phononic crystal)를 이용한 방식과 내부 공진(Internal resonace) 미소구조를 통한 음의 물성을 이용하는 방법으로 나뉜다. 이 중 미소구조의 주기적 특성을 이용하는 방식은 미소구조 간의 간격기 파장의 절반이 되는 주파수 대역에서 미소구조 간의 상쇄간섭을 통해 파동 및 진동을 차단하는 방식이다. 이 방식은 상쇄간섭이 이루워지는 해당 주파수에서만 동작하기 때문에 광대역화하려는 연구가 다수 진행 중이다. 그 중 밴드 어드조이닝 기법(band adjoining method)이 최근에 제안 되어 광대역 저주파 진동 차단을 가능케 하고 있다.( 오주환, 울산과학기술원, 기계항공 및 원자력공학부 조교수)
굽힘진동은 다른 탄성 모드와는 전혀 다른 지배 방정식으로 표현되기에, 기존 탄성 메타물질에 적용되던 다양한 메타물질 과련 기법이 적용될 수 없는 분야이다. 기존의 탄성 모드는 메타물질의 밀도와 강성 두 종류 물성치로 파동 특성을 기술하지만, 굽힘진동은 밀도와 회전 관성(rotational inertia), 전단 강성과 회전 강성(rotataional stiffness)의 네 종류의 물성치로 파동 특성을 기술해야 한다. 따라서 굽힘 메타물질에서는 파동 특성을 네 종류의 물성치를 독립적으로 제어하는 것으로 조절이 가능하다. 굽힘 메타물질을 이용한 진동 차단 기술 중 가장 대표적인 예로, 최근 굽힘파의 특성을 이용하여 메타물질의 전단 강성과 회전 강성을 독립적으로 제어할 수 있다면 저주파에서 광대역 굽힘 진동을 차단하는 것이 가능하다고 밝혀졌다. 메타물질을 공학적으로 설계하여 굽힘 강성을 낮추고 동시에 전단 강성을 매우 높일 경우 매우 넓은 주파수 대역에서 저주파 진동이 차단 가능함을 이론적으로 발견한 것이다. 메타물질의 굽힘 강성과 전단 강성을 독립적으로 조절하기 위하여, 주로 기계적 링키지 메커니즘 분야에서 널리 사용되고 있던 힌지 연결구조가 공학적으로 도입되었다. 제안된 메타물질을 통해 차단 가능한 주파수 대역은 235Hz에서 4520Hz로, 이는 현재까지 구현된 그 어떠한 메타물질보다도 더 넓은 주파수 대역에서의 저주파 진동 차단 기술이다. 이 와 같이 굽힘 메타물질의 특성을 이용하여 보다 효율적인 진동 차단을 구현하고자 하는 다수의 연구가 진행되고 있으며, 이러한 연구들이 향후 진동 분야에서의 혁신을 가져올 수 있으리라 기대한다.( 오주환, 울산과학기술원, 기계항공 및 원자력공학부 조교수)
음향 블랙홀은 러시아의 M. A. Mironov가 제시한 쐐기 형상의 구조물이다. 판/보의 부께를 멱법칙(Power-law:\(h(x0=\varepsilon x^m\))형상으로 충분히 완만하게 감소시켜 끝 단의 두께를 0으로 만들면, 음향 블랙홀의 끝 단으로 진행하는 굽힘파(Bending Wave)는 파동의 속도가 무한히 느려져 두께가 0인 끝 단에 도달하지 못하게 된다. 따라서, 끝 단으로부터 반사되는 파동에너지가 없으므로 음향 블랙홀로 입사하는 굽힘파는 마치 블랙홀에 빨려 들어가는 것처럼 반사 없이 모두 음향 블랙홀로 흡수된다. (Mironov M. A., 1988, Soviet Physics Acoustics, Vol. 34, No. 3, pp. 49~87)
음향 블랙홀 효과란 평판이나 보의 진동을 음향 블랙홀 끝단에 집중시킨 후, 끝 단에 부착된 소량의 감쇠 물질을 통해 탄성 변형을 열로 소산시킴으로써 본래 구조물로의 탄성파 반사율을 낮추어 진동을 감쇠하는 효과이다. 기존의 음향 블랙홀은 진동 감쇠 성능을 향상시키기 위해서 길이를 길게 할 경우 많은 공간을 차지하는 단점이 있었다. 이를 보완하기 위해서 중고주파 영역에서 진동 감쇠 성능은 유지하면서 차지하는 공간을 줄이기 위해서 나선형 음향 블랙홀이 제안 되었다. (전원주, KAIST, 기계공학과 부교수)
최근 사물인터넷(IoT), 5G 등 첨단 ICT 기술 발전과 함께 첨단 부품에 대한 수요가 급증하면서, 기존 소재의 한계를 뛰어넘을 수 있는 새로운 소재나 구조에 대한 관심이 높아지고 있다.[3]
[1] 역학 메타물질: 연구동향과 전망, 대한기계학회, 이진우 교수(아주대), 기계저널 2018. 7., 58, No. 7
[2] 메타물질 개요와 파동에너지 극한제어 연구단 소개, 박남규(서울대), 이학주(한국기계연구원), 물리학과 첨단기술 April 2015.
- ml_revie_infogan . . . . 6 matches
InfoGAN: Interpretable Representation Learning by Information Maximizing Generative Adversarial Nets[* https://arxiv.org/pdf/1606.03657.pdf]에 대한 리뷰는 몇몇 사람들에 의해서 이미 되었기 때문에 논문을 읽어 보는 것과 동시에 다른 사람들의 논문 리뷰를 참조하도록 하겠다. 가장 먼저 세틀렉아이에서 근무하는 김홍배 박사의 infoGAN 설명 변역자료[* https://www.slideshare.net/ssuser06e0c5/infogan-interpretable-representation-learning-by-information-maximizing-generative-adversarial-nets-72268213]와 유재준 박사의 블로그[* <http://jaejunyoo.blogspot.com/2017/03/infogan-1.html>] 를 참고 했다.
아래 동영상은 네이버에서 근무하는 차준범님의 pr-12 발표 영상을 참조 했다.
--Loss Function으로 Cross Entropy를 사용할 경우 label값이 0인 경우에는 prediction값에 무관하게 0으로 처리 되기 때문에 이를 보완하기 위해서 대칭 되는 항을 추가해서 사용했다.--
label 값으로 '0', '1'만을 갖는 경우에 아래와 같이 Cross Entropy(''Binary entropy'')를 전개할 수 있다.
- modern_cpp . . . . 9 matches
#title Modern C++ 이모저모
위 4가지 방법은 모두 같은 결과를 나타낸다. 그 중 중괄호를 사용한 생성 방법을 균일 초기화(Uniform initialization)[* https://pppgod.tistory.com/27] 이라고 한다.
a, b 는 callable value로 L-Value이고, "abc"는 temperary value로 R-Value이다.
정확히는 L-Value는 표현식(대입식)이 끝나도 그 값이 유지되는 객체를 말하고,
R-Value는 표현식이 종료되면 더이상 존재하지 않는 값들을 말한다.
std::move()는 L-Value를 R-Value로 변환해준다. 이게 무슨 말인지 아래 예제로 알아보자.
- mp3_unicade_change . . . . 13 matches
mp3 파일의 한글 입력 방법에 따라서 리눅스에서 한글이 깨져 보이는 현상이 있는데 이것을 해결해보자.
mp3 태그를 일일이 손으로 수정할수는 없는 일이다.
이것을 자동으로 해주는 프로그램이 있다.
이것을 이용해서 하위 폴더에 있는 모든 음악 파일을 수정해 보자.
mutagen은 python 기반으로 python이 설치 되어 있는 모든 운영체제에서 사용할 수 있는 것으로 보인다. 고로 python이 설치 되어 있다면 mac에서도 동일하게 사용 가능하다. 설치는 아래와 같이 하면 된다.
- multi_GPU_pytorch . . . . 30 matches
Multi-GPU를 사용해서 딥러닝을 수행하는 방법은 간단하면서도 어렵다. 이유는 많은 부분을 딥러닝 라이브러리에서 수행해 주기 때문이고 이 기능이 GPU를 100% 활용하지 못하기 때문이다. 7-80% 정도 GPU를 활용하는 것에 만족한다면 딥러닝 라이브러리에서 제공하는 Data Parallel을 사용하면 된다. 갖고 있는 모든 GPU를 100% 활용하고 싶다면 아래 방법들을 공부하고 연구해보자.
NLP분야에서도 2018년 BERT 기점으로 큰 데이터셋에 큰 모델을 사용하여 성능을 높이는 방향으로 연구가 진행되었다.
PyTorch에서 기본적으로 Multi-GPU 학습을 위한 Data Parallel 기능을 제공한다. 아래 그림은 Data Parallel이 작동하는 방식을 보여준다.
attachment:data_parallel.png?width=1000px&title='[[br]]이미지 출처: https://medium.com/huggingface/training-larger-batches-practical-tips-on-1-gpu-multi-gpu-distributed-setups-ec88c3e51255'
위 방법으로 딥러닝을 여러 개의 GPU에서 계산하려면 동일 모델을 GPU에 복사하고 iteration마다 batch를 GPU 개수로 나눠서 forward 과정을 수행합니다. 이렇게 계산할 데이터를 나누는 과정을 'Scatter'라고 합니다. 이 과정은 Data Parallel이 수행해 줍니다.
이렇게 각 GPU에서 입력에 대한 출력이 나오면 이 결과를 하나의 GPU에 모읍니다. 이렇게 tensor를 하나의 device로 모으는 것을 'gather'라고 합니다.
딥러닝 모델의 출력과 정답을 비교하는 loss function이 있다. 이 loss function을 통해 loss를 계산하고 back-propagation을 수행할 수 있다. Back-propagation은 각 GPU에서 수행하며 그 결과로 각 GPU에 있던 모델의 Gradient를 구할 수 있다. 이렇게 계산된 Gradient는 모델을 업데이트하기 위해 또 하나의 GPU로 모아서 업데이트를 한다.
이런 일련의 작업들을 단순히 아래 코드 한줄이면 된다.
nn.DataParallel()로 모델을 감싸면 학습을 할때 replicate → scatter → parallel_apply → gather 순서대로 학습 데이터를 쪼개고 합치는 일을 수행한다.
하나의 Device로 모든 데이터를 합치기 때문에 하나의 GPU의 메모리 사용량이 많을 수 밖에 없다.
일반적으로 DataParallel을 사용한다면 아래와 같이 학습 코드를 구성할 수 있다.
- multiprocessing . . . . 65 matches
동시성(concurrency)를 python에서 구현하는 방법에 대해서 알아보자 물리적인 코어와 별개로 가상의 라이프 타임을 설정하여 프로그램의 동시성을 구현할 수 있는 방법이 여러개 존재하는데 그 차이점과 활용에 대해서 알아보자.
여기서 동시성이란 '''여러 작업들을 마치 동시에 실행되는 것 같이 보이게''' 실행하는 방법을 말한다. 실제 여러 작업을 동시에 수행하는 병렬(parallel)과는 조금 다른 개념이다.
컴퓨터로 처리하는 작업은 크게 CPU-Bound Job과 I/O-Bound Job으로 나눌 수 있다. CPU-Bound Job은 일을 수행하는데 CPU 자원이 사용되는 일이고 I/O-Bound Job은 일출력이 주된 일이다. 이 두 가지 일을 적절히 배분하면 동시성을 통해서 전체적인 일의 수행을 효과적으로 할 수 있게 된다.
Python에서는 여러개의 Thread가 있을 때 동기화하기 위해서 Global Interproter Lock(GIL)을 사용합니다. 이 기술은 전역으로 Lock을 두고, 이 Lock를 점유한 thread만 작업을 수행하도록 제안하기 때문에 동시에 하나의 thread만 수행되게 됩니다.(이 때문에 실제 물리적 CPU Core를 다 사용할 수 없음)
Threading library를 사용하면, CPU 활용에서 이점을 얻을 수 있는데 CPU 계산이 끝나고 I/O 작업을 수행해야 하는 순간 idle 상태가 되는데 이때 다른 쓰레드의 일을 수행할 수 있다. 이 때문에 CPU는 쉬지 않고 다른 작업을 수행한다.(CPU 100% 활용)
1. Signal 클래스는 쓰레드 외부에서 쓰레드를 제어하기 위한 용도로 사용될 클래스이다.
1. spinner 함수는 별도의 쓰레드에서 실행할 함수이다.
* spinner 함수는 문자열 |/-\ 을 순차적으로 thinking 이라는 문자열과 함께 무한히 출력한다. 기존 출력을 지우고 새로 출력하기 때문에 막대기가 회전하는 것처럼 보이게 된다.
* signal.go 값이 False 이면 루프를 멈추고 나온다.
* 가상의 시간이 오래걸리는 I/O bound 작업을 처리하는 함수이다.
* time.sleep 을 호출하면 주어진 시간동안 메인 쓰레드는 블락된다. 하지만 그 동안 GIL이 해제되어 다른 쓰레드가 작업을 진행할 수 있게 된다.
* supervisor 함수는 별도의 쓰레드를 생성해서 spinner 를 처리하도록 하고, 이어서 slow_function 작업을 처리한다. slow_function 의 처리가 끝나면 별도의 쓰레드에서 돌고있는 spinner 함수의 루프도 종료시킨다.
* 별도로 생성된 thread 오브젝트를 출력한다. 대략 <Thread(Thread-1, initial)> 와 같이 출력된다.
* slow_function 을 실행시킨다. 이 부분에서 메인 쓰레드는 result 값을 받을 때까지 블락되어 있다. 이 동안 별도의 쓰레드에 넘겨진 spinner 함수가 실행된다.
* slow_function 의 실행이 끝나면 signal.go 의 값을 False 로 바꾸어주어서 spinner 함수의 루프가 종료되도록 한다.
threading 라이브러리의 Thread 객체에는 외부에서 쓰레드를 제어할 수 있는 API가 없기 때문에, 위 예제에서는 직접 Signal 이라는 객체를 만들어서 쓰레드를 종료시켜주었다.
1. time.sleep 대신 asyncio.sleep 을 활용하면 이벤트 루프를 블락하지 않고 sleep 할 수 있다.
1. sleep 이 끝난 시점에 asyncio.CancelledError 가 발생하면, 이는 테스크가 취소된 것이며, 따라서 루프를 종료해준다.
1. slow_function 은 이제 코루틴이 되었다. await 문을 사용해서 I/O bound 작업을 하는 동안 이벤트 루프를 진행시킨다.
1. await asyncio.sleep(3) 부분에서는 3초동안 I/O 작업(sleep)이 끝나기를 기다린다. 그 동안 이벤트 루프는 계속 진행되며, 작업이 끝나고 나면 slow_function 코루틴이 이 부분에서 이어서 진행된다.
- neovim . . . . 15 matches
설치가 되면 nvim을 실행보자 v0.4.0-dev 버전이 설치 되었음을 확인했다.
.config 디렉토리를 만들고 init.vim등을 만들어 사용하면 되는데 vim 설정을 그래로 사용하고 싶다면 아래와 같이 할 수 있다.
vi plug-in 관리자로는 [https://github.com/junegunn/vim-plug vim-plug]을 설치했다. 다른 패키지 관리자도 많이 있지만 선택한 이유는 병렬처리가 된다는 점이다 병렬로 설치와 업데이트가 되기 때문에 다른 패키지 관리자들 보다 빠르다는 장점이 있다.
뛰어쓰기 가이드로 코딩을 하거나 할때 사용하면 좋음.
" 로컬 리더 키 설정은 취향이니 각자 마음에 드는 키로 설정한다
" vimwiki의 conceallevel 을 끄는 쪽이 좋다
== 메타데이터의 updated 항목 자동 업데이트 ==
== 새로운 문서 파일을 만들었을 때 기본 형식이 입력되도록 하기 ==
이벤트 헨들러와 같이 자동실행 되도록 설정한다.
- netstat . . . . 26 matches
netstat(Network statistics)는 전송 제어 프로토콜, 라우팅 테이블, 네트워크 인터페이스 등 네트워크 상태를 확인 할 수 있도록 정보를 제공해 준다.
-p : 프로그램 이름 / PID
-i : 이더넷 카드별 정상/에러/드랍 송수신 패킷 수 확인
-r : 라우팅 테이블
||CLOSED ||완전히 연결이 종료된 상태 ||
||CLOSE_WAIT ||TCP 연결이 상위 응용프로그램 레벨로부터 연결 종료를 기다리는 상태 ||
||ESTABLISHED ||서버와 클라이언트 간에 세션 연결이 성립되어 통신이 이루어지고 있는 상태
(클라이언트가 서버의 SYN을 받아서 세션이 연결된 상태) ||
||FIN_WAIT1 ||클라이언트가 서버에게 연결을 끊고자 요청하는 상태(FIN을 보낸 상태) ||
||FIN_WAIT2 ||서버가 클라이언트로부터 연결 종료 응답을 기다리는 상태
(서버가 클라이언트로부터 최초로 FIN을 받은 후, 클라이언트에게 ACK를 주었을 때) ||
(서버가 클라이언트에게 FIN을 보냈을 때의 상태) ||
||LISTEN ||서버의 데몬이 떠 있어서 클라이언트의 접속 요청을 기다리고 있는 상태 ||
||SYN_SENT ||클라이언트가 서버에게 연결을 요청한 상태 ||
||SYN_RECEIVED ||서버가 클라이언트로부터 접속 요구(SYN)을 받아 클라이언트에게 응답(SYN/ACK)하였지만, 아직 클라이언트에게 확인 메시지(ACK)는 받지 못한 상태 ||
||TIME_WAIT ||연결은 종결되었지만 당분간 소켓을 열어 놓은 상태, 약 1분 정도이며 시간이 지나면 사라짐 ||
- network_QoS_diffserv . . . . 9 matches
QoS 란 Quality Of Service 의 약자로서, 네트워크의 품질을 보장한다는 의미이다. 즉, 실시간 트래픽 (음성, 영상) 등을 처리함에 있어서 많은 트래픽으로 인해 장애가 발생하지 않도록 해주는 것이다.
이 때 트래픽을 우선순위에 따라 차등 처리되게 함으로써 품질을 보장해주게 된다.
QoS 의 표준 모델 중 하나이다.
비슷한 성질을 가진 트래픽을 하나의 클래스로 묶어 각 클래스에 가중치를 부여하고, 이 가중치에 따라 서비스를 처리하는 방식이다.
1. 트래픽이 들어오면 Classifier 는 비슷한 성질을 가진 트래픽끼리 묶어 클래스로 분류한다. (ACL 과 Class-Map 을 통해 분류)
1. 미터에 의해 측정된 트래픽 플로우를 사전에 약속한 트래픽 특성과 비교하여 결과에 따라 마킹한다. (구분한 클래스에 대해 Policy-Map 을 통해 마킹하여 우선순위 지정한다. IP Precedence, DSCP 가 L3 마킹 종류이다.)
1. 마킹 된 패킷은 컨디셔너를 통해 약속된 트래픽 대역폭에 맞추어 조절한다. (약속된 대역폭을 초과할 경우, Shaping 혹은 Drop 방식으로 처리한다는 의미이다)
- neural_additive_models . . . . 3 matches
찾아보니 국내 이 논문에 대해서 작성된 리뷰가 있다. [* https://themore-dont-know.tistory.com/14?category=837958] 간단한 설명이지만 참고가 될만한 코드[* https://github.com/merchen911/NAM]가 있어서 기록을 남긴다.
기본적으로 딥러닝 모델은 해석이 거의(?) 불가능한 블랙박스로 취급되어진다. 본 논문에서는 Generalized additive models (GAMs)[* https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=je1206&logNo=220804476471]의 한 종류인 유리박스(glass-box) 모델인 Neural Additive Models(NAMs)를 제안하고 있다.
- nextcloud.conf . . . . 1 match
server unix:/var/run/nextcloud.sock; 이 부분은 '''/etc/php/7.3/fpm/pool.d/nextcloud.conf''' 설정에 의해서 생성된다.
- nextcloud_installation . . . . 6 matches
Nextcloud는 홈페이지(https://nextcloud.com/changelog/)에서 최신 버전을 다운 받아서 설치한다.
이렇게 하면 Nextcloud 설치는 끝이다. 여기서 주의해야 할 것은 사용자와 권한이다. __사용자로 새로운 사용자 nextcloud를 추가해서 사용한다는 것을 기억해 둬야한다.__
이 설정에서 user, group, listen.owner, listen.group에 주의해서 설정한다.
설정을 적용하기 위해서는 아래와 같이 php를 재시작한다.
- nginx_php . . . . 3 matches
NextCloud 설치 과정을 정리한다. 웹서버와 db 관련해서 ''Nginx, PHP-FPM, MariaDB, Let's Encrypt SSL'' 라이브러리를 사용했다.[* 가장 잘 정리된 nextcloud 설치 메뉴얼 <https://pyxispub.uzuki.live/?p=601#8_Nginx>]
'''max_execution_time''': php 스크립트가 실행되는 최대 시간을 의미하며, 용량이 큰 파일을 업로드할 경우를 대비해서 넉넉히 잡아준다.
웹 서버 설정은 '''/etc/nginx/nginx.conf''' 이다.
- nims_ann_library . . . . 3 matches
이 문서는 NIMS ANN Library를 위한 API 문서 입니다.
NIMS ANN Library는 OpenCL 베이스의 병렬 인공신경망 라이브러리를 목표로 합니다.
- nims_cluster_install_guide . . . . 17 matches
아래 기술하는 모든 내용은 Ubuntu 12.04 64bit 기준으로 이루워 진다.
Intel OpenCL를 설치하고 실행 시켜 보면 라이브러리를 찾을 수 없다는 에러를 볼 수 있다. 이것은 '''libOpenCL.so'''가 /usr/lib64에만 설치 되기 때문이다.
* '''libnuma.so.1''' 라이브러리 에러 처리
AMD-APP-SDK-v2.8-lnx64.tgz 압축을 풀면 아래 파일들이 나온다.
그래픽 카드 드라이버[[footnote(https://help.ubuntu.com/community/BinaryDriverHowto/ATI 우분투에 ATI 그래픽 카드 드라이버 설치하는 법)]]를 설치해줘야 사용 할 수 있다. 그래픽 카드 드라이버는 System Settings -> Additional Drivers에 보면 AIT 그래픽 카드를 볼 수 있는데 선택하고 Activate 버튼을 누르면 알아서 설치 된다.
그래픽 카드 드라이버 설치[[footnote(https://help.ubuntu.com/community/BinaryDriverHowto/Nvidia 우분투 nVidia 그래픽 카드 드라이버 설치하는 법)]]
네트워크를 통해서 파일을 받아와서 설치하는 방식으로 설치에 상당한 시간이 걸린다. (퇴근하기 전에 설치를 하는 것이 좋다. 너무 오래 걸림)
드라이버를 설치 하기 위한 준비
1. make mrproper 로 기본 작업을 한다. (한번이상 컴파일했다면 안해도된다.)
1. make bzImage 로 커널이미지를 만든다.
1. svn을 사용하기 위한 클라이언트를 설치 한다.
- nims_rule . . . . 147 matches
제 1조 (목적 )이 규정은 국가수리과학연구소(이하 “연구소”라 한다)에서 시행하는 소규의 제정 및 개폐에 관한 사항을 규정하여 연구소 운영의 합리화를 기함을
제 2조 (적용범위 ) 소규관리에 관하여는 따로 정하는 바 외에는 이 규정에 의한다.
① 이 규정에서 “소규”라 함은 연구소에서 계속적 ,반복적 효과를 가진 규범적 문서로서 규정 ,세칙 및 지침을 말한다.
② 세칙은 규정의 하위 소규이며 ,지침은 세칙에서 위임한 세부사항인 사무기준과 작업표준에 관한 사항을 명시하는 세칙의 하위 규정이다.
제 5조 (세칙 )세칙은 규정의 시행 또는 소규의 유지관리를 위하여 구체적이며 개별적인 사항을 정한 문서로서 다음 각 호의 사항을 내용으로 정한 것을 말한다.
제 7조 (소규화)각 부서는 소관 업무수행상의 절차 및 기준을 정하여 이 규정이 정하는 바에 따라 가능한 한 소규화하여야 한다.
① 소규의 제정 ․개정 및 폐지권자는 국가수리과학연구소장(이하 ‘소장’)이 되며 ,소규심의위원회의 심의를 거쳐야 한다.다만,법령개정 및 직제개편 등에 따른 단순한 문구․자구 등의 수정이나 경미한 사항의 개정은 심의를 생략할 수 있다.(개정 2013.7.16)
① 위원회는 위원장 1인과 7인 이내의 위원으로 구성
② 위원은 소장이 위촉하며,위원장은 연구본부장이 된다.(개정 2013.7.16.,2017.01.23.)
③ 위원회에 간사 1인을 두되 ,간사는 주관부서장이 된다.(개정 2013.7.16)
제 10조의 2(소규심의위원회 위원장)위원장은 회무를 맡아 처리하고 회의를 소집하며 그 회의의 의장이 된다.다만,위원장이 유고시에는 소장이 지명하는 위원이 그 직무를 대행한다.(개정 2013.7.16)
제 10조의 3(소규심의위원회 의결정족수)위원회는 재적위원 과반수의 찬성으로 의결한다.다만,가부동수인 경우에는 위원장이 결정권을 가진다.(개정 2013.7.16)
제 10조의 5(소규심의위원회 서면결의 )위원장은 경미한 안건에 대하여는 위원회의 의결을 서면결의로 갈음할 수 있다.이 경우 다음 위원회에 그 결과를 보고해야한다.(개정 2013.7.16)
제 11조 (주관부서)소규의 제정,개정,폐지 및 배포에 관한 사항은 기획담당부서장이 주관한다.
② 각 부서장은 제1항의 규정에 의하여 배부 등록된 소규를 지체 없이 소속직원에게 공람시켜야 한다.(2014.7.8.개정 )
제 14조 (세부사항의 규정 )소규의 형식,배부,유지 및 관리 등에 관한 세부사항은 소장이 정한다.
제 1조 (시행일)이 규정은 2012년 12월 31일부터 시행한다.
제 2조 (경과조치 )이 규정 시행일 이전에 시행된 사항은 이 규정에 의하여 시행한 것으로 본다.
제 1조 (시행일)이 규정은 2013년 7월 16일부터 시행한다.
제 2조 (경과조치 )이 규정 시행일 이전에 시행된 사항은 이 규정에 의하여 시행한 것으로 본다.
- nips2016 . . . . 39 matches
2016년도 학회가 처음으로 참석한 해이다. 전해 듣기로는 이전 연도까지 각종 CNN과 RNN관련 논문들이 발표되었다고 들었다. 하지만 올해는 그 어느 발표에서도 이 두 키워드를 찾아볼 수 없다. 이미 두 알고리즘에 대해서는 소화가 끝났고 배설이 시작되는 듯하다. 이미 딥러닝을 이루는 빌딩 블록이 되어 버렸기에 어디에도 언급되지 않는 것이다. 올해의 새로운 키워드는 Unsupervised Learning이다. 그중에서도 Variational inference, Generative Adversarial과 Bayes Learning이 눈에 띄었다. 그리고 또 하나의 키워드는 Reinforcement Learning이다. 강화학습은 알파고로 인해서 많은 사람에게 알려진 알고리즘이다. 이번 학회를 한 장으로 정리하면 LeCun's Cake로 정리할 수 있다.
Big Data 시대 데이터는 넘쳐나고 가공할 시간적 여유는 없는 시대 누가 일일이 데이터를 정리해서 의미를 찾으려고 하겠는가? 그냥 모든 데이터를 기계에 넘겨주고 분석을 맡기고 싶지 않겠는가? 누구나 그런 생각을 해봤을 것이다. 그러한 방법을 Unsupervised Learning이라고 한다. 사람의 지도 없이 기계가 스스로 데이터를 기반으로 학습하는 방법. 하지만 기계가 스스로 하는 데는 정확도 측면에서 한계가 있다. 사람의 의도를 모르기 때문이다. 기계 스스로가 만들어 놓은 지식 위에 사람(Human)의 의지만 넣을 수 있다면 어떨까? Unsupervised Learning이 끝나면 Labeled 데이터를 이용해서 Supervised Learning을 한다. 이렇게 함으로써 사람의 의지를 기계에 전달할 수 있게 된다. 이 단계까지 진행되면 막대한 데이터를 사람의 의지대로 분석할 수 있게 된다. 마지막으로 기계가 사람을 넘어 설 수 있도록 Reinforcement Learning으로 마무리하게 된다. 게임의 규칙처럼 정해진 규칙에서 가장 높은 점수를 내도록 트레이닝 된 기계가 정확도를 높이는 것이다. 이것이 이번 학회의 화두이고 앞으로 딥러닝이 진행할 길인 것이다.
- note_index . . . . 5 matches
[:network_interface 진화하는 네트워크 인터페이스]
[:programming_openmp Openmp를 이용한 프로그래밍]
[:usb_driver USB 드라이버]
[:wiki_server_immigration Wiki 서버 이전 관리]
[:nims_cluster_install_guide NIMS 클러스터 설치 가이드]
- notebook_lenovo_e145 . . . . 8 matches
= AMD 그래픽 카드 드라이버 =
USB 무선랜카드 설치하기 정식 버전을 제공하고 있지는 않은데 같은 칩셋으로 랜카드 드라이버로 동작을 하는 것을 확인 했다. [* https://github.com/abperiasamy/rtl8812AU_8821AU_linux/issues/105]
강제로그아웃 : Ctrl + Alt + 백스페이스
주의 하세요,아무 경고도 없이 모든 프로그램을 종료하고 로그아웃시킵니다.
어떤경우에 프로그램이 멈추는 프리즈 상태일때 사용하게 됩니다.
지금 실행중인 프로그램들이 많거나 다른프로그램 실행중에 일일이 창을 찾아가기 번거롭죠?
복사한 파일이나,경로를 터미널에서 붙여 넣을때 사용합니다.
- notebook_msi_x200 . . . . 4 matches
그뒤에 repository를 업데이트 해준다
우분투에서도 기본으로 제공하는 글꼴이 있다.
네이버 사전체
feh --bg-scale <이미지파일> &
- notion_api . . . . 5 matches
Notion을 사용하다보면 자동화와 약간의 프로그래밍이 필요하다는 생각이 들어서 찾아보니 비공식 API이지만 notion-py[* https://butter-shower.tistory.com/189]라는 python api가 있음을 알았다.
또한 필요에 의해 파생된 notionist[* https://tootouch.github.io/experiment/notionist/]라이브러리도 있는데 지금은 약간의 문제가 있어서 사용이 안 되고 있다. [* https://tootouch.github.io/experiment/notionist/]
- numerical_analysis_note . . . . 9 matches
미국은 10년에 한번씩 인구조사를 하고 있다. 아래 테이블은 1950년부터 2000년까지의 인구조사 결과이다.
위 결과는 10년 주기의 인구조사 결과이다. 이 결과에서 1975년도의 인구수와 또는 2020년의 인구를 예측할 수 있을까?
이런 물음에 의미 있는 답을 내어주기 위한 방법을 보간법(Interpolation)이라고 한다.
'''정리 3.1)''' 와이어스트라스[* Karl Weierstrass (1815~1897) ) is often referred to as the father of modern analysis because of his insistence on rigor in the demonstration of mathematical results. He was instrumental in developing tests for convergence of series, and determining ways to rigorously define irrational numbers. He was the first to demonstrate that a function could be everywhere continuous but nowhere differentiable, a result that shocked some of his contemporaries.] 다항식 근사 정리(Weierstrass Approximation Theorem)
정의에 대한 증명은 여기서 다루지 않고 기회가 된다면 별도의 페이지에서 다루도록 하겠다.
다항식(polynomials)과 다항식의 미분, 적분을 구하기 쉽기 때문에 연속 함수의 근사에 다항식을 사용하는 이유로 꼽고 있다.
- odroid_index . . . . 25 matches
Odroid 보드를 갖고 무엇을 해볼까해서 만든 페이지.
Odroid os관련해서 이미지를 다은 받을 수 있는 곳[* https://wiki.odroid.com/odroid-c1/os_images/ubuntu/v3.0]
이 곳에서 이미지를 다운 받는다. 이미지는 mate, minimal 두가지 버전이 있다. (참고로 mate 버전을 사용했다.)
이미지를 받으면 xz로 압축되어 있는데 ''unxz ubuntu-18.04.1-3.10-minimal-odroid-c1-20180802.img.xz''와 같이 압축을 풀어 줍니다. 압축이 풀리면 '''.img''' 파일이 생성됨.
sync 명령을 여러차례 수행하도록 경고하고 있다. 캐쉬에만 쓰여지고 실제 SD 카드에 쓰기가 안 되는 경우가 있기 때문이라고 함.
이렇게 하면 php와 아파치를 연동해서 사용할 수 잇다.
모듈이 설치 되어 있더라도 연결해주지 않으면 동작하지 않는다.
fdisk -l 명령으로 연결된 디스크장치 정보를 알 수 있는데 아래와 같이 장치가 보이면 하드웨어적으로는 잘 연결 되어 있는 것이다.
/etc/fstab에 아래와 같이 추가하면 된다.
위와 같이 장치가 보이면 물리적으로는 잘 연결 된 것이다.
이제 부터 논리적인 파티션을 나누고 마운트할 파일시스템을 입히는 일을 해야 한다.
파티션을 나눴다고 바로 쓸수 있는 것은 아니다. 이 파티션을 사용할 파일 시스템으로 포멧팅을 해줘야 한다.
위와 같이 생성된 파티션을 포멧해고 마운트하면 끝.
= 게임 에뮬레이터 =
1. [http://odroid.com/dokuwiki/doku.php?id=en:odroid-c1 wiki 페이지]
- omicron_installation . . . . 1 match
freetype/freetype.h 에러 발생시 /usr/lib/freetype2 에 freetpye이 설치 되어 있는지 확인해서 ln -s /usr/lib/freetype2 /usr/lib/freetype 설정
- open_cl_tip . . . . 1 match
#title OpenCL Tip 관련 페이지
- openann . . . . 2 matches
= 라이브러리 설치 =
= 관련 라이브러리 =
- opencl_atomic_cmpxchg . . . . 4 matches
포인터 변수 p에 있는 값을 비교해서 업데이트하는 함수로 모든 커널 엘리먼트 중에서 특정 값만을 취하거나 할때 사용하면 용이 하다.
64bit 데이터를 처리하기 위해서는 확장기능을 사용해야 한다.
이 확장을 통해서 사용할 수 있는 함수는 아래 표와 같다.
- opencl_dot_product . . . . 7 matches
두 벡터를 서로 곱하고 그 합을 구하는 것을 벡터의 내적이라고 하는데 이 과정에서 가장 중요한 것이 합을 구하는 파트다.(Reduction)
곱을 하는 과정은 서로 독립이라서 병렬처리가 힘들지 않은데 Summation 과정은 병렬화 알고리즘이 다소 복잡할 수 있다.
이곳에서는 OpenCL을 이용한 내적의 병렬화 과정을 알아보도록 하자.
- opencl_guide . . . . 161 matches
하나의 호스트와 한개 이상의 OpenCL 다바이스로 구성된 OpenCL 플랫폼. 각 OpenCL 디바이스들은 한개 이상의 계산 유닛을 가지고 있고, 각 계산 유닛은 한개 이상의 PE(Processing Element)를 가지고 있다.
OpenCL은 Host 프로그램과 Kernel 프로그램으로 나뉠 수 있는데 Kernel 프로그램은 Opencl 디바이스에서 동작될 프로그램이고 Host 프로그램은 Kernel 프로그램의 생성 및 실행을 포함하는 Host 프로그램이다. Kernel에서 실행 될 kernel 프로그램의 인스턴스 하나 하나를 '''작업 아이템'''(Work Item)이라고 한다.
이런 작업 아이템들의 집합을 '''작업 그룹'''이라고 하는데 작업 아이템과 작업 그룹에는 Index 번호가 부여 된다. 작업 아이템에는 총 3개의 번호가 부여 되는데 다음과 같다.
예를 들어 전체 작업 아이템이 15개가 있다고 하면 Global Work ID는 0 ~ 14이 되고,
작업 그룹이 3개가 있다고 가정 하면 Group Work ID는 0 ~ 2이 된다.
하나의 작업 아이템은 Global Work ID, Group Work ID + Local Work ID의 조합으로 구별할 수 있다.
Context가 정의 된 후 OpenCL 디바이스마다 하나씩 연결 된다. 호스트는 명령을 Command Queue에 담고, 명령은 연관된 디바이스에서 실행 되기 위해 스케줄링 된다.
* '''커널 실행 명령''' : OpenCL 다바이스의 PE에서 커널을 실행.
* '''메모리 명령''' : 호스트와 다른 메모리 객체 사이에서의 데이터 전송을 발생시키고 메모리 객체들 사이에서 데이터를 이동시키며, 호스트 주소 공간에 메모리 객체를 매핑시키거나 매핑을 해제시킴.
* '''동기 명령''' : 명령들이 실행되는 순서에 제한을 가함.
* '''이미지 객체'''
'''버퍼 객체'''는 커널이 사용 가능한 연속된 블록의 메모리이다.
'''이미지 객체'''는 이미지만을 담아야 하는 제약이 있다. 이지미를 저장하는 형식은 특정 OpenCL 디바이스마다 서로 다르게 최적화 될 수 있다. (이해하는데 시간이 필요할 듯)
* 전역 메모리 : 모든 작업 그룹의 작업 아이템들이 읽고 쓸 수 있는 공간이다. 디바이스에 따라서 전영 메모리에 대한 읽기 쓰기를 깨슁할 수 있음.
* 상수 메모리 : 전역 메모리의 일부, 커널이 실행 되는 동안 변하지 않고 상수로 유지 됨. 상수 메모리는 호스트에서 할당하고 초기화 한다.
* 지역 메모리 : 작업 그룹에 지역적이다. 작업 그룹 안의 모든 작업 아이템들이 공유하는 변수들이 이 메모리 영역에 할당 된다.
* 사유 메모리 : 하나의 작업 아이템이 개별적으로 소유하고 있는 메모리. 다른 작업 아이템들에게는 보이지 않는다.
OpenCL에서의 프로그래밍 모델은 데이터 병렬성과 태스크 병렬성 모델을 염두해 두고 만들어 졌다. 하지만 프로그래밍 모델은 유연하기 때문에 혼합되거나 다른 프로그래밍 모델을 생각해 볼 수 있다.
=== 데이터 병렬성 프로그래밍 모델 ===
데이터 병렬성 프로그램이라고 하면 SIMD(Single Instruction Multiple Data)나 SPMD(Single Program Multiple Data)[[footnote(Matton의 ''Patterns for Parallel Programming''을 참고 하길 바람.)]] 모델을 생각해 볼 수 있다.
- opencl_reqd_work_group_size . . . . 4 matches
를 이용해서 kernel 컴파일러에게 work group size 정보를 미리 알려주게 되면 워크 그룹 사이즈에 맞게 최적화 된 커널 이미지를 얻을 수 있다.
워크 그룹은 하드웨어 사양에 디펜드 하기 때문에 최적화된 워크 그룹 사이즈를 찾는것도 중요하다.
- opencl_subdevice . . . . 12 matches
이런 경우 host를 구동하는 부분이랑 계산 부분이랑 혼합이 되면서 계산 효율이 많이 떨어지게 된다.
host에서 사용할 1개의 core를 제외 시켜서 device를 잡는 것이 효과적인데 이럴 때 사용하는 것이 sub device이다.
실제 cpu 디바이스(device_id)를 받아와서 cl_device_partition_property에서 정의한데로 복수 개의 디바이스(device_ids)로 나눠 준다.
- opencv_c_c++ . . . . 16 matches
파이썬 모듈 설치
'''capture.set(option, n)'''과 같이 카메라 객체에 속성을 설정할 수 있음.
'''ret, frame = capture.read()''' 카메라 객체로 부터 프레임 데이터를 읽어 온다.
읽어오는 행위가 정상적이였으면 '''ret'''에 True를 반환하고 그렇지 못할 경우 False를 반환함.
'''cv2.imshow("VideoFrame", frame)''' VideoFrame이라는 윈도우 창에 frame 정보를 출력함.
waitKey(time) 설정한 시간 만큼 키 입력을 기다리라는 명령으로 0으로 설정하면 무한한 시간을 기다리기 때문에 프레임이 넘어가지 않음.
로컬 영역에서 대비 정보를 이용하여 표현하는 특징으로 지역적으로만 특징을 추출하기 때문에 전체적으로 조도 변화에 둔감하여 광원 변화에도 일정한 결과를 내어준다.
위 사진은 LBP(Local Binary Pattern) 논문의 그림이지만 MCT를 설명하는데 사용해도 무방할 정도로 두 알고리즘은 같다. 출발은 달랐지면 결국은 같은 알고리즘...
각 픽셀의 밝기가 위 그림과 같다고 하면 중심 픽셀의 밝기보다 주변의 픽셀이 밝으면 '1' 그렇지 않으면 '0'이라고 하면 중심 픽셀에 대한 feature로 8bit 정보를 얻을 수 있다. 이 8bit 정보는 사용하는 것이 CT이고 알고리즘을 살짝 수정해서 9개의 픽셀의 평균 밝기를 계산하고 그 평균보다 밝으면 '1' 그렇지 않으면 '0'을 할당하여 중심 픽셀에 대한 정보를 포함해서 9bit 정보를 사용하는 것이 MCT이다.
= 이미지에 날자 정보 넣기 =
- osx_utility . . . . 1 match
LD_LIBRARY_PATH에 /user/local/gcc-5.3.0/lib를 넣어주어야 컴파일시 링크가 정상적으로 이루워진다.
- p_value . . . . 91 matches
'어떤 가설이 참일 때 하나의 결과를 관찰할 확률'은 '어떤 결과가 관찰되었을 때 하나의 가설이 참일 확률'과 다르다.
P값(녹색 부분)이란 ‘영가설이 참이라고 가정할 때, 관찰된(또는 그보다 더 극단적인) 결과가 일어날 확률’을 말한다.
미국 통계학회(ASA: American Statistical Association)는 3월 7일 발표한 성명서에서(참고 1), 다음과 같이 경고했다. "P값(P value)은 과학적 증거가 얼마나 강력한지를 판단하는 데 흔히 사용되는 척도다. 그런데 P값은 가설이 참이거나, 결과가 중요한지 여부를 결정할 수 없다. 따라서 P값을 오용(誤用)하면, 재현되지 않는 연구결과가 증가하는 데 기여하게 된다(참고 2)." ASA가 P값 사용에 관한 가이드라인을 발표하는 특단의 조치를 취한 것은 매우 이례적이다.
"177년의 역사를 가진 ASA가 통계학의 기본적 문제에 관해 명확한 권고사항을 발표한 것은 이번이 처음이다. ASA의 회원들 중에서 'P값이 잘못 적용됨으로써, 통계학에 대한 전반적인 의구심이 조장되고 있다'고 우려하는 사람들이 점점 더 증가해 왔다"라고 ASA의 론 바서스타인 회장은 말했다.
ASA는 이번 성명서에서, "연구자들이여, P값 하나만을 근거로 과학적 결론을 내리거나 정책을 결정하지 말라"고 권고했다. ASA의 권고는 다음과 같이 계속된다. "연구자들은 통계적으로 유의한 결과를 도출하는 데이터분석에만 치중하지 말고, 계산을 통해 이루어지는 모든 통계적 검증과 선택까지도 서술해야 한다. 그러지 않으면 연구결과가 탄탄하다는 착시를 일으킬 수 있다."
PLos(Public Library of Science)의 편집장 베로니크 키어머는 ASA의 이번 성명서를 "'연구자들이 P값에 부당하게 의존하고 있다'는 오랜 우려에 가시적으로 힘을 실어줬다"고 평가하면서, "이번 성명서의 의의는, ‘다른 분야의 문헌에 나타나는 통계적 문제점을, 전문적인 통계학자들이 나서서 지적했다’는 데 있다. 이것은 매우 중요한 의미를 갖는다"고 덧붙였다.
P값은 영가설(null hypothesis)을 검증하고 기각하는 데 흔히 사용되는데, 영가설은 일반적으로 '두 그룹 간에 차이가 없다'거나 '한 쌍의 특징 사이에 상관관계가 없다'고 진술한다. P값이 작으면 작을수록 관찰된 값이 우연히 일어났을 가능성이 낮으므로, 영가설이 참이라고 추정된다. 일반적으로 P값이 0.05보다 작으면, 하나의 발견이 통계적으로 유의함을 의미하는 것으로 받아들여진다.
그러나 ASA의 성명서에 의하면, 이상과 같은 관행이 꼭 올바른 것은 아니라고 한다(참고 3). P값이 0.05보다 작다(P < 0.05)는 것은 '주어진 가설이 참일 확률은 95%이다'라는 것을 의미하지 않는다. 그것이 의미하는 것은 다음과 같다: "영가설이 참이고 다른 모든 가정들이 타당하다면, 관찰된 결과 이상으로 극단적인 결과를 얻을 확률은 5%이다." 그리고 P값은 어떤 발견이 중요함을 의미하지도 않는다. 예컨대, 하나의 약물이 환자의 혈당수준에 확률적으로 유의한 효과를 미친다 하더라도, 치료효과가 없을 수 있다.
다나파버 암연구소의 지오바니 파르미지아니 박사(생물통계학)에 의하면, 교과서와 실무매뉴얼을 읽다 보면, P값이 제공하는 정보를 종종 오해하고 있음을 발견하게 된다고 한다. "만시지탄의 감이 있다. 만약 ASA의 성명서가 20년 전에 발표되었다면, 생명공학 연구가 훨씬 더 발전했을 것이다"라고 그는 말했다.
사실 P값에 대한 비판이 낯설지는 않다(참고 4). 2011년에는 P값을 동원해 통계적 유의성을 강조한 연구결과가 비판을 받았다. 연구의 내용은 '비틀즈 음악을 들으면 대학생들이 젊어진다'는 것이었다(참고 5). 더욱 논란이 된 것은 2015년, 한 다큐멘터리 영화제작자들이 (일부러 조잡하게 설계한) 임상시험결과를 이용하여 "초콜릿을 먹으면 체중감소에 도움이 된다"는 결론을 도출한 것이다. 물론, 이 논문은 나중에 기각되었지만 말이다(참고 6).
그러나 이번에 발표된 ASA의 성명서는 과거 어느 때보다도 학계에 미치는 파장이 클 것으로 기대된다. UC 데이비스의 심리학자이자 《Social Psychological and Personality Science》의 편집장인 사이민 바지르 박사는 이렇게 말했다. "'다른 정보 없이 P값을 함부로 해석하면 안 된다'는 통계학자들의 말이 연구자들에게 먹히려면, 먼저 연구자들로 하여금 P값에 대한 회의를 품게 해야 한다. ASA의 이번 성명서를 계기로 하여, 연구자들은 P값 말고도 다양한 통계분석 방법을 사용하게 될 것이다."
그러나 메모리얼 슬론 케터링 암센터의 앤드루 비커스 박사(생물통계학)에 의하면, 좀 더 과격한 방법은 역효과를 나을 수 있다고 한다. 예컨대 한 저널에서는, 'P값을 포함한 논문출판을 거부한다'고 발표한 적이 있다(참고 7). 그는 'P값은 옳지 않으니 사용하지 말라'는 건 '자동차 사고의 위험을 없애기 위해, 운전을 하지 말라'는 것이나 마찬가지라고 하며, 그처럼 과격한 조치는 연구자들에게 무시받을 거라고 지적했다. 그래서 그는 연구자들에게 '통계를 레시피로 취급하지 말고, 하나의 과학으로 취급하라'고 가르쳐야 한다고 말했다.
그러나 우려의 목소리는 여전하다. "P값을 좀 더 잘 이해한다고 해서, 사람들이 통계학을 이용하여 불가능한 수준의 신뢰감을 얻으려는 충동에서 벗어나지는 않을 것이다"라고 콜럼비아 대학교의 앤드루 겔먼 박사(통계학)는 경고했다. "사람들은 실제로 얻을 수 없는 것을 원하는 경향이 있다. 그것은 바로 확실성이다"라고 그는 덧붙였다.
1. P-값은 '데이터가 특정 통계 모형과 얼마나 상반되는지'를 나타낼 수 있다.
2. P-값은 '연구 가설이 참일 확률'이나, '데이터가 무작위적인 우연만으로 생성된 확률'의 척도가 아니다.
3. 과학적 결론이나 사업이나 정책적 결정이 'P-값이 특정 문턱값을 넘어서는지'에 의해서만 내려져서는 안 된다.
4. 적절한 추론을 위해 충분한 보고와 투명성이 필요하다.
5. P-값이나 통계적 유의성은 '효과의 크기'나 '결과의 중요성'의 척도가 아니다.
6. P-값 그 자체만으로는 어떤 모형이나 가설에 관한 증거를 판단하는 좋은 척도가 될 수 없다.
- parallel_processor_flynn . . . . 9 matches
하나의 명령 스트림이 하나의 데이터 스트림을 처리하는 병렬성이 없는 순차적인 시스템, 싱글코어 프로세서 하나가 탑재된 PC
단일 명령으로 복수의 연산기에 전달하더라도 각각의 연산기는 서로 다른 데이터를 가지고 연산하는 시스템
벡터 연산기라고 불리는 일부 슈퍼 컴퓨터가 대표적인 예이고, 마이크로 프로세서에도 SIMD가 탑재 되었다.
이론상으로만 존재할 뿐 실제 사용하지 않는다.
클러스터 시스템이나 SMP 시스템 등 병령 컴퓨팅을 실행하기 위한 하드웨어 아키텍처 대부분이 MIMD에 속한다.
- parallel_programming_ex . . . . 10 matches
openCL 및 MPI를 이용한 병령 프로그래밍에 대해서 설명한다.
위 예제는 메트릭스 M_A, M_B 를 곱해서 M_C에 저장하는 예제이다.
각각의 행렬의 곱을 얻는 과정은 독립적이다. 이 독립적인 과정을 하나의 Work Item으로 정의해서 병렬화 해보자.
'''kernel_baseline.cl''' - 기본이 되는 opencl 커널 파일
계산하려는 메트릭스 M_C의 사이즈만큰 work item을 생성해서 처리하는 방식
컨테스트 스위칭의 오버헤드를 고려할때 하나의 Work Item에 많은 일을 할당하는 것이 유리하다.
하나의 Work Item이 행렬의 곱의 한 라인을 계산하도록 수정한다.
백터 연산은 모드 계산 디바이스에서 지원하는 기능은 아니다. 하지만 계산 디바이스가 지원한다면 좀 더 좋은 성능을 보장할 수 있다.
- pci_express_spec . . . . 3 matches
LTP 메카리즘은 링크 전원 관리 시스템이나 스위치 내부 전원 관리 시스템에 직접적인 영향을 주지는 않는다. 비록 간접적인 효과를 주는 것이 가능하더라도
LTR 지원은 쳅터7에 기숙 된 것 처럼 보고와 컨트롤 레지스터들에 의해서 가능하다. Root Complex와 모든 intermediate Switch들이 LTR을 지원하게 설정 되어 있지 않다면 소프트웨어는 LTR을 enable하면 안 된다.
- pci_interface_review . . . . 3 matches
#title PCI 인터페이스 리뷰
외부 가속기를 사용하면서 PCI에 대해서 모르고 사용한다는 것이 얼마나 허무한 일인지 알게 되었다.
|| 1.0 ||8b/10b ||2.5 GT/s[[footnote(1GT/s means \(10^9\) or one billion transfers per second. 하나의 전송이 얼마의 bit를 전송하는지 나타내지 않고 순수하게 전송하는 동작을 몇번하는지만으로 나타낸다. )]] ||2 Gbit/s ||250 MB/s ||40 GT/s ||4 GB/s ||
- poisson_distribution . . . . 71 matches
== 푸아송 분포, 이항 분포로 부터 왔다? ==
__'''푸아송 분포'''는 단위 시간 안에 어떤 사건이 몇 번 발생할 것인지를 표현하는 ''이산 확률 분포''이다.__
''이산 확률 분포''에서 가장 기초적인 분포는 '''베르누이 분포'''(Bernoulli distribution)이다. 가장 흔하고 쉬운 예로 동전을 던져서 앞면이 나올 확률과 뒷면이 나올 확률에 대해서 이야기 하는 것 처럼 어떤 시행의 결과가 '성공', '실패'인 시행을 베르누이 시행이라고 한다. 그리고 어떤 시행이 성공이면 확률변수\(x\)는 1을 갖고, 실패하면 0을 갖을 때, 이 확률 변수를 베르누이 확률 변수라고 한다. 그리고 이 베르누이 확률 변수로 이루어진 확률분포를 '''베르누이 분포'''라고 한다. 베르누이 확률 변수의 확률질량함수(PMF, probability mass function) \(f(x)\)는 다음과 같다.
이런 베르누이 시행을 n번 반복했을 경우를 생각해보자. 이번엔 n번 수행의 성공 횟수를 확률변수 X로 설정하자. 이때 이 확률 변수를 '''이항 확률 변수'''(Binomial random variable)라고 한다. 결과 베르누이 분포는 이항분포의 특수한 경우이다.(n=1인 경우)
여기서 중요한 것은 베르누이 시행을 n회 시행할 때, 각 시행은 서로에게 어떤 영향도 주지 않는다는 것이다. 즉, __각각의 베르누이 시행은 서로 독립이다.__ 이 때문에 이항분포를 ''독립시행의 확률''이라고 하는 것이다.
이항 분포를 수식으로 표현하면, 1회 시행 시 성공 확률이 \(p\)인 어떤 사건을 \(n\)번 수행하였을 때 \(k\)번 성공할 확률의 분포는 다음과 같다.
이항 분포를 시간의 맥락으로 바꿔보자. 하루 동안 내 사이트에 방문한 사람이 한 명이 확률이 0.1이라고 하자. 28일, 즉 4주 동안 10명이 방문할 확률을 이항 분포의 맥락에서 생각하면, \(B(10;28,0.1)\)로 적을 수 있다. 그런데 이러한 모델링은 어딘가 어색하다.
문제 정의에서 이항 분포의 모델링은 하루 동안 사이트 방문객이 한 명일 확률(0.1)에 기대고 있다. 그런데 하루에 방문객이 2명 이상이면 어떻게 표현할 수 있을까?
두 명 이상의 방문자를 수용하려면 이항 분포의 모형을 수정해야 한다. 가장 손쉬운 방법은 단위 시간을 바꾸는 것이다. 단위 시간을 하루가 아니라 더 작은 단위로 바꾸는 것이다. 시간 단위로 바꾸면 시간당 방문할 확률은 0.1/24이 된다. 이렇게 수정하면 하루에 두 명 이상이 방문하는 것도 표현 가능하다.
이항 분포는 단위 시간당 사건이 한 번 일어날 확률에 기대고 있기 때문에, 앞서 언급한 것처럼 단위 사간을 최대한 잘게 쪼개면 어찌 어찌 될거 같다.
이항 분포와 달리 푸아송 분포는 파라미터가 한 개이다. 푸아송 분포의 파라미터 \(\lambda = np\)는 단위 시간 당 평균 발생 횟수를 뜻한다. 비율(rate)이라고도 한다.
(나)의 극한값은 분자에 극한이 걸리므로 0으로 수렴하고 결과적으로 (나)식은 1이 된다. 정리하면 푸아송 분포를 아래와 같이 정의 할 수 있다.
- poisson_process . . . . 14 matches
홈페이지의 방문자의 방문 빈도, 휴대전화의 메세지 수신 간격, 고속도로에서의 사고 등은 시간과 공간에 독립적으로 일어난다. 이러한 현상들은 연속 구간(보통 시간)에서의 발생하거나 또는 도착하는 사건들을 모델링하는데 '''푸아송 과정'''(Poisson process)을 사용한다.
임의의 시간 동안 \(\lambda\)의 비율로 사건이 발생한다고 생각해보자. 각 사건은 독립적으로 발생하며 일정 비율 만큼만 발생한다. 이러한 과정을 확률적으로 설명하는 모델을 점과정이라고 한다.
푸아송 과정은 셈과정의 특별한 타입이다. 어떤 사건들의 흐름이 \(t=0\)에서 시작하는 시간대에서 무작위로 도착한다고 가정해보자. 이 때 \(t\)시간까지 도착한 사건의 숫자를 \(N_t\)라고 하자. 모든 \(t \le 0\)에서 \(N_t\)는 확률변수다. 이런 확률변수들의 모임(collection) \((N_t)_{t \le 0}\)은 연속이며 정수값을 갖는 확률과정이고 이를 셈과정이라고 부른다.
\(N_t\)는 \([0,t]\)사이의 사건을 세기 때문에 \(t\)가 증가함에 따라 \(N_t\) 또한 증가한다.
- ppsspp_install_guide . . . . 6 matches
1. opengl이 설치 되어 있어야 한다.
cmake.. 를 실행하면 아래와 같이 FFMPEG관련 경로가 잘 못 설정 되는 것을 알 수 있다.
이부분을 바로 설정해주도록 CMakeList.txt파일을 수정해야 한다.
와 같이 해주면 라이브러리 경로가 설정 되는데 그래도 원하는 경로로 설정이 안 되면 CMakeList.txt파일을 수정 하자.
- program_language_c . . . . 23 matches
'''const'''는 상수를 의미하며 값이 변하지 않음을 주의해야 한다.
각각의 프로그램은 독립적인 가상 메모리 공간을 갖는다. 위 그림은 메모리 공간을 도식화한 것이다.
메모리 공간은 스텍, 힙, 코드, 데이터 영역으로 나뉠 수 있다.
* 스텍이라는 영역은 이름에서 알 수 있드시 스텍(나중에 들어온 데이터가 먼저 나간다.)이라는 구조를 갖는다.
* 라이프 타임이 짧은 매개 변수와 지역 변수들이 사용하는 영역이다.
* 컴파일 시점에 사이즈가 정해진다. 스텍이라는 구조를 사용하기 때문이다.
* 힙은 사용자가 new나 malloc 같은 동적할당으로 사용하는 공간이다.
* 프로그램이 실행 되는 동안 그때 그때 할당 되어 사용 되며 물리적인 메모리에 따라 제한이 된다.
== 데이터 ==
* 데이터 영역은 Static 변수(정적 변수)와 전역 변수가 저장 되는 곳.
* 데이터영역은 다시 Data와 BSS 영역으로 나뉠 수 있다.
* 초기화가 되지 않았거나 0으로 설정이 되어 있는 변수는 BSS에 저장됨.
연속된 메모리 공간을 할당 받는다 컴파일시점에 사이즈가 결정 된다.
메모리의 주소공간을 지칭하는 데이터를 저장하는 변수
- programming_atod . . . . 1 match
파일로 부터 받아 들이 문자열을 double형 배열에 저장하는 프로그램
- programming_cli_ex . . . . 1 match
Linux gcc를 이용해서 컴파일 한다.
- programming_clock_gettime . . . . 25 matches
gettimeofday는 유닉스, 리눅스 시스템 프로그래밍에서 시간을 구할 때 쓰던 함수이다. 마이크로초(백만분의 1초)단위로 구할 수 있는 기능을 가지고 있어서 많이 사용되는 함수이다.
그러나 앞으로는 gettimeofday는 사용하지 말아야할 함수가 되었다. 왜냐하면 gettimeofday는 2008년도 유닉스 표준인 SUSv4-2008에서 앞으로 제거될 구식(obsolescent) 함수로 지정했기 때문이다.
물론 하위 호환성을 위해서 gettimeofday 함수는 계속 제공될 것이다. 하지만 기본 시스템 라이브러리에서는 제거되고, 구식 라이브러리를 따로 포함해야 사용할 수 있게 될지도 모르기 때문에 차후에는 gettimeofday는 쓰지 않는 편이 좋다. 참고로 지금까지의 표준안의 행보로 봤을 때 obsolescent 함수로 지정되면 약 10여년의 유예를 거치는 것 같다. 따라서 지금 당장부터 쓰지 말아야 하는 것은 아니다.
gettimeofday는 1988년도에 SVR4에서 표준에 지정되어 20여년을 넘게 사용되던 함수이다. 아직도 수많은 프로그래밍 서적이나 소스 코드의 예제에서 사용되고 있다. 실제로 최근에 개발되던 몇몇 실무 코드 조차 gettimeofday를 사용하고 있는 실정이다.
하지만 가까운 장래에는 퇴출될 함수이므로 지양하는 편이 좋다. 본인도 가끔 졸린 상태에서 기계적으로 코딩하다보면 gettimeofday를 쓰곤 하는데 지양하도록 주의하는 중이다.
그러면 새로운 함수인 clock_gettime의 프로토 타입부터 살펴보자. 비교를 위해 과거 gettimeofday 도 같이 적어두었다.
먼저 clock_gettime은 시간 관련 구조체가 struct timespec으로 바뀌었는데 나노초까지 지정할 수 있다. 물론 모든 시스템이 나노초까지 정밀한 시계를 제공하는 것은 아니다. 각 시스템 시계의 정밀도는 clock_getres로 확인할 수 있다.
인수로 쓰이는 clockid_t 타입은 시계의 종류를 나타내는 ID로서 POSIX 시스템은 기본적으로 2가지 타입(CLOCK_REALTIME, CLOCK_MONOTONIC)의 시계를 제공한다. 그리고 추가적으로 몇 개의 시계를 더 제공할 수 있다. 아래 표를 보면 몇몇 시계 ID를 정리해두었다. 그러나 실제 시스템에서는 이보다 더 많은 비표준 시계 ID를 제공하기도 한다.
여기서 CLOCK_REALTIME을 사용하면 실제 시간을 구하므로 gettimeofday의 기능과 같은 기능을 제공한다. 이제 현재 시각을 버퍼에 저장하는 간단한 예제 코드를 살펴보자.
main 함수는 생략했으니 적당히 붙여서 코딩하면 될 것이다. 화면에 출력되는 것을 보고 싶다면 printf로 buf 문자열을 출력하면 된다.
'''※ 컴파일 시에 동적 라이브러리 -lrt 를 추가해야 함'''
{{{{color: rgb(255, 1, 1); font-size: 13px;} 참고로 gettimeofday 외에 usleep, getitimer, setitimer도 구식(obsolescent) 함수로 지정되어 나중에는 사라질 함수이므로 되도록이면 쓰지 않는 편이 좋다. }}}
- programming_cpp_cout_cin . . . . 7 matches
km를 입력 받아서 몇 mile인가를 계산해서 출력해주는 간단한 프로그램 이다.
'''using namespace '''는 네임스페이스는 사용하기 위해서 쓰는 명령이다.
cout, cin 함수는 std 클래스의 내장 함수이다. 위의 네임 스페이스 명령을 쓰지 않았다면 매번 cout(), cin()함수를 쓰기 위해서는
std::cout(), std::cin()과 같이 클래스 이름을 명시해줘야 한다.
- programming_cpp_list . . . . 1 match
C++에 대한 기본적인 문법과 관련 내용을 설명하는 페이지를 작성 중입니다.
- programming_cpp_overloading . . . . 6 matches
연산자라고 하면 흔히 +, -, *, /등을 말한다. 그런데 이런 연산자들은 이미 정의 되어 있는 자료형(기본 자료형)에 대해서만 연산을 해준다. 근데 우리가 세로운 자료형을 정의 했다면??
그 자료형에 맞는 연산자 수행을 정의 해줘야 한다는 것이다.
이때 필요한 것이 연산자 오버로딩이다.
- programming_cpp_template . . . . 31 matches
= Template의 이해 =
템플릿(Template)은 C++에서 사용되는 개념으로 변수형의 대명사 같은 것이다.
탬플릿은 메크로와 비슷한 성격을 갖고 있는데 그것은 컴파일시에 자료형이 결정이 되고 구문이 치환이 된다는 것이다.
우선 간단한 템플릿 클래스를 예를 들면서 이야기를 해보죠.
자 이렇게 됩니다.
템플릿이라는 개념이 들어가면서 이상해 보이는 저 코드는 어떻게 이해해야 할까요?
이것과 동일하게 됩니다.
템플릿 구문이 들어가면서 보기 생소한 코드라서 그렇지 템플릿 구문을 제거 하고 나면 극히 평범한 코드가 된다.
와 같은 함수가 있다고 합시다. 이 함수는 int형 변수를 2개 받아서 서로 값을 바꿔 주는 역할을 합니다.
그런데 다른 자료형도 이와 같은 작업을 해야 한다고 했을때 어떻게 할까요?
이럴때 사용할 수 있는 것이 템플릿 입니다.
이와 같이 하면 어떤 자료형이든 이 함수 하나로 처리가 가능하게 됩니다.
인자로 들어오는 자료형이 무엇이냐에 따라서 자료형이 바뀌게 되기 때문입니다. (컴파일 타임에 적용 된다.)
예제를 통해서 템플릿에 대한 이해를 돕는다.
위 예제 코드는 좌표를 표현하기 위해서 간단하게 Point 클래스를 정의하고 연산자 오버로딩을 한 것이다.
이 클래스는 정수형 좌표만 표현 할 수 있다. 그런데 float형 좌표도 표현해야 한다면 어떻게 할까?
다음은 어려 자료형을 표현 할 수 있도록 템플릿으로 구성한 것이다.
- programming_f_function . . . . 40 matches
|| "r" ||읽기 전용. 파일이 반드시 있어야 합니다. ||
|| "w" ||쓰기 전용. 파일이 없으면 생성되고, 파일이 있다면 기존 내용은 지워집니다. ||
|| "a" ||내용 추가. 파일이 없으면 생성되고, 파일이 있다면 기존 내용 뒤에 추가됩니다. ||
|| "r+" ||읽기와 쓰기용으로 열기 파일이 없으면 생성되고, 파일이 있다면 기존 내용에 덮어 쓴다. ||
|| "w+" ||읽기와 쓰기용으로 열기 파일이 없으면 생성하고, 파일이 있다면 내용을 지우고 기록한다. ||
|| "a+" ||읽기와 쓰기용으로 열기 파일이 없으면 생성하고, 파일이 있다면 파일 끝에 내용을 추가한다. ||
|| "b" ||바이너리 모드 (binary mode) ||
{{{{color: rgb(1, 100, 100); font-size: 15px; font-weight: bold;} CR(Carriage Return) 이란? }}}
의미는 커서의 위치를 그 줄 맨 앞으로 이동하라는 의미이다.
LF(Line Feed)란 툭수문자 '\n'로 표현되며 커서의 우치를 그 다음 줄로 이동하라는 의미이다.
현재 커서의 위치에서 줄만 다음으로 이동하라는 의미이지, 커서의 위치를 줄의 앞으로 이동하라는 의미는 포함하고 있지 않다.
하지만, 보통 C코드에서 '\n'는 줄을 바꾸고 맨 처음으로 이동하는 것을 볼 수 있다.
그 이유는 텍스트 모드와, 바이너리 모드의 차이 때문이다.
2진 모드란? 프로그램상에서 파일로 데이터를 쓰거나 읽어 들이는 경우 아무런 데이터의 변화도 일으키지 않는 데이터 입·출력 모드를 의미한다.
반면, 텍스트 모드란? 프로그램상에서 파일로 데이터를 쓰거나 읽어들이는 경우에 데이터 변환이 일어나는 입·출력 모드를 의미한다.
텍스트 모드에서는 '\n' 앞에 자동으로 '\r'이 추가 되게 된다.
'''참고''' : 텍스트 모드와 2진 모드의 차이는 논리적인 파일의 끝을 표현하는 방법의 차이도 있다. 더블어 유닉스 계열의 운영체제는 2진 모드와 텍스트 모드를 구분 짓지 않는다.
''디폴트 모드는 텍스트 모드이다.''
파일의 끝에서 더 이상 읽을 것이 없을 경우 리턴하는 값을 확인해서 파일을 끝을 확인하는데 각각의 함수에 따라서 리턴하는 값이 다르다.
- programming_gettimeofday . . . . 3 matches
아래 예제는 '''gettimeofday()'''함수를 이용해서 시간을 얻어 오는 예제 코드 이다.
= 라이브러리 =
- programming_index . . . . 2 matches
* [:programming_library 라이브러리(Library)의 사용]
* [:programming_gettimeofday gettimeofday를 이용한 코드 실행 시간 구하기 예제]
- programming_library . . . . 273 matches
#title 라이브러리 사용에 대한 글
이 문서는 프로그램에서 사용하는 Library에 대해서 설명한다.
라이브러리가 무엇이고, 왜 필요한지, 어떻게 작성 할 수 있는지, 그리고 어떻게 사용하지는에 대해서 알아본다.
= Library 이야기 =
라이브러리란 특정한 코드(함수 혹은 클래스)를 포함하고 있는 컴파일된 파일이다. 이러한 라이브러리를 만드는 이유는 자주 사용되는 기능을 main 함수에서 분리시켜 놓음으로써, 프로그램을 유지, 디버깅을 쉽게하고 컴파일 시간을 좀 더 빠르게 할수 있기 때문이다.
만약 라이브러리를 만들지 않고 모든 함수를 main 에 집어 넣는다면, 수정할때 마다 main 코드를 수정해야 하고 다시 컴파일 해야 할것이다. 단연히 수정하기도 어렵고 컴파일에도 많은 시간이 걸린다.
반면 라이브러리화 해두면 우리는 해당 라이브러리만 다시 컴파일 시켜서 main 함수와 링크 시켜주면 된다. 시간도 아낄분더러 수정하기도 매우 쉽다.
라이브러리에도 그 쓰임에 따라 여러가지 종류가 있다. (크게는 3가지로 분류)
가장 흔하게 쓰일 수 있는 "정적 라이브러리"와 "공유 라이브러리", "동적 라이브러리" 가 있다.
이들 라이브러리가 서로 구분되어지는 특징은 '''적재 시간'''이 될 것이다.
* 정적 라이브러리
정적 라이브러리는 object file(.o로 끝나는)의 단순한 모음이다. 정적라이브러리는 보통 .a의 확장자를 가진다. 간단히 사용할 수 있다. 컴파일시 적재되므로 유연성이 떨어진다. 최근에는 정적라이브러리는 지양되고 있는 추세이다. 컴파일시 적재됨으로 아무래도 바이너리 크기가 약간 커지는 문제가 있다.
* 공유 라이브러리
공유 라이브러리는 프로그램이 시작될 때 적재 된다. 만약 하나의 프로그램이 실행되어서 공유 라이브러리를 사용했다면, 그 뒤에 공유 라이브러리를 사용하는 모든 프로그램은 자동적으로 만들어져 있는 공유 라이브러리를 사용하게 도니다. 그럼으로써 우리는 좀 더 유연하게 프로그램을 만들 수 있다.
* 동적 라이브러리
공유 라이브러리가 프로그램이 시작 될때 적재되는 반면 이것을 프로그램 시작 중 특정한 때에 적재되는 라이브러리이다. 플러그인 모듈등을 구현할때 적합하다. 설정 파일등에 읽어들인 라이브러리를 등록시키고 원하는 라이브러리를 실행 시키게 하는 등의 매우 유연하게 작동하는 프로그램을 만들고자 할때 유용하다.
== 왜 정적 라이브러리의 사용을 지양하는 가 ==
예전에 libz 라는 라이브러리에 보안 문제가 생겨서 한창 시끄러웠던적이 있다. libz 라이브러리는 각종 서버프로그램에 매우 널리 사용되는 라이브러리였는데, 실제 문제가 되었던 이유는 많은 libz를 사용하는 프로그램들이 "정적 라이브러리" 형식으로 라이브러리를 사용했기 때문에, 버그픽스(bug fix)를 위해서는 문제가 되는libz를 사용하는 프로그램들을 다시 컴파일 시켜야 했기 때문이다. 한마리로 버그 픽스 자체가 어려웠던게 큰 문제였다. 도대체 이 프로그램이 libz를 사용하고 있는지 그렇지 않은지 알길이 없었을 뿐더러 그 많은 프로그램을 다시 컴파일 한단는 것이 힘들었다.
만약 libz를 정적으로 사용하지 않고 "공유 라이브러리" 형태로 사용했다면 bug fix가 훨씬 쉬웠을 것이다. 왜냐면 libz 공유라이브러리는 하나만 있을 것이므로 이것만 업데이트 시켜주면 되기 때문이다.
이렇게 유연성이 떨어진다는 측면에서 정적 라이브러리를 사용하지 않는 가장 큰 이유가 된다. 프로그램 덩치가 커지는 문제는 유연성 문제에 비하면 그리 큰 문제가 되지는 않는다.
- programming_linux_getch . . . . 2 matches
getch()함수는 DOS에서 사용하던 것으로 linux에서는 사용할 수 없다고 한다. 이유는 없으니까..
그래서 리눅스에서는 아래와 같이 많들어서 사용해야 한다.
- programming_mpi . . . . 29 matches
MPI 프로그래밍 가이드
* '''buf''' : 주고 받을 데이터
* '''count''' : 주고 받을 데이터의 사이즈
* '''datatype''' : 주고 받을 데이터의 타입
* MPI_Get_count() 함수를 통해서 전달 받은 메세지의 사이즈를 확인 할 수 있다.
* '''buf''' : 주고 받을 데이터
* '''count''' : 주고 받을 데이터의 사이즈
* '''datatype''' : 주고 받을 데이터의 타입
아래와 같이 비동기 방식으로 코딩을 하게 되면 결과가 조금 달라진다.
Rank 3의 결과를 마지막에 받기 때문에 Rank3의 종료가 Rank 0 이후로 넘어가는 모습을 확인할 수 있다.
MPI_Wait()함수는 Request Handle 이 종료 될때까지 기다림.
MPI_Test()함수는 Request Handle의 상태에 상관 없이 대기하지 않음.
※ MPI_Wait()함수는 통신의 종료를 확인할 뿐만 아니라 통신에 사용한 버퍼를 free 시키는 함수 이기 때문에 비동기 통신 함수와 짝을 이루워야 한다. 짝이 안 맞으면 메모리 누수가 발생함.
교착상태에 빠지는 경우를 데드락이라고 한다.
위 코드를 교착상태에서 벗어나게 하기 위해서는 보내는 데이터의 사이즈를 줄이거나 MPI_Send() 대신 MPI_Isend()를 사용하면 된다.
MPI_Send는 버퍼 통신을 하게 되는데 보내려는 데이터의 사이즈가 시스템 버퍼 보다 작을 경우 Block 되지 않고 넘어간다.
하지만 보내려는 데이터가 시스템 버퍼 보다 크게 되면 데이터를 다 전송하기 전까지 대기 모드에 들어간다.
이점 때문에 데드락이 발생할 수 있게 된다.
이 전까지 다룬 내용은 점대점 통신으로 특정 rank간의 통신을 다루웠다.
가상의 토폴리지에서 이웃 Rank의 정보를 얻어오는 함수
- programming_open_flag . . . . 11 matches
이 옵션은 fcntl.h에 정의 되어 있기 때문에 헤더 파일을 추가 해줘야 한다.
* '''O_APPEND''' : 파일 오프셋을 파일의 끝으로 이동, 끝부분에 추가할 수 있게 해줌
* '''O_TRUNC''' : 파일을 쓰기 위해서, 열은 파일의 내용을 지워서 길이가 0이 되도록 만든다.
* '''O_CREAT''' : 명시된 파일이 존재하지 않으면 파일을 만든다.
이 플래그를 넣으려면 반듯이 다음 아규먼트로 원하는 권한을 명시해야한다.
조합을 사용할 것을 추천한다. 이경우에 파일이 존재하면 에러를 리턴한다.
* '''O_NOCTTY''' : 열려 있는 장치가 컨트롤링 터미널이 되지 못하도록 해준다.
* '''O_NONBLOCK''' : OPEN 함수가 즉시 리턴될 것이지, 장치가 준비될 때까지 블록될 것인지 제어함.
- programming_openmp . . . . 78 matches
#title OpenMP 프로그래밍 가이드
요즘 들어 멀티코어라는 말을 흔하게 듣게 되는데 컴퓨터뿐만 아니라 휴대폰 및 모발일 기기에도 듀얼 코어니 쿼드 코어니 하는 말을 한다. 모든 기기의 멀티코어 시대가 도래한 것이다. 싱글 코어로 계산량을 늘리는데 한계(?)에 부딪친 CPU 제조사들은 싱글 코어를 여러게 붙인 멀티코어 제품을 속속 내놓고 있다.
그에 따라 프로그래밍 방법에도 변화가 찾아온 것이다. 그렇다고 해서 병렬 프로그램이 갑자기 생겨난 것은 아니다. 병렬 프로그램은 싱글 코어가 주류이던 시절에도 있었다.
멀티 프로세스를 사용한 fork()와 멀티 스레드를 사용하는 pthread() 등이 백그라운드 로딩이라든지 네트워크 통신등에 많이 사용되고 있었고 지금도 사용 되고 있다.
멀티 코어 CPU가 발전하는 만큼 이를 쉽게 사용할 수 있게 해주는 라이브러리도 발전하고 있는데 OpenMP, TBB, PPL등이 그것이다.
이들 라이브러리를 사용하면 더욱 쉽게 멀티 스레드를 할용한 프로그램을 만들 수 있다.
기본적인 병렬 프로그래밍 이슈들에 대해 알아보고 OpenMP를 사용해서 병렬 프로그램을 만들어 보도록 하겠다.
* 예를 들면 A라는 프로세스는 프로세서 B가 가진 자원이 있어야만 동작이 가능하며 B의 작업이 끝나기를 기다리고 있고, B도 A가 가진 자원이 필요해 A가 끝나기를 기다리는 상태에 있다면 결국 이 두 프로센서는 서로가 끝나기를 기다리는 상태가 되서 영원히 끝날 수 없게 된다.
* 참조만 할 경우에는 크게 상관 없지만 자원의 값을 업데이트 하는 경우에는 접근하는 프로세스의 순서에 따라서 결과를 예측할 수 없게 된다.
이라는 코드를 여러 개의 쓰래드가 수행한다고 하자.
근데 이 한 줄의 코드를 프로세스가 수행할때는 간단하지 않다.
1. 더해진 값으로 sum을 업데이트 한다.
굶주린 상태라고 표현할 수 있는데 이 문제를 간단한 이야기로 설명해 보자
테이블 위에 포크와 나이프 그리고 스테이크가 올려져 있다.
스테이크를 먹기 위해서는 포크와 나이프를 모두 쥐고 있어야 한다고 가정하고
포크와 나이프가 사람 수 만큼 충분하지 않을 경우를 생각해 보자.
테이블에 앉은 사람들은 모두 배가 고픈 상태로 탐욕적으로 토크와 나이프를 쥐려다 보니 누구는 포크나 쥐었고 또 다른 누구는 나이프만 들게 되어 스테이크를 먹지 못하는 일이 생길 수 있다.
포크를 쥔 사람은 나이프를 얻으려고 할 것이고 나이프를 쥔 사람은 포트를 얻으려고 할 것이다.
이렇게 자원은 쥐고 서로 놓지 않을 경우 스테이크를 먹지 못하고 굶주린 상태(Starvation)이 발생하게 된다.
이런 경우를 피하기 위해서는 자신이 작업을 진행하기 위해서 필요한 모든 자원원 얻지 못해 작업을 수행하지 못 하는 상태에서는 확보한 자원을 반환하고 일정 시간 후에 자원 할당을 받을 수 있도록 해서 특정 자원을 잡고 있는 상태가 지속 되지 않게 해야 한다.
- programming_sh_copy . . . . 1 match
쉘명령어를 이용해서 간단한 프로그램을 하는 방법에 대해서 설명 한다.
- programming_struct_usage . . . . 1 match
Struct에 열거 된 데이터들 중 임의의 값을 초기화 하기 위한 코드
- public_problem . . . . 17 matches
= 빅데이터 플랫폼 & 시각화 솔루션 (㈜조인트리) =
홈페이지 : www.jointree.co.kr/ [http://www.k-safetyexpo2020.com/lib/download.php?file_name=jointree_company.pdf&save_file=com_intro_file_202008311234330.pdf&file_path=/upload/company/ 회사소개서]
㈜조인트리는 지속적인 투자를 통해 높은 매출 증가 추이를 보이고 있으며, 외부로부터의 안정적인 신용평가를 바탕으로 성실하게 사업을 수행하여 2017년 이후 4차산업 혁명을 준비하기 위해 SI/SM 사업 기반 신기술 R&D와 HRD을 통해 사회공익증진과 지식공유를 실천하고 있습니다.
= 순돌이 드론 =
홈페이지 : www.sundori.net [http://www.k-safetyexpo2020.com/lib/download.php?file_name=2002%20%EB%A6%AC%ED%94%8C%EB%A0%9B_%EB%89%B4.zip&save_file=com_intro_file_202009031751230.zip&file_path=/upload/company/ 회사소개서]
순돌이드론은 특수 산업용 무인기 개발, 제조 전문기업이다. 농약살포드론을 개발, 보급화하며 산업용드론의 포문을 연 선두기업으로, 다년간 축적된 기술력과 수준 높은 석박사의 기술개발로 쉼 없이 도약하고 있다.
기본에 충실한 기술력을 바탕으로 솔루션의 목적, 환경, 용도에 맞추어 제품을 커스터마이징하여, 다양한 산업분야에서 적용하고 있다.
2019년 개발 완료, 2020년 출시된 유선드론, “T-Dori”는 2020년 가장 주목받는 제품으로 유선을 이용하여 전력을 공급받아, 24시간 비행한다. 촬영, 감시, 인명구조, 서치라이트 드론 등에 활용되고 있다. GCS(Ground Control Station) 탑재, 통제차량은 드론의 관제 및 안전제어 등 다양한 외부환경에서 드론을 효율적으로 통제하고, 실시간 영상수신 및 분석을 통하여 드론을 활용한 공공서비스 분야에서 효율적인 미션 수행을 지원한다.
그 외 엔진을 장착하여 비행성능을 높인 하이브리드드론, 실시간 미세먼지를 분석하고 포집하는 미세먼지 측정드론 등 임무 특화용 드론은 소방, 해양, 환경, 산림 등 다양한 산업분야에서의 효율적인 미션 수행을 지원한다.
홈페이지 : www.onpoom.co.kr [http://www.k-safetyexpo2020.com/lib/download.php?file_name=%EC%9D%B8%EB%B9%8C%EB%94%A9%20%ED%86%B5%ED%95%A9%20%EC%95%88%EC%A0%84%20%EA%B4%80%EB%A6%AC%20%ED%94%8C%EB%9E%AB%ED%8F%BC.pdf&save_file=catalog_file_202009221029130.pdf&file_path=/upload/company/ 회사소개서]
주식회사 온품은 1984년 10월 (주)에이앤디엔지니어링으로 창립 이후 지난 36년간 국내·외 지진, 홍수 등 다양한 공공 재난 예·경보 솔루션 개발 및 구축하였습니다.
- python_animation_plot . . . . 8 matches
#title 움직이는 그래프 그리기
실시간으로 움직이는 그래프를 그려보자.
collections 라이브러리는 파이션 내장 데이터 타입 위해 편의를 제공하기 위해서 특별한 자료형을 만들어줬다.
그 중 이 예제에서 사용한 '''deque'''를 보자.
위 코드는 뷰에 '>--------------------' 스트링을 넣어 놓고 특정 시간 스텝마다 하나씩 로테이션 시켜주는 예제이다. ''print문 종말에 ,는 줄바꿈을 하지 않기 위해서 쓰여짐.''
- python_c_c++ . . . . 90 matches
#title 파이션 C&C++ 연동하기
파이션을 사용하다 보면 필연적으로 C나 C++을 찾게 된다. 이유인즉,
파이션을 사용자에게 여러가지 편의를 제공해주는 아주 좋은 인터프린터 프로그램 언어임에 틀림 없지만 사용하다 보면 성능 측면에서 부족함과 답답함을 느끼는 순간이 있다. 텍스트를 파싱하고 간단한 벡터와 메트릭을 연산할때는 좋은데 계산량이 많거나 처리해야 할 일이 많을 경우 C나 C++에 비해 상대적으로 느림을 알 수 있다. 이런 경우 계산 부분만 C나 C++로 할 수 없을까 하는 생각을 하게 된다. 지금 부터 알아보려고 하는 것은 이런 문제를 해결하기 위한 방법이다.
파이션에서 C나 C++를 불러서 사용하는 방법에 대해서 알아보도록 하자.
그 반대의 경우도 가능하나 지금은 파이션에서 외부 모듈을 불러서 사용하는 것만을 다루도록 하겠다.
= 파이션에서 C&C++ 연동하기 위한 방법 =
파이션에서 제공하는 ''C interoperability API, SWIG, SIP, CXX...'' 등의 방법이 있다.
그 중에서 여기서 사용할 방법은 Boost라이브러리에서 제공하는 Boost.Python을 사용하려고 한다.
= Boost Python 라이브러리를 이용한 C&C++ 모듈 사용 =
== Boost Python 라이브러리 설치 ==
'''sudo apt-get install libboost-python-dev'''로 배포판에서 제공하는 바이러리 파일을 받아서 사용할 수 있다.
소스를 받아서 설치하는 것은 또 다른 문제이기 때문에 여기서는 다루지 않는다.
boost Getting Started on Windows[https://www.boost.org/doc/libs/1_69_0/more/getting_started/windows.html] 페이지의 1. Get Boost에 보면 [https://www.boost.org/users/history/version_1_67_0.html boost_1_67_0.7z or boost_1_67_0.zip]을 받을 수 있는 링크를 확인할 수 있다.
boostrap.sh을 실행하면 config를 생성해준다. config 파일에는 다양한 설정을 넣을 수 있는데 간단하게 header와 라이브러리 패스를 지정할 수 있고 연동될 파이썬을 넣을 수 있다. 절대 경로를 넣어서 특정 파이썬 버전을 연동할 수도 있고 그게 아니라면 현제 사용하는 파이썬을 연동하기 위해서 python만 넣어도 무방하다.
이렇게 하면 "project-config.jam"이 생성된다. 이를 이용해서 b2 명렁어로 컴파일을 진행한다. 컴파일이 끝나면 b2 install 이라고 하면 바이러리 복사가 진행된다.
마지막으로 라이브러리를 사용하기 위해 환경설정에 라이브러리 패스를 넣어주면 된다.
* booststrap.sh을 사용해서 설정파일을 생성하면 project-config.jam 파일이 생성 되는데 생성된 파일을 열어서 실제 설정값이 잘 들어 갔는지 확인해봐야 한다. 설정값이 정상적이지 못하면 문제가 발생한다.
'''boost/python.hpp''' 파일이 Boost Python 라이브러리의 헤더 파일이다.
두번째 ''stdexcept'' 파일은 예러를 던지기 위해서 사용하는 파일이다.
파이션으로 받은 인자에 오류가 발생했을 경우 그 오류를 C모듈에서 처리하고 그 것을 파이션에게 알려주기 위함이다.
- python_chat_program . . . . 169 matches
#title 보안을 고려한 파이션 채팅 프로그램 작성(Secured chatting program with python)
기능 위주의 프로그램을 작성하다 보면 보안을 고려하지 않는 경우가 많다. 편의성과 화려함으로 치장된 프로그램은 간혹 치명적인 오류로 대대적인 디버킹 작업을 해야하는 경우가 있다. 이미 만들어져서 서비스중이라면 이야기는 더 복잡해진다. 프로그램의 설계 단계부터 보안을 고려하였다면 조금 더 안정적이고 사용자 편의성을 고려한 서비스를 제공할 수 있었을 것이다.
''David A. Wheeler''의 '''Secure Programming HOWTO'''[* ''David A. Wheeler'', '''Secure Programming HOWTO''', 2015.]란 책을 토대로 보안을 고려하여 채팅 프로그램의 설계부터 구현까지를 진행하도록 하겠다. 사용 언어는 Python을 사용하였으면 버전은 2.7을 사용하였다. Python이란 언어의 특성상 멀티 플랫폼을 지원하지만 편의상 Ubuntu 16.04 환경을 기준으로 설명하도록하겠다.
본 문서는 채팅 프로그램의 설계 및 구현 과정과 결과물에 대한 소개 적용한 보안 사항에 대해서 이야기하고 이 프로젝트를 진행하면서 느낌점을 정리하는 것으로 마무리 하도록 하겠다.
보통 설계과정 중 요구사항 분석과정은 프로젝트의 절반이상을 차지할만큼 중요하지만 이미 요구사항과 디자인이 주워져 있기 때문에 주어진 요구사항과 디자인 편의성을 다시한번 언급하는 것으로 생략하도록 하겠다.
사용자 인터페이시는 GUI환경을 사용하지 않고 Command line의 콘솔 입출력을 사용하도록 한다.
채팅 프로그램에 접속하기 위한 계정을 관리하기 위해 DB를 사용하고 분리된 채팅방에서 사용자간 파일을 교환할 수 있도록하고 채팅방별로 인가된 사용자만이 파일에 접급할 수 있도록 한다.
파이썬은 많은 기능을 라이브러리로 제공하고 있기 때문에 필요한 기능을 구현하기 위해 필요한 라이브러리가 있는지를 조사하는 것이 중요하다. 필요한 기능이 없다면 구현해야 한다. 하지만 그런 일은 흔치 않다. 파이썬에서 농담처럼 하는 말중에 어떻게 날 수 있냐는 질문에 "I just typed import antigravity."라는 말이 있다.[* "Python" <https://xkcd.com/353/>. (21 Nov 2017) ] 파이썬 라이브러리의 방대함을 빙자한 말이다. 필요한 기능이 있다면 라이브러리를 import 하면 된다.
그렇다면 기능 구현을 위해서 필요한 라이브러리에 대해서 알아보자. 기본적으로 서버와 클라이언트가 데이터를 교환하기 위해서는 TCP/IP 소켓 프로그램 라이브러리가 필요하다.[* K. Hong. "Network Programming II - Chat Server & Client" <http://www.bogotobogo.com/python/python_network_programming_tcp_server_client_chat_server_chat_client_select.php>. (21 Nov 2017)]
소켓을 사용하기 위한 '''socket'''라이브러리 뿐만 아니라 멀티 소켓을 모니터링하기 위한 '''select'''라이브러리 까지 이미 구현되어 있다.
시스템의 환경변수와 시스템 명령어를 사용하기 위한 라이브러리로 '''os'''와 '''sys'''를 사용할 수 있다. 시스템 시간을 갖고 오기 위해 '''time''' 라이브러리를 사용했다. 서버는 여러 클라이언트의 요구에 응답해야 하기 때문에 멀티 쓰레드로 동작하여야 한다. 클라이언트도 채팅을 하면서 파일 교환을 하려면 멀티 쓰레드가 필요한다. 이를 위해서 '''threading''' 라이브러리를 사용했다. DB는 mysql이나 오라클을 사용 할 수 있지만 간단하게 사용할 수 있는 sqlite를 사용했다. 파이썬에서는 '''sqlite3''' 라이브러리를 제공하고 있다.
'''사용한 라이브러리'''
사용자 관리를 위해서 DB를 사용했다. DB는 파이썬에서 제공하는 '''sqlite3'''을 사용했다. [* K. Hong. "SQLITE3 B. SELECT/UPDATE/DELETE - 2017" <http://www.bogotobogo.com/python/python_sqlite_select_update_delete.php>. (21 Nov 2017)]
DB에 어떤 것들을 넣어 관리할까를 고민 했다. 기본적으로 유저 아이디와 비밀번호가 필요하겠다. 아이디는 한번 정하면 변경이 불가하다. 때문에 별명을 따로 관리하여 필요에 따라서 변경할 수 있으면 좋을 것이다. 또한 비밀번호를 안전하게 관리해야 한다. 비밀번호를 안전하게 관리하기 방법을 DB설계 단계에서 고려하여야 한다. 비밀번호를 안전하게 관리하기 위한 방법으로 ''Salted Password Hashing'' 방법을 사용했다. 자세한 내용은 별도의 페이지에서 설명하도록 하겠다.
=== 데이터베이스 정규화 ===
DB에서 관리할 데이터를 정의했다면 데이터 중복성과 DB의 유지 보수의 편의성을 높이기 위해 테이블 정규화를 해야한다.[* 엇봄비닷 (12 Feb 2013). "DB 정규화의 중요성. (1,2,3 차 정규화 종합 예시)" <http://blog.daum.net/bluelinu/8511663>. (12 Nov 2017)]
* 사용자 이름 테이블 (user_name_table)
* 사용자 Password 테이블(user_password_table)
* 사용자 닉네임 테이블(user_nickname_table)
* 사용자 Salt 테이블(user_salt_table)
- python_generator . . . . 100 matches
지난 글에서는, 생산자-소비자 패턴(Producer-Consumer Pattern)의 소비자 쪽의 코드를, 함축적이면서도 자연스럽게 기술할 수 있는 방법을 제공하는 이터레이터를 살펴봤습니다. 오늘은 생산자 쪽을 들여다봅니다.
앞서 Range 라는 클래스를 통해 이터레이터를 살펴보았습니다만, 이 코드에는 불편한 부분이 있습니다. 대부분의 작업은 __next__() 메쏘드를 통해 구현되는데, 매번 예전의 상태를 복구한 후, 작업을 수행하고, 다시 상태를 저장하는 작업을 반복하게 됩니다. Range 와 같은 간단한 작업에서야 문제될 것이 없지만, 알고리즘을 기술하는 자연스러운 방식에서 벗어나 있기 때문에, 작업이 복잡해질수록 점점 문제가 됩니다. 이런 스타일의 프로그래밍은 이벤트 주도형 프로그래밍(event-driven programming)에서 자주 등장하는데, 비동기 IO(Asynchronous IO) 나 GUI 프로그래밍을 해 보셨다면 이미 익숙할 겁니다.(지금 우리가 걷고 있는 길은 이 문제들에 대한 직접적인 해결책으로 이어집니다. 하지만 아직은 갈 길이 멉니다.)
파이썬에서는 제너레이터(generator)라는 이터레이터의 확장을 제공합니다. 이터레이터가 단지 프로토콜인데 반해, 제너레이터는 yield 라는 전용의 키워드를 통해 문법적인 특별함을 더합니다. Range 를 제너레이터로 다시 구현해 보겠습니다. (되도록 이터레이터 구현과 유사하게 코드를 구성했습니다.)
파이썬은 함수 정의에 yield 키워드가 등장하면 그 함수 전체를 제너레이터로 인식하고, 특별한 VM 코드를 생성해냅니다. 함수의 코드를 재구성해서 같은 일을 하는 이터레이터를 만든 다음, 원래 함수는 그 이터레이터 인스턴스를 돌려주는 함수로 바꾼다고 보시면 됩니다.
제너레이터는 이터레이터입니다.
이터레이터 구현과 제너레이터 구현간에는 이런 문법적인 차이가 있습니다.
* 이터레이터 구현에서 __next__() 의 return 값은, 제너레이터 구현에서는 yield 값으로 대체됩니다.
* 제너레이터에서 return 문은 StopIteration 예외를 일으킵니다. 함수의 끝에 도달해도 마찬가지 입니다. 파이썬 3 에서는 return 문이 값을 포함할 수도 있지만, 오늘 다룰 범위를 벗어납니다.
제너레이터를 위해 파이썬이 만들어내는 이터레이터를 제너레이터-이터레이터(generator-iterator)라고 부르는데, 이터레이터는 프로토콜인 반면 제너레이터-이터레이터는 실제 구현이 제공되는 것이라, 일반적인 이터레이터에서 지정하지 않은 동작들이 구체적으로 정의되기도 합니다.
가령 예외의 경우, 이터레이터의 __next__() 가 StopIteration 또는 그 외의 예외를 일으킨 후에 이터레이터가 어떤 상태가 되는지는 정의되어있지 않습니다. 하지만 제너레이터의 경우는 항상 이렇게 됩니다.
* 일단 StopIteration 예외가 일어나면 그 이후에는 계속 StopIteration 예외를 일으킵니다.
* StopIteration 이외의 예외가 일어나면, 일단 caller 에게 예외가 전달됩니다. 하지만 그 이후로는 계속 StopIteration 예외를 일으킵니다.
재진입(Reentrancy) 문제도 이터레이터에서는 정의되어있지 않습니다. 가령 __next__() 메쏘드 내에서 직접적이던 간접적이던 next(self) 를 호출했을 때 어떤 일이 일어나야 할지 지정되어 있지 않다는 것입니다. 그러니 재귀적인 구현도 생각해볼 수 있습니다. 하지만 제너레이터에서는 재진입이 허락되지 않습니다.
그런데 이 예에서 볼 수 있듯이 lambda 로 제너레이터를 만들어도 문제가 되지는 않습니다. 그런데 lambda 의 바디에는 문장(statement)이 아니라 표현식(expression) 이 온다는 것을 기억하십니까? yield 를 둘러싼 괄호가 yield 가 표현식임을 알려줍니다. 예 지금까지 저희는 yield 를 문장처럼 사용해 왔습니다만, 사실 yield 는 표현식입니다. 그러면 그 값은 뭘까요?
처음 인쇄된 'output' 은 next(g) 의 반환 값이고, 다음 next(g) 호출의 처음에 인쇄된 None 이 yield 표현식의 결과값입니다. 순서를 잘 기억하세요, 첫 번째 next() 에서 yield 로 값을 전달한 후에, 다음 next() 가 호출될 때야 비로소 yield 표현식이 값을 전달합니다.
caller 가 제너레이터로 값을 전달해 준다면 yield 표현식은 None 이외의 값을 가질 수 있습니다. 이를 위해 제너레이터에는 send() 라는 메쏘드가 제공됩니다.
None 이 send() 가 전달한 'input'으로 대체된 것을 확인하실 수 있습니다. 주의할 부분은 첫 번째 next(g) 대신 g.send('input') 을 사용할 수 없다는 것입니다.
이유는 앞에서 주의를 부탁한 실행 순서 때문입니다. 첫 번째 yield 표현식은 최초의 yield 가 일어난 후에 전달됩니다. 즉 send() 메쏘드는 yield 로 값을 전달한 후에, caller 가 next() 나 send() 를 호출해주기를 기다리고 있는 제너레이터에만 사용될 수 있습니다. 꼭 send() 를 사용해야 한다면 None 을 전달할 수 있습니다.
제너레이터에는 send() 외에도 throw() 와 close() 라는 메쏘드가 더 제공됩니다. 이 메쏘드들은 나중에 다룰 기회가 있을 겁니다만, 제너레이터에 이런 기능들이 들어간 목적이 무엇일까요? 그 것은 바로 다음에 다룰 코루틴(coroutine) 때문입니다.
- python_index . . . . 12 matches
= [:python_installation 파이션 설치 하기] =
파이션 2.7.9 버전 설치 과정 스크립트.
= [:python_c_c++ C언어 파이션 연동하기] =
부스트 파이션을 사용한 파이션 연동 테스트
= [:python_animation_plot 움직이는 그래프 그리기] =
실시간으로 업데이트 되는 그래프를 파이션을 사용해서 그려보자.
= [:python_generator 제너레이터] =
= [:python_iterator 이터레이터] =
= [:python_object_oriented 파이션 in 객체지향 ] =
- python_install_guide . . . . 3 matches
파이썬은 version 2와 version 3으로 구분 되고 둘은 비슷하지만 전혀 다른 언어라고 봐도 된다. 호환이 안 되니까..
위 내용 추가 src_dirs 는 절대 경로 이다.
- python_installation . . . . 26 matches
파이션은 2.xx 와 3.xx로 구분 될 수 있다. 이는 2.xx 에서 3.xx로 버전이 비약적으로 업데이트 되면서 하위버전 호환성을 고려하지 않았기 때문에 생기는 문제점이다. 3.xx의 버전이 업데이트 되면서 해결될 문제 이지만 현제 호환성 문제가 있음을 알고 있어야 프로그램을 하면서 생기는 문제에 당황하지 않을 수 있다.
최신 버전은 파이션 홈페이지[[footnote(https://www.python.org/)]]에서 최신 버전을 받을 수 있다. 현재는 2.xx와 3.xx 두 버전으로 제공하고 있지만 2.xx 버전의 업데이트는 진행 되고 있지 않다. 특별한 목적이 아니라면 3.xx를 사용해 보는 것을 추천한다.
편의 기능으로 ipython 이라는 인터페이스를 설치 할 수 있는데 파이션 자체가 제공하는 환경보다 편의 기능이 강화되어 프로그래밍하기에 좋은 환경을 제공합니다. 이거 역시 2.xx 버전과 3.xx 버전을 구분해서 제공합니다.
폐키지마다 의존성이 있어서 설치 순서가 중요하다.
cp INSTALL/make.inc.grotran make.inc #blas와 lapack이 포트란으로 컴파일 된 라이브러리를 scipy가 원하기 때문에 포트란으로 컴파일해야 한다.
로컬이 아닌 시스템에 설치하기 위해서는 아래와 같이 하면 된다.
scipy 는 blas와 lapck에 의존성이 있어서 설치와 환경변수 설정이 되어야 한다.
numpy에 의존성이 있다.
1. [:python_c_c++ 파이션 c&c++ 연동하기]
- python_iterator . . . . 70 matches
대부분의 파이썬 튜토리얼들과는 달리 파이썬 3.3을 중심으로 기술하고 파이썬 2를 포함한 하위 버전에서 차이를 보이면 따로 설명합니다.
파이썬의 시퀀스는 for 루프로 탐색할 수 있습니다.
이 경우 딕셔너리의 키를 탐색하게 되는데, 키가 전달되는 순서는 정해지지 않았습니다. 때문에 여러분이 직접 실행할 경우, 위의 예와는 다른 순서로 키가 인쇄될 수 있습니다. 이터레이터(iterator)를 제공한다면 시퀀스가 아닌 타입도 for 루프로 탐색할 수 있습니다. 이터레이터는 내장 함수 iter() 를 사용해서 얻습니다.
이렇게 얻은 이터레이터를 탐색하려면 내장 함수 next() 를 사용하면 됩니다.
next() 를 사용해 한 번에 하나씩 탐색해 나가다가, StopIteration 예외가 발생하면 끝냅니다. 이러한 탐색 법에 대한 약속을 이터레이터 프로토콜(Iterator Protocol)이라고 부르는데, for 루프는 간결한 문법을 제공합니다.
사용자가 정의한 클래스가 이터레이터를 지원하려면 {{{__iter__()}}} 메쏘드를 정의하면 됩니다. iter() 는 객체의 {{{__iter__()}}} 메쏘드가 돌려주는 값을 이터레이터로 사용합니다. next() 에 이터레이터를 전달하면 이터레이터의 {{{__next__()}}} 메쏘드를 호출합니다. 때문에 최소한의 이터레이터는 이렇게 구성할 수 있습니다.
... return self # 이터레이터인 경우는 자신을 돌려주면 됩니다.
... next = __next__ # 파이썬 2 에서는 __next__ 대신 next 를 사용합니다.
Range 클래스는 이터레이터 외의 용도가 없습니다. 하지만 딕셔너리는 별도의 용도가 있고, 사실 딕셔너리는 이터레이터가 아닙니다.
딕셔너리를 for 루프에 직접 사용할 수 있는 이유는 딕셔너리 역시 {{{__iter__()}}} 메쏘드를 제공하고 있기 때문입니다. 비슷한 방법으로 RangeFactory 라는 클래스를 만들어보면:
{{{__next__()}}} 메쏘드를 제공하고 있지 않기 때문에 RangeFactory 의 인스턴스는 이터레이터가 아닙니다만, {{{__iter__()}}} 메쏘드를 통해 이터레이터(이 경우에는 Range 인스턴스)를 제공하고 있기 때문에 for 루프에서 사용될 수 있습니다. 사실은 이 용법 때문에 이터레이터에도 큰 의미 없는 {{{__iter__()}}} 메쏘드를 만들어주도록 요구하고 있습니다.
이렇게 for 루프에 이터레이터를 직접 요구하지 않고, 이터레이터를 만드는 객체를 요구함으로써, 많은 경우에 for 루프가 깔끔해지기는 하지만, 간혹 혼란을 야기할 수 있는 경우도 발생할 수 있습니다.
이 경우는 for 루프를 시작할 때마다 새로운 이터레이터(Range 인스턴스)가 만들어집니다. 때문에 매번 새로운 루프가 시작되는 것이지요. for 루프가 이터레이터를 재사용하는 것으로 보일 때는, 인스턴스가 이터레이터인지 이터레이터를 제공하는 객체인지를 확인하는 것이 중요할 수 있습니다.
프로그래밍을 하다 보면 한쪽에서 생산하고(produce), 다른 쪽에서 소비(consume) 하는 상황을 자주 만납니다. 이를 생산자-소비자 패턴(Producer-Consumer Pattern)이라고 하는데, 이터레이터는 소비자 쪽의 코드를 함축적이면서도 자연스럽게 기술할 수 있는 방법을 제공합니다. 이제 필요한 것은 생산자 쪽의 코드를 자연스럽게 구성할 수 있는 방법입니다. 다음에 다룰 제너레이터(Generator) 가 파이썬의 대답입니다.
- python_logging . . . . 27 matches
Python 프로그램을 작성하면서 프로그램 동작 중 발생할 수 있는 다양한 로그를 출력하기 위한 방법으로 logging 라이브러리를 사용하여 로그를 작성하는 방법을 알아보자.[* https://jh-bk.tistory.com/40]
||INFO ||프로그램 작동이 예상대로 진행되고 있는지 트래킹하기 위한 용도로 사용 ||
||WARNING ||예상치 못한 일이나 추후 발생 가능한 문제를 표시하기 위해 사용 ||
||ERROR ||심각한 문제로 인행 프로그램이 의도한 기능을 수행하지 못하고 있는 상황을 표시. ||
로거 설정 시 레벨을 지정해 주면 해당 레벨 이상의 로그 이벤트만 기록한다. 디폴트(Default) 설정은 WARNING으로 Warning 이상의 이벤트만 트래킹 되도록 되어 있다.
logging 모듈을 import하고 위와 같이 실행하면 warning에 대한 내용만 출력되는 것을 확인할 수 있다.
logging.basicConfig() 함수를 통해서 로그를 설정할 수 있다. 이 함수는 최초 1회만 적용되면 이후 호출되는 함수에 대해서는 무시된다. '''filename'''로 지정된 파일에 로그를 기록하면 파일이 존재하는 경우 내용을 덮어쓰지 않고 이여서 기록하도록 되어 있다. 덮어쓰도록 설정하고 싶다면 '''filemod="w"''' 옵션을 설정하면 된다.
||args ||직접 포맷할 필요는 없습니다. ||message 를 생성하기 위해 msg 에 병합되는 인자의 튜플. 또는 (인자가 하나뿐이고 딕셔너리일 때) 병합을 위해 값이 사용되는 딕셔너리. ||
||asctime || %(asctime)s ||사람이 읽을 수 있는, LogRecord 가 생성된 시간. 기본적으로 ‘2003-07-08 16:49:45,896’ 형식입니다 (쉼표 뒤의 숫자는 밀리 초 부분입니다). ||
||created || %(created)f ||LogRecord 가 생성된 시간 (time.time() 이 반환하는 시간). ||
||funcName || %(funcName)s ||로깅 호출을 포함하는 함수의 이름. ||
||lineno || %(lineno)d ||로깅 호출이 일어난 소스 행 번호 (사용 가능한 경우). ||
||message || %(message)s ||로그 된 메시지. msg % args 로 계산됩니다. Formatter.format() 이 호출될 때 설정됩니다. ||
||module || %(module)s ||모듈 (filename 의 이름 부분). ||
||name || %(name)s ||로깅 호출에 사용된 로거의 이름. ||
||pathname || %(pathname)s ||로깅 호출이 일어난 소스 파일의 전체 경로명 (사용 가능한 경우). ||
||processName || %(processName)s ||프로세스 이름 (사용 가능한 경우). ||
||relativeCreated || %(relativeCreated)d ||logging 모듈이 로드된 시간을 기준으로 LogRecord가 생성된 시간 (밀리 초). ||
||stack_info || 직접 포맷할 필요는 없습니다. ||현재 스레드의 스택 바닥에서 이 레코드를 생성한 로깅 호출의 스택 프레임까지의 스택 프레임 정보 (사용 가능한 경우). ||
||threadName || %(threadName)s ||스레드 이름 (사용 가능한 경우). ||
- python_module_pyaudio . . . . 12 matches
Python으로 1분단위로 오디오를 녹음해서 mp3파일을 만드는 프로그램을 라즈베리파이에서 구동하려고 한다.[* https://whansunkim.top/wiki.php/raspberry_pi_pyAudio] 이 프로그램의 목적은 실험 장비의 이상 유무를 오디오로 모니터링하기 위함이다. 그 과정에 대해서 자세히 설명하고자 한다.
사용하는 마이크 장비를 확인하는 방법은 아래와 같은 Python 코드를 실행보면 확인 할 수 있다.
= systemd를 이용한 service 등록하기 =
systemd(System daemon)은 Unix 시스템이 부팅후에 가장 먼저 생성된 후 다른 프로세스를 실행하는 init 역할을 대체하는 데몬입니다. Rad Hat의 주도로 개발되어 지금은 RHEL/CentOS/Ubuntu 나 Arch 등 많은 리눅스 시스템에서 채택하고 있습니다.
systemd(system daemon)는 1번 프로세스 ID를 갖고 있으며 부팅부터 서비스관리 로그관리 등을 담당합니다. 또한 부팅시에 병렬로 실행되어서 부팅속도가 빠릅니다. 오래전에 사용하던 init방식은 부팅 과정에서 단계적으로 run-level을 올려가며 해당 run-level에 포함된 스크립트들을 순차적으로 실행시키니 설정이 복잡했으며 속도마저 느렸었습니다.
# 자신이 사용하는 마이크에 따라서 해당 옵션을 설정해줘야 한다.
# 1분 단위 mp3를 저장하기 위한 베이스 디렉토리
# 베이스 디렉토리에서 년, 월, 일 폴더가 생성되고 최대 60 * 24 개의 mp3가 저장 된다.
- python_object_oriented . . . . 27 matches
기본적으로 파이션의 모든 요소들이 객체(''Object'')로 되어 있다. 나는 파이썬을 처음 접하고 스크립트 수준으로 그때 그때 필요한 것들을 만들어 쓰고 버렸다. 이 시간 이후 부터는 코드의 재사용성을 높이기 위해서 객체지향 프로그래밍 방법을 사용해서 코드를 만들어 보려고 한다.
= 파이썬 클래스 =
파이썬에서 클래스 정의는 C++의 클래스와 다르다. 이미 모든것이 객체이기 때문에 정의를 해서 사용한다는 것보다는 복제하고 수정해서 사용한다고 볼 수 있다. 기본적으로 모든 클랙스는 '''object''' 클래스를 상속 받아서 만들어진다.
파이썬 클래스는 클래스 변수는 공유하고 인스턴스 변수는 각 인스턴스 객체마다 독립적으로 관리한다. 클래스 공통으로 공유해야 하는 변수는 클래스 변수로 정의하고 인스턴스 고유값은 인스턴스 변수로 정의한다.
클래스 아래에 정의 되는 함수(function)를 메소드(method)라고 하는데 파이썬 클래스는 3가지 Method를 갖을 수 있다.
각각은 인자로 무엇을 받느냐에 따라서 그 성격이 달라지며 메소드 앞에 어떤 데코레이터가 주워지는지에 따라서 구분 된다.
* '''static method'''는 자동으로 넘어오는 인자 없이 클래스와 인스턴스에 종속되지 않은 일을 수행한다.(@staticmethod)
파이썬에서 생성자는 __init__() 메소드를 binding 하여 처리한다.
파일을 다루기 위한 방법으로는 크게 3가지 방법이 있다고 하는데 여기서는 두가지 방법만을 다룬다.
파이썬에서는 iterator라고 하는 반복자를 사용하는 방식이나 참조로 묶인 자료형을 많이 사용한다. 이때 참조를 갖고 있는 구조체를 벗겨내고 알맹이를 넘기고 참조하고 싶거나 여러가지 객체를 하나로 묶어서 넘기고 싶을때 사용할 수 있는 특별한 형식을 알아보자
선언하는 인자형에 *을 붙이게 되면 한번에 여러 객체를 받아 넘기겠다는 것이고 코드 중간에 *를 사용하게 되면 컨데이너 혹은 iterator가 지칭하고 있는 참조를 풀어서 각가의 객체를 바로 보겠다는 의미가 된다.
[http://jonnung.blogspot.kr/2014/07/python2-unicode-utf8.html 파이썬 유니코드 다루기]
- python_re . . . . 1 match
정규표현을 이요한 문자열 처리를 도와주는 re 모듈을 사용하는 방법에 대해서 알아보자.[* https://engineer-mole.tistory.com/189]
- python_tip . . . . 152 matches
= 파이썬 초보자가 흔히 저지르는 실수 =
파이썬 프로그래머라면 누구나 한 때는 배워야 했고, 초보자로 시작했을 것이다. 초보자는 실수를 저지른다. 이 글은 내가 저질렀던 실수를 포함하여 몇가지 흔한 실수들을 밝힌다.
초보자의 실수는 파이썬의 잘못도 아니고, 초보자의 잘못도 아니다. 실수는 단순히 파이썬 언어를 잘못 이해한 결과일 뿐이다. 그렇지만, 언어의 특징을 잘못 이해(때로는 미묘한) 하는 것과 언어를 전반적으로 잘못 이해하는 것 그리고 그것으로 무엇을 할 수 있는지 (그리고 할 수 없는지)에는 차이가 있다. 함정수 글은 앞에 초점을 두었다; 이 글은 뒤의 문제를 다룬다.
다른 말로 하면, 이 글에서 실수란 코딩 실수나 비밀스런 언어의 함정이 아니라, 흔히 "잘못된 도구로 일을 하는" 경우를 이른다.
파이썬은 보통 VHLL 즉 아주-높은-수준의 언어(Very High-Level Language)라고 기술된다. 그래서, 당연히 높은-수준의 작업에 알맞다. 예를 들어 HTML 페이지를 만들거나 해석하는 것, 게임 엔진 스크립팅, 또는 웹 작업틀을 작성하는 것, 기타 등등의 예에 알맞다. 전형적으로 낮은-수준의 언어로 성취되는 작업에는 알맞지 않다. 예를 들어 장치 드라이버를 작성하는 것이 있겠다. 또는 수행속도가 중요한 작업에도 알맞지 않다. 예를 들어 3D 그래픽의 화면가공, 또는 무거운 숫자-쪼개기가 있다.
이는 곧 파이썬으로 이런 일들을 하는 것이 불가능하다는 뜻은 아니다; 그러나 이런 일을 하는 데 별로 알맞지 않을 것이다. 이를 처리하는 한가지 해결 방법은 C로 저-수준 코드를 작성하고, 파이썬에서 그 코드를 호출하는 것이다.
== 실수 2: 파이썬을 "X 언어" 식으로 코딩한다 ==
이는 거의 피할 수 없는 실수이다. 파스칼 같은 언어에서 왔고, 바로 파이썬을 시도한다면, 처음 작성한 코드는 아마도 파이썬 구문의 파스칼처럼 보일 것이다. 파이썬으로 파스칼 코드를 작성하려고 한다.
데이터 은닉에 너무 집착한다 (어떤 사람들은 이를 "캡슐화(encapsulation)"라고 부른다). 특별한 규칙이 추가되든 안되든 상관없이 모든 객체 속성에 획득자(getter)와 설정자(setter)를 쓴다 (Java, C++, Delphi)
특성(properties)을 남용한다 (파이썬 2.2의 새로 도입된 빛나는 특징 중 하나이다). (Java, Delphi, 어쩌면 Visual Basic, C++?)
함수나 클래스를 사용하기 보다, 기나긴 서술문을 줄줄이 사용한 프로그램을 작성한다 (그 옛날 Basic)
객체를 사용하기 보다, 데이터 구조를 건네는 함수를 사용한다 (Pascal, C)
반복이 더 적절한데도 재귀에 너무 많이 의존한다 (Lisp, Scheme, 기타 기능적 언어들)
몇가지 객체면 충분한데도, 약간만-다른 객체들을 너무 많이 작성하려 한다 (Java, C++, 기타 정적-유형의 OO 언어들)
(나의 경험에 의하면 파이썬이면 클래스를 덜 써도 된다는 것인데, 덜 유연한 언어라면 따로 클래스가 요구될 정도의 차이라도 파이썬의 동적 특징을 사용하면 그 차이를 다룰 수 있다.)
많은 함수/메소드 호출을 사슬처럼 엮는다. 이 때문에 코드의 가독성이 떨어진다 (Lisp, Scheme, 어쩌면 Perl?)
객체가 더 적절한데도, 함수에서 함수를 (...등등...) 돌려주는 함수들과 이런 함수들로 둘러싸인 이름공간을 조작하는 함수들을 많이 작성한다. (Lisp, Scheme, 기타 기능적 언어)
바이트코드 해킹으로 "예전 언어의(come from)" 서술문을 구현한다 (Intercal - 역주:언어의 일종)
여기에서 요점은 예전에 익숙했던 언어를 단죄하자는 것이 아니다 (비록 언제나 재미있겠지만 말이다;-). 요점은 좋은 "X 언어" 코드와 좋은 관행이 늘 파이썬으로 직접 번역될 수 있는 것은 아니라는 점을 강조하는 것이다.
== 실수 3: 기존 환경에 파이썬을 맞추려고 하지 말자 ==
- pytorch_exeample_mnist_grad_cam . . . . 33 matches
MNIST 데이터를 학습하고 CAM, Grad-CAM, Guided Grad-CAM으로 해석해보는 예제를 돌려보겠다.
MNIST 데이터는 가운데 정렬 되어 있어서 위치를 렘덤하게 조절해주기 위한 함수
torchvision.datasets 모듈에 다양한 데이터셋이 있는데 이를 받아와서 딥러닝 모델에 넣어주기 위한 과정을 설명한다.
[torchvision]는 널리 사용되는 데이터 셋과 아키텍쳐 모델 등을 갖고 있고 '''이미지 변환''' 모듈을 포함하고 있다.
DataLoader[* <https://pytorch.org/docs/stable/data.html#torch.utils.data.DataLoader>]는 데이터셋으로 부터 모델에 넣어주기 위한 모양으로 데이터를 전처리 해준다. 실제 데이터를 넘기는 것이 아니고 iternator의 형태로 객체를 넘기고 for문과 같은 loop에서 꺼내서 사용한다.
'''dataset''': 사용할 데이터 셋
'''batch_size''': 한번에 사용할 데이터의 갯수
'''shuffle''': True, False 데이터를 섞어서 뽑을 것인지
'''num_workers''': 데이터 전처리에 사용할 프로세서의 수 (전체 프로세서의 1/2, GPU를 사용한 연산을 할 경우. 그렇지 않은 경우 2개 정도, 근거는 없다 그냥 해봐라)
# model = nn.DataParallel(CNN().cuda(), device_ids=[0, 1]) //사용할 GPU를 환경변수로 지정할 수도 있고 이렇게 명시적으로 지정할 수도 있음.
forward() 함수를 정의해서 정의된 레이어를 연결했다.
'''nn.Conv2d(Channel, Number of feature, filter size, padding, stride)''': RGB와 같이 중복된 이미지의 장수를 Channel이라고 하고, Channel과 같이 filtered image를 몇장을 생성할지를 Number of feature, filter size는 한 차원만 정해주면 모든 차원에 동일한 길이를 적용한 fileter가 만들어진다. padding=1 or padding=0 패딩을 하면 원본 사이즈를 유지할 수 있고 하지 않으면 필터 사이즈 만큰 (-1) 이미지가 줄어든다. stride는 filter 가 진행하는 step size에 해당한다.
'''view()''': 데이터의 모양을 바꾸기 위해서 사용한다. 위 예제의 경우는 x.size()[0]를 하게 되면 batch size를 리턴하는데 batch size와 나머지 이미지 부분을 1차원으로 확장하겠다는 것이다.
'''super(CNN,self)._ _init_ _()''': 상속 받은 nn.Module 의 초기화 함수를 실행하기 위한 문구로 python3에서는 인자를 요구하지 않지만 python2에서는 하나 이상의 인자를 요구한다. 때문에 버번 호환성을 위해서는 넣어주는게 좋지만 클래스 이름이 변경되면 신경써서 같이 바꿔줘야 한다.
loss를 구현해서 사용할 수 있지만 매번 같은 일을 하는 것도 귀찮은 일이다. 그냥 만들어진 것을 쓰자.
- pytorch_multiGPU . . . . 1 match
attachment:multi.png?width=1000px&align=center&title='''[[br]] 이미지 출처''': <https://medium.com/huggingface/training-larger-batches-practical-tips-on-1-gpu-multi-gpu-distributed-setups-ec88c3e51255>
- pytorch_tutorial . . . . 8 matches
딥러닝 프레임워크는 크게 텐서플로우와 같은 정의된 다음 실행되는 (Defined-and-run) 방식과 PyTorch, Chainer, DyNet 등과 같은 실행 시점에 정의 되는 (Define-by-run) 프레임워크 방식이 있다.
torch.Tensor는 PyTorch의 기본 자료형이라고 볼 수 있다. Tensor 클래스는 .requires_grad 속성을 갖고 있는데 이 속성을 True로 설정하면 텐서의 모든 연산에 대해서 추적하게 된다. 계산 작업이 모두 수행 되면 .backward()를 호출하여 모든 gradient를 자동으로 계산할 수 있다. 계산된 gradent는 .grad 속성에 저장 된다.
기존적으로 Tensor를 wraping하고 있으며, Tensor 기반으로 정의된 거의 대부분의 연산을 지원한다. 계산이 완료된 후 .backward()를 호출하여 모든 변화도를 자동으로 계산할 수 있다.
음... 사실상 같아 보임 차이가 없는데.. 뭘까?
* [:pytorch_exeample_mnist_grad_cam MNIST 데이터를 이용한 GradCAM]
- pytorch_with_tensorboard . . . . 12 matches
파이토치에 Tensor Board를 적용하기 위한 방법을 알아보자. 참고할 만한 사이트로 파이토치 공식 튜토리얼[* https://tutorials.pytorch.kr/intermediate/tensorboard_tutorial.html]이 있다.
그 외에도 개인이 정리한 블로그들[* https://jangjy.tistory.com/343]이 있다.
같은 기능을 하는 패키지로 tensorboardX 가 있는데 이것은 별도로 설치를 해야 한다.
로그를 저장하기 위한 모듈로, 인자로 저장할 폴더의 위치를 받는다. default 값은 ''runs'' 폴더 아래에 실행한 날짜와 서버의 이름을 조합한 폴더를 만들어준다.
로그의 기록은 바이너리형태로 기록되지 때문에 기록된 문서를 읽어보는 것은 쉽지 않다.
기록하는 데이터의 형태에 따라서 웹에서 기록되는 텝이 달라진다. 각 텝에 데이터를 기록하기 위해서 별도의 함수를 제공하고 있다.
- qt_programming_index . . . . 13 matches
Qt는 다양한 라이센스로 제공하고 있으며 상업적인 목적 외에 open source user를 위한 (L)GPL 라이센스 버전도 제공하고 있다.
이렇게까지 하면 설치는 되는데 설정이 필요하다.
버전이 업데이트 되면서 메뉴 구성이 달라져 있을 수 있기 때문에 설정에 대한 부분은 잘 찾아서 해보자. ㅎㅎ
QString filename = "sample.txt"; // 파일 이름을 QString 클래스에 저장
file->setFileName(QApplication::applicationDirPath() + "/" + filename); //프로그램이 실행되는 위치와 파일명을 QFile 객체에 넘겨준다.
QString filename = "sample.txt"; // 파일 이름을 QString 클래스에 저장
file->setFileName(QApplication::applicationDirPath() + "/" + filename); //프로그램이 실행되는 위치와 파일명을 QFile 객체에 넘겨준다.
== QTextStream 클래스를 이용한 방법 ==
파일이 수정되는 것을 확인하고 처리하는 것을 SIGNAL, SLOT으로 처리했다.[* https://jdh5202.tistory.com/298]
- quadtree_paper_reading . . . . 47 matches
우리의 작업은 주어진 지리적 지역에 대한 LIDAR 데이터의 분할에 대한 쿼드 트리의 사용에 의해 좌우된다.
LIDAR 데이터는 x 좌표 (동 - 서), AY-좌표 (남북), AZ-좌표 (높이) 및 강도 좌표 (반환 신호의 강도)로 구성된 4 - 튜플이다.
우리의 쿼드 트리 구현은 다음 R3에서 우리는 인덱스 데이터 포인트가 자신의 x 및 y 좌표를 기반으로하는 [2]에 설명 된 방법을.
이 옥트리를 사용에 의존하지 않고 3 공간에서 우리가 인덱스를 점 할 수 있습니다.
데이터가 분할되면, 보간 알고리즘은 다음 디지털 고도 모델의 보간 3the 픽셀 값으로 데이터를 사용할 수 있습니다.
데이터 세그먼트는 DEM 건설의 중요한 부분이기 때문에, 속도 향상에 대한 병렬 멀티 기가 바이트 데이터 세트의 빠른 처리를 위해 필요합니다.
이것은 우리의 쿼드 트리 구현의 건설을 병렬화의 기본 동기로 사용됩니다.
포인트 클라우드 격자 DEM에 자신의 논문에서 : 확장 접근 Argarwal, ARGE 다나 대형 멀티 기가 바이트의 데이터 세트에 그리드 기반의 디지털 고도 모델의 효율적인 건설 (격자 DEM을)에 대한 세 가지 부분, 확장 성, 순차 알고리즘을 제안한다 [2] .
그들은 쿼드 트리를 사용하여 데이터 세그먼트로 구성된 세 단계 접근 방식도 사용이 쿼드 트리 셋째 보간 한 적합하다고 어떤 방법을 적용 말했다 찾는 이웃을 설명합니다.
Agarwal et al. 쿼드 트리의 증분 및 레벨 별 수준의 구조를 설명하고 하이브리드 방식을 채택한다.
고 말했다 접근 방식에서, 저자는 잎이 포인트 목록을 함유 한 번에 쿼드 트리의 세 가지 수준을 구축 할 수 있습니다.
잎 점의 수보다 작거나 어떤 임계 값에 해당 될 때까지 알고리즘은 다음이 목록의 각 반복됩니다.
잎의 이웃을 찾기 위해 저자는 또 일부 공통 모서리 또는 경계 상자의 전체 가장자리가 인접 해 있다고합니다 공유하는 잎 증분 방법을 설명합니다.
이 먼저 다른 세그먼트의 경계 상자와 상자 주에게 부분 또는 전체 가장자리를 경계 경우 보는 계층으로 계층 다음 잎 선택에 의해 수행됩니다.
세그먼트 잎없는 경우에만 리프 노드는 해당 리프 노드에 인접한라고 할 때까지이 프로세스는 자식에 반복됩니다.
데이터 보간 단계의 설명은 원하는 수 뭔가를 남기는하지만, 아가 왈 하였다. 데이터 보간 알고리즘의 무리가 있다는 것을 인정한다.
따라서 알고리즘은 특정 데이터 보간 방법이 아닙니다.
우리는이 병렬 구축 쿼드 트리뿐만 아니라 인덱싱 및 LIDAR 데이터 세그먼트에 유용하지만, 많은 다른 목적을 봉사하는 표시 되었기 때문에 병렬화 알고리즘의 중요한 부분임을 관찰합니다.
사실 우리의 구현보다 일반화 된 버전은 이미지 프로세싱 및 압축뿐만 아니라 컴퓨터 그래픽에 사용 쿼드 트리를 확장해야합니다
우리의 작업에 매우 중요한 또 다른 논문은 빠른 C. 라우터 바흐 등으로 GPU에서 BVH 건설이다. 2009.
- raspberry_Grafana . . . . 6 matches
MQTT(메시지 큐잉 텔레메트리 트랜스포트, Message Queuing Telemetry Transport)는 ISO 표준 발행-구독(Pub-Sub) 기반의 메시징 프로토콜이다.
TCP/IP 프로토콜 위에서 동작하며, 사물인터넷(임베디드)을 사용하기 위해 개발된 프로토콜 이다. TCP 기반의 프로토콜로서 낮은 전력 낮은 대역폭 낮은 성능의 환경에서도 사용이 가능하다.[* https://gymcoding.github.io/2020/09/22/mqtt-eclipse-mosquitto/]
MQTT는 메시지를 발행하는 발행자(Publisher)와 메시지를 구독하는 구독자(Subscriber) 그리고 이 둘을 중계하는 브로커(Broker)로 구성되며, 메시지는 Topic으로 분류 된다.
이글이 잘 정리 되어 있다. https://cedalo.com/blog/mosquitto-docker-configuration-ultimate-guide/
- raspberry_Yemigo . . . . 2 matches
= 마이크 설치 =
사운트 카드 설치 및 마이크 연결[* https://whansunkim.ml/wiki.php/raspberry_pi_pyAudio]
- raspberry_pi_dht22 . . . . 20 matches
#title 라즈베리파이에 센서 붙이기
ntp를 설치하면 ntpsec이 설치 되는데 아래 과정을 통해서 설치와 설정을 할 수 있다.
dht22 센서는 3.3v 전원을 사용하고 gpio를 이용해서 센서값을 읽을 수 있다. 라즈베리파이의 GND와, 3.3v를 연결하고 사용하지 않는 gpio 하나를 연결한다.
gpio version 2.5는 라즈베리파이 4를 지원하지 않는다. 업데이트된 버전을 설치해야 한다.
= MG811 이산화탄소 센서 =
#define DC_GAIN (8.5) //증폭회로의 전압이득 정의(변경 X)
//추출할 샘플값들의 평균값이 측정값입니다.
#define ZERO_POINT_VOLTAGE (0.324) //이산화 탄소가 400ppm일때의 전압값 (수정 X)
#define REACTION_VOLTGAE (0.020) //이산화 탄소가 1000ppm일때의 전압값(수정 X)
//이 두점에서 라인이 생성이 되는데,
//번역된 부분으로 읽는데 잘 파악이 되지는 않네요, 센서값 곡선 그래프에 맞추어 계산을 하기 위한 설정값들이라고 생각하면 될듯합니다.
upm 라이브러리[* https://github.com/eclipse/upm/blob/master/docs/installing.md]를 이용한 파이썬 예제는 아래와 같다.[* https://github.com/eclipse/upm/blob/master/examples/python/mg811.py]
- raspberry_pi_ntp_server . . . . 25 matches
라즈베리파이를 이용한 GPS기반 NTP 서버를 구축하는 과정을 기록하기 위해서 이 문서를 만든다.
gps 모듈과 라즈베리파이를 물리적으로 연결하기 위해서는 gpio를 이용해야 하는데 아래는 연결을 위한 배선표이다.
GPS 모듈은 3.3v의 전원을 사용한다. 라즈베리파이에 3.3v 전원부와 GND를 연결하고 시리얼통신을 이용하기 위해서 라즈베리파이의 GPIO14,15에 해당하는 UART rx, tx를 교차하여 연결해준다. 마지막으로 PPS는 Pulse per second 신로를 내여주는 선으로 1초에 한번씩 전기적인 신호를 주는 선이다. 이것은 GPIO18 혹은 24번을 이용해서 연결하는데 여기서는 24번을 이용해서 연결하도록 하겠다.
이와 관련해서 많은 자료를 찾아보았는데 설치된 OS와 설치된 Version에 따라서 설치되는 패키지의 버전과 종류가 달라서 고생했다.
현재(2022-12-02)기준 설치된 운영체제는 raspberrpi 5.15.67이다.
pps-tools는 pps 신호가 잘 들어오고 있는지를 확인하기 위한 툴로 설치가 정상적으로 잘 되어 있고 몇가지 설정만 잘 되어 있다면 별문제 없이 신호가 들어오는 것을 확인할 수 있습니다.
pps 신호선을 GPIO 24번에 연결하고 /boot/config.txt 파일에 GPIO24번이 pps로 사용할 것임을 알려줘야 합니다.
이 과정에서 uart 사용에 대한 설정도 미리합니다. gps 설정을 위한 사전 조치
설정이 끝나면 reboot을 통해서 설정을 반영합니다.
부팅하고 나서 아래와 같이 테스트를 해볼 수 있습니다.
설정을 완료하고 재부팅을 해서 설정값을 적용시키고 cat /dev/serial0 와 같이 테스트를 해보면 gps 신호가 들어오는 것을 확인할 수 있는데 화면에 아무런 반응이 없다면 접속된 시리얼 포트가 /dev/ttyAMA0 와 같이 다른 이름을 갖고 있는지 확인을 해보아야 합니다.
그리고 gpsd 설정을 아래와 같이 바꾼다.
- raspberry_pi_pyAudio . . . . 8 matches
마이크 녹음을 하기 위해서는 사용자가 넣어줘야 하는 값이 몇가지 있는데 FORMAT, CHANNELS, RATE는 사용하는 마이크의 제원을 확인해서 넣어줘야 한다. 보통의 경우 FORAMT, CHANNELS는 16bit mono 마이크가 대부분이니 큰 고민이 없는데 sampling rate는 16kHz, 44.1kHz, 48kHz 등 다양하게 지원하기 때문에 해당 sampling rate 찾아야 한다.
라즈베리파이에 pyaudio를 설치하기 위해서는 사전 작업들이 필요할 수 있다. {* https://thefirst.tistory.com/22]
- raspberry_pi_sensor . . . . 19 matches
라즈베리파이와 센서를 연결하기 위해서는 하드웨어 Interface(GPIO, SPI, I2C etc)가 필요하다. 그 중 GPIO에 대해서 알아보자.[* https://www.raspberrypi.com/documentation/computers/raspberry-pi.html]
라즈베리파이는 40핀의 하드웨어 Interface를 제공한다. 그 중에는 전원 및 각종 목적의 핀들이 있는데 아래 그림에서 확인할 수 있다.
사용자가 GPIO를 사용하기 위해서는 권한이 필요한데 아래 명령은 사용자를 gpio 그룹에 추가하는 명령이다.
gpio 관련 페키지를 설치하면 gpio를 직접 사용해 볼 수 있는데 라즈베리파이 4를 사용하기 위해서는 gpio 버전 2.5 이상이 필요하다.
GPIO로 데이터를 전송하는 간단한 하드웨어 Interface를 갖고 있는 온습도 센서이다. DHT11보다 성능이 좋아지고 측정 간격은 1초에서 2초로 증가 했다.
Python에서 DHT-22 센서를 사용하기 위해서는 Adafruit-DHT 라이브러리가 필요하다. 설치는 아래와 같이 하면 된다.
BMP280센서는 기온과 기압을 측정할 수 있는 센서로 I2C, SPI 두가지 인터페이스를 제공하고 있다. 라즈베리파이에서는 I2C 인터페이스를 사용해서 연결하였다.
BMP280 센서와 I2C 인터페이스를 사용하기 위해서는 두개의 라이브러리를 설치해야 한다. (하드웨어적으로 I2C 인터페이스를 사용할 수 있도록 활성화 시켜줘야 한다. DietPI의 경우 dietpi-config를 통해서 설정할 수 있음.)
- raspberry_sensor_installation . . . . 3 matches
#title MQTT와 Influxdb를 이용한 센서 데이터 수집
ntp를 설치하면 ntpsec이 설치 되는데 아래 과정을 통해서 설치와 설정을 할 수 있다. [* https://whansunkim.top/wiki.php/raspberry_pi_ntp_server]
- raspberry_wireguard . . . . 5 matches
설정은 생각보다 조금 복잡할 수 있는데 간단하게 설정 파일을 생성해주는 사이트가 존재한다. [* https://upvpn.app/ko/wireguard-config-generator/]
클라이언트와 서버가 통신하기 위해서는 한 쌍의 키가 필요하다. [* https://hyunjin821.tistory.com/219] 키 생성은 아래와 같으 할 수 있다. [* https://blog.ewq.kr/67]
= 클라이언트 =
클라이언트도 서버와 같이 wireguard를 설치해서 수행한다. 설정 파일은 위에서 생성한 macbook.conf, nims.conf 파일을 wg0.conf로 /etc/wireguard에 저장해서 사용하면 된다.
- raspberrypi4 . . . . 20 matches
#title 라즈베리파이4 서버 설정 튜토리얼
부트로더를 최신으로 업그레이드 하기 전력소모등 여러가지 하드웨어 세팅값이 달라짐.
'''/etc/nginx/site-available/nextcloud.conf'''를 만들어 넣어주자. 두 가지 설정이 있다. 첫 번째 파일은 ssl 미적용, 두 번째 파일은 ssl을 적용한 파일이다.
설정 파일의 위치는 /etc/netplan/50-cloud-init.yaml 이고 설정 값은 아래를 참조해서 설정하면 된다.
/var/log/auth.log 를 보면 내가 하지 않은 ssh 접속 시도가 많음을 알 수 있는데 대부분 중국으로 부터 오는 무차별 공격이다.
설치는 간단히 apt로 할 수 있다. 설정은 아래와 같이 기본 설정값을 복사해서 사용한다. 이유는 소프트웨어 업데이트시 설정값이 복원 되기 때문이다.
여러가지 설정을 할 수 있지만 우리가 관심 있는 것은 sshd 부분이다. 이부분을 아래와 같이 수정해서 사용한다.
/var/log/fail2ban.log 파일에서 로그를 확인해보면 침입으로 ban이 된것을 확인 할 수 있다.
실수로 ban이 되었다면
라즈베리 파이의 기본적인 Clock Speed는 1.5Ghz로 설정 되어 있는데 2Ghz로 설정해도 안정적으로 돌아가는 듯하다.
라즈베리 파이의 부팅 설정 파일을 수정해서 간단하게 overclock을 수행할 수 있다.
부분을 아래와 같이 수정하면 된다. [* https://www.seeedstudio.com/blog/2020/02/12/how-to-safely-overclock-your-raspberry-pi-4-to-2-147ghz/]
- recurrent_neural_network . . . . 58 matches
* [https://deeplearning4j.org/kr/kr-lstm#long 초보자를 위한 RNNs과 LSTM 가이드(deeplearning4j)]
인공신경망의 확장으로 각종 모양의 hidden network layer들이 개발되고 있다.
기계학습법이라는 것만 놓고 보면 입력과 그에 해당하는 출력(labels)을 갖는 데이터로 기계(Black Box)를 훈련시켜서 그 밖의 데이터에 적용하겠다는 것이다.
때문에 Black Box 안쪽은 그 모양이 어찌 되었던 결과만 좋으면 어떤 것이든 좋은 것이다.
하지만 모든 일이 그렇하듯 아무런 노력 없이 이루워지는 일은 없다. 지금 부터 이 Black Box 안쪽을 들여다 보려고 한다.
각종 변환(fft, dht.. etc) 과 band pass filter 등을 하기 위해서 FIR 이나 IIR filter를 사용하는데 이런 관점에서 유초해보면 CNN과 RNN은 결국은 입력 데이터를 각종 필터를 통과 시켜 변환을 하기도 하고 자르기도 하면서 분류하기 좋은 모양으로 변형하는 것으로 이해할 수 있다.
RNN은 다양한 자연어처리(NLP) 문제에 대한 뛰어난 성능을 보이고 있는 인기 있는 모델로 알려져 있다.
이 글은 Team AI Korea의 Tutorial[* http://aikorea.org/blog/rnn-tutorial-1/]을 보고 본인이 이해한 바를 적어보려고 한다.
RNN 기본 알고리즘은 IIR 필터와 유사한데 아래 그림과 같이 Weight를 공유하는 방식을 취한다.
위 구조에서 보면 시간 흐름에 따라서 일정량(W) 만큼 메모리효과를 갖게 되는데 이 효과는 시간이 지남에 따라 급격하게 사라진다. 지난 과거의 값이 누적되는 과정에서 오래된 값의 영향력이 급격이 줄어들기 때문이다.
그렇기 때문에 LSTM이나 GRU등[* http://aikorea.org/blog/rnn-tutorial-4/]과 같은 수정된 버전의 RNN을 사용하고 있다.
파이썬을 이용해서 언어 모델을 만드는 예제[* http://aikorea.org/blog/rnn-tutorial-2/]를 진행해 보려고 한다.
\(m\)개의 단어로 이루어진 문장이 있다고 하자. 언어 모델은 이 문장이 특정 데이터셋에서 나타날 확률을 다음과 같이 예측할 수 있게 해준다.
말로 풀어쓰자면, 문장이 나타날 확률은 이전 단어를 알고 있을 경우 각 단어가 나타날 확률의 곱이 된다. 따라서 "He went to buy some chocolate"라는 문장의 확률은 "He went to buy some"이 주어졌을 때 "chocolate"의 확률 곱하기 "He went to buy" 가 주워졌을 때 "some"의 확률 곱하기 ... 해서 문장의 시작에서 아무것도 안 주어졌을 때 "He"의 확률까지의 곱이 된다.
이전 까지 완성된 문장이 만들어지는 모든 과정의 확률 곱하기 지금 현재의 단어가 나올 확률의 곱으로 이루워진다는 것이다.
두가지 측면에서 볼 수 있다. 하나는 만들어진 문장의 점수를 매기는데 사용할 수 있다. 기계 번역 시스템에서 만들어진 문장들에 대해서 가장 높은 확률을 갖는 문장이 가장 자연스러운 문장이고 문법적으로도 가장 완벽한 문장일 수 있다는 것이다.
또 하나는 주어진 문장에서 이후에 어떤 단어가 나올지 확률적으로 알기 때문에, 이를 기반으로 새로운 텍스트를 생성해낼 수도 있다는 것이다. 이런 '''생성 모델'''(Generative model)에 대해서는 Andrej Karpathy 블러그[* http://karpathy.github.io/2015/05/21/rnn-effectiveness/]를 참조하길 바란다.
위의 수식을 보면 각 단어들의 확률은 이전에 나왔던 모든 단어들에 의존하고 있다. 하지만 실제 구현에서는 많은 모델들이 계산량, 메모리 문제 등으로 인해 long-term dependency를 효과적으로 다루지 못해서 긴 시퀀스는 처리하는 것이 힘들다. 이론적으로 RNN 모델은 임의의 길이의 시퀀스를 전부 기억할 수 있지만 실제로는 조금 더 복잡하다.
- resampler_renew . . . . 25 matches
기존 Upsampler에 필터를 적용하는 부분에서 문제가 있을 수 있다는 점과 Up/Down을 통합해서 하나의 패키지로 일반화 하기 위해 이번 작업을 시작한다.
위에 보이는 그림은 Filter_length 8을 그래프로 표현한 것입니다. 오른쪽 그림은 Upsample을 하기 위한 filter patten을 표로 나타낸 것입니다.
입력 데이터 0 ~ 3은 guide 영역으로 실데이터가 아닌 필터 계산에 쓰이는 영역입니다. 실 데이터의 시작인 ''4''와 Sinc Finter의 중앙인 ''16''번 index를 일치 시키면 계산에 필요한 데이터와 필터의 쌍이 Zero 곱을 하는 것을 알 수 있습니다. 이런 경우를 제외하기 위해서 필터에서 ''0''를 제거하고 자기 자신을 계산하는 계산을 계산에서 제외하도록 필터를 설계하면 그래프의 아래에 있는 표와 같이 됩니다.
''4''와 ''5''사이의 4개의 보정값을 찾는 4배 Upsampling을 예로 보면 입력 데이터를 기준으로 필터가 오른쪽으로 한 클럭 쉬프트 하면 입력 데이터의 ''0''번 Index를 제외하고 ''1''번 부터 필터의 갯수만큼 계산 되는 것을 알 수 있다. ''4-1''을 계산하는데 필요한 필터는 3, 7, 11, 15, 19, 23, 27, 31이 필요하게 된다.
Downsample의 경우는 Upsample와는 달리 의미 있는 값을 갖고 있는 데이터를 입력으로 받아서 적당한 값을 추려 내는 것으로 Upsample보다 긴 guide영역이 필요하다. Upsample이 Filter_length만큼의 guide 영역이 필요했다면 Downsample은 Filter_length * times(배수) 만큼의 guide 영역이 필요하다.
입력 데이터를 기준으로 추출하려는 배율의 배수로 Index를 진행하면서 원하는 값을 없게 되는데, 필터의 중앙에 해당하는 인렵 데이터의 index는 자기 자신을 제외하고 필터의 '0'에 해당하는 값과 곱하기 연산을 하게 된다. 이 부분을 계산에서 제외시키면 나머지 연산은 Upsample의 것과 같이 이루워지게 된다. 필터의 진행 순서는 Upsample과 반대이다.
- roc_curves . . . . 8 matches
예를 들어 질병이 있는 그룹과 정상인 그룹을 어떤 요소를 기준으로 구분한다고 생각해 보자. 그 요소가 얼마나 잘 두 그룹을 판별할 수 있을까?
이때 사용 할 수 있는 지표가 Receiver Operating Characteristic (ROC) curve analysis [[footnote(Metz, 1978; Zweig & Campbell, 1993)]]이다.
아래 그림을 보면 두 그룹이 완벽하게 분리되지 않고 겹쳐져 있는 것을 볼 수 있다.
어떤 요소의 값을 기준(criterion value : Rank)으로 정상인 사람과 병에 걸린 사람을 구분할 때 겹쳐진 구간이 있기 때문에 완벽하게 두 그룹을 구분 할 수는 없을 것이다.
criterion value를 기준으로 4개의 영역으로 구분할 수 있는데 그 그룹을 아래와 같이 정의 하자.
'''Sensitivity''' : Rank를 기준으로 판단 했을때 Rank값 이상을 참으로 봤을때 실제 참 값을 갖는 비율. = a / (a+b)
- rsync_cron_data_backup . . . . 26 matches
#title Rsync와 Cron을 이용한 데이터 백업
rsync는 데용량 데이터를 복사하는데 아주 유용한 유틸이다. 이것과 Cron을 이용해서 주기적으로 데이터를 백업하는 스크립트를 작성해 보려고한다.
서버와 클라이언트 모두에 설치해야함.
-a --archive 아카이브 보드로 가져오기(퍼미션 소유주 및 위치까지 그대로 가져온다.)
--exclude=patten 해당 패턴을 가진 파일이나 디렉토리를 동기화시 제외한다.
--include=patten 해당 패턴을 가진 파일이나 디렉토리를 동기화시 포함시킨다
위 예는 home 디렉토리를 로컬의 저장공간에 백업하기 위한 명령의 예이다.
--daemon옵션을 이용, 서버모드로 작동할 수 있다. xinetd를 이용해서 시스템 서비스로 등록했다.
이렇게 하면 xinetd 데몬에 서비스를 등록하게 되는 것이다. 이렇게 서비스를 등록하고 나서는 데몬을 다시 시작 시켜줘야 한다.
rsync 설정파일은 /etc/rsyncd.conf 이다. 설정파일이 없는 경우 직접 만들어줘야 한다.
'''hosts allow''' : 접속 호스트를 지정하게 되면 지정한 호스트에서만 접속이 가능하다. 여러 호스트에서 접속이 가능하게 하려면 이 필드 보다는 '''auth user'''를 사용하는 것이 좋다.
사용자에 대한 설정 파일은 아래와 같이 하면 된다. password는 plain/text이다.
crontab 을 이용해서 반복 작업을 등록할 수 있다.
- runits . . . . 1 match
강성호는 뻥쟁이
- rust_language . . . . 1 match
* 상속이 없다 [* https://modoocode.com/334]
- sc12 . . . . 6 matches
* --전력선을 이용한 네트워크를 형성하고 High perfermance grid computing 환경을 만들겠다는 생각으로 추정 됨.--
* --전력선 네트워크를 형성하기 전에 전기가 만들어지고 공급 되어지는 네트워크의 이해가 필요한 것으로 보임.--
* 실제로 서비스를 하기보다는 시뮬레이션 단계인듯
what is the theoretical peak performance? 이론적 flop/s (''benchmark를 통해서 얻은 결과가 아닌 이론적 수치'')
LAPACK(80`s) -> ScaLAPCK (90`s)으로 적은 코드 수정으로 변경이 가능하다.
- scientist . . . . 8 matches
= 특수상대성 이론 =
빛은 파동이다, "파동이기 때문에 매질(에테르)이 있을 것이다"라고 생각했다. 그럼 에테르의 존재에 대한 궁금증이 생겼다. 이를 실험을 통해서 에테르의 존재를 증명하기 위해서 [:Albert_Abraham_Michelson 마에켈슨-몰리]실험이 행해졌다.
- sgg_review . . . . 3 matches
2013년에 '''Jan Harms'''에 의해서 LIGO 관측기에서 관측할 수 있는 낮은 주파수에 대한 중력파 연구 논문[* ''Jan Harms et al'', '''Low-frequency terrestrial gravitational-wave detectors''', PHYSICAL REVIEW D 88, 122003 (2013),http://www.astro.umd.edu/~miller/reprints/harms13.pdf ]이 발표 되었고 이를 새로운 관측 플렛폼으로 조금 더 잘 관측할 수 있는 방법을 '''백호정''' 교수님께서 연구하셨고 그에 대한 논문[* ''Ho Jung Paik et al'', '''Low-frequency terrestrial tensor gravitational-wave detector''', Class. Quantum Grav. 33 075003 (2016), http://iopscience.iop.org/article/10.1088/0264-9381/33/7/075003/pdf]이 2016년에 발표 되었다.
- singularity . . . . 1 match
* 관련 라이브러리 설치
- slack_api_chatbot . . . . 15 matches
* Slack API 사이트에 접속합니다.
* 앱 이름과 개발할 워크스페이스를 선택하고 Create App을 클릭합니다.
* 앱 설정 화면에서 OAuth & Permissions 탭으로 이동합니다.
* Bot Token Scopes 섹션에서 chat:write와 같은 봇 권한을 추가합니다. 이 권한을 통해 봇이 메시지를 보낼 수 있습니다.
* Install App 버튼을 클릭하여 해당 워크스페이스에 앱을 설치합니다.
* 설치 후, OAuth Access Token을 받을 수 있습니다. 이 토큰은 나중에 Python 프로그램에서 사용됩니다. 이 토큰을 안전하게 보관하세요.
2.1. 라이브러리 설치
슬랙 API와 통신하려면 slack-sdk 라이브러리를 설치해야 합니다. 아래 명령어를 사용해 설치하세요.
위 코드를 실행하면, 지정된 채널에 메시지가 보내집니다. 예를 들어, 채널 ID가 C12345678이고 봇 토큰이 xoxb-...일 경우, message로 입력한 내용이 그 채널에 전송됩니다.
파일 업로드: 메시지뿐만 아니라 파일도 업로드할 수 있습니다. 예를 들어, 이미지 파일을 채널에 보내고 싶다면 files_upload 메서드를 사용할 수 있습니다.
- snucl_install_work . . . . 10 matches
서울대 이재진 교수님 연구실에서 천둥이라는 시스템을 운영하기 위해서 opencl와 MPI를 이용한 SnuCL이라는 플래폼을 만들었다.
이번 문서에서는 SnuCL을 설치하고 사용하는 전 과정을 다루도록 한다.
설치 파일은 서울대 snucl 사이트[[footnote(http://aces.snu.ac.kr/Center_for_Manycore_Programming/SnuCL.html)]]에 정보를 남기면 메일[[footnote(http://aces.snu.ac.kr/download.php?p=snucl&ver=1.2b&email=o1185@naver.com)]]로 온다.
설치 가이드에 있는 것처럼 설치를 끝내고 apps/samples에 있는 예제를 컴파일 하게 되면 라이브러리 에러가 발생하는데
ldl 라이브러리 옵션이 lsnucl 보다 앞에 있어서 생기는 문제다.
- softmax_activation_function . . . . 13 matches
대표적인 활성 함수(Activation Function)로는 시그모이드 함수를 꼽을 수 있다.
시그모이드 함수의 미분꼴은 아래와 같이 유도해서 얻을 수 있다.
SoftMax 활성 함수는 마지막 output Node에서 Classification을 하고자 할때 사용된다. 기본적으로 두개 이상의 라벨값을 갖을 때 사용하며 output 노드의 출력값을 더하고 그걸로 출력값을 나눠서 사용함으로 출력값을 확률값으로 해석하기 위해서 사용한다.
식으로 나타내면 위와 같이 나타낼 수 있다.
Loss Function 으로 [:cross_entropy Cross Entropy]를 사용할 경우 Weight 업데이트를 위한 델타값의 계산이 쉽지 않다. 하지만 활성 함수의 미분값을 같이 계산하게 되면 의외로 계산값이 간단해지는 것을 확인 할 수 있다.
Softmax의 기대값의 합은 1이기 때문에 \(\sum_id_i \)은 1로 없어진다.
시그모이드의 미분값은 \(\frac{\partial f_i}{\partial x_j} = f_i(1-f_i)\delta_{ij}\)임을 이미 알고 있다.
SoftMax와 같이 전개해 보면 아래와 같다.
- software_raid_mdadm . . . . 13 matches
하드웨어 레이드를 구성해서 사용하지 못하는 경우 소프트웨어적으로 레이드를 구성할 수 있다.
'''mdadm'''이라는 소프트웨어를 사용하게 되는데 설치는
레이드를 구성하게 되면 이 역시 하나의 장치가 된다. /dev 폴더 아래 md0와 같은 장치를 하나 생성한다. [* 아무도 없는 세계. <https://dinggur.tistory.com/33>. (02 Dec 2011).]
레이드 생성은 아래와 같이 진행된다.
아래와 같이 상태를 확인할 수 있다. UUUU로 표시된 부분은 정상이라는 표시다. 이 부분이 '''_U''' 나 '''U_'''와 같이 표시 된다면 문제가 있다는 것이니 확인해서 처리해야 한다.
- ssh_config . . . . 7 matches
리눅스에서 ssh를 사용하다보면 윈도우 텔넷 클라이언트 처럼 설정 값을 저장해서 사용하고 싶을 때가 있다.
이때 사용할 수 있는 방법이 자신의 홈 드렉토리 아래에 있는 .ssh 폴더에 config 파일을 추가 하는 것이다.
설정할 호스트를 정하고 호스트의 이름과 포트 번호를 설정할 수 있고 인증 방법 또한 설정할 수 있다.
인증 방법을 설정하게 되면 password를 넣지 않고 접속이 가능해 진다.
이렇게 생성된 키를
- stock_study . . . . 46 matches
= 바이넥스 =
[바이넥스], CDMO 사업
바이오실밀러 수혜주, 지난 해 11월 초 중국 충칭 즈언제약과 바이오실밀러(바이오의학약품 복제약) 기술이전 계약 체결
= SK바이오랜드 =
[SK바이오랜드], 화장품
* 피부 마이크로바이옴(Gut & Skin Microbiome) 솔루션 완성을 위한 기술 특허를 확보
* SK 바이오랜드는 프로바이오틱스를 차세대 먹을거리 사업 중 하나로 정하고 지속적인 연구개발(R&D)강화를 통한 사업 기반 조성에 박차를 가하고 있다.
= 케이엠더블유 =
= 오이솔루션 =
CNT(탄소나노튜브) 도전재 생산, CNT 도전재 시장이 매년 216% 성장해 2025년 2조 2000억 규모 시장 형성 예상
CNT 양극재에 적용하면 기존 카본블랙보다 1/5 사용으로 부피를 줄일 수 있고, 실리콘 음극재의 부피 팽창으로 구조적 안정성이 떨어지는 것을 막아 주기 위해 CNT 도전재 사용 기능, 상용화한 유일한 업체
''2020.06.19, 노성인'', '''카타르 LNG 100척 발주, 너무 이른 축포?'''[* http://www.econovill.com/news/articleView.html?idxno=401617]
2009년에도 에너지 기업 로열 더치 쉘은 약 500억달러 규모의 LNG-FPSO 10척을 발주 했지만 10년 동안 1척(30억 달러) 발주에 그쳤다. 이번에도 100척 발주가 정상적으로 이루워질지 의문이다.
발주가 정상적으로 다 이행되지 않을 가능성이 있고 LNG 시장의 가격하락 등에도 영향을 받는다.
sangsangin과 한국카본이 B, C 타입 LNG 탱크 개발 업무 협약서 체결함.
* 매출이 감소하고 있음.
= 농우바이오 =
종자생상 수출, 국내 유통은 농업을 통해서 이루워지기 때문에 안정적인 수입
종자 시장: 농우바이오, 서울바이오, 농경, 부농, 신성미네랄, 참그로 순으로 17% ~ 8.7%까지 비슷한 점유율을 갖고 있음.
1. 중국 노스랜드 바이오텍과 임상개발 계약 연장
- sublime . . . . 5 matches
행 들여쓰기 · 내어쓰기 win: ctrl+[ · ctrl+], mac: cmd+[ · cmd+] 기본적으로 탭키를 사용할 수도 있지만, 한참 코드를 작성하다가 행단위 들여쓰기를 제어하려면 이 방식이 편하기도.
행 상하 이동 win: ctrl+shift+↕, mac: cmd+ctrl+↕
GoTo Anything win: ctrl+p, mac: cmd+p GoTo Anything을 호출한다. 해당기능은 아래서 살펴볼 것이다.
설치는 버전에 따라서 다른 스크립트를 사용하게 된다. 홈페이지 참조.
- svm . . . . 35 matches
일반적으로 직선을 \(ax +by + c = 0 \)로 표시하는데 이것을 두 벡터의 내적으로 표시하면 \( (a, b) \cdot (x, y) + c = 0 \)이 된다.
\( (a, b) \)를 \(\vec w\) 벡터로 놓고 \( (x, y) \)를 \(\vec x\) 벡터로 치환해서 표시하면 그럼 1과 같이 \( \vec w \cdot \vec x + c = 0 \) 가 된다.
이 직선을 평행하게 +1, -1만큼 이동 시키고 이 두 선분의 반정식을 각각 \( \vec w \cdot \vec x_1 + c = 1 \), \( \vec w \cdot \vec x_2 + c = -1 \) 이라고 하자.
d[* 삼각함수 \(\cos \theta\ = \frac{d}{||\vec x_1 -\vec x_2||}\), 빗면분에 직교성분으로 표현가능]를 margin이라고 하면 margin을 최대화하는 하이퍼플레인을 찾는 것이 목적이다.
= 트레이닝 =
트레이닝 data로부터 decision boundary를 결정학 위해 파라메터 \(w,\ b\)를 결정하기 위한 두 개의 조건을 하나의 조건으로 바꾸면 아래와 같다.
라그랑지 승수법[* 라그랑지 승수법(Lagrange multiplier) : 어떤 함수(F)가 주어진 제약식(h)을 만족시키면서, 그 함수가 갖는 최대값 혹은 최소값을 찾고자할 때 사용한다.출처: http://newsight.tistory.com/96]으로 문제를 정의하면 아래와 같이 정의 할 수 있다.
''제약식이 등호로 이루어진 경우'', '''equality constraint problem''' 이라 부르며 이는 편미분만 하면 되서 푸는 방법이 간단하다.
하지만 ''제약식이 등호가 아닌 부등호인 경우''를 '''inequality constraint problem''' 이라 부르고 KKT condition 이라는 라그랑지 승수법에서 추가된 조건을 써야 한다.
만약, \(\omega = \vec 0\)이라면, \(b \ge 1,\ b \le -1\)이므로 가능한 해가 없다.
\(y_i(\omega \cdot X_i +b) -1) \ge 0\) 임으로 \(\lambda_i \ge 0\) 이라고 한다면 infeasible solution 만이 Lagrangian의 Value를 증가시킨다.
소비자 갑돌이의 효용함수는 U(X,Y)=xy라 합시다.
그가 가진 돈(예산)이 총 90원이고, 사과(x)재화의 가격은 3원, 배(y)재화의 가격은 5원이라 합시다.
이 예산제약상황을 식으로 나타내면
이 된다.
이 문제는 제약조건식이 등식으로 되어 있기 때문에 \(x,y,\lambda\)에 대해서 편미분만 계산하면 간단하게 풀린다.
[http://mathbang.net/453 점과 직선 사이의 거리]
- svn_sunken . . . . 11 matches
svn 체크아웃을 받고 나면 일단 권한 설정을 해준다.( 이유는 모르겠지만, 최초에 소스를 올릴때, 윈도우 삼바로 통한 import로 인하여, 권한 설정이 틀어지는거 같다. )
만약 sudo 명령이 안되면 그 서버에 sudoer가 등록이 안되어 있기 때문에 관리자에게 sudoer권한을 얻어야 한다.( 인터넷검색으로 할수도 있음 )
일단은 777권한을 주면 부팅이 된다.( 추후에 특정 파일이나 특정 쉘스크립트에서 로그인 유저명이나 로그인 권한 설정을 알게되면 해결될거 같다.)
mkcramfs 이 binary file이 없는데, 현재 sunken서버는 우분투 이기 때문에
위 명령어로 설치 하였다. (주의:이미 설치 하였기 때문에 설치 했다고 알고 있으면 된다. 또다시 하면 안됨)
- tcp_ip_program . . . . 24 matches
네트워크 프로그램을 하기위한 기본(Base) 지식과 간단한 예제를 담기 위한 페이지.
* domain : 생성할 소켓이 통신을 위해 사용할 프로토콜 체계(Protocol Family)를 설정한다. (IPv4, IPv6, IPx ... etc)
* type : 소켓이 데이터를 전송하는데 있어서, 사용하게 되는 전송 타입(스트리밍 방식, 데이타 그램 방식)
소켓이 사용할 프로토콜을 정의 한다.
* 에러나 데이터의 손실이 없이 전송 (전용 연결 통로를 이용해서 데이터를 전송하는 것과 같다. 연결 통로에 문제만 없다면 데이터의 순차적 전송을 보장한다.)
* 전송하는 순서대로 데이터 전달.
* 전송하는 데이터의 경계(Boundary)가 없다. (Overhead 없이 전송, 전용 연결 통로를 설정하는 Overhead는 있음.)
* 전송 순서에 상관 없이 가장 빠른 전송을 지향.
* 데이터 손실과 에러 발생 가능.
* 데이터의 경계(Boundary) 존재.
* 한번에 전송 가능한 데이터 사이즈 제한 있음.
인터넷 프로토콜을 사용하고 소켓 타입을 설정하게 되면 그에 해당하는 프로토콜은 하나씩 밖에 존재하지 않기 때문이다.
하지만 차후에 프로토콜이 추가 될 수 도 있고(?) 다른 프로토콜 체계를 사용할 수도 있는 문제이니 그냥 이해하고 넘어가자.
- teamspeak_kgwg . . . . 1 match
설치후 teamspeak의 connect 설정에서 아래의 정보를 이용하여 접속하면 됩니다.
- ternsorflow_with_tersorRT . . . . 12 matches
텐서플로우 버전이 올라가면서 설치 환경이나 설치 방법의 차이가 발생한다. 이 문서를 기술하는 시점으로 Tensorflow v1.14.0이다.
이 문서는 NVIDIA CUDA와 TensorRT를 사용할 수 있도록 소스 컴파일을 진행하는 과정에 대한 문서이다.
Tensorflow 버전마다 요구하는 bazel 버전이 다르다.
NVIDIA TensorRT Instrall guide[* https://docs.nvidia.com/deeplearning/sdk/tensorrt-install-guide/index.html#installing-debian]에 보면 자세한 설치 방법이 나와 있다.
TensorFlow 공식홈페이지[* https://www.tensorflow.org/install/source]의 안내에 따라서 진행하였다.
Python은 system에 설치된 것을 사용하였다. 보통의 경우 Anaconda로 설치해서 사용하는데 TensorRT가 Anaconda 환경에서 빌드가 안 된다는 이야기가 있다. 확인하지는 못 했음.
빌드하는 동안 /tmp를 사용하는데 별도의 장소를 정하고 싶다면 아래와 같이 하면 된다.
- test . . . . 23 matches
1. [[슬라이드쇼(MoniWikiTutorial)]] 위키위키 배우기!
얼음 방패 상태라면 얼음 방패를 취소하며, 1.마우스오버 2.현재대상을 변이한다.
알트키를 누른 상태라면 주시대상을 변이한다.
(변이 종류는 변이 뒤 괄호내용을 변경하여 바꿀 수 있다.)
기존 주시대상을 바꾸지는 않으나, 기존 주시대상이 죽은 상태거나, 우군이거나, 존재하지 않은 경우
현재 변이하고있는 대상을 주시대상으로 설정한다.
마우스오버로 변이하는 경우에도 마우스오버 대상이 주시대상으로 설정된다.
/cast [@mouseover,harm,nomodifier][harm,nomodifier] 변이(거북이); [@focus,harm,modifier:Alt] 변이(거북이)
#title 테스트용 페이지
여긴 위키사용법 페이지입니다.
위키기능은 뭐가있나? 이런이런 기능이 있다.
* 스마일이 있다.
스마일이 머냐면 이런거다.
* 여러명이 문서편집할 수 있다.
- test2 . . . . 590 matches
gcc는 예전에는 GNU C Compiler의 약자였으나 지금은 GNU Compiler Collection의 약자로 다양한(?) 언어의 컴파일러들의 집합체이다. gcc는 한마디로 GNU에서 개발된 ANSI C 표준을 따르는 C 언어 컴파일러라고 말할 수 있다. gcc는 ANSI C 표준에 따르기는 하지만 ANSI C 표준에는 없는 여러 가지 확장 기능이 있다. 또한 gcc는 통합개발환경(IDE)을 가지고 있지 않은 command line 컴파일러이다. 옛날 Turbo-C를 주로 사용해 보셨던 분들은 tcc.exe와 비슷하다고 생각하면 된다.
현재 사용되고 있는 gcc의 버전을 나타내는 옵션이다. 특정 소프트웨어 패키지를 컴파일하기 위해 어느 버전 이상의 gcc를 쓰도록 권장하는 경우가 있는데 시스템에 깔려있는 gcc의 버전을 파악하려고 할때 사용한다.
이제 직접 프로그램 하나를 컴파일하면서 설명하도록 하겠다. 아래는 hello.c의 소스이다.
(*) -o 파일이름 옵션
gcc의 수행 결과 파일의 이름을 지정하는 옵션이다. 위의 예제를 단순히
로 컴파일 하면 hello라고 하는 실행파일이 만들어 지는 것이 아니라 보통의 경우 a.out이라는 이름의 실행파일이 만들어진다.
-o hello 옵션을 줌으로써 결과물을 hello라는 이름의 파일로 만들어지게 하였다.
위의 컴파일 과정을 외부적으로 보기에는 단순히 hello.c파일이 실행파일 hello로 바뀌는 것만 보이지만 내부적으로는 다음과 같은 단계를 거쳐 컴파일이 수행된다.
C Preprocessing은 C 언어 배울 때 배운 #include, #define, #ifdef 등 #으로 시작하는 여러 가지를 처리해 주는 과정이다. 그 다음 C 언어 컴파일은 C Preprocessing이 끝난 C 소스 코드를 assembly 소스코드로 변환하는 과정이다. Assemble은 그것을 다시 object 코드(기계어)로 변환하고 printf()함수가 포함되어 있는 라이브러리와 linking을 하여 실행파일이 되는 것이다.
위의 네 가지 과정을 모두 gcc라는 실행파일이 해 주는 것일까? 겉으로 보기에는 그렇게 보일지 모르지만 실제로는 gcc는 소위 말해 front-end라고 하여 껍데기에 지나지 않고 각각을 해 주는 다른 실행파일을 gcc가 부르면서 수행된다.
C Preprocessing을 전담하고 있는 실행파일은 cpp라고 하여 /usr/bin 디렉토리와 /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.95.12 디렉토리(당연히 gcc버전과 시스템에 따라 디렉토리 위치가 다르다. gcc -v로 확인하길 바란다.)에 존재한다. C 언어 컴파일은 cc1이라는 실행파일이 담당하는데 /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.95.12 디렉토리에 존재한다. Assemble과 linking은 각각 as와 ld라는 실행파일이 담당하고 /usr/bin 디렉토리에 존재하는 파일이다. (참고 : 시스템에 따라 /usr/bin이 아니라 /bin또는 /usr/local/bin 디렉토리에 존재할 수도 있다.)
gcc라는 실행파일이 하는 일을 정리해 보면 다음과 같다.
C preprocessing을 우리말로 하면 "C 언어 전처리"라고 할 수 있을 것이다. 모든 C 언어 문법책에서 정도의 차이는 있지만 C preprocessing에 대한 내용을 다루고 있다. C preprocessing에 대한 문법은 C 언어 문법의 한 부분으로 가장 기본이 되는 부분이다. C preprocessing에 관한 문법은 모두 '#'으로 시작된다. '#' 앞에는 어떠한 문자(공백 문자 포함)도 오면 안된다. 하지만 대부분의 compiler가 '#'앞에 공백 문자가 오는 경우에도 처리를 한다.
== C preprocessing이 하는 일 ==
cpp 는 C 언어 소스코드를 입력 받아서 C preprocessing에 관련된 문법 사항을 적절히 처리하고 결과로 C 언어 소스코드를 출력하는 프로그램이다. 입력은 작성된 C 언어 소스 코드이고, 출력으로 나온 C 언어 소스 코드에는 C preprocessing 문법에 관련된 어떠한 것도 남아있지 않는다. 즉, #define, #include 등을 찾을 수 없다. 남아 있는 정보가 있다면 file 이름과 줄수(line number)에 관한 정보이다. 그 이유는 추후의 컴파일 과정에서 에러가 날 때 그 정보를 이용해서 error를 리포팅할 수 있도록 하기 위해서이다. 그렇다면 C preprocessing을 직접 해보자.
결과로 hello.i라는 파일이 생긴다. 그 파일을 에디터로 열어보면 hello.c의 첫번째 줄에 있는 #include 를 처리한 결과가 보일것이다.
-E 옵션은 gcc의 컴파일 과정 중에서 C preprocessing까지만 처리하고 나머지 단계는 처리하지 말라는 것을 지시하는 것이다. 평소에는 별로 쓸모가 있는 옵션이 아니지만 다음과 같은 경우에 유용하게(?) 사용할 수 있다.
(1) C 언어 소스 코드가 복잡한 선택적 컴파일을 하고 있을 때, 그 선택적 컴파일이 어떻게 일어나고 있는지 알고 싶은 경우.
(*) 참고 : parse error before x(어떤 문자) 에러는 소스코드를 parsing 할 때 발생한 에러를 말한다. parsing이란 syntax analysis(구문해석) 과정인데 쉽게 말하면 C 언어 소스코드를 읽어들여 문법적 구성요소들을 분석하는 과정이라고 할 수 있다. 보통 gcc에서 parse error라고 하면 괄호가 맞지 않았거나 아니면 ';'를 빼먹거나 했을 때 발생한다. 보통의 경우 before x라고하여 x라는 것이 나오기 전에 parse error가 발생하였음을 알려주기 때문에 그 x가 나오기 전에 있는 C 소스 코드를 잘 살펴보면 문제를 해결할 수 있다.
C preprocessing의 문법과 나머지 C 언어의 문법과는 거의 관계가 없다. 관계가 있는 부분이 있다면 정의된 macro가 C 언어의 문법 상의 char string literal에는 치환되지 않는다는 정도이다. (좀 더 쉽게 이야기 하면 큰 따옴표 안에서는 macro 치환이 되지 않는다.) 또한 c preprocessing은 architecture dependent하지 않다. 즉, i386용으로 컴파일된 cpp를 다른 architecture에서 사용해도 무방하다. 조금 문제가 있을 수 있는 부분이 있다면 gcc의 predefined macro(i386의 경우 i386용 자동으로 define된다.)가 다를 수 있다는 점 뿐이다. 따라서 cpp를 C 언어 소스코드가 아닌 다른 부분에서 사용하는 경우도 있다. 대표적으로 assembly 소스 코드에서도 사용한다. assembler가 사용하고 있는 macro 문법이 c preprocessing의 macro문법 보다는 배우기 쉽기 때문이다.
- torchvision . . . . 2 matches
널리 사용되는 데이터 셋, 아키텍쳐 모델 computer vision에서의 일반적인 이미지 변환으로 구성되어 있습니다.
- transmission_daemon . . . . 9 matches
설정 파일은 '''/etc/transmission-daemon/settings.json'''이며 데몬이 돌아가고 있을때는 편집이 안 되기 때문에 설정을 수정하기 전에 데몬을 중지 시켜야 한다.
* 웹 클라이언트 관련
* "rpc-username": "transmission", //웹 접속을 위한 아이디
* "watch-dir": "/home/pi/Torrent/magnet_box", //이 폴더에 .torrent 파일이 있으면 자동으로 다운로드 됨.
데몬이 특정 유저 권한으로 실행 될 수 있도록 설정하는 방법
이와 관련해서 transmission-deamon 폴더의 사용권한을 변경한다. 또한 다운로드 폴더 권한도 일치 시켜줘야 한다.
- upsampling_implementaion . . . . 4 matches
커널과 메모리가 준비 되면 장치에 계산할 데이터를 전달하고 값을 얻어 오기 위한 함수 스트리밍 방식으로 처리 할 수 있도록 장치와를 커넥션은 유지 됨.
모든 소스에 대해서 resample이 종료 되면 장치와 메모리를 릴리즈한다. (장치라기 보다는 메모리 릴리즈라고 보면 됨)
소스, 결과, 싱크값, 싱크 사이즈, 소스 사이즈, 배율을 넘겨 받아서 upsampling을 수행하는 single function.
- upsampling_sinc . . . . 1 match
Sinc function (Rectangular function)을 이용한 Upsampling 방법
- usb_driver . . . . 48 matches
- USB(Universal Serial Bus)는 사용의 편리와, 넓은 확장성 그리고, PC와 전화와의 연결을 위해서 1994년 Compaq, Intel, Microsoft, Nec등이 주축이 되어 개발되었습니다. 크게 두 가지 종류의 chip이 PC쪽에서 USB와의 연결을 담당하며 Intel과 Compaq에서 제공됩니다. 재 USB Spec. 2.0이 나와 있는 상태이며, Spec 1.1에서는 최대 12Mbps를 그리고, Spec. 2.0에서는 최대 120Mbps를 지원한다.
2. USB 드라이버 개발에 앞서
- USB Driver는 크게 3가지 드라이버가 있습니다.USB Client Driver, USB Core, Host Controller Driver. 이 세가지로 구분 됩니다. 하지만 실제적으로 우리가 구현하게 되는 부분은 USB Client Driver 이며 나머지 두가지의 경우는 OS 레벨에서 재공되는것이 보통입니다. 윈도우 뿐만아니라 Linux에서도 지원이 되고 있습니다.
Isochronous Transfer : 일정한 속도로 일정량의 data를 전송하기를 원하는 경우에 사용한다. 이러한 것으로 Stream이 있으며, reliable한 전송을 보장하지는 않습니다. 주로 Audio나 Video의 data를 전송하는 경우 유용합니다. 우리가 사용하는 웹캠도 이러한 종류의 Data Flow를 사용합니다.
- USB나 혹은 다른 PCI device같은 것을 다루게 될 때, device의 configuration을 알기 위해선 device의 descriptor들을 읽어와야 합니다. 이렇게 읽어온 data를 기초로 어떤 device가 연결되었는지를 알 수 있게 되며, 또한 device로 data를 보내고자 할 때, device의 특성에 맞게 data의 양을 조절해 줄 수도 있게 됩니다.
USB device들은 bus에 붙게 되면, USB subsystem에 의해서 enumeration이 됩니다.
Device descriptor : USB device에 대한 일반적인 정보를 제공합니다. 단지 하나의 descriptor만이 존재하며 그 USB device에 전역적으로 영향을 미칩니다.
Configuration descriptor : 특정의 device configuration에 대한 정보를 제공합니다. USB device는 하나나 그 이상의 configuration descriptor를 가질 수 있으며, 각각의 descriptor는 또한 하나나 그 이상의 interface를 가질 수 있습니다. 물론 각각의 interface들 역시 0이나 여러 개의 endpoint를 가질 수 있습니다. 이러한 endpoint들은 같은 interface의 다른 setting에 의해서 사용되지 않는다면, 단일의 configuration내에서 interface간에 공유될 수 없습니다. 하지만 이러한 제한이 없는 다른 configuration내의 interface에 의해서는 공유가 될 수 있습니다. configuration들은 control transfer에 의해서 배타적으로 activate될 수 있으며, global한 device setting을 변화시키기 위해서 사용될 수 있습니다.
Interface descriptor : 하나의 configuration내의 특정 interface를 말하며, 0이나 혹은 여러 개의 endpoint를 가질 수 있습니다. 물론 이러한 endpoint들은 하나의 configuration내에서 고유한 set을 이룹니다. Interface는 또한 alternate setting을 가질 수 있으며, 이것은 endpoint를 변화시키거나 endpoint의 특성을 device가 configure된 후에 변화시키기 위해서 사용될 수 있습니다. Interface에 대한 default setting은 항상 alternate setting 0입니다. Alternate setting은 set_interface control command로 배타적으로 select될 수 있고 이러한 예로서는 multi-functional device를 들 수 있습니다.
Endpoint descriptor : host가 각각의 endpoint의 bandwidth requirements를 결정하기 위해서 필요합니다. 간단히 이야기 해서 endpoint라는 것은 USB device에 있어서는 data의 논리적인 source가 되거나 sink가 된다고 할 수 있습니다. 다른 말로 표현하자면 pipe라고도합니다. 가장 기본적으로 Endpoint 0는 항상 모든 control transfer에 사용되며, descriptor가 존재하지 않습니다.
String descriptor : optional한 것이며, 사람이 읽을 수 있는 unicode format으로 된 string을 가집니다. 이것은 vendor나 device name혹은, serial number등을 가질 수 있을 것입니다.
- Linux 커널모듈은 일정한 구조를 가지고 개발 되어집니다. 이러한 구조를 통해서Insmod ,rmmod util로 모듈을 Load하고Release할수 있게 됩니다.그런 간단한 Linux module을 만들어 보도록하죠 .
위에서 볼수 있듯 module_init , module_exit 메크로에 Function만 지정해주면 간단한 Linux 모듈이 완성됩니다. hello_init은 insmod 로 모듈을 Load할때 호출되어지며 hello_exit는 rmmod로 모듈을 Relase해줄때 호출되어집니다.
어떤 Deivce Driver든 이러한 구조를 가지고 Linux Kernel Driver가 개발되어집니다.
probe는 Device가 연결되었을때 Device를 초기화 해주고 통신을 할수있도록 하부 드라이버에 알려주는 역할을 합니다. disconnect는 probe에 생성된 객체들을 release 해주고 Device가 disconnect 되었다는것을 알려줍니다.
간단히 설명하면 probe에서는 interrupt 방식으로 URB를 만들어 하부 드라이버로 Submit 해줍니다. URB에는 Device로 부터 Data 통신을 어떻게 할것인가를 결정해주는 정보들을 담고 있습니다. 위의 경우는 Interrupt 방식으로 4byte씩 받아 usb_irq Function으로 Callback 해줄것을 요구하는 URB 입니다.
usb_irq Function에서는 4Byte를 받아서 프린트 해주는 역할을 합니다 .물론 Interrupt 방식이기때문에 이 Function은 Interrupt Interval에 맞춰서 호출 되어지게 됩니다.
여기까지 간단히 USB Driver의 구조에 대해서 알아 봤습니다. 그럼 이러한 모듈을 어떻게 컴파일 할것인지에 대해서 알아보죠
3.3 Kernel 2.4 와 2.6에서 컴파일 과 USB 개발의 차이
2.4와 2.6 은 컴파일 방법이 조금 다릅니다. 2.6 커널 부터는 module의 경우 makefile을 통해서만 컴파일이 되는것 같습니다.
- vae_gan . . . . 2 matches
Variational Inference를 활용한 연구중 가장 최근의 연구라면 VAE를 꼽을 수 있다. VAE는 2013년 Kingma et al.[* Diederik P. Kingma and Max Welling. '''Auto-encoding variational bayes'''.CoRR, abs/1312.6114, 2013.]과 Rezende et al.[* Danilo Jimenez Rezende, Shakir Mohamed, and Daan Wierstra. '''Stochastic backpropagation and approximate inference in deep generative models'''. In Proceedings of the 31st International Conference on Machine Learning - Volume 32, ICML’14, pages II–1278–II–1286.JMLR.org, 2014.]에 의해 정의 되었습니다. Variational Autoencoder를 이해하기 위해서는 간단한 Autoencoder의 구조부터 이해해야 합니다.
- variational_autoencoder . . . . 107 matches
뉴럴넷 관점에서 VAE는 '''encoder''', '''decoder''' 그리고 '''loss function'''으로 구성되어 있다. 뉴럴넷을 설명하는 일반적인 방법으로 __네트워크 모델__을 '''네트워크 구조'''와 이를 학습하기 위한 '''loss function'''을 어떻게 정의하느냐로 설명한다.
이 관점에서 encoder, decoder는 모두 뉴럴넷이다.
encoder는 입력으로 data x가 들어가고 출력으로 '''잠재된 차원'''(hidden representation) z가 나온다. 이 네트워크는 고차원의 문제를 낮은 차원으로 효율적으로 압축하는 것을 배워야하기 때문에 Encoder를 \(q_{\theta}(z|x)\)로 표현하자. --encoder는 Gaussian probability density인 \(q_{\theta}(z|x)\)에 파라미터를 아웃풋으로 내보낸다.-- encoder의 출력은 Latent vector의 확률분포의 파라미터를 내어준다. 가정에 의해서 Latent vector의 확률분포는 가우시안 확률분포를 따른다고 했기 때문에 가우시안 확률분포의 파라미터인 \(\mu, \sigma\)를 출력으로 내어준다. 이 확률 분포로 부터 z를 얻을 수 있다.
decoder는 입력으로 z를, 출력으로 데이터 확률분포의 파라미터 값('''가우시안 분포의 (\(\mu, \sigma\))''')을 내어준다. Decoder는 \(p_{\phi}(x|z)\)로 표현 된다. 예로 손으로 쓴 숫자를 판독하는 일이라고 하면 784개의 픽셀이 흑백이고 각각의 픽셀이 0, 1로 이루워져있다면 Bernoulli distribution으로 표현할 수 있다. 즉 출력값으로는 각 픽셀에 해당하는 Bernoulli distribution 확률분포의 파라미터들이 된다. 낮은 차원에서 높은 차원으로 가기 때문에 정보의 손실이 발생한다. 얼마나 손실이 발생하는가? reconstrunction log-likelihood \(\log p_{\phi}(x|z)\)를 사용하여 측정한다. (''z 입력으로 x 아웃이 나올 확률이 높았으면 한다. 즉, f(z)의 결과가 x이길 바라는 것으로 \(||x - f(z)||^2\)MSE로 계산 된다.'')
VAE의 loss function은 regularizer가 표함된 negative log-likelihood이다. 모든 datapoint가 공유하는 전역 변수가 없으므로 우리는 loss function을 하나의 datapoint \(l_i\)에만 의존적이도록 나눌 수 있다. 총 loss는 총 N개의 datapoint의 loss의 합이 된다.
앞 부분은 재생성 loss 혹은 i번째 datapoint의 negative log-likelihood 기대값이다. 기대값은 encoder의 분포와 관련이 있다. 이 부분은 decoder를 데이터를 재생성하도록 유도한다. decoder의 출력이 데이터를 잘 재생성하지 못하면 loss는 증가한다.
뒷 부분은 regularizer이다. 이 것은 encoder의 분포 \(q_{\theta}(z|x)\)와 \(p(z)\) 사이의 kullback-leibler divergence이다. q를 사용하여 p를 표현할 때 얼마나 정보가 유실 되는지를 측정한다. q가 p에 얼마나 가까운지 측정하는 방법이다.
VAE에서 p는 평균 0, 분산 1을 갖는 표준정규분포를 갖는다. encoder가 표준정규분포와 다른 z를 갖는다면 loss값에서 손해(penalty)를 본다. 이 regularizer는 z의 각 숫자를 충분히 다양하도록 만들라는 뜻이다. regularizer가 없다면 encoder는 각 datapoint에 대해 유클리드 공간상의 다른 영역을 나태내도록 편법을 사용할 수도 있다. 예로 똑같은 숫자를 나타내는 이미지(두 명이 쓴 숫자 2, \(2_{alice}, 2_{bob}\)가 각각 다른 값 \(z_{alice}\), 와 \(z_{bob}\)을 가질 수 있기 때문이다. z값이 의미 있길 원하기 때문에 이런 행동을 제한한다. 이를 통해 비슷한 숫자의 표현을 가깝게 유지할 수 있다.
확률 모델의 관점에서 VAE는 어떤 특정한 확률 모델을 갖는 data x와 숨겨진 변수(latent varialbe) z를 갖는다. 이 모델의 joint probability를 \(p(x,z) = p(x|z)p(z)\)로 표현할 수 있다. 생성과정은 다음과 같다.
이 것을 그래프 모델로 표현하면:
attachment:Variational_inference/model.png?width=200px&align=center&title''VAE 의 그래프 모델. 숨겨진 변수 z 는 표준정규분포이며 data 는 \(P(X|Z)\) 에서 추출된다. 그림자 진 노드 X 는 관찰된 data 를 의미한다. 손글씨 숫자 이미지에 대해서 이 data likelihood 는 Bernoulli distribution 을 따른다.''
이 모델이 VAE를 확률 모델의 관점에서 생각할때 가장 중요한 부분이다. 숨겨진 변수는 prior \(p(z)\)로 부터 얻어진다. 데이터 x는 숨겨진 변수 z를 조건부로 하는 likelihood \(p(x|z)\)를 갖는다. 모델은 data와 숨겨진 변수에 대한 joint probability \(p(x,z)\)를 정의한다. 이를 likilihood와 prior로 분해할 수 있다. \(p(x,z) = p(x|z)p(z)\) 흑백 숫자 이미지의 경우 likelihood는 Bernoulli distribution을 따른다.
이제 이 모델에서의 inference에 대해 생각해 볼 수 있다. 목표는 관찰된 데이터로부터 숨겨진 변수를 잘 추론(infer)하는 것이다. 곧, posterior \(p(z|x)\)를 계산하는 것과 일치한다. bayers에 따르면:
분모 p(x)를 생각해보자. 이 부분은 evidence라 부르고 숨겨진 변수를 제거하여 얻을 수 있다. (추론에 대한 증거)
\(p(x)= \int p(x|z)p(z)dz\) 불행하게도 이 적분을 계산하기 위해선 모든 숨겨진 변수의 가능성을 고려해야하기 때문에 지수 시간이 걸린다. 따라서 우리는 이 posterir distribution을 근사해야 한다.
Variational inference가 \(q_{\lambda}(z|x)\) 계열의 분포를 근사할 수 있다. Variational parameter \(\lambda\)는 분포 계열을 구별할 수 있게 한다. 예를 들어, q가 Gaussian이라면, 각 datapoint \(x_i\)에 대한 숨겨진 변수의 평균과 분산이 된다. \(\lambda_{x_i = (\mu_{x_i}, \sigma^2_{x_i})}\)
목표는 divergence를 최소화하는 \(\lambda\)를 찾는 것이다. 따라서 최적의 근사 posterior는 다음과 같다.
왜 이 값을 바로 계산하는게 불가능한가? 귀찮은 evidence p(x)가 식에 나타나기 때문이다.
variational inference를 위해서 아래의 조건이 필요하다.
이 식을 Kullback-Leibler divergence와 합쳐서 evidence를 다시 쓸 수 있다.
- vi_사용법 . . . . 7 matches
* ctrl + ] : 커서가 위치하고 있는 함수나 구조체의 정의로 이동
* ctrl + t : 이전 위치로 돌아가기
* tn : 다음 태그로 이동
* tp : 이전 태그로 이동
* tags : 이동한 태그 히스토리 목록
taglist.zip을 .vim 디렉토리로 이동하여 압축 해제
- visual_studio_code . . . . 9 matches
빌드 작업 실행은 <cmd + shift + B>로 실행 시킬 수 있는데 이 때 필요한 파일이 tasks.json 파일이다. 이것은 프로젝트별로 존재해야 하며 기본적인 템플릿을 제공하지만 기본적인 문법을 알아야 사용할 수 있다. 기본적인 문법은 아래와 같지만 추가적인 작업을 정의해서 사용할 수 있다.
* '''command:''' 실행 명령어를 적는 항목, 아규먼트와 분리할 수 있는데 이때는 실행할 명령과 '''args'''로 분리해서 적을 수 있다.
debug를 실행하기 위해서는 설정이 필요한데, launch.json 파일을 설정해줘야 한다.
설정에서 신경써야 할 부분은 컴파일 program과 preLanuchTack 정도로 보인다. debug를 실행할 바이너리 파일의 위치와 파일명이 일치하도록 설정해줘야 하고 컴파일 옵션에 -g 옵션이 들어간 task를 연결해줘야한다.
- wave_file_header_format . . . . 63 matches
WAV 또는 WAVE는 웨이브폼 오디오 포맷(웨이브 오디오 포맷, Waveform audio file format)의 준말로 개인용 컴퓨터에서 오디오를 재생하는 마이크로소프트와 IBM 오디오 파일 포맷 표준이다. 덩어리째로 데이터를 저장하기 위한 RIFF 비트스트림 포맷 방식에서 변화한 것으로, 아미가에 쓰이는 IFFF와 매킨토시 컴퓨터에 쓰이는 AIFF 포맷에 매우 가깝다. 가공되지 않은 오디오를 위한 윈도 시스템에 쓰이는 기본 포맷이다. 윈도 상에서는 WAV가 비압축 형식만 있는 것이 아니고 여러 압축 코덱을 이용할 수 있다. 그러나 윈도 비스타부터는 기본 지원 포맷이 WMA으로 바뀌었다.
WAV는 비압축 오디오 포맷으로, 프로그램 구동음이나 일반 수준의 녹음용으로 사용되지만 전문 녹음용으로는 WAV가 아닌 다른 비압축 포맷이 더 많이 쓰이기도 한다. 참고로 일부 라디오 방송국에서는 MP2이라는 압축 오디오 포맷 대신 비압축 WAV 포맷을 사용하는 경우도 있다.
요약하자면, WAV 는 Waveform Audio File Format 의 약자입니다. 확장자가 .wav 이기 때문에 흔히들 wav 라고 부르는 것이지요. 내용에 나와 있듯이 wav 는 기본적으로 비압축 포맷입니다. 무슨말인가 하면, 소리나는 그대로 값들을 저장해둔 파일이라고 생각하시면 됩니다.
- 이 부분에 'RIFF' 라는 문자가 ASCII 값으로 들어갑니다. wave 파일에 대한 고정값입니다.
- 주의할 점은 \0(NULL) 로 끝나는 문자열이 아니라는 것입니다. 프로그래밍할 때, 주의해야 합니다.
- 이 부분에는 나머지 부분에 대한 Size 가 들어갑니다.
- 파일 전체 사이즈에서, 위에 'Chunk ID' 와 자기자신인 'Chunk Size' 를 제외한 값이라고 보시면 됩니다.
- Little Endian 값이니 파일 사이즈가 0x00000010 인 경우, 메모리 값으로는 10 00 00 00 으로 저장되어 있습니다.
- 'fmt ' 라는 고정값이 들어갑니다.
- 현재 Header 에서 뒤에 이어지는 값들의 사이즈입니다.
- 즉, 현재 주황색 헤더의 전체 크기가 24 byte 인데, 다음에 이어지는 부분의 크기는 16 이죠.
- 고정값이라고 생각하시면 됩니다.
- 고정값으로 1 이 사용된다고 생각하시면 됩니다.
- Little Endian 이므로 00 01 이 아닌, 01 00 입니다.
- mono 라면 1 이고, stereo 라면 2가 됩니다.
- 10 Hz 라고 하면, 0.1 초 단위로 정보를 저장한다는 거겠지요. 당연히 숫자값이 커질수록 음질이 좋아집니다.
- 일단 위에 Sample Rate 가 441000 이고, mono 채널이라고 가정해 봅시다.
가장 마지막에 나오는 field 인 'Bits Per Sample' 이 바로 그것입니다. 그때 설명하겠습니다.
- mono 면 'sample 크기 x 1' 이고, stereo 면 'sample 크기 x 2' 가 되겠습니다.
- Sample 한 개를 몇 bit 로 나타낼 것이냐 입니다.
- wedding . . . . 1 match
이덕균 5만 -- [wskim] [[DateTime(2012-11-08T04:42:57)]]
- weight_training . . . . 14 matches
= 여자 웨이트 방법 =
1. 웨이트 트레이닝 (40~60분)
근육 뿐 아니라 거의 모든 것들은 처음에 워밍업이 필요합니다.
자동차 조차도 시동을 걸고 어느정도 시간이 지나야 몸이(?) 풀리죠.
웨이트 또한 일정 시간동안 가벼운 스트레칭과 함께 약간의 유산소 운동을 해주시는게 좋아요.
적절한 스트레칭은 헬스 전 근육에 산소를 공급하고 활성화 되기 때문에 부상이나 결림, 담 등을 예방할 수 있습니다.
'''예: 목 -> 어깨 -> 가슴 -> 팔 -> 허리 -> 엉덩이&하체 -> 종아리&발목'''
== 웨이트 트레이닝 ==
'''POINT''' : 유산소 운동이나 스트레칭만으로 살을 빼면 요요현상이 쉽게 찾아 온다. 웨이트는 필수! 적은 무게로 반복운동
- wiki_server_immigration . . . . 10 matches
#title 위키 서버 이전 관리 메뉴얼
지금 사용하고 있는 위키 서버는 내가 원하는 기능을 충실히 실행하고 있고 나에게 모든 것이 마춰져 있는 상태로 쉽사리 바꿀 수 없음.
이 위키를 운영하고 있는 서버 업체가 언제 없어질지 모르는 상태로 항상 주위해야 한다.
매달 위키 서버는 백업 되어 개인 서버로 이전 되어 관리 된다.
* ssh/ftp 접속이 됨으로 wiki 디렉토리를 tar로 묶어 백업 할 수 있음.
= 이전 관리 =
1. 백업 된 wikixxxxxx.tar 파일을 /var/www(별도의 다른 폴더를 사용해도 상관 없음, 단 httpd.conf 파일의 수정이 필요함) 아래 압축을 풀어 설치 한다.
1. wiki 폴더와 _cache, data, pds 폴더의 권한이 777로 되어 있는지 확인한다.
1. 웹서버와 시스템에 따라서 웹문서의 사용자와 구릅이 다를 수 있다 새로운 위키 페이지 하나를 만들어서 확인한다.
- wikibackup . . . . 20 matches
아마존 웹 서비스는 free tier를 제공하여 1년 동안 웹 서비스를 사용할 수 있도록 하고 있다. 1년이 지나면 어찌 할까? free tier로 사용하던 것을 유료 전환하게 되면 한달에 약 1만원 정도의 비용이 발생하게 된다. 개인적 목적으로 사용하기 위해서 한달에 만원의 비용을 지불하는 것이 사정에 따라서 달라지겠지만 1년에 약 12만원 정도의 비용이 발생하니 만만치 않은 비용이다.
그렇기 때문에 최소의 노력으로 새로운 계정으로 넘어가서 새로이 free tier서비스를 사용하는 방법을 알아보자.
사용하던 인스턴스를 그대로 이미지로 만들어 저장할 수 있다.
아마존 콘솔에서 인스턴스 탭으로 가면 사용 중인 인스턴스를 볼 수 있다. 이 중에서 백업할 인스턴스를 선택하고 이미지 > 이미지 생성을 선택하면 이미지가 생성되고 이미지 탭에서 확인 할 수 있다.
생성된 이미지를 보면 권한을 설정할 수 있는데 이때 프라이빗에 AWS 계정 번호를 넣어주면 그 계정 번호에 해당하는 유저가 이 이미지에 대한 접근 권한이 생긴다. 새롭게 생성된 아마존 계정의 번호를 넣어주고 새 계정에서 기존의 이미지로 인스턴스를 생성해서 사용하면 된다.
whansun.iptime.org로 도메일 이사후 rasberry pi 4b 보드에 nextcloud와 웹서버 운영
- windows10_iis_installation . . . . 24 matches
윈도우 10은 윈도우 8.1과 비교하면 많은 부분이 바꼈지만, IIS에 관련한 부분은 크게 바뀐 부분이 없는 것 같습니다. 맨 처음 윈도우10 테크니컬 프리뷰를 소개하면서 맨 처음 버전에서는 윈도우 8.1과 탑재된 같은 버전(8.0)의 IIS가 있었지만, Windows 10이 정식으로 배포되기 시작한 지금 Windows10에 탑재된 IIS 에는 버전 업(10.0)이 되어있었습니다. [* 웹서버는 운영체제 안에 기능으로 되어 있어서 별도의 설치 파일이 있는 것이 아니라 '''제어판 > 프로그램 > 프로그램 및 기능'''에서 Windows 기능 켜고/끄기 에서 기능을 활성화 시키는 것으로 설치가 된다.]
아직까지는 IIS7에서 IIS8로 업그레이드 될 때 처럼 많은 변화가 눈에 띄지는 않지만 시간을 두고 차근차근 찾아보도록 하겠습니다. 이번에 무료 업그레이드를 통해서 많은 사용자들이 윈도우10으로 갈아타고, 서버도 새로 세팅하는 분들이 계시거나 또는 처음 세팅하는 분들이 꽤 계시더군요.
덕분에 웹서버를 구축하면서 제 블로그를 찾아오시고 설치하는 분들이 꽤 많습니다. 하지만, IIS에 핵심적인 추가 기능이라고 할 수 있는 PHP관리자(PHP Manager)가 Widnows10에서는 제대로 설치되지 않는 부분이 발생하였는데 그 부분을 해결하고 정상적으로 설치하도록 해결하는 방법을 이 포스팅을 통해 소개하고자 합니다
= PHP 관리자가 설치 안 되는 이유 =
근데 오류 내용이 조금 웃깁니다. IIS 7또는 그 이상의 버전에서 설치하라고 하네요. 근데, 윈도우10에 설치되어 있는 IIS 버전을 한번 확인을 해볼까요?
IIS의 상단 메뉴중에서 '''도움말 > 인터넷 정보 서비스 정보''' 를 클릭해 보면 아래와 같이 IIS의 버전을 확인할 수 있습니다.
당연이 IIS7보다 훨씬 상위 버전이긴한데 설치가 안되는 이유는 간단합니다. 가장 최근에 나온 버전으로 IIS의 Major 버전 설정이 10으로 되어 있었기 때문에 상대적으로 구 버전인 PHP 관리자가 버전을 인식을 못하고 기타 버전으로 인식을 해버리기 때문에 발생한 문제입니다.
- windows_driver_development_env . . . . 275 matches
지난 컬럼에 이어 이번 컬럼에서는 윈도우 디바이스 드라이버 개발 방법에 관한 내용을 살펴보도록 하겠습니다.
윈도우즈 디바이스 드라이버 개발 방법
디바이스 드라이버 개발을 처음 시작하시는 분들이 가장 많이 하시는 질문은 “ 디바이스 드라이버를 개발하려면 무엇을 어떻게 공부해야 하나요 ? ” 라는 것이다 .
일반 애플리케이션 프로그램 개발을 시작하는 경우에는 자료도 많고 , 주변에 개발자들도 많아서 공부 방법이나 자료들을 쉽게 접할 수 있는데 , 디바이스 드라이버 분야는 개발자들이 많은 분야도 아니고 , 자료도 쉽게 찾을 수도 없다 보니 입문자들에게는 어디서부터 어떻게 시작해야 할지 막막해 한다 . 간혹, 디바이스 드라이버에 열정이 있으신 분들중에는 홀로 무수한 나날을 디버깅과 테스트를 통해 개발의 고수가 되는 경우도 있다.
하지만 , 일반 개발자들은 아직도 디바이스 드라이버 개발을 위해 어떻게 준비를 해야 할지 어려워하는게 현실이다. 그래서 이런 컬럼 에서는 필자가 그 동안 경험하고 느낀 것을 토대로 초보자들도 쉽게 접근할 수 있는 개발 방법들을 소개하려고 한다 .
우선 , 디바이스 드라이버 개발 방법의 내용을 언급하기 전에 여러분이 한 가지 알아두어야 할 사항이 있다 . 이전 1 부 컬럼 에서도 언급했듯이 디바이스 드라이버와 운영체제는 서로 밀접한 관계를 맺고 있다 . 그래서 이번 컬럼에서 다루는 윈도우 디바이스 드라이버 개발 방법이 다른 운영체제들에도 동일하게 적용되지 않을 수도 있다는 것을 참고해서 글의 내용을 이해했으면 한다 .
응용프로그램 , 웹 프로그래밍 , 게임 등의 프로그램들처럼 디바이스 드라이버도 소프트웨어의 한 종류로 볼 수 있다 . 그래서 일반적인 대학교의 컴퓨터 학과들에서 배우는 알고리즘 , 운영체제 , 프로그래밍 언어 , 자료구조 , 컴파일러 등등의 다양한 지식들을 기본적으로 알고 있는 것은 디바이스 드라이버를 공부하는데 하는데 많은 도움이 된다 .
하지만 , 이런 기본적인 내용들 이외에 디바이스 드라이버를 개발하기 위해서 좀 더 알아야 할 지식들이 있다 . 그 내용들에 대해서 간략히 살펴보도록 하자 .
운영체제 아키텍처 : 다른 프로그램들도 마찬가지겠지만 , 프로그램이 동작하는 기반이 되는 운영체제를 이해하지 않고서는 제대로 된 프로그램을 개발 할 수가 없다 . 그 중에서도 디바이스 드라이버는 운영체제의 커널에서 동작 하므로, 운영체제 구조 및 개념들 ( 메모리 관리 , 스케줄링 , I/O 요청의 흐름 , 동기화 등등 ) 을 제대로 이해해야 개발하는데 문제가 없게 있게 된다 . 하지만 , 윈도우는 리눅스와 같은 Open Source 운영체제가 아니고, 내부 구조가 블랙박스처럼 베일에 싸여 있다보니, O/S 내부 내용을 공부 하려해도 항상 정확한 자료들을 가지고 아니어서 이해하는데 많은 어려움이 있다. 그래서, 이런 경우엔 직접 디버깅을 통해 알아내야 하는데, 이런 부분은 윈도우 운영체제를 이해하는데 어렵게 하는 부분이 되고 있다.
Microsoft 에서는 윈도우 소스코드를 공유하는 “ Windows Shared Source programs ” 제도를 운영하고 있다 . 이 프로그램에 참여방법은 여러 가지 방법이 있는데, 그 중에 Microsoft MVP 자격으로 참여해 볼 수 있는 형태가 있다. 관심 있는 분들은 MVP 에 도전해 보길 바란다.
• 컴퓨터 구조 및 CPU 아키텍처 : 운영체제 아키텍처를 이해하기 위해서는 먼저 컴퓨터 구조나 CPU 아키텍처의 이해가 필요하다 . 즉 , 넓은 의미로 운영체제도 CPU 및 컴퓨터 구조 기반 위에서 작동하는 프로그램이기 때문에 CPU 및 컴퓨터의 구조를 이해하는 것은 기본 중에 기본이다 . 그래서 기본적인 CPU 동작원리라던지 컴퓨터의 내부 구조에 대한 지식은 운영체제 및 드라이버를 이해하는데 필요하다.
• C/C++ 언어 : 많이 질문하시는 내용 중에 “ 디바이스 드라이버는 어떤 언어로 개발하나요 ? ” 가 있다 . 윈도우 디바이스 드라이버 개발 시에는 C/C++ 언어 정도를 이해한다면 개발하는데 무리는 없다 . 그리고 , 가끔 디버깅 (Debugging) 이나 리버스 엔지니어링 (Reverse Engineering) 이 필요한 경우에 어셈블리 언어 (Assembly) 의 지식이 필요하다. 그렇다고 어셈블리 언어를 완벽한 이해해야 하는것은 아니다. 대신 남의 코드를 디버깅하는 경우 소스 코드가 어셈블리 코드로 보여 내용을 보고 분석할 줄 알아야 하는데 이때 간단히 코드를 보고 이해할 수 있을 정도의 지식이면 된다.
• API 프로그래밍 : 디바이스 드라이버는 누군가의 요청에 의해 기능을 하게 된다 . 사용자가 GUI 를 가진 애플리케이션을 통해 I/O 요청을 하면 디바이스 드라이버가 해당 작업을 하게 되고 , 결과는 다시 애플리케이션에게 전달되는 구조를 가진다. 이처럼 디바이스 드라이버는 애플리케이션과 항상 상호작용을 한다.
그래서, API 프로그래밍을 공부할때는 단순 API 사용법의 내용이 아닌 디바이스 드라이버와 애플리케이션 사이의 통신 및 전체 I/O 구조에 대한 내용을 중심으로 공부하길 바라며 이 부분은 추후에 드라이버를 공부하는데도 많은 도움이 된다.
• H/W 지식 : 디바이스 드라이버는 소프트웨어와 하드웨어 사이에 중간의 다리역할을 하는 프로그램이라 볼 수 있다 . 이러다 보니 디바이스 드라이버를 작성하기 위해서는 소프트웨어 지식 뿐만 아니라 , 하드웨어적인 지식도 필요로 하게 된다. 그렇다고 H/W 스펙의 전기적인 내용이나 물리적인 회로등의 이해를 요구하는 것은 아니다. 대신. 기본적인 H/W 스펙 문서에 나와있는 용어라던지 통신 프로토콜등에 대해 먼저 이해하기 바라며, 드라이버에서 사용되는 H/W 관련 개념들도 같이 공부하길 바란다.
• 디바이스 드라이버 모델 : 윈도우에서는 디바이스 드라이버를 어떤 방식으로 개발하라는 드라이버 모델들을 제시하고 있으며, 이 모델들을 이용해 드라이버를 좀 더 쉽게 개발할 수 있게 해준다. 현재 윈도우에서 제공하는 드라이버 모델은 10 가지 이상의 방법들을 제시하고 있고 , 개발하려는 장치 및 드라이버 종류에 따라 추천하는 드라이버 모델들이 존재하고 있다 . 하지만 , 이런 다양한 드라이버 모델은 개발자들이 드라이버 종류에 따라 각각 새로운 모델들을 익히기 위해 시간과 노력을 배로 들게 하는 단점이 있다 . 그래서 Microsoft 에서는 이런 어려움을 해결하기 위해 새로운 드라이버 모델을 계속 발전시키고 , 통합하는 과정을 진행하고 있다 .
아래 표는 현재까지의 윈도우 운영체제의 종류에 따른 지원하는 드라이버 모델이다 .
아래 표는 Microsoft 에서 디바이스 및 드라이버 종류에 따라 권장하는 드라이버 모델에 대한 설명이다 . ( http://www.microsoft.com/whdc/driver/foundation/DrvRoadmap.mspx# )
VxD ( Virtual Device Driver ) : Windows 95/88/ME 에서 사용되는 드라이버 모델로 디바이스 드라이버를 가상화시킨다는 개념을 적용해 드라이버를 만든다 . 확장자는 vxd 로 만들어진다 .
NT Kernel Mode Driver : Windows NT 용 드라이버를 만들기 위한 드라이버 모델로 드라이버 개발을
- windows_git_usage . . . . 3 matches
설정과정이 다소 불편하더라도 이해해 주세요
windows용 git 클라이언트를 설치 했다면 탐색기에서 오른쪽 클릭을 하면 아래와 같은 메뉴가 생성된 것을 확인 할 수 있다.
- windows_util_xshell . . . . 4 matches
telnet, serial, ssh 등 을 사용할 때 편하게 쓸 수 있는 유틸중 하나가 xshell이다. 근데 설치 하고 제공 되는 색 구성표가 너무 강해서 눈에 피로감을 많이 주고 잘 보이지 않는다.
그래서 따로 한텀의 색구성으로 누군가가 색 구성표를 작성해서 배포 했다. 참 좋은 사람이다. ㅎㅎ
- work2010_list . . . . 4 matches
== [:20101105_hdcctv_image_data_path HDCCTV 영상 이미지 데이터 패스 열기] ==
2. YAFFS2 이미지 만들기
3. YAFFS2 이미지 FUSING하기 (U-BOOT, LINUX)
- work2011_list . . . . 7 matches
== [:20110711_xbmd FPGA를 이용한 하드웨어 라이브러리 작업] ==
드라이버 작업
== [:20110824_fftw fftw 라이브러리를 사용하는 예제 작성 작업] ==
opengl 라이브러리 설치
freeimage 라이브러리 설치
fftw3 라이브러리 설치
- work2012_09_list . . . . 1 match
double precision 데이터를 처리하기 위한 작업 추가
- work2013_10_list . . . . 38 matches
심심해서 strace 툴(프로그램이 사용하는 시스템 콜을 보여준다) 을 써봄
ELF조작(?) 해서 gettimeofday 함수 레이블(??)을 바꿔서 어케하면 될까 생각해봄
근데 ELF가 먼지 함수 테이블이 뭔지 나는 하나도 모르므로 일단 GG..........
이건 해당 프로그램에서 어떤 라이브러리를 사용하는가 보여주는 녀석 같다.
일단 날짜 지났음 새로사삼! 하는 메세지박스가 나온다음에 좀 자세시 출력 한것을 보니 이름이 수상한 녀석 발견!!
그래서 다음과 같이 쳐 보았다
HncGetTrialDays 라는 함수가 있네.. (보기 쉬우라고 조작좀 했다능.. 이해즘.ㅋ... 실제로는 너무 길어서요)
이함수의 Return 값이
0(FALSE) 이면 날짜 지났다는 오류메세지 띄우고,
1(TRUE) 이면 정상적으로 처리해 hwp를 띠워준다는 사실을 알아냄.
자 이제 이 라이브러리를 수정해야하느데 이함수, 대체 어디다 박힌 놈이야!!?
#4 라이브러리의 위치를 찾아랏!
공유라이브러리니깐 확장자가 so인녀석
Common7/libHncBL70.so 이 파일이 되겠습니다...
근데.. 이걸 어셈으로 바꿔주는 툴을 또 찾아야겠네요 후...
아! 부트로더 만들때 쪼오끔 건드렸던 ndisasm 이 있었지!!
이거 찾으면 되나??? (아래는 /tmp/b 파일에서 HncGetTrialDays문자열만 단순히 찾은겁니다)
저기가 시작점이라는건가?? 에라이 모르겠다.. 감으로 찍어!!!
일단 push push 하는게 C에서 인자들 넣어주는 삘이 나긴하는데
아 마 도 이게 HncGetTrialDays 본체가 맞는거 같아요
- work2013_11_list . . . . 3 matches
1. git 클라이언트 사용 설명서 작성.
1. --[:git_client_user_guide git 클라이언트 사용 설명서 작성].--
* git 도구 관련글 업데이트
- work2013_12_list . . . . 24 matches
1. --[:git_client_user_guide git 클라이언트 사용 설명서 작성].--
* git 도구 관련글 업데이트
1. --[:git_client_user_guide git 클라이언트 사용 설명서 작성].--
* git 도구 관련글 업데이트
* [:programming_library 공유 라이브러리 업데이트]
1. --[:git_client_user_guide git 클라이언트 사용 설명서 작성].--
* git 도구 관련글 업데이트
* [:programming_library 공유 라이브러리 업데이트]
1. --[:git_client_user_guide git 클라이언트 사용 설명서 작성].--
* git 도구 관련글 업데이트
* --[:programming_library 공유 라이브러리 업데이트]--
1. --[:git_client_user_guide git 클라이언트 사용 설명서 작성].--
* git 도구 관련글 업데이트
1. --[:git_client_user_guide git 클라이언트 사용 설명서 작성].--
* git 도구 관련글 업데이트
1. --[:git_client_user_guide git 클라이언트 사용 설명서 작성].--
* git 도구 관련글 업데이트
1. [:work_blas_library BLAS 라이브러리 개발하기]
1. --[:git_client_user_guide git 클라이언트 사용 설명서 작성].--
* git 도구 관련글 업데이트
- work2014_01_list . . . . 9 matches
1. --[:git_client_user_guide git 클라이언트 사용 설명서 작성].--
* git 도구 관련글 업데이트
1. [http://escape.nims.re.kr/moni/wiki.php/haechi_iternative_solver 개발자 페이지 작성 with 츄]
1. [:work_blas_library BLAS 라이브러리 개발하기]
1. [:work_blas_library BLAS 라이브러리 개발하기]
1. --[:git_client_user_guide git 클라이언트 사용 설명서 작성].--
* git 도구 관련글 업데이트
1. [http://escape.nims.re.kr/moni/wiki.php/haechi_iternative_solver 개발자 페이지 작성 with 츄]
1. [:work_blas_library BLAS 라이브러리 개발하기]
- work2014_07_list . . . . 1 match
[:pci_interface_review PCI 인터페이스 리뷰]
- work2015_01_list . . . . 5 matches
1. [:openann OpenAnn 라이브러리 설치 및 소스 리뷰]
1. [:openann OpenAnn 라이브러리 설치 및 소스 리뷰]
* 라이브러리 설치 완료
1. [:openann OpenAnn 라이브러리 설치 및 소스 리뷰]
* 라이브러리 설치 완료
- work2015_02_list . . . . 5 matches
1. [:openann OpenAnn 라이브러리 설치 및 소스 리뷰]
* 라이브러리 설치 완료
1. --kNN을 이용한 분류 (벡터 사이의 거리를 이용한 분류)--
- work2015_03_list . . . . 7 matches
1. [:openann OpenAnn 라이브러리 설치 및 소스 리뷰]
* 라이브러리 설치 완료
1. --kNN을 이용한 분류 (벡터 사이의 거리를 이용한 분류)--
1. [:openann OpenAnn 라이브러리 설치 및 소스 리뷰]
* --라이브러리 설치 완료--
- work2015_08_list . . . . 9 matches
virtualenv 가상의 파이션 환경을 구축하고 사용할 수 있도록 해주는 유용한 어플이케이션
Theano[[footnote(다차원 배열을 사용한 수학식을 정의, 최적화, 풀이하는 Python 라이브러리)]] 설치
열역학이란 열과 일(에너지와 운동)의 관계를 설명하는 물리학이다. 다수의 입자를 다루기 때문에 대학 학부 수준만 되도 통계를 사용하며, 여기에 원자/양자 개념을 도입하면 통계역학이 되기 때문에 통계역학의 전신이라고도 할 수 있다.
- work2015_11_list . . . . 8 matches
* 기계학습법(Machine Learning) 中 하나로 인공신경망을 사용했었는데 2000년대 들어서 Deep Learning이라는 형태로 진화했고 지금은 머신러닝 분야를 드라이빙하는 큰 화두가 되었다.
*최신 Deep Learning 논문들이 ICLR(International Conference on Learning Representations)에서 발표 되고 있다.
* Yoshua Bengio, Yann LeCun이 Chair를 맞고 있다.
* AI Korea 라는 블러그에 Deep Learning에 대한 글이 Rapidly Update 되고 있다.
* 삼성에서 만들었다는 머신러닝 라이브러리[[footnote(https://github.com/samsung/veles)]] opencl을 사용했다는 것이 눈에 뛰는 점이다.
- work2015_12_list . . . . 1 match
* 시작은 했는데 아직 갈길이 멀다.
- work2016_012_list . . . . 3 matches
* --김경민 박사 [http://iopscience.iop.org/article/10.1088/0264-9381/32/24/245002 논문] 리뷰-- 서울대 학생들이 함.
* 중력파 데이터 다루기
- Raw Data Handling (시계열 데이터에서 트리거 추출하기)
- work2016_01_list . . . . 7 matches
* 시작은 했는데 아직 갈길이 멀다.
* anncpp로 AUX 데이터 분류
* 250개 feature 데이터 중에서 어느것이 분류 성능에 영향을 주는지 확인 하는 작업을 시작 한다.
* [:lalsuite_info LALSuite 관련 조사: 라이브러리 분석 및 설치 방법]
* omicron 이벤트 트리거 알아보기 [* https://wiki.ligo.org/DetChar/Omicron]
* 연구재단 이공계열 기초연구사업 설명회 참석 (1/28)
- work2016_02_list . . . . 2 matches
* --omicron 이벤트 트리거 알아보기 [* https://wiki.ligo.org/DetChar/Omicron]--
* --연구재단 이공계열 기초연구사업 설명회 참석 (1/28)--
- work2016_03_list . . . . 2 matches
* --omicron 이벤트 트리거 알아보기 [* https://wiki.ligo.org/DetChar/Omicron]--
* --연구재단 이공계열 기초연구사업 설명회 참석 (1/28)--
- work2016_07_list . . . . 2 matches
* 중력파 데이터 다루기
- Raw Data Handling (시계열 데이터에서 트리거 추출하기)
- work2016_08_list . . . . 3 matches
* --김경민 박사 [http://iopscience.iop.org/article/10.1088/0264-9381/32/24/245002 논문] 리뷰-- 서울대 학생들이 함.
* 중력파 데이터 다루기
- Raw Data Handling (시계열 데이터에서 트리거 추출하기)
- work2016_09_list . . . . 3 matches
* --김경민 박사 [http://iopscience.iop.org/article/10.1088/0264-9381/32/24/245002 논문] 리뷰-- 서울대 학생들이 함.
* 중력파 데이터 다루기
- Raw Data Handling (시계열 데이터에서 트리거 추출하기)
- work2017_02_list . . . . 4 matches
* [attachment:bayesian_dl.pdf 베이지안 딥러닝] - 서울대학교 통계학과 김용대 교수
* --김경민 박사 [http://iopscience.iop.org/article/10.1088/0264-9381/32/24/245002 논문] 리뷰-- 서울대 학생들이 함.
* 중력파 데이터 다루기
- Raw Data Handling (시계열 데이터에서 트리거 추출하기)
- work2017_03_list . . . . 7 matches
* --데이터 마이닝 수업 준비 하기--
* --[:cnu_digital_signal 데이터 신호처리] 수업 준비 하기--
* [attachment:work2017_02_list/bayesian_dl.pdf 베이지안 딥러닝] - 서울대학교 통계학과 김용대 교수
* --김경민 박사 [http://iopscience.iop.org/article/10.1088/0264-9381/32/24/245002 논문] 리뷰-- 서울대 학생들이 함.
* 중력파 데이터 다루기
- Raw Data Handling (시계열 데이터에서 트리거 추출하기)
- work2018_02_list . . . . 7 matches
* --데이터 마이닝 수업 준비 하기--
* --[:cnu_digital_signal 데이터 신호처리] 수업 준비 하기--
* [attachment:work2017_02_list/bayesian_dl.pdf 베이지안 딥러닝] - 서울대학교 통계학과 김용대 교수
* --김경민 박사 [http://iopscience.iop.org/article/10.1088/0264-9381/32/24/245002 논문] 리뷰-- 서울대 학생들이 함.
* 중력파 데이터 다루기
- Raw Data Handling (시계열 데이터에서 트리거 추출하기)
- work2019_12_list . . . . 1 match
* HDR 알고리즘의 내부 파라메터에 CARLA(Continuous action reinforcement learning automata) 적용 논문[* 남동균 et al. "저가형 자이로 센서의 드리프트 감소 방안에 대한 고찰", Proceedings of KIIS Conference 2010 Vol. 20, No. 1.] 리뷰
- work2020_01_list . . . . 16 matches
* booststrap.sh을 사용해서 설정파일을 생성하면 ''project-config.jam'' 파일이 생성 되는데 생성된 파일을 열어서 실제 설정값이 잘 들어 갔는지 확인해봐야 한다. 설정값이 정상적이지 못하면 문제가 발생한다.
* numpy 버전이 업데이트 되면서 boost-numpy와 버전 호환이 일시적으로 안 좋은 것으로 파악됨. Singularity 환경 구축과 etagen 에 대응 코드 넣어둠.
* 관련 라이브러리 설치
* 컨테이너 만들기
이와 관련된 이슈는 Numpy __1.17.2__ (3.7.4)환경에서 발생 했고 이전 성공 버전은 __1.15.4__(3.7.1) 이다.
https://hub.docker.com/에서 필요한 이미지를 검색하고 그 이미지로 부터 필요한 것들을 추가 하는 방식으로 만들어 사용하면 된다.[* <https://sylabs.io/guides/3.5/user-guide/build_a_container.html> Container 빌드하기]
* 진타이 딩(Jintai Ding) - Multivariate Public Key Cryptosystems(MPKC)
- work2020_02_list . . . . 16 matches
* Grad-CAM++ 논문 리뷰, [:grad_cam Grad-CAM 리뷰 페이지]
* 진타이 딩(Jintai Ding) - Multivariate Public Key Cryptosystems(MPKC)
* torch.img 기준 numpy scipy matplotlib ipython mne pandas jupyterlab torch OpenCV-Python tensorflow etagen이 설치 되어 있고 그 밖에 필요한 페키지들은 .local에 별도로 설치했다.
* .local폴더는 시스템과 같이 사용하는 것으로 기존의 .local 아래 python3.6 폴더를 지우거나 이동해줘야 한다.
아래와 같이 GPU 이름과 사용할 수 있는 메모리 용량이 보이는 것을 확인 할 수 있다.
* CHB-MIT 뇌전증 데이터 화이트닝
* [:임차권등기 전세 이사하기]
* o1 데이터 기준으로 데이터 수집
* gravityspy 데이터 기준
* 데이터 준비(3월 말까지), 분류(4월말까지 1차), + 6월 1차 분류기 데스트, 7월부터 XAI 알고리즘 적용
- work2020_03_list . . . . 8 matches
* --Grad-CAM++ 논문 리뷰, [:grad_cam Grad-CAM 리뷰 페이지]--
* 진타이 딩(Jintai Ding) - Multivariate Public Key Cryptosystems(MPKC)
아래와 같이 GPU 이름과 사용할 수 있는 메모리 용량이 보이는 것을 확인 할 수 있다.
* CHB-MIT 뇌전증 데이터 화이트닝
- work2020_04_list . . . . 15 matches
* 진도 확인 및 최종 보고서 기술에 도움이 되는 중간 material 생성이 목적
* 백그라운드는 보려고 하는, 관심 있는 신호를 제외한 모든 신호를 백그라운드라고 한다. 보려고 하는 신호가 transient하다는 조건에서 모든 신호의 평균에서 얼마나 벗어나 있느냐를 보고 변화가 생김을 찾는 방식에서 가능한 방법이다.
* 신호의 전체적인 통계량이 변했다면 psd를 다시 계산해야 한다. 신호가 전반적으로 변화한 것이 이벤트(관심있는 사건)에 의해서 변화한 것이 아니라 환경이나 조건이 변했을 가능성이 있음.
* 시간에 따라서 조건이 변한다면 분석하는 시간단위(window size)의 크기를 설정하는 이슈가 있음.
* chb-MIT 데이터 시간에 따른 데이터 분류 (2일)
== 시계열 데이터 ==
- work2020_05_list . . . . 7 matches
* chb-MIT 데이터 시간에 따른 데이터 분류 (2일)
* 파일별로 시간 영역 추출하기 --> 시간에 따른 데이터 분류보다 델타파를 이용한 실제 수면 구간 분리가 합당해 보여 프로젝트의 방향을 변경함.
- Refined grid를 사용해서 dt 구간 업데이트 시도 실패 ||
|| 목 ||- qC_1, qC_2와 element 객체의 qc 데이터 포인트 불일치 발견 ||- 뇌파 데이터 분석 회의 (13:00~15:00)
- work2020_06_list . . . . 12 matches
* chb-MIT 데이터 시간에 따른 데이터 분류
* 파일별로 시간 영역 추출하기 --> 시간에 따른 데이터 분류보다 델타파를 이용한 실제 수면 구간 분리가 합당해 보여 프로젝트의 방향을 변경함.
|| 목 ||- 뇌파 잡은 제거를 위한 python code 개발 ||- 뇌파 데이터 분석 회의 (13:00~15:00)
|| 월 ||- 진행중인 프로젝트 정리[* http://gitlab.nims.re.kr:8081/whansun.kim/eeg_autoencoder] [[br]] - AMR flux 업데이트 코드 정리[* https://gitlab.com/jinhokim0919/amr] [[br]] - 인턴 자리 배정 및 컴퓨터 세팅 ||- AMR 클래스 다이어 그램 및 개념도 작성 [[br]]- 기획연구 회의 (15:30~17:00) ||
|| 화 ||- AMR 클래스 다이어 그램 및 개념도 작성 ||- AMR flux 계산 코드 조사 ||
|| 화 ||- AMR Code Debug 문제 해결 후 git push [[br]]- CHB-MIT 데이터에서 수면 구간 검출 [[br]]- 권구상 아메레퍼스픽 미팅 (10:30~14:30) ||- 기획연구 회의 (14:30~16:30) ||
* dictation.io/, 구글 드라이브 문서 둘다 음성을 텍스트로 작성해줌.
== 맥에서 사용하면 좋은 어플리케이션 ==
* kega 홈페이지에서는 무료
- work2020_07_list . . . . 7 matches
* chb-MIT 데이터 시간에 따른 데이터 분류
* 파일별로 시간 영역 추출하기 --> 시간에 따른 데이터 분류보다 델타파를 이용한 실제 수면 구간 분리가 합당해 보여 프로젝트의 방향을 변경함.
|| 화 ||- Object-Oriented Implementation of Adaptive Mesh Refinement Algotirhms 논문 읽기 큰 소득 없이 종료 ||- ETAS CRAN Package[* https://www.jstatsoft.org/article/view/v088c01] 조사[[br]]- Hawkes process study ||
|| 화 ||- Unsupervised automatic seizure detection for focal-onset seizures recorded with behind-the-ear EEG using an anomaly-detecting generative adversarial network 논문 읽기[[br]]; DCGAN에 정상 구간을 학습 시키고 정상 구간에서 벗어난 것을 찾고자 했다. anomaly-detection 알고리즘이 더 있을텐데 왜 DCGAN을 사용했을까?[[br]]- Hawkes process 조사[* https://whansun.iptime.org/wiki.php/hawkes_process] ||- ETAS CRAN Package[* https://www.jstatsoft.org/article/view/v088c01] 조사[[br]]- Hawkes process study ||
= 이달의 정보 =
- work2020_08_list . . . . 13 matches
* chb-MIT 데이터 시간에 따른 데이터 분류
* 파일별로 시간 영역 추출하기 --> 시간에 따른 데이터 분류보다 델타파를 이용한 실제 수면 구간 분리가 합당해 보여 프로젝트의 방향을 변경함.
|| 화 ||- 승진심사 발표자라 송부 ||- 주간보고 정리[[br]]- Hawkes Process 데이터 확인 ||
|| 수 ||- Hawkes Process, Pointer process 가능하도록 데이터 가중 작업 ||- KGWG telecon (16:00~) ||
|| 목 ||- 뇌파 데이터 Timestamp, channel로 데이터 분석 ||- 뇌파 미팅, 아모레퍼시픽 권구상 박사님 화상회의 (13:30~16:00) ||
|| 화 ||- AMR 구조 정리 & UML 다이어그램 작성 ||- 서울기술연구원 온라인 미팅(14:00~15:30)[* https://whansun.iptime.org/wiki.php/%ED%9A%8C%EC%9D%98%EB%A1%9D][[br]]- 뇌파 패턴 분석 ||
|| 수 ||<colspan=2>- 회의 많은 날.... 기억이 없음. [[br]]- 황박사님 요청으로 MHP관련 일 진행 ||
|| 목 ||- MHP를 이용한 뇌파 분석, SSL 이벤트 생성및 통계량 보기 ||- 뇌파 미팅 [* https://indico.math.cnrs.fr/event/921/attachments/2079/2299/gaiffas.pdf] ||
= 이달의 정보 =
- work2020_09_list . . . . 20 matches
* AuxCam 데이터 읽어 보기, 데이터 전처리 루틴 만들기
|| 화 ||- AMR 코드 정리 및 UML 다이어그램 작성 ||- R&D 역량 아카데미 - 연구윤리 교육[[br]]-R&D 역량 아카데미-연구보안 교육 ||
|| 수 ||- Hawkes Process 네트워크 해석을 위한 예제 코드 작성, x -> y 관계 ||- 3층 서버 하드디스크 추가 후 기존 레이드 속도 저하 문제 제기로 시스템 점검 및 hdparm으로 실제 데이터 전송 속도 확인 작업 수행 ||
|| 목 ||- Hawkes Process 네트워크 분석 - MNI 데이터에 적용 ||- 작업량이 많아짐에 따라서 python 병렬 처리 작업 수행 ||
|| 월 ||- 노사협의회 일정 조율(금요일 11시 회의) ||- getphi를 이용한 네트워크 그리기 수행 ||
|| 화 ||- MNI 데이터 처리 루팅 클래스로 구현[[br]]- getphi로 ripple 데이터 네트워크 분석||- AMR Grid 클래스 주도의 refinement 구조 설계[[br]]- ldg-ui 로부터 글리치 데이터 titanv에 복사||
|| 월 ||- 서울대 뇌전증 데이터 Etagen trigger data 전처리과정 병렬화 ||- 전처리 코드 eeg class에 이식하고 hawkes process 계산 시작(14시간 이상 돌아가는 중) ||
|| 화 ||- Etagen 결과를 ripple과 fast ripple로 분류해서 진행 ||- 병렬화 코드 최적화 및 etagen 전반부 데이터 mvhp 수행[[br]]- 중기기획 회의 (15시) ||
|| 수 ||- eeg class 코드 수정 ||- etagen ripple 전, 후반 데이터 계산[[br]]- AMR ghost cell 처리 루팅 추가 ||
|| 월 ||- networkx 패키지 조사 ||- 영상에서 마스크 클릭 이벤트로 부터 좌표값 얻기 ||
|| 화 ||- 노사협의회(10:00) ||- 뇌파 데이터 surrogate 실험 ||
|| 수 ||- 뇌파 데이터 surrogate 실험 Diagonal, off-diagonal histogram 비교 분석 ||- 결과 정리 및 코드 정리 ||
|| 목 ||- AMR 코드 정리 및 리뷰 ||- Level sub 구조 설계[[br]]- 식사 이벤트 안건 협의(16:00) ||
- work2020_10_list . . . . 7 matches
* AuxCam 데이터 읽어 보기, 데이터 전처리 루틴 만들기
|| 월 ||- Networkx 코드 작성 ||- sll, mni, etagen 데이터 네트워크 그래프 그리기 ||
|| 화 ||- 센서 위치 기반 Networkx 그래프 결과 resnote wiki에 정리 ||- AMR, Grid 분할시 마지막 고스트셀이 생성 되지 않는 문제 발견 ||
|| 수 ||- AMR make_subLevel() 마지막 고스트셀이 생성되지 않는 문제 debugging||- 기획회의 참석[[br]]- AMR 개발 회의[[br]]- 상집 회의 [[br]]- AMR 마지막 고스트셀이 상위 label의 고스트셀 영역일 경우 생성되지 않았던 문제 해결||
|| 월 ||- 주간보고 작성[[br]]- AuxCAM 데이터 읽기||- AMR Hydro 구상 ||
- work2020_11_list . . . . 6 matches
* HydroDynamics 예제로 전환 다차원 데이터 연산을 위한 데이터 타입 선언
* AuxCam 데이터 읽어 보기, 데이터 전처리 루틴 만들기
|| 화 ||- 뇌파 서울대 미팅(11:00) ||- [:auxcam_job AuxCAM 데이터 정리] ||
|| 수 ||<colspan=2>- Etagen 버그 수정 GPS 값이 Integer 범위를 넘어서는 경우가 있어서 long long으로 타입변환 함. ||
- work2021_01_list . . . . 1 match
|| 월 ||- [:auxcam_job AuxCAM 학습데이터 만들기] || ||
- work_blas_library . . . . 1 match
* 병렬 blas 라이브러리를 개발하기 위한 프로젝트를 시작함.
- work_lighttpd_install . . . . 3 matches
'''/etc/lighttpd/lighttpd.conf''' 파일에 웹서버 설정이 들어간다.
설치하고 그냥 /var/www/ 폴더 아래에 웹문서를 넣어주면 바로 보이기 때문이에 특별히 수정 할 부분은 없다.
- work_mmpc_u_boot . . . . 1 match
실제 nand를 읽고 쓰는 드라이버
- work_mmpc_update . . . . 3 matches
카메라 Firmware 업데이트를 원격으로 제어하기 위한 시스템 구축
원격 Remote에서 각각의 카메라에 Firmware 업데이트를 지시하면 카메라들은 TFTP Server로 부터 새로운 Firmware를 받아서 업데이트를 실행한다.
- work_multicast . . . . 18 matches
유니캐스트 전송 방식은 하나의 송신자가 다른 하나의 수신자로 데이터를 전송하는 방식으로 일반적인 인터넷 응용프로그램이 모두 유니캐스트 방식을 사용하고 있다. 브로드캐스트 전송방식은 하나의 송신자가 같은 서브네트웍 상의 모든 수신자에게 데이터를 전송하는 방식이다. 반면 '''멀티캐스트''' 전송방식은 하나 이상의 송신자들이 특정한 하나 이상의 수신자들에게 데이터를 전송하는 방식으로 인터넷 화상 회의 등의 응용에서 사용한다.
멀티캐스트 전송이 일반적인 유니캐스트 인터넷 응용 분야와 다른 점은 우선 그 전송 패킷에 있다. 일반적으로 TCP/IP 상의 인터넷 응용 프로그램은 데이터의 송신자가 이를 수신할 수신자의 인터넷 주소를 전송 패킷의 헤더에 표시해 패킷을 전송한다. 그러나 멀티캐스트 전송을 위해서는 헤더에 수신자의 주소 대신 수신자들이 참여하고 있는 그룹 주소를 표시하여 패킷을 전송한다.
멀티캐스트 전송을 위한 그룹 주소는 D-class IP 주소 '''(224.0.0.0∼239.255.255.255)'''로 전세계 개개의 인터넷 호스트를 나타내는 A, B, C-class IP 주소와는 달리 실제의 호스트를 나타내는 주소가 아니며, 그룹 주소를 갖는 멀티캐스트 패킷을 전송받은 수신자는 자신이 패킷의 그룹에 속해있는 가를 판단해 패킷의 수용여부를 결정하게 된다.
그러나 현재 인터넷상의 라우터들이 대부분 유니캐스트만을 지원하기 때문에 멀티캐스트 패킷을 전송하기 위하여서는 멀티캐스트 라우터 사이에 터널링이라는 개념을 사용하여 캡슐화된 패킷을 전송한다. 즉 멀티캐스트 주소를 가진 데이터 패킷 헤더 앞에 멀티캐스트 라우터간에 설정된 터널의 양 끝단의 IP 주소를 덧붙여 라우팅을 함으로써 멀티캐스트를 지원하지 않는 일반 라우터들을 거칠 때 기존의 유니캐스트 패킷과 같은 방법으로 라우팅되어 최종적으로 터널의 종착지로 전송될 수 있게 하는 것이다.
- work_snmp_install . . . . 37 matches
prefix는 설치 될 위치를 정의 하는 것이다. 장치를 기준으로 해야 한다. 설치 위치를 기준으로 동작하기 때문에 경로를 잘 못 입력하게 되면 포팅하고 엉뚱한 곳을 참조 할 수 있다. 호스트에 설치하고 타겟으로 복사하는 방법으로 포팅하길 바란다.
이렇게 하면 카메라에 SNMP 프로토콜 설치는 끝이다.
설치하지 않고도 MIB를 추가할 수는 있겠지만 mib util를 사용해서 조금 편하게 MIB를 생성하고 추가 하기 위해서는 호스트에도 동일한 환경이 있는 것이 편하다.
이렇게 설치하고 나면 /usr/local/share/snmp/mibs/ 드렉토리가 생긴다. 이 곳에 mib가 들어 있다.
.txt 파일들이 ASN1에 맞추어 작성된 MIB 들이다. 이것 들을 참조해서 새로은 mib를 추가해 보자
vs.c, vs.h 파일이 생성 된 것을 확인 할 수 있다.
agent/mibgroup 폴더에 넣고 아래와 같이 configure를 수행하면 자동으로 Makefile을 업데이트 해준다.
# 이부분은 SNMPv3에서 크게 향상 되었는데 여기서는 그냥 인증과 접근 방침
# 인증, 접근 방침등의 특성을 정의하는 하나의 에이전트와 여러 매니져 사이의
# 관계이며 각 에이전트를 기준으로 정의된다.
# 한 에이전트는 여러 community를 가질 수 있으나 각각의 이름은 그 에이젼트
# 내에서 유일하다 그러나 다른 에이전트가 같은 이름의 community를 가질 수는
# 또한 community의 이름은 패스워드의 역할을 하므로 매니저로부터의 모든
# 메시지는 이 이름을 포함해야만 한다.
# community를 사용하고, SET과 같이 쓰기 동작이나 private 한 MIB에 대해서는
# 비밀의 community를 지정하여 사용하는것이 일반적이다.
# 이러한 접근 제어의 방법은 SNMP MIB의 관점(관리 객체들의 집합으로 각
# community 에 정한 이름을 sec.name으로 맵핑한다.
# community pcharley는 로컬 호스트와 특정 아이피에서만 접근을 할 수 있으며
# 설정하는 예이다.
- ws_discovery . . . . 3 matches
* Discoverable – 기본 모드로 일반적인 Target Service 처럼 동작합니다. 네트워크에 참여하거나 메타 데이터 변경 시 메시지를 보내며, Probe 와 Resolve 메시지를 Listen 하고, 그에 대한 응답을 보냅니다.
* HELLO : 단방향 메시지로, Target Service 가 네트워크에 참여하거나 메타 데이터를 변경했을 경우에 보낸다.
* Resolve : Client 가 이름으로 Target Service 를 찾을 때 사용한다.
- wskim . . . . 2 matches
[:webtoon_godofhischool 갓 오브 하이스쿨]
1. 추억의 장소에서 아이와 사진찍기(1년에 한장씩)
- wskim-쇼핑 . . . . 2 matches
= 신체 사이즈 =
32 사이즈를 구매해서 잘 입고 있음.
- wskim-자기소개 . . . . 25 matches
맞벌이를 하시는 부모님 때문에 유년시절을 시골 할아버지 댁에서 보냈습니다. 농사일을 하시는 조부모님은 바쁜 농사일에도 무척이나 절 귀여워 해주셨습니다. 집 앞 큰 나무에 그네도 만들어 주셨고 자연에서 얻을 수 있는 많은 것들을 알려 주셨습니다. 지금 생각해 보면 도시 아이들 보다 더 많은 것을 자연에서 얻으면서 풍족하게 유년시절을 보냈습니다. 시골 할아버지 댁에서 즐거운 유년시절을 보내고 초등학교를 입학하기 위해서 부모님이 계신 천안으로 오게 되었습니다. 저희 부모님은 자유방임의 교육철학으로 저에게 공부를 강요하시지 않으셨으며 제가 하고자 하는 것을 적극 지지해 주셨습니다. 우리 아들을 믿는다는 말씀과 김박사라는 호칭으로 모든 것을 대신 하셨던 것 같습니다. 김박사는 제가 어릴 적 저희 집에서 불리던 호칭입니다. 왜 그렇게 불려주셨는지는 모르지만 저희 집안에서는 저는 김박사였습니다.
시골에서의 유년시절과 자유로운 분위기의 집안 분위기 때문인지 저는 자유로운 사고와 풍부한 상상력을 갖고 있습니다. 저의 자유로운 사고는 인간관계에 있어서도 남을 이해하고 좋은 관계를 유지 하는데 많은 장점으로 작용 합니다. 하지만 저의 엉뚱한 상상력은 때로는 다른 사람으로 하여금 저를 이상한 사람처럼 보이게 할 때도 있습니다. 엉뚱하고 재미 있는 사람, 하지만 선하고 친절한 사람으로 저를 만드는 요소 입니다.
또한, 저는 호기심이 많고 무언가 만드는 것을 좋아합니다. 초등학교 3학년 때 처음 컴퓨터를 접하게 되면서 컴퓨터에 대한 호기심을 갖게 되었습니다. 1년쯤 컴퓨터 학원을 다니면서 학원에서 배울 수 있는 모든 과정을 마스터 했습니다. 제가 만든 보안 프로그램을 갖고 중고등부를 대상으로 한 컴퓨터 경진 대회에 참가하기도 했습니다.
저는 주워진 환경과 일을 즐기면서 하려고 합니다. 나로 하려금 주변이 즐거워 지고 개선 되는 것에 즐거움과 성취감을 느낍니다. 대학교 2학년을 마치고 호주로 워킹홀리데이 비자를 받아서 여행을 떠났습니다. 비행기표와 현금 70만원을 들고 떠난 여행이라서 여행이 풍족할 수 없었습니다. 그 때문에 흔희 말하는 관광이라기 보다는 일과 여행을 병행할수 밖에 없었습니다. 한식당에서 웨이터로도 일을 하고 공장에서 책도 만들어 보고 각종 농장에서 일도 해보면서 호주 반바퀴를 돌았습니다. 힘들고 고된 순간도 있었지만 많은 외국인 친구들을 만나고 대화 하고 일을 하면서 언제나 에너지 넘치는 한국 사람으로 불렸습니다.
대학을 진학하면서 어릴적부터 다니던 성당에서 교리 교사로 3년간 일을 하게 되었습니다. 교리 교사는 주말에 성당에서 아이들 미사 지도와 교리공부를 도와 주는 일을 하고 여름방학이 되면 아이들을 인솔해서 여름신앙 캠프를 떠나게 됩니다. 여름신앙 캠프는 2박3일에서 3박4일 일정으로 이루워 지게 되는데 초등부와 중고등부로 나뉘어 진행합니다. 모든 일정과 프로그램의 작성뿐만 아니라 아이들 인솔까지 모두 교사의 책임이기 때문에 많은 준비와 책임감이 필요한 일 입니다. 3년 동안 교리 교사로서 아이들 교리를 가르치고 캠프를 준비하면서 많은 인원을 인솔하고 프로그램을 진행할 수 있는 기술을 배울 수 있었습니다.
10년후의 나의 모습은 지금과 같은 엔지니어로 일을 하고 있을 것을 기대하고 그렇게 하려고 합니다. 나이에 무관하게 왕성한 연구활동을 할 수 있었으면 합니다. 도퇴되지 않고 시대를 리딩할 수 있는 룰을 만들어 가는 힘이 있는 사람으로 성정해 있기를 원합니다. 그러기 위해서 지금은 낮은 자세로 아래로 위로 많은 것을 배우고 수용하는 자세로 모든 업무에 임하겠습니다.
= 관련 페이지 =
- wskim_atrix_customrom . . . . 4 matches
== USB 드라이버 받기 ==
루팅은 root 권한을 얻는 과정을 말한다. root권한을 얻으면 시스템 설정이라든지 제조사에서 넣은 각정 어플들을 제거할 수 있다.
1. 2.3.5 버전 업데이트 (현제 사용하고 있는 버전)
1. usb 케이블로 연결, 연결 후 상단바에 usb모드중 모토로라 휴대전화도구 모드로 체크
- wskim_banghee . . . . 5 matches
== 청주 바람막이 ==
A에서 B로 이사했다네요
국내에 유통되는 까망베르와 브리 치즈는 살균처리를 거치기 때문에 생김새와 맛이 비슷하다.
오리지널은 살균처리가 되지 않아 국내 유통이 불법이다.
- wskim_banghee_daily . . . . 2 matches
1. 서래마을 야마짱 (4시 이후 오픈)
1. 대장장이 화덕피자
- wskim_banghee_sick . . . . 46 matches
여성들의 가장 큰 고민 생리통 나에게 보내는 그 위험한 경고 심한 생리통이나 생리불순 등의 증상은 다른 부인과 질환이 원인이 돼서 나타나는 경우가 많다.
특히 평소보다 심한 생리통은 20대 여성에게 많이 생기는 '''자궁내막증의 전조증상'''일 수 있다. 생리와 관련된 증상에 따라 각각 어떤 질환을 의심할 수 있는지에 대해 알아보자.
한 통계에 따르면 우리나라 여성 중 75% 정도가 생리통을 겪으며, 그 가운데 20%가량은 일상생활이 힘들 정도의 심한 생리통을 앓고 있다고 한다. 여자이기에 어쩔 수 없는 숙명으로 받아들이고 그냥 넘기기엔 생리의 고통이 너무 크다. 생리통의 다양한 증상에 따른 치료법과 극복법을 알아보자
여생의 생리 상태는 전신 건강을 가늠하는 지표다. 여성미한의원 조선화 원장은 "기혼 여성이 갑자기 생리통이 생기고 생리양이 많아지는 경우가 있는데, 자국근종이나 자국내막증 등 자국내질활을 의심할 수 있다. 특히 자국내막증환자의 30%~40%는 불임으로 진행될 수 있어 조기에 발견해 치료하는 것이 중요하다. 미혼여성의 경우 생리에 문제가 있고 통증이 있다면 자국 정밀 검사를 한 뒤 적절한 치료를 해야 한다"고 말했다.
생리통은 크게 ''원발성 생리통''과 ''속발성 생리통''으로 나울 수 있다 ''원발성 생리통''은 생리시 자궁기능의 이상으로 발생하고, ''속발성 생리통''은 자국 질환에 의해 생긴다.
생리통을 호소하는 환자 대부분이 ''원발성 생리통''이다. 어떤 특별한 진환에 의해 나타나는 통증이 아니므로 심각하게 걱정할 필요는 없다.
하지만 틍증이 심하면 이야기는 달라진다. 무조건 참기만 한다고 해결되는 것은 아니다. 생리시 우리 몸ㅁ에서는 생리혈이 잘 배출될 수 있게 '프로스타글라딘'이라는 유사 호르몬이 분비된다. 배란 직후에 분비되는 이 호르몬은 자국근육을 강하게 수축시킨다. 이때 생리혈을 배출하기 위한 근육수축운동이 너무 강하다보니 심한 통증이 발생하는데, 이게 바로 생리통이다.
생리통은 아랫배가 묵직한 느낌이거나 약간의 통증을 동반한다. 심한 사람은 출산때와 유사한 통증을 겪고, 허리와 골반의 뻐근한 통증, 오심(신물이 올라오는 현상)과 구토, 실신을 하는 이들도 있다. 함기 힘든 정도의 생리통에 시달리고 있다면 진통제보다는 자궁 수축을 유발하는 물질의 생성을 억제하는 약물치료를 받는다. 생리시 2~3일 정도 '''비스테로이드성 소염 진통제'''를 복용하는 치료로 3~6개월 정도면 효과가 나타난다.
평소 생리통이 없다가 갑자기 생긴 생리통, 혹은 참기 어려운 통증이 계속 된다면 자궁 질환에 의한 ''속발성 생리통''일 수 있다. 이 경우에는 원인 치료가 필요하다. 일반적으로 성인이 된 이후 한번도 빠짐 없이 생리통을 겪고 그때마다 심한 통증에 시달린다면 '''자국내막증'''을, 생리통이 있으면서 과다월경이 반복되면 자궁근종을 의심해본다. 생리통이 심하다면 진통제로 매달 그냥 넘기기보다는 한 번쯤 산부인과 검진을 받아 본다. 특히 자국내막증과 같은 질환을 방치하면 불임으로 이어질 수 있으니 특별한 관심이 필요하다.
2차 접종 1월 10일 이후
3차 접종 3월 10일 이후
- wskim_house . . . . 8 matches
건물과 수영장이 붙어 있어서 좀더 아늑하고 신비한 공간을 연출해주고 있다.
거실 공간과 마당 수영장이 연결 되어 있어 좀 더 활동적인 공간.
수영장과 거실을 연결하는 통로도 인상적이다.
마당과 거실의 높이가 같은 것이 인상적이다.
마당과 거실 사이에 배수처리가 잘 되어 있어야 할 것으로 보인다.
하층보다 상층의 면적이 넓어 자연스럽게 처마를 형성하는 형태가 마음에 든다.
- wskim_lig_insurance . . . . 1 match
1. 구비서류를 이메일로 받아서 작성
- wskim_recipe_soy_sauce . . . . 31 matches
2. 정종(화이트 와인) 1/2C,맛술(미림,미정,,)3/4C
맛간장을 만들때 가장 먼저 만들어야 하는것이 야채 졸인물이랍니다.
맛간장을 만들때, 가장 귀찮은 작업이지만 한꺼번에 많이 만들어 냉동했다가 그때그때 꺼내쓰면,
양파 100g,생강 10g,마늘 15g,통후추 1/2T을 사진과 같이 썰어 준비합니다
냄비에 위의 재료와 물 1C을 넣고 끓기시작하면 약불로 줄여 물이 1/2C이 될때까지 졸여줍니다
물의 색깔이 갈색으로 변하는게 보이시죠?
잠시 한눈팔면 간장이 끓어넘칠 수 가 있거든요 ^^
'''Tip''': 저는 정종대신 화이트와인을 썼는데요
뉴질랜드에선 정종이 너무 비싸거든요
다른요리에도 정종대신 화이트와인을 쓰는데 큰무리는 없는듯 하더라구요.
사진에 거품이 보이시죠? 간장이 끓기때문에 생기는 거품이므로 걷어낼 필요가 없답니다
사과,레몬 각 1/2개씩 껍질채 깨끗이 씻어 준비했다가
정종,미림이 끓으면 불을끄고 냄비에 넣고 뚜껑덮어 12시간 놔둡니다
12시간후에 건더기만 건져내면, 맛간장이 완성됬습니다
사진과 같이 거품이 모두 없어졌지요?
이렇게 만들어진 맛간장은 용기에 담아 실온에 두고 사용합니다
한번만 만들어보면 사진과 같이 복잡하지 않구요
앞으로 맛간장을 이용한 음식을 많이 올리려고하니
아이들의 밥반찬 - 어묵볶음
맛간장으로 만든 아이들 반찬 - 양송이 & 계란 조림
- wskim_recipe_꼬리찜 . . . . 28 matches
* 맛간장 10T ( 150cc ),감자2개, 양송이 6개, 브로컬리 약간, 물엿 1T,참기름
이 과정을 해줘야 불순물들이 많이 제거가 된답니다
약 40분 정도 삶으니 기름이 많이 있네요
그대로 식히면 고기에 기름이 끼기 때문에
이과정 까지는 먹기 전날 해두면 참 편해요
이런 과정을 거치지 않고 그냥 꼬리찜이나 갈비찜을 하게되면
기름이 둥둥 뜬 느끼~한 꼬리찜을 먹게되니
기름기를 제거하고 고기도 깨끗이 씻어서 준비합니다
이때 물은 정확한양이 필요하지 않아요.
나중에 국물이 없을때까지 졸일꺼기 때문에
그래야 국물이 다 졸았을때 맛이 있거든요
국물이 거의 다 졸았을때 싱거우면
감자 2개 돌려깍기 해서 준비하고, 양송이도 크면 2등분하고,브로컬리 적당량 준비합니다
고명이야 밤,은행,무우,당근,버섯,,,,, 아무거나 원하는거 준비하면 되구요
저는 아이들이 익은 당근을 잘 안먹어서 안넣고
국물이 텁텁해지지 않고 깔끔하답니다
감자가 어느정도 익으면 양송이 넣고
( 나중에 넣어야 색이 예뻐요~~ )
정성이 가~~~득 들어간 꼬리찜 완성이요~~~
국물이 어느정도 자작하게 남아있어야 좋아요
- wskim_trainning_eat . . . . 12 matches
1. 탄수화물로 부터 얻는 글리코켄이 에너지원이다.
1. 운동 중 수분 섭취는 노패물 배출에 도움이 된다.
1. 운동 후 몸안의 수분 및 무기질 등이 손실되 상태이므로 이를 빠르게 보충해줘야 한다.
1. 운동 후 2시간 이내에 보충이 필요!!
1. 수분 보충을 위해서 농도가 진하지 않은 꿀물, 주스등을 마시는 것이 좋다.
[http://bbs.moneta.co.kr/nbbs/bbs.normal.qry.screen?p_bbs_id=N10603&p_message_id=12382091 참조 사이트 1]
글리세믹 지수(혈당 지수)는 포도당(100)을 기준으로 했을 때 상대적으로 에너지화 되는 정도를 나타낸 것이다.
* {{{{color: rgb(255, 1, 1); font-size: 13px;} 폭발적이고 지속적인 운동을 위해서 GI가 높은 음식과 낮은 음식을 썩어 먹는다! }}}
- wskim_경력 . . . . 33 matches
본 과제의 목표는 기존 WiMAX나 통신 프로토콜이 SoC로 개발 되고 있는 것에 반해 RF를 제외한 모든 기능 블럭을 Software로 개발함으로 유지보수와 확장이 용이한 솔루션을 제공하는 것을 과제의 목표로 합니다.
WiMAX 단말기 개발은 크게 MAC(Media access control) layer와 Physical layer 두개의 파트로 나뉘어 진행 되었으며, 본인이 속한 파트는 MAC Layer 입니다.
개발 과정은 UML을 도입하여 RA(Require Analysis), SA(System Architecture), SD(System Development) 3단계로 이루워지는 개발 절차를 거쳐 개발 되었습니다.
* '''SA 단계'''는 RA 과정에서 결정된 System Feature와 요구 사항을 만족하기 위한 시스템을 설계하는 단계 입니다. 설계 단계에서는 Target Platform과 OS를 결정하고 전체 시스템의 뼈대와 외형을 결정하게 됩니다. 이 과정에서 많은 것들이 결정 되게 되는데 앞으로 진행할 SD 과정에서 혐업을 위한 coding scheme과 버전 관리 방법등을 결정하게 됩니다.
* '''SD 단계'''는 SA 단계에서 도출 된 System을 실제 구현 하는 단계 입니다. 앞서 거친 RA와 SA과정에 충실했다면 단순 코드 작업에 해당 하는 단계입니다. 하지만 요구사항이 추가 되거나 구조설계의 문제가 발생한다면 이전 단계로 Rollback하게 됩니다.
이 과제는 다른 과제와 다르게 UML과 체계화된 개발과정을 엄격하게 지키면서 개발을 진행했던 과제로 실제 코딩보다는 많은 회의와 설전이 오고 갔던 것이 기억에 많이 남습니다.
HD 출력이 가능한 CCTV 카메라 개발
* Non-os 환경에서 드리이버 작성
Hardware 검증 및 각 모듈 기동의 위한 드라이버
OSD 출력 및 조이스틱 작업
외부 업체에서 하드웨어 설계 및 보드 제작 후 하드웨어 검증 및 드라이버 작업과 어플리케이션을 구현하는 과제 입니다.
* I2C 드라이버 작업
* SPI 드라이버 작업
* 이미지 센서 드라이버 작업
ISP작업은 따로 전문 인력이 있어서 ISP작업은 제외 되었습니다.
Network을 통해 비디오 오디오 스트리밍이 가능한 카메라 솔루션 개발 및 카메라를 제어하기 위한 Windows Application 개발(CMS)
* Embedded Linux 환경에서 드라이버 작업
리눅스 드라이버 개발
외부 업체에서 하드웨어 설계 및 보드 제작 후 하드웨어 검증 및 드라이버 작업과 어플리케이션을 구현하는 과제 입니다.
* 이미지 센서 드라이버 작업
- wskim_국화차 . . . . 45 matches
약은 그것을 필요로 하는 사람에겐 약이지만 그렇지 않은 사람에겐 독이 될 수도 있습니다(물론 독성의 차이는 있습니다).
그래서 한의학에서는 다른 장부를 보호하는 다른 약재를 같이 처방하여 약재의 작용을 조절합니다.
약재를 충분히 이해하고 있는 한의사의 처방에 의하여 약을 복용하시는것이 안전한 이유입니다.
많은 분들이 국화의 독특한 향이 좋아서 마신다고 하는데 어떤 국화를 이용해서 차로 마셔야 하는지, 많이 마셔도 부작용은
국화는 백국화,황국화,들국화가 각각 그 특성이 있고 쓰임도 차이가 있습니다.
눈을 밝게하고, 열을 내리고 해독하는 작용이 있습니다.
일반적으로 백국화는 간에 주로 작용하는데 간기상승을 억제하며 눈을 밝게 하는 작용이 있어 간기상승으로 인한 어지럼증
이나 눈이 빨갛게 충열되고 안구통증이 있을때(즉,고혈압과 같은 증상.실제로 백국화는 고혈압과 동맥경화에 효과가 좋음)
사용되어지고, 황국화는 풍열을 없애주는 작용이 있어 풍열감기나 온병초기에 사용됩니다. 들국화는 다른국화보다 차가운
성질이 제일 강하여 열을 내리고 독을 풀어주는 작용이 있어 부스럼,종기등에 사용됩니다.
위에서와 같이 국화는 솟구쳐 오르는 기를 내려주고, 차가운 성질이 있어 열을 내리는 작용을 주로 하게됩니다.
특히나 배속이 차가운 사람이 계속 복용하게 되면 그 정도는 더 심하겠지요. 부작용이 유발될 수 있는것입니다.
중국사람들도 국화차를 많이 마시는데 차가운 성질이 비교적 적은 백국화를 많이 이용하고 양기가 허한사람들 예를들면
배속이 차가워서 따뜻한것을 주로 찾는 사람들이나 손발이 차가운 사람 등은 잘 마시지 않습니다.
중국사람들이 이런부분에서는 한국사람들보다 많이 알고 있는것 같습니다.
평소 국화차를 드실때에는 백국화를 이용하시는것이 좋고, 풍열감기나 편도선염,몸에 종기등이 났을때와 같이 청열해독이
필요할땐 황국화나 들국화를 이용하시는 것이 좋습니다. 또한 몸이 찬 분들은 가급적 드시지 않는것이 좋습니다
- wskim_그남자작곡그여자작사 . . . . 32 matches
아 븬 슬맆핑 위더 클라우더버브 마이 베드
트랩트인 더 패스다이 저스트 캔 심 투 므브 온
아 븬 하이딩 얼 마이 홒샌 드림즈어웨이
저스틴 케이사이 에버 니덤 어겐 썸데이
아 븬 세딩 어사이타임
투 클리어 리들 스페이신 더 커너즈(브) 마이 마인
얼아 워나 두이 퐈인더 웨이 백 인투 러브
아 캔 메(이)킷 쓰루 위다웃 어 웨이 백 인투 러브
데어(스) 가다 비 섬딩퍼 마이 소울 썸웨어~ㄹ
아 쿠 유즈 섬 다이렉션
얼아 워나 두이 퐈인더 웨이 백 인투 러브
아 캔 메(이)킷 쓰루 위다웃 어 웨이 백 인투 러브
앤디퐈이 오픈 마이 허얼더게인
델아 모먼췐아 돈 노우 이핏(츠) 릴
오리패니바디 퓔스 더 웨이 아 퓔
나져스언나더 네고시에이션
얼아 워나 두이퐈인더 웨이 백 인투 러브
아 캔 메(이)킷 쓰루 위다웃 어 웨이 백 인투 러브
앤디퐈이 오픈 마이 허얼투 유
- wskim_살다보면만나지는인연 . . . . 17 matches
참 닮았다고 여겨지는 사람이 있습니다
영혼이라는 게 있다면 비슷하다 싶은
그런 사람이 있습니다.
다 보여지는 사람이 있습니다.
틀림이 없어 보이는 그런 사람이 있습니다.
어렴풋이 가슴에 메이기도 한
그런 인연이 살다가 보면 만나지나 봅니다.
그래서 더 마음이 가고 더 마음이 아린
그런 사람이 있습니다.
그리워하기엔 목이 메이고 모른 척 지나치기엔
서로에게 할 일이 아닌 것 같고
그런 게 인연이지 싶습니다.
- wskim_업적 . . . . 3 matches
1. 중력파 GW150914의 관측과 데이터 분석 = Observation and Data Analysis of the Gravitational Wave GW15091, Published online March 31, 2016; http://dx.doi.org/10.3938/NPSM.66.283, © 2016 New Physics: Sae Mulli.
1. 김환선; 이병주; 이승형; 최웅철; 전광수, 2006, “Ad hoc 네트워크에서 TDMA의 전송성능 향상을 위한 타임슬롯의 동적 할당”, 한국정보과학회 재33권 2호, pp228~231
- wskim_여행정보_부안 . . . . 1 match
방희의 시골집으로 할머니와의 추억이 있는 장소
- wskim_여행정보_출장_미국_시에틀_sc11 . . . . 1 match
버스를 이용해서 20분쯤 소요
- wskim_여행정보_태국 . . . . 8 matches
위치 : 인도차이나 반도 중앙부에 있는 나라
언어 : 타이어
종교 : 불교 94.6%, 이슬람교 4.6%
하늘 열차 - 롯파이 파
네모칸 색깔은 요금, 안에 있는 숫자가 시간이에요
보통 장기체류가 아닌 여행자라면 1회권(Single Journey Ticket)을 이용하게 된다.
1회권은 자동반매기를 이용해야 하고, 동전(5바트, 10바트)만 사용 가능하다.
만약, 동전이 없다면 '''Ticket Office'''라고 써있는 안내창궁서 바꿀 수 있다.
- zeroconfig . . . . 4 matches
Zeroconf 는 네트워크 스스로가 설정을 할 수 있도록 해주는 프로토콜과 툴들의 모음이다.
윈도우 시스템에서 Bonjour이라고 하면 맥[[footnote(Mac OS X by apple Inc.)]]에서는 ''Rendezvous''하고 한다.
전통적으로 대부분의 네트워크 설정은 DHPC와 DNS에 의해서 이루워 진다.
하지만 ad-hoc 네트워크에서는 zeroconf 방법이 적당하다.
- 김환선 . . . . 58 matches
맞벌이하시는 부모님 때문에 유년시절을 시골 할아버지 댁에서 보냈습니다. 농사일하시는 조부모님께서는 바쁜 농사일 중에도 무척이나 절 귀여워 해주셨습니다. 집 앞 큰 나무에 그네도 만들어 주셨고 자연에서 얻을 수 있는 많은 것들을 알려 주셨습니다. 지금 생각해 보면 도시 아이들보다 더 많은 것을 자연에서 얻으며 풍족한 유년시절을 보냈던 것 같습니다. 시골에서 유년시절을 보내고 초등학교를 입학할 때쯤 부모님이 계신 천안으로 오게 되었습니다. 저희 부모님은 자유방임의 교육철학으로 저에게 공부를 강요하시지 않으셨지만 제가 하고자 하는 것은 적극 지지해 주셨습니다. 우리 아들을 믿는다는 말씀과 김 박사라는 호칭으로 절 불러주셨습니다. 김 박사는 제가 어릴 적 집에서 불리던 호칭입니다. 아마도 똑똑하고 바른 사람으로 자라줬으면 하는 바람으로 그런 호칭으로 절 불러주셨던 것 같습니다.
시골에서의 유년시절과 자유로운 집안 분위기 때문인지 저는 자유로운 사고와 풍부한 상상력을 갖고 자랐습니다. 저의 자유로운 사고는 인간관계에서도 남을 이해하고 좋은 관계를 유지 하는데 많은 장점으로 작용합니다. 하지만 저의 엉뚱한 상상력은 때로는 다른 사람으로 하여금 저를 엉뚱한 사람으로 오해하게 만들 때도 있습니다. 전 엉뚱하고 재미있는 사람으로 보이는 것을 좋아합니다.
저는 지금 이종 컴퓨터 관련 연구에 참여하고 있습니다. 하지만 이 연구를 계속 진행할 수 없을 상황에 부닥치게 되었습니다. 그런 와중에 국가정보원에서 이종 컴퓨터 관련 인력을 구한다는 소식을 듣게 되었습니다. 국가정보원이라는 곳에 대해서는 잘 알지 못합니다만 지금 제가 하는 분야에 대해서는 누구보다 잘 알고 있으며 또한 잘할 수 있습니다. 지금 제가 하고 있는 일에서 최고가 되고 그로 인해 나라에 도움이 될 수 있다면 더 없는 복이라 생각 합니다
일에 관련해서는 해결하기 힘들었다거나 고생했다고 느낀 일은 많지 않습니다. 컴퓨터라고 하는 분야가 광범위하다 보니 어떤 일이든 늘 새로운 일일 수밖에 없었습니다. 사회에 나와서 처음 했던 일은 UML이라는 개념을 도입해서 프로젝트를 진행하는 일을 했습니다. 국내에서는 UML을 도입해서 실제 제품을 개발하는 곳이 전혀 없다 보니 UML툴을 판매하는 본사로부터 컨설팅을 받아가면서 프로젝트를 진행했습니다. 1년여의 시간 동안 UML을 갖고 설계와 개발을 진행하다 보니 국내에서 UML툴을 제일 잘 다루는 사람이 되어 있었습니다. 이후 맞게 된 일은 임베디드 제품을 개발업무였습니다. 컴퓨터 언어 중 가장 추상도가 높은 고급언어를 사용하다가 하드웨어에 근접한 임베디드 제품 개발을 하게 되니 새로운 세계를 만난 듯했습니다. 하지만 이 역시 못 할 일은 아니었습니다. 1년 정도의 시간을 들여 두 가지 제품을 개발했고 지금은 자리를 옮겨 병렬 컴퓨팅 관련 연구에 참여하고 있습니다. 다양한 경험을 갖고 맞은바 임무에 최선을 다하겠습니다.
단체 생활이라고 할 수 있는 경험은 대학 시절 봉사활동으로 했던 천주교 주일학교 교사와 군대 생활 그리고 지금의 직장 생활입니다. 군대 생활이야 말할 것도 없이 힘들었지만 군대 시절 힘들었다는 얘기처럼 재미없는 이야기도 없으니 빼고 저의 대학 시절 얘기를 조금 해 보록 하겠습니다. 숫기 없고 남 앞에 나서기가 죽기보다 싫었을 만큼 내성적인 성격이었던 저는 이 내성적인 성격을 극복해 보고자 어려서부터 다니던 성당에서 주일학교 교사를 하기로 마음먹었습니다. 처음엔 아이들 돌봐주고 교리 공부를 조금 도와주면 되겠다는 생각으로 시작했는데 생각보다 교리교사가 해야할 일이 많았습니다. 여름 방학이 되면 성당에서 캠프를 떠납니다. 이 캠프의 준비는 전적으로 교리교사들의 몫입니다. 성당에 나오는 7살 유치원생부터 초등학교 6학년까지 백여 명의 아이들을 인솔해서 외진 곳에서 며칠을 보낸다는 것은 생각만큼 쉽지 않은 일입니다. 인원도 많고 연령 폭도 넓어서 다양한 나이의 아이들이 함께할 수 있는 프로그램을 만들고 넓은 공간을 효율적으로 이용할 수 있도록 해야 하므로 시간과 공간을 모두 고려한 계획을 세워야 했습니다. 이런 프로그램을 기획하는 일에 빠져 중고등부 교사까지 총 3년이라는 시간 동안 주일학교 교리교사로서 봉사했었습니다.
== 지원분야에 필요한 지식이나 경험을 기술하고 그 같은 지식이나 경험습득을 위해 어떻게 준비 했는지 기술 ==
트랜지스터는 무어의 법칙에 따라 꾸준히 2년에 2배씩 증가하고 있지만, CPU의 동작 클럭의 증가 추이는 어느새 주춤한 모습을 보이고 있습니다. 그 이유는 클럭이 높아지면 질수록 전력소비도 비례해서 올라가기 때문입니다. 파워 장벽에 붙디 친 CPU 동작 클럭의 대안으로 나온 것이 멀티코어 CPU입니다. 하지만 과학계산에서는 부족한 면이 있습니다. 이런 부족한 부분을 해결하기 위해서 저는 계산용 액셀러레이터에 주목하게 되었습니다. 대표적인 액셀러레이터로는 GPU, Xeon Phi 등이 있겠지만 FPGA도 고려했습니다. 200MHz 정도의 낮은 동작 클럭해서도 충분한 성능을 내주키 때문에 전력소비당 계산량을 보면 최고의 성능을 보여줬습니다. 하지만 알고리즘의 구현이 어렵고 높은 개발비용 등의 단점을 갖고 있었습니다. GPU, Xeon Phi 역시 각기 장단점을 갖고 있습니다. 이런 액셀러레이터의 장단점을 정확히 파악해서 필요에 따라 사용할 수 있다면 정말 좋겠다는 생각으로 이종 컴퓨팅 환경 개발을 진행했고 이 모든 액셀러레이터를 아우를 수 있는 플랫폼으로 OpenCL을 선택해서 사용했습니다. OpenCL을 공부하기 위해 서울에 있는 대학교와 공동으로 OpenCL 학교를 열기도 했습니다.
고방희 (1982-06-24) ANDROMEDA1, 스카이패스 회원번호 1142 2826 2651
김윤재 (2013-10-15) 131015-3409518 스카이패스 회원번호 1208 1132 9574
* 호주 워킹홀리데이
* 김환선, 이병주, 이승형, 최웅철, 전광수, “Ad hoc 네트워크에서 TDMA의 전송성능 향상을 위한 타임슬롯의 동적 할당”, 한국정보과학회 재33권 2호, pp228~231 2006년 10월
- 동호회_만들 . . . . 10 matches
(2020년) 10명 - __현윤경__, __김환선__, 강석우, 강성호, 고태욱, 이완호, 이종걸, 장혜영, 전기완, 정한영
(2021년) 9명 - __현윤경__, __김환선__, 강성호, 고태욱, 이완호, 장혜영, 전기완, 정한영, 이순주
1.13 이월금 5,626원
1.28 이종걸 지원 -62000원
3.02 이완호 지원 -62,000원
1.14 이월금 17,919원
1.19 이완호 지원 -72,000원
6.30 이순주 지원 -72,000원
- 리눅스드라이버 . . . . 20 matches
#title 리눅스 드라이버 빌드 하기
리눅스 드라이버를 만들어 추가하고 컴파일 하는 방법에 대한 설명을 한다.
드라이버는 작성하고 그것을 커널과 함께 컴파일 하기 위해서는 몇 가지 과정이 필요하다.
위 예제처럼 서브 드렉토리가 somthing, anything, wskim 이렇게 3개가 있다고 했을때 처리 방법이다.
* obj-y : 커널 안에 들어가는 장치이다.
Kconfig는 커널의 환경변수를 설정하기 위해서 사용하는 설정 파일이다. 이 파일은 make menuconfig때 읽혀진다. Kconfig도 Makefile과 같이 드렉토리 계층에 따라서 하나씩 존재하게 되는데 현 드렉토리에서 서브 드렉토리에 대한 처리를 해줘야 한다.
menu 에 표시 되는 문구는 make menuconfig시에 표시 되는 문구이다. 변경해 보면서 확인해 보길 바란다.
Kconfig를 제대로 수정 했다면 아래와 같이 추가된 메뉴를 확인 할 수 있다.
초기화 함수는 static으로 선언해서 파일 외부에 노출 시키지 않는 것이 좋다.
__init는 커널에게 주는 힌트이다. 다음 함수가 초기화 함수이고 모듈 적재 후 제거할 수 있다는 것이다. 유사한 태그로 __initdata가 있다. 이 역시 초기화 과정에만 사용하는 데이터를 가르킨다.
* module_init() 매크로는 모듈 목적 코드에 모듈 초기화 함수가 있는 곳을 알려주는 특별한 섹션 정보를 첨부한다. 이 정의가 없으면 커널은 초기화 함수를 결코 호출하지 않는다.
__exit 수정자는 모듈 제거용으로만 코드를 사용하라는 표시이다. 컴파일러는 코드를 특수 ELF 섹션에 둔다. 모듈을 커널 내부에 들어가도록 직접 빌드했거나 커널 설정에서 모듈 제거를 허용하지 않은 경우 제거 함수는 버려진다.
- 리눅스의구조 . . . . 85 matches
리눅스는 버전업이 이루워 지면서 많은 부분에서 발전해 왔다. 하지만 기본 구조는 변경되지 않은 채로 남아 있다.
기본 구조는 다음과 같은 요소로 이루워져 있다.
HAL(Hardware Abstraction Layer)는 플랫폼 하드웨어를 가상화하므로 드라이버를 다른 하드웨어에 쉽게 포팅할 수 있도록 해 준다.
다음은 리눅스 커널 2.6에서 지원하는 (x86을 제외한) 임베디드 프로세서 아키텍처들이다.
* 타이머
리눅스 커널은 전체 메모리를 일반적으로 4KB 크기인 페이지 단위로 나우어 관리한다. 커널은 모든 페이지를 접근할 수 있지만, 실제로는 그 일부만 사용하고 나머지는 응용 프로그램에서 사용하게 된다.
* '''커널 쓰레드''': 이는 사용자 공간의 정보를 포함하지 않는 프로세서이다. 이들은 항상 커널 공간 내에서 실행된다.
* '''사용자 프로세서''': 각각의 사용자 프로세서는 가상 메모리 기능으로 인해 자신만의 주소 공간을 갖는다. 이들은 인터럽트, 예외, 시스템 콜을 통해 커널 모드로 진입할 수 있다. ''프로세스가 커널 모드로 진입하면, 원래와는 다른 스택을 이용한다는 것에 주의하자.'' 이것을 커널 스택이라 하며, 각 프로세서는 자신만의 독자적인 커널 스택을 갖고 있다.
* '''사용자 쓰레드''': 쓰레드는 하나의 사용자 프로세스로 매핑된 또 다른 실행 개체이다. 사용자 공간의 쓰레드는 동일한 텍스트, 데이터, 힙 영역을 공유한다. 또한 열려 있는 파일 목록, 시그널 처리 함수 등의 자원은 공유되지만 스택 영역은 별도로 존재한다.
리눅스에서는 다양한 종류의 파일 시스템들이 VFS(Virtual File System)라는 계층을 통해 관리 된다. VFS는 시스템상의 다양한 장치들에 저장된 데이터를 일관적인 형식으로 바라볼 수 있도록 해 준다.
리눅스가 동작하는 모든 장치는, 그것이 임베디드 시스템이든 서버 머신이든 간에 최소한 하나 이상의 파일 시스템이 필요하다.
이것은 특별히 파일 시스템을 필요로 하지 않는 실시간 운영체제와 구분되는 특징이다.
리눅스의 IO서브시스템은 시스템상에 존재하는 장치들에 대해 단순하고 통합적인 인터페이스를 제공한다. IO 서브시스템은 다음과 같은 장치들을 지원한다.
* 순차적인 접근이 필요한 장치들을 지원하는 문자 장치(Character device)
* 임의적인 접근이 가능한 장치들을 지원하는 블록 장치(Block device). 블록 장치는 파일 시스템을 구현하는 기본이 된다.
리눅스의 가장 큰 장점 중의 하나는 다양한 프로토콜을 지원하는 강력한 네트워킹 기능이다.
리눅스의 IPC(Inter-Process Communication, 프로세스 간 통신)는 (비동기 통신 방식인) 시그널과 파이프, 소켓은 물론 공유 메모리, 메시지 큐, 세마포어와 같은 System V의 IPC 메커니즘을 포함한다.
* '''프로그램''': 파일 시스템상에 존재하는 응용 프로그램으로, 메모리상에 로드되어 실행된다. 가상 메모리 기능으로 전체 프로그램 이미지가 메모리상에 로드 되는 것이 아니라 현제 실행 중인 부분의 페이지만 로드 된다.
* '''가상 메모리''': 프로세서별로 각각의 주소공간을 갖도록 해준다. 가상 메모리는 공유 메모리와 같은 고급 기능들을 이용할 수 있도록 한다. 각 프로세스는 가상 메모리상에 자신만의 고유한 메모리 맵을 가지며, 이는 커널의 메모리 맵과는 완전히 별개의 것이다.
* '''시스템 콜''':커널로 진입할 수 있는 지점으로 이를 통해 커널은 응용 프로그램을 대신해 운영체제의 서비스를 제공한다.
- 바이넥스 . . . . 28 matches
{{{[헬스코리아뉴스 / 곽은영 기자]}}} 바이넥스는 바이오 의약품 위탁개발·생산(CDMO) 전문기업으로 알려져 있다. 국내 바이오 벤처 중 바이넥스를 거쳐가지 않는 곳이 거의 없을 정도다.
국내에서 처음으로 민간 바이오 CDMO 사업을 시작한 바이넥스는 1957년 부산에 세워진 순천당제약사에 그 뿌리를 두고 있다. 60여년의 세월 동안 두 차례 주인이 바뀌는 등 변화의 폭이 컸던 제약회사다.
설립 초기만 하더라도 제네릭(복제약) 판매에 주력하던 이 회사가 처음 변화를 맞이한 것은 1985년 이백천 전 회장이 회사를 인수하면서다. 이 회장은 회사를 법인으로 전환하면서 세포치료제 전문기업으로 키우기 위해 노력한 것으로 전해진다. 이 회장은 2000년 기업이미지 제고를 위해 사명을 지금의 바이넥스로 바꾸고 이듬해 코스닥 상장까지 밀고 나가면서 제2의 도약을 선언했다.
바이넥스는 이후 세균정장제 ‘비스칸’을 출시하고 국내 최초로 세포치료제에 대한 임상시험 승인을 획득하는 등 활발한 연구개발 활동을 이어나갔다. 2007년에는 정부로부터 5년간 100억원을 지원받을 수 있는 바이오 의약품 개발지원 프로그램인 ‘바이오스타 프로젝트’ 기업에 선정되기도 했다. 이밖에 국내 최초로 면역세포 보관은행인 ‘애니셀뱅크(Anycell Bank)’ 설립, ‘천연물 연구소’ 설립 등 바이오 신약 분야에 발빠르게 진출했다.
세포치료제 및 바이오 의약품 개발을 통해 20년 넘게 달려오던 바이넥스는 2000년대 들어 새로운 주인을 만나면서 또 한 번의 변화를 맞이한다.
- 세마포어 . . . . 5 matches
리눅스 세마포어(semaphore)는 '''휴면하는 록'''이라 생각할 수 있다.
자료형은 struct smaphore이다.
세마포어 생성은 정적과 동적인 방법이 있다.
또는 count가 1인 뮤텍스를 다음과 같이 간단히 선언할 수도 있다.
1. down_trylock() : 세마포어를 얻지 못하는 경우 0이 아닌 값을 바로 리턴한다. 세마포어를 반환하는 경우 up()을 호출하면 된다.
- 임차권등기 . . . . 4 matches
https://ecfs.scourt.go.kr/ 전자소송 사이트
= 등기이전(증여) =
신청서 양식[* http://easylaw.go.kr/CSP/CnpClsMain.laf?popMenu=ov&csmSeq=566&ccfNo=3&cciNo=2&cnpClsNo=3]은 참조 사이트에서 구할 수 있다 양식은 토지와 건물이 따로 있는 것으로 보인다.
- 자료정리 . . . . 2 matches
1. [리눅스 드라이버]
1. [Hello 드라이버 예제]
- 크로마서브샘플링 . . . . 26 matches
크로마 서브샘플링(Chroma subsampling)은 크로마 정보에 대한 것보다 루마 정보에 대한 더 많은 정보를 추가함으로써 영상을 인코딩하는 방식을 말한다. 이 방식은 아날로그와 디지털 방식의 수많은 비디오 인코딩 방식과 JPEG 인코딩에서 사용된다.
기억 공간과 전송의 제한으로 (원본 그대로를 사용하지 않고) 신호를 줄이거나 압축하는 것이 선호된다. 인간의 시각 구조는 색보다 밝기 변화에 훨씬 더 민감하므로 영상 시스템은 Cb, Cr과 같은 색차 요소보다 루마 컴포넌트(Y라고 줄여 말함)에 더 많은 대역을 할당함으로써 최적화할 수 있다. 이를테면 4:2:2 Y'CbCr 방식은 (4:4:4) R'G'B' 대역의 3분의 2를 요구한다. 이러한 감소를 통해 보는 사람이 시각적인 차이를 거의 느끼지 못하게 된다.
인간의 시각 계통이 루미넌스(밝기차)보다 색의 움직임과 자리 이동에 덜 민감하기 때문에[1] 대역폭은 색의 자세한 부분보다 밝기의 부분을 더 많이 저장함으로써 최적화할 수 있다. 일반적인 시차에서 낮은 레이트에서 색의 자세한 부분을 샘플링함으로써 입는 손실은 눈에 띄지 않는 정도이다. 비디오 시스템에서 색차 컴포넌트를 사용하면서 이를 달성할 수 있다. 신호는 루마 (Y') 컴포넌트와 두 개의 색차 컴포넌트(크로마)로 나뉜다.
크로마 업샘플링은 루마, 크로마 컴포넌트가, 선형 RGB 컴포넌트(tristimulus)가 아닌 감마 보정(tristimulus) R'G'B' 컴포넌트의 총합으로 형성된다는 색의 과학에서 비롯한다. 그러므로 루미넌스와 색의 세세한 부분은 서로 완전히 독립적이지 않게 된다. 루마와 크로마 컴포넌트 사이의 루미넌스와 색 정보에는 약간의 "오류"가 있다. 이 오류는 매우 채도가 높은 색에서 가장 크며 (크로마 서브샘플링이 적용된) 테스트 패턴에서 빨간색과 녹색 부분에 어느 정도 눈에 띈다. 이러한 공학의 어림 계산을 통해 (감마 보정과 총합 사이의 명령어 순서를 거꾸로 함으로써) 색 서브샘플링을 훨씬 더 쉽게 추가할 수 있게 도와 준다.
색 서브샘플링을 거친 뒤의 영상 (소니 베가스 DV 코덱으로 압축되었으며 박스 필터링이 적용되어 있다.)
'''YUV'''라는 용어는 아날로그 인코딩 방식을 가리키지만''' YCbCr '''은 디지털 인코딩 방식을 가리킨다. 두 방식의 차이점은 크로마 컴포넌트 (U, V, Cb, Cr)에 대한 크기값이 다르다는 점이다. 그러나 YUV라는 용어는 Y'CbCr 인코딩으로 (잘못) 사용되기도 한다. 그러므로 "4:2:2 YUV"와 같은 용어는 아날로그 인코딩에서 4:x:X와 같은 것이 없다는 단순한 이유 때문에 언제나 4:2:2 Y'CbCr을 가리킨다.
현실적으로 CIE 기호 Y는 루마로 잘못 불린다. 1993년에 SMPTE는 이 두 용어를 명확하게 구분해 둔 Engineering Guideline EG 28을 채용하였다. 주된 기호 '는 감마 보정을 가리키는 데 사용된다.
- 회의록 . . . . 15 matches
* 간염병 확산 모델, 빅데이터 기반 도시 문제 해결
* 실내 공기질 개선 연구, 도시형 공기질 개선 연구, 대기환경 모니터링 데이터 수집, 기상 예측 모델 연구
- 기본적으로 서울시 출연금으로 운영되며, 외부 수탁사업을 지행하는데 이 역시도 서울시 수탁사업이 많음.
다년도 사업은 2년 이상으로 기간은 다양함.
1. 김수진 - 처음엔 영상처리를 이용한 지표식물 분석 등이 공동연구로 적합해 보였는데 발표를 듣고 보니 데이터 분석쪽이 더 적합해 보인다.
- 생활환경, 데이터기반 지표, 북잡계 연구 가능해 보임, 진행 연구는 동력학 및 3차원 수치해석을 이용한 수자원 연구??
- 사회현상에 대해서도 한다. 데이터 기반의 복잡계 연구, ETRI에 함께 인구감소 연구 진행 사례가 있음.
; 복잡계, 시계열 데이터(황동욱)
1. 서울, 인천, 경기를 중심으로 자연, 사회현상 빅데이터 수집 예정 수집된 데이터를 기반으로 미래 예측을 하려고 함. (서울기술연구원)
- 20100217 . . . . 9 matches
캠트론 오디오 드라이버 점검
1. 김명종씨가 어플리케이션 점검 완
1. 김성실 이사님이 하드웨어 점검 완
1. 오디오 드라이버에서 각 레지스터 값 확인
DM365 오디오 데이터 시트
Z:\rnd\RND(Share)\IP Camera\데이타시트\dm365
* 오디오 노이즈 심함
{{{{color: rgb(255, 1, 1); font-size: 13px; font-weight: bold;} 시스템 파트에서 할 일이 없어 종료 }}}
- 20100221 . . . . 5 matches
#title BSC 드라이버 작성
BSC 장치 드라이버 작성 작업
드라이버 작성은 끝이 났지만
HDCCTV 코드를 이용해서 BSC 블럭에서 인터럽트가 발생하는지 확인하려고 함.
- 20100223 . . . . 9 matches
* IRIS_PWM과 IRIS_O의 값에 의해서 iris를 제어하게 되는데 이 둘은 PWM2,3으로 PINMUX 세팅을 해줘야 함.
PINMUX가 속한 System module의 '''BASE ADDRESS'''는 0x01c4 0000 이다.
* GIO81을 PWM3으로 설정하기 위해서는 PINMUX1 19-18bit가 3이여야 한다.
* GIO82를 GIO82로 설정하기 위해서는 PINMUX1 17bit가 1이여야 한다.
* GIO90을 PWM2로 설정하기 위해서는 PINMUX1 5-4bit가 2이여야 한다.
{{{{color: rgb(255, 1, 1); font-size: 13px; font-weight: bold;}PS. HDCCTV 메모리 덤프에서는 0x1c40004번지에 0x003EAAA5 값이 들어가 있음}}}
GPIO의 기본 '''BASEADDRESS'''는 0x01C6 7000 이다.
* GIO82는 BANK45에 18번 bit이다.
* 실제 값이 잘 적용 되었는지는 OUT_DATA45레지스터를 읽어서 확인 할수 있다.
Found 550 matching pages out of 774 total pages
You can also click here to search title.