- 20100428_DM365_Boot_cfg_reg . . . . 1 match
DM365를 Nand 부팅하기 위한 방법을 조사하고 Nand로 부팅 할 수 있게 만든다.
- 20100802_ipnc_osd . . . . 3 matches
ipnc 에서 OSD 출력을 테스트 하기 위해서 mt9p031 데모 프로그램을 분석 수정하고 있음
IPNC에서는 YUV420 포멧을 사용하는 것으로 보임.
- 20100803_ipnc_system_configuration . . . . 7 matches
시스템 configuraton을 초기화하고 복구하는 메카니즘을 보완하기 위한 작업
/nand/wtt_config 드렉토리의 유무로 설정 파일을 복사 하던 것을
파일 단위로 복사 하도록 설정을 변경
/etc/init.d/rcS 파일의 내용을 수정함.
reset시 network 설정을 유지 하기 위해서
- 20100816_samsung_filesystem . . . . 4 matches
nfs로 부팅을 하고 아래와 같이 mtdblock3을 마운트 시키고
미리 준비한 파일 시스템 gz 파일을 마운트한 nand 영역에 풀어 넣는다.
cmem이 사용할 영역을 늘리기 위해서 mem size를 74M로 줄였다.
- 20101101_HDCCTV_pal . . . . 2 matches
PAL 출력을 내기 위한 작업 내용을 기술 한다.
- 20101105_hdcctv_image_data_path . . . . 6 matches
ISIF에서 들어온 영상 image를 재단해서 원하는 영상 정보만을 추출하게 된다.
화면을 구성하는데 필요한 주요 레지스터 LNH, LNV, HSIZE 설정
OSD가 출력할 화면을 구성했다고 하면 VENC는 외부 장비에 화면을 전송하기 위한 출력을 구성하는 곳이다.
아래 코드는 720p 출력을 만드는 예시이다.
- 20101105_ipnc . . . . 1 match
digital out의 출력을 이벤트 발생 시점으로 수정함.
- 20101117_spd400_filesystem_yaffs2 . . . . 2 matches
삼성 SPD400 에서 사용하는 JFFS2 파일 시스템을 YAFFS로 교체 하기 위한 작업
* yaffs 파일 시스템을 커널 소스에 추가 해서 컴파일 성공
- 20101203_spd400_filesystem_install_guide . . . . 6 matches
삼성 SPD400 프로젝트 관련해서 NAND 파티션을 나누고 YAFFS2 파일 시스템을 포팅하는 일에 대해서 기술한다.
.name : 부팅 과정중에 표시 되는 이름이다. 개발자의 의도를 알 수 있도록 적당한 이름을 부여한다. (ex. app, conf, temp, log..)
파일 시스템을 올리는 일은 KERNEL 이미지를 올리는 것과는 조금 다릅니다.
yaffs2 이미지의 경우 정확하게 얼라인을 계산해서 만들기 때문에 이미지 size를 적어주시면 됩니다.
target에서 수행하게 되며, '''unyaffs2''' 명령을 사용합니다.
- 20110711_xbmd . . . . 3 matches
== 2열의 TEXT 입력을 받아서 float형으로 처리 하기 ==
carriage return 이라는 것을 처리 하기 위해서 조건에 '''ch != 13'''을 추가 했다.
- 20110824_fftw . . . . 1 match
라이브러리의 정확한 이름은 '''apt-cache search''' 명령으로 검색해서 찾을 수 있다.
- 20111223_private_linux_server . . . . 1 match
구형 노트북에 리눅스를 설치해서 개인 웹서버와 svn등 개발 환경을 구축하기 위한 작업
- 20120213_jhkim_impulsec_review . . . . 1 match
오상훈 박사의 부탁으로 종환이가 임펄스 씨에서 만든 단진자 운동 방정식을 PICO 보드에 올려 테스트 하는 일.
- 20120402_fpga_fft . . . . 2 matches
1. 부분적인 자료 추출을 위한 테스트 코드 위치 ~/test_c/mis/main.c
RADIX-2 FFT 알고리즘을 기반으로 C code 작성했다.
- 52hour . . . . 18 matches
하루 근로시간을 8시간으로 하고, __주 5일 근무하는 것으로 해서__ 주 40시간 근무를 기준으로 정함.
고용노동부의 행정해석을 통해 휴일도(근로일에서 제외하는 것으로 해석) 근무하는 것으로 해서 토요일, 일요일도 근무가 가능하기 때문에 16시간이 추가 되어 사실상 최장 허용 근로시간이 68시간이됨.
환노위는 토.일을 포함한 주 7일을 모두 '근로일'로 정의하는 법문을 명시해 주 근로시간의 허용치를 52시간으로 정함.
시장의 충력을 완하하기 위해 기업 규모별로 적용 시기를 차등 적용하기로 함.
* 30인 미만 기업에 대해선 2022년 12월 31일까지 특별연장근로 8시가을 추가 허용함.
휴일근무수당의 지급 기준은 현행을 유지함.
''근로자가 1주일 중 근무일에 40시간을 근무한 뒤 휴일에 근로(8시간 이내)했다면 휴일근로수당 50%만 가산하면 된다는 게 행정해석의 핵심 내용이다. 국회는 이런 행정해석을 근로기준법에 명시해 지급의 ‘법적 근거’를 제공하기로 했다.''
''노동계는 근로기준법상 주당 법정 근로시간이 40시간인 점을 들어 근무일에 40시간을 근무한 뒤 휴일에 근로하면 휴일수당(50%)과 연장근로수당(50%)을 합쳐 200%의 중복할증 수당을 지급해야 한다고 주장했는데 이는 받아들여지지 않았다.''
''이런 법 개정은 그간 법원의 판결과 배치된다. 앞서 법원은 ‘휴일근무수당을 150%만 지급하도록 한 행정해석이 위법하다’며 성남시를 상대로 소송을 제기한 성남시 환경미화원들에 대해 1심과 2심에서 승소 판결을 해 휴일ㆍ연장수당을 각각 50%씩 중복가산해 통상임금의 200%를 지급하라고 판시했다.''
- AliasPageNames . . . . 2 matches
# config.php 파일에 다음과 같은 설정을 넣어주시면 별명 기능이 활성화됩니다.
# 이 페이지 이름을 가리킵니다.
- AttachmentMacro . . . . 9 matches
올리고 싶은 파일 이름 혹은 이미 첨부된 파일 이름을 {{{attachment:파일이름.확장자}}}라고 써준다.
파일이 이미 올려 있을 경우에는 그 파일을 받을 수 있는 링크가 자동으로 걸리게 되고, 파일이 아직 업로드되지 않았다면 파일을 업로드 할 수 있는 링크가 생성된다.
/!\ Attachment는 매크로로 구현되어 있으므로 {{{[[Attachment(hello.png)]]}}}라고 해도 똑같은 방식으로 작동을 합니다. 그러나 '''attachment:'''문법을 쓰시기 바랍니다.
/!\ 1.1.3에서 제대로 안됩니다. 버전 1.1.3.1을 받아서 사용하시기 바랍니다.
모니위키 1.1.3부터 제대로 지원하게 된 WikiWyg GUI를 사용하면 좀 더 쉽게 파일을 업로드 하실 수 있습니다.
- AuxCAM . . . . 8 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]는 현재 아래 그림과 같다.
- BSN_Driver . . . . 1 match
BSC 하드웨어 블럭을 제어하기 위한
- BT.656 . . . . 4 matches
ITU 656(BT.656) 표준은 압축되지 않은 PAL 또는 NTSC 표준 화질 텔레비전을 스트리밍하기 위한 단순한 디지털 영상 프로토콜을 정의한다. 이 프로토콜은 비월 주사된 영상 데이터를 지원하며, 각 필드는 따로따로 스트리밍된다. ITU 656 프로토콜은 TV-out용의 DAC 칩으로 비디오 프레임을 보내는 데 사용되거나 비디오 캡쳐용 ADC 의 출력으로 사용될 수 있다.
라인 내의 각각의 픽셀은 YUV 형식으로 부호화 된다. 4 바이트 길이의 SAV 코드가 전송된 후에 Y (휘도) 신호의 초기 8 비트가 전송되고 그 다음에는 Cb (색차 U) 신호의 8 비트가 전송되며 그 다음에는 Y 신호의 다음 8 비트, 그 다음에는 Cr (색차 V) 신호의 8 비트가 전송된다. 온전한 Y, Cb, Cr 픽셀 값을 복원하기 위해서는 반드시 [크로마 서브샘플링]이 필요하다.
- Bias_Variance_Tradeoff . . . . 33 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 이런 개념들을 창안한 학자들이 이름 지을 때는 경험을 통해서 일상용어 중 적당한 것을 가져다 붙인 것이겠지만, 뒤늦게 공부하는 후학으로서는 거꾸로 이런 학술용어의 의미를 일상에서 곱씹어 보게 된다.
경험으로부터 어떻게 배워야 할까? 기계학습에는 이런 위험을 최소화하는 수학적 방법이 있다지만, 우리 삶에서 위험을 최소화하는 알고리즘은 어디에 있을까? 아니, 있기는 할까?
추정치 estimation의 분산을 뜻한다.
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]
- Blog/2010-12 . . . . 1 match
내용은 뭘로 하면 좋을까
- CCTV . . . . 5 matches
I2C 통신으로 DAC6571 를 컨트롤하여 IRIS 기준 전압을 잡아주는 회로도 입니다.
GIO24(T3) I2C_EN : I2C 레벨 컨버터 역할 칩( PCA9306DCU)을 Enalbe시켜 i2c 통신한 후 disable을 시켜 차 후 어떠한 디바이스와 I2C 통신을 할때 영향을 미치지 않게 설계하였습니다.
- CamtronPackage . . . . 1 match
서영섭씨 작업 내용, 정수연씨가 ISP쪽 작업한 내용을 포함
- CategoryCategory . . . . 3 matches
분류 페이지에 들어가서 제목을 클릭하면 그 분류 페이지에 대한 역링크를 서치하고, 그 분류페이지의 링크가 들어있는 모든 페이지 목록을 보여주게 됩니다.
OriginalWiki와 일관적으로 만드려면 모든 분류는 "Category"로 시작하도록 지정해야 합니다. 물론 다른 방식으로 이름을 붙여도 문제되지 않습니다.
- CommentMacro . . . . 2 matches
만약 모든 페이지에 Comment 매크로를 붙이기를 원한다면 config.php에 다음을 추가해주세요.
/!\ Comment 매크로 이외에 자신이 만든 매크로가 맨 하단에 들어가도록 위의 방법을 쓰실 수 있습니다. 위의 방법으로 FootNoteMacro와 CommentMacro를 넣은 예입니다.
- DNN_index . . . . 4 matches
Andrew Ng(앤드류 응, 스탠포드대학) 과 구글이 2012년에 16,000개의 프로세서와 10억개 이상의 뉴럴네트워크를 이용해서 유튜브 비디오중에서 고양이를 인식하는 DNN 연구를 진행했다. Unsupervised learning을 이용해서 고양이를 찾음.
Geoffery Hinton 교수(캐나다 대학) - DeepMind 설립자, 구글이 회사를 인수하면서 구글에서 일함. 머신러닝의 부흥을 이끈 장본인
Pascal Vincent - [:ann_rnn RNN] (Recurrent Neural Network) 예전의 RNN은 인공신경망이 너무 깊어서 오랜 시간 전의 데이터들을 까먹는 현상(vanishing gradient problem) 때문에 학습이 힘들었는데요, 유르겐 슈미트후버(Jurgen Schmidhuber) 교수의 Long-Short term Memory란 게이트 유닛을 노드마다 배치하여 이러한 문제를 극복, 현재는 컨볼루셔널 네트워크의 가장 강력한 경쟁 상대로 자리매김하고 있습니다.
- DSC_Depthwise_separable_Convolution . . . . 20 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 . . . . 16 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는 아래 세 가지 조건을 만족해야 한다.
* '''경졔조건(Boundary condition)''': 입력 패턴과 참조 패턴의 시작점과 끝점을 일치시킨 후 모든 패턴을 비교해야 한다.
* '''이동 크기 조건(step size condition)''': 입력 패턴과 참조 패턴 비교 시 격자상의 비교를 위한 이동 크기는 일정하게 하여 모든 격자의 패턴을 비교해야 한다.
밑의 그림은 최단 경로를 찾아가게 되는 과정을 잘 보여주고 있다. 이 그림에서는 맨 아래의 시작점으로부터 시작하여 오른쪽, 위쪽, 대각선으로 가장 작은 수를 향하여 전진하게 된다. 그때 제일 낮은 값을 향해 가고 제일 끝 종착지에서 지나온 값들을 더한 값중 가장 작은 경로가 제일 이상적인 경로다.
- DrawMacro . . . . 4 matches
gif 그림을 그릴 수 있게 해주는 애플릿
{{{applets/TWikiDrawPlugin/}}}로 가서 {{{gmake}}} 혹은 {{{make}}} 명령을 하여 설치한다.
윈도우즈의 경우는 다음의 파일을 받아서 직접 압축을 풀어준다. {{{applets/TWikiDrawPlugin/}}}twikidraw.jar 및 *gif 파일이 있게끔 해야 한다.
- EmbeddedLinux시작하기 . . . . 65 matches
다음은 리눅스 커널 2.6에서 지원하는 (x86을 제외한) 임베디드 프로세서 아키텍처들이다.
HAL은 다음과 같은 하드웨어 요소들을 지원한다.
리눅스의 메모리 관리자는 하드웨어 메모리 자원에 대한 접근을 제어하는 책임을 맡고 있다.
리눅스 스케줄러는 멀티태스킹을 지원하며 실시간 스케줄링 정책을 지원하기 위해 계속 발전되고 있다.
* '''사용자 프로세서''': 각각의 사용자 프로세서는 가상 메모리 기능으로 인해 자신만의 주소 공간을 갖는다. 이들은 인터럽트, 예외, 시스템 콜을 통해 커널 모드로 진입할 수 있다. ''프로세스가 커널 모드로 진입하면, 원래와는 다른 스택을 이용한다는 것에 주의하자.'' 이것을 커널 스택이라 하며, 각 프로세서는 자신만의 독자적인 커널 스택을 갖고 있다.
* '''사용자 쓰레드''': 쓰레드는 하나의 사용자 프로세스로 매핑된 또 다른 실행 개체이다. 사용자 공간의 쓰레드는 동일한 텍스트, 데이터, 힙 영역을 공유한다. 또한 열려 있는 파일 목록, 시그널 처리 함수 등의 자원은 공유되지만 스택 영역은 별도로 존재한다.
리눅스에서는 다양한 종류의 파일 시스템들이 VFS(Virtual File System)라는 계층을 통해 관리 된다. VFS는 시스템상의 다양한 장치들에 저장된 데이터를 일관적인 형식으로 바라볼 수 있도록 해 준다.
이것은 특별히 파일 시스템을 필요로 하지 않는 실시간 운영체제와 구분되는 특징이다.
모든 리눅스 시스템은 루트 파일 시스템과 함께, 임베디드 시스템을 위한 플래시나 ROM기반의 늑수 파일 시스템을 지원한다. 또한 호스트상의 파일 시스템을 임베디드 시스템 Target에 마운트 할 수 있는 NFS(Network File System)와 임베디드 시스템에서 유용하게 사용되는 메모리 기반의 파일 시스템에 대한 지원도 포함 된다.
리눅스의 IO서브시스템은 시스템상에 존재하는 장치들에 대해 단순하고 통합적인 인터페이스를 제공한다. IO 서브시스템은 다음과 같은 장치들을 지원한다.
* 순차적인 접근이 필요한 장치들을 지원하는 문자 장치(Character device)
* 임의적인 접근이 가능한 장치들을 지원하는 블록 장치(Block device). 블록 장치는 파일 시스템을 구현하는 기본이 된다.
* 여러 링크 계층 장치들을 지원하는 네트워크 장치(Network device)
리눅스의 가장 큰 장점 중의 하나는 다양한 프로토콜을 지원하는 강력한 네트워킹 기능이다.
리눅스의 IPC(Inter-Process Communication, 프로세스 간 통신)는 (비동기 통신 방식인) 시그널과 파이프, 소켓은 물론 공유 메모리, 메시지 큐, 세마포어와 같은 System V의 IPC 메커니즘을 포함한다.
리눅스의 사용자 공간은 다음과 같은 개념들을 기본으로 한다.
* '''가상 메모리''': 프로세서별로 각각의 주소공간을 갖도록 해준다. 가상 메모리는 공유 메모리와 같은 고급 기능들을 이용할 수 있도록 한다. 각 프로세스는 가상 메모리상에 자신만의 고유한 메모리 맵을 가지며, 이는 커널의 메모리 맵과는 완전히 별개의 것이다.
* '''시스템 콜''':커널로 진입할 수 있는 지점으로 이를 통해 커널은 응용 프로그램을 대신해 운영체제의 서비스를 제공한다.
응용 프로그램에서 호출 되는 모든 시스템 콜을 알려주는 툴 strace를 사용하면
응용 프로그램에서 호출하는 시스템 콜을 볼 수 있다.
- English_letter . . . . 10 matches
+ (직업을 구하고자 할 때) submit my application for the position advertised in the X
+ (불만을 제기하고자 할 때) complain about
+ (의견을 전달하고자 할 때) inform you that
1. '''좀 더 강한 강조를 하고 싶을 때''' : 내가 쓰는 편지의 주제나 내용에 대해 읽는 이는 좀더 확실히 새겨들 것을 요구할 때
1. 빠른 답장을 부탁
(I look forward to + 명사형은 명사형을 고대한다는 뜻으로 굉장히 많이 쓰이는 표현입니다)
Dear + 사람이름을 아는 경우에는 Yours Sincerely, 를 쓰고, Dear Sir or Madam, 인 경우에는 Yours Faithfully, 를 사용합니다.
이 경우에도 Comma를 찍는 것을 절대 잊어서는 안됩니다.
이상 영어편지쓰기에 대하여 간략하게 알아보았습니다. 외국인들은 정확하고 간결한 표현을 좋아합니다. 편지를 쓸 때에는 간략하지만 본인이 원하는 바로 정확하게 전달할 수 있도록 깔끔하고 간략하게 편지를 정리하는 것이 중요합니다. 이상입니다.
- FPGA_PSA_Implementation . . . . 19 matches
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은 데이터 출력을 위해 사용한다.
'''double atod(char *str)''' - 기존의 atof()함수와 같이 문자형을 double형 데이터로 변환해주는 함수.
공백, newline, tab carrier return등을 필터링한다.
- FindPage . . . . 8 matches
= 찾아보기를 통해서 위키위키의 구석구석을 여행하실 수 있습니다 =
== 페이지 이름을 아신다면, 페이지 이름을 넣어 검색하실 수 있습니다 ==
== 페이지 이름을 잘 모르신다면 관심있는 내용을 검색해보세요 ==
* RecentChanges: 최근에 고쳐진 페이지와 사람들의 참여 내역을 보여줍니다.
* TitleIndex: 이곳에 있는 모든 페이지 목록을 보여줍니다.
* HelpContents: 위키위키에 대해 더 궁금하시다구요? 도움말을 읽어보시기 바랍니다.
- Finite_Elements_Method . . . . 30 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) 등등 거의 대부분 편미분방정식의 적분 형태에서 파생된 방법이거나 선형함수의 단점을 보완하고자 도입된 다항식에 관한 방법론이다. (사실 우리는 다항식에 대해서 모르는 부분이 엄청 많다. 잘 아는 것 같지만서도........)
- Fortran95_Tutorial . . . . 158 matches
여기서는 Fortran90(95) 버전을 기준으로 Tutorial을 작성하도록 하겠다.
Object 파일을 여러개 묶어서 하나의 실행 파일을 만들 수 있는데 그때를 위함 과정이라고 보면 된다.
이때 주의해야 할 점은 모든 Object 파일을 다 합쳤을때 '''program''' 키워드는 한번은 존재해야 한다는 것이다.
중복해서 있다거나 하나도 없으면 실행 파일을 만들 수 없다.
포멧을 사용한다.
문장 앞뒤에 점(.)을 찍어야 한다.
ichar //문자형을 정수형으로 변환
char //정수형을 문자형으로 변환
예 : How to multiply 두 개의 실수 변수 x와 y 를 double precision을 사용하여 곱하고 그 결과를 double precision 변수 w에 저장하는 방법:
Fortran 77에서는 비교하기 위하여 < 나 = 같은 부호를 사용할 수 없고 알맞은 두 문자 약호 앞뒤에 점을 찍어 사용하여야 한다.
이는 한 줄에 적어야 한다. 위 예에서는 x의 절대값을 구하는 것이다.
if 내부에서 한 문장 이상을 수행하여야 할 경우에는 다음의 syntax를 사용한다.
수행 순서는 위에서 아래 방향이다. 조건식은 하나가 참일때 까지 순서대로 그 값을 구한다. 그 후 그와 관련된 code를 수행하고 endif 이후의 다음 문장으로 뛰어 넘는다
do-loop 는 간단히 세고자 할 경우 사용한다. 다음은 정수 1부터 n (n의 값은 다른 곳에서 지정되었다고 가정한다.)까지의 합을 매번 구하는 예이다.
do-문장에서 정의한 변수는 특별한 명려이 없는 한 1씩 증가한다. 그러나 step 을 사용하여 그 증가량을 다른 정수로 바꿀 수 있다. 다음은 1부터 10사이의 짝수를 큰 수부터 인쇄하는 프로그램이다.
주의 : do-loop 변수를 loop 안에서 다른 방법으로 바꾸어서는 안된다. 이 경우 심각한 혼란을 초래한다.
많은 Fortran 77 compiler에서 do-loop를 enddo 문장으로 끝낼 수 있도록 한다. 이 경우의 장점은 enddo가 앞에서 사용한 가장 최근의 do 문장의 끝을 의미하므로 문장 번호를 사용하지 않아도 된다는 점이다. enddo 구조는 상당히 많이 사용되지만 표준 ANSI Fortran 77은 아니다.
이다. while 문이 참(true)인 한 내부의 문장들을 반복한다. 이 syntax를 여러 컴퓨터에서 사용할 수 있기는 하나 ANSI Fortran 77은 아니다. 올바른 방법은 if와 goto를 사용하는 것이다.
다음은 100보다 작거나 같은 수를 2의 지수로 하여 그 값을 계산하고 인쇄하는 프로그램이다.
마지막의 논리식이 유사 코드의 논리식의 부정이어야 한다는 점을 주의하라.
- FortuneMacro . . . . 2 matches
Fortune 매크로 플러그인은 GNU fortune프로그램을 이용한 매크로입니다.
<!> 현재 유닉스만 지원하며 다음을 만족시켜야 합니다.
- FrontPage . . . . 3 matches
이곳은 나만의 디지털 안식처로, 초대받지 않은 자의 출입을 엄격히 금지합니다.
당신이 실수로 들어왔다면, 지금 당장 Ctrl+W (또는 뒤로 가기) 버튼을 누르세요.
🚀 "뒤로 가기" 버튼을 눌러라. 아니면... 감당할 수 있겠어?
- FrontPage2013 . . . . 2 matches
{{{{color: rgb(120, 150, 200); font-size: 12px;}새로운 것을 시작할때 나는 긴장한다. }}}
{{{{color: rgb(120, 150, 200); font-size: 12px;}피할 수 없는 고통을 즐겨주리라.}}}
- FullSearchMacro . . . . 8 matches
* 붙으면, (rc15 이상에서) 인자가 없을 땐 현재 페이지 제목으로 찾고, 인자가 있으면 그에 따라 찾는다.
* 안 붙으면 찾기 폼을 출력한다.
세부 옵션(context=10, case=1,backlinks=1)을 추가할 예정입니다.
FullSearch는 낱말 찾기 기능에 중점을 두게 고치고, [노스모크]의 확장은 [모인모인]의 PageList를 확장했습니다. --WkPark
그런데, gybe 경우에 해당되는 페이지 이름이 불규칙해서 PageList를 쓸 수가 없습니다. FullSearch가 날짜별 정렬을 지원하지 않는다면, MoniWiki의 기능 중에 어떤 걸 쓰면 될까요? --[kz]
{{{[[PageList(^Gybe.*|Gybe$)]]}}}이런 식으로도 됩니다. [모인모인]에서도 되구요, MoniWiki는 여기에 date옵션을 쓸 수 있는거죠. --WkPark
아하.. 그러니까, Category페이지를 어떻게 찾느냐는 것을 말씀하신 것이군요 ? 흠 그것은 FullSearch로 찾아야 겠군요. ToDo로 넣겠습니다. ^^;;; --WkPark
요즘은 모니위키에 신경을 못 쓰고 있습니다. ^^;; --WkPark
- GAN_iclr_2017 . . . . 9 matches
ICLR 2017 Workshop track에서 발표가 있었던거 같은 논문 PRECISE RECOVERY OF LATENT VECTORS FROM GENERATIVE ADVERSARIAL NETWORKS [* https://arxiv.org/pdf/1702.04782.pdf]을 읽고 논문의 리뷰를 작성한다.
논문의 초록을 읽어보면 GAN 으로 트레이닝된 Generator 로 Latent vector에서 이미지를 생성하는 것까지는 되지만 역으로 이미지를 Latent vector(Latent space)로 mapping하는 것은 일반적으로 잘 안 된다고 소개하고 있습니다. 하지만 자신들의 방법으로는 이것을 완벽하게 해결할 수 있다고 합니다. 어떻게 하면 될지 천천히 살펴 봅시다.
이 기술을 사용하면 이미지에 노이즈를 넣었음에도 불구하고 원래의 latent vector 를 복구할 수 있다네요.
1. \(z'\)을 조절해서 \(\phi(z')\)를 원래 이미지 \(\phi(z)\)와 가까워 지도록 \(L_2 norm\)을 minimize를 시도한다.
1. \(z'\)을 Update 하는 방법으로 아래와 같은 방법을 사용하면 Learning rate \(\eta\)는 시간에 따라 감소하도록 설정했다.
1. 많은 경우 Latent vectors는 bounded domain에서 오는 경우가 많다. 예로 DCGANS에 경우 \([-1, 1]^{100}\) 의 hyper cube로 부터 uniformly 난수를 추출해서 사용하고 있다. 이런 경우 \(z'\)의 출력 범위를 한정하기 위해서 아래와 같이 Update 방법을 수정했다.
- GAN_review . . . . 11 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를 동시에 학습합니다.
Tensorflow를 이용해서 간단한 GAN을 실제 구현해 본 사람이 있다.[* https://github.com/nlintz/TensorFlow-Tutorials/blob/master/11_gan.ipynb]
Weights의 초기값을 어떻게 정하느냐에 따라서 성능 차이가 발생한다. 머신러닝에서 초기값은 중요하다.
초기값을 렌덤하지 않은 특정 값으로 설정한다면 트레이닝이 되지 않는다.
예로 초기값이 모두 '0'으로 초기화 된다면 모든 입력값에 대해서 0의 결과값을 주게 된다.
이런 관점에서 간단하면서도 성능이 좋은 두 개의 초기화 설정 방법을 소개한다.
원래 코드에서는 Bias 값을 '0'으로 초기화를 진행했는데 이것을 normal random 함수를 사용해서 표준편차 0.1인 난수로 초기화 하도록 수정 했다.
Hidden 레이어는 Relu를 사용했고 출력단은 시그모이드를 사용하도록 구성 했습니다. 우선은 그냥 사용해 보고 Activation function을 바꿔가면서 테스트 해보도록 하겠습니다.
- Gradient_Descent . . . . 32 matches
Gradient descent 방법은 미분의 개념을 최적화 문제에 적용한 대표적 방법 중 하나로서 함수의 local minimum을 찾는 방법 중 하나입니다. Gradient descent 방법을 다른 말로 steepest descent 방법이라고도 부릅니다.
자신이 한치앞도 잘 안보이는 울창한 밀림에 있을 때 산 정상으로 가기 위한 방법은 간단합니다. 비록 실제 산 정상이 어디에 있는지는 모르지만 현재 위치에서 가장 경사가 가파른 방향으로 산을 오르다 보면 언젠가는 산 정상에 다다르게 될 것입니다.
또는 이와 반대로 깊은 골짜기를 찾고 싶을 때에는 가장 가파른 내리막 방향으로 산을 내려가면 될 것입니다.
이와 같이 어떤 함수의 극대점을 찾기 위해 현재 위치에서의 gradient 방향으로 이동해 가는 방법을 gradient ascent 방법, 극소점을 찾기 위해 gradient 반대 방향으로 이동해 가는 방법을 gradient descent 방법이라 부릅니다.
어떤 다변수 함수 \(f(x_1,x_2,...,x_n)\)이 있을 때, f의 그레디언트(gradient)는
와 같이 정의 됩니다. 즉, 그레디언트(gradient)는 위 식과 같이 각 변수로의 일차 편미분 값으로 구성되는 벡터입니다. 그리고 이 벡터는 '''f의 값이 가장 가파르게 증가하는 방향'''을 나타냅니다. 또한 벡터의 크기는 그 증가의 가파른 정도(기울기)를 나타냅니다.
또한 반대로 그레디언트(gradient)에 음수를 취하면 즉, -▽f는 f값이 가장 가파르게 감소하는 방향을 나타내게 됩니다.
이러한 그레디언트의 특성은 어떤 함수를 지역적으로 선형근사(linear approximation)하거나 혹은 함수의 극점(최대값, 최소값 지점)을 찾는 용도로 활용될 수 있습니다.
최적화 알고리즘 중 하나로 널리 알려진 gradient descent 방법은 이러한 그레디언트의 특성을 이용하여 어떤 비용함수의 값을 최소화시키기 위한 파라미터 값을 아래와 같이 점진적으로 찾는 방법입니다.
즉, 어떤 초기값 \(X_0 = (x_0^1,...,x_0^n)\)부터 시작하여 위 식에 따라 gradient 반대 방향으로 x를 조금씩 이동시키면 f(x)가 극소가 되는 x를 찾을 수 있다는 방법이 gradient descent 방법입니다.
Gradient descent 방법에 대해서는 그 기본적인 개념만 이해하고 있으면 된다고 생각합니다. 그 핵심은 함수의 극대값 또는 극소값을 구하기 위해 현재 위치에서 함수값의 변화가 가장 큰 방향으로 이동한다는 것이므로 함수값의 변화가 가장 큰 방향을 구할 수만 있다면 다양한 문제에 똑같은 개념을 적용할 수 있습니다.
다변수 스칼라 함수(scalar-valued function of multiple variables)의 경우에는 gradient(그레디언트)를 이용하여 최대 증가 방향을 찾았지만 일변수 함수의 경우에는 통상적인 일차 미분값 f'(x)을 이용하면 될 것입니다. 예를 들어, \(f(x) = x^2 + 3x + 1\)가 극소가 되는 점 및 극소값을 구하고 싶다면 식을 다음과 같이 세울 수 있습니다
위 식을 동시에 만족시키는 \(x = (x_1,...,x_n)\)을 구하는 문제는 결국 아래의 E를 최소화시키는 x를 구하는 LS(Least Square) 문제로 볼 수 있습니다.
E를 극소로 만드는 x에 대한 초기 추정값) \(x_0 = (x_1^0,...,x_n^0)\)부터 시작하여 아래와 같은 gradient descent 탐색을 반복하면 E의 극소점을 근사적으로 찾을 수 있습니다.
그런데 ▽E를 직접 구하여 위 식을 적용해도 되지만, \(E = F^TF\) 로부터 \( \nabla E = 2J_F^TF\) 이므로 아래 식과 같이 F의 Jacobian인 \(J_F\)를 이용하여 해를 탐색해도 됩니다.
- Gradient_Jacobian_Hessian_Laplacian . . . . 38 matches
문득 정리의 필요성을 느껴서 적어봅니다.
이들을 함께 보는 이유는? 그냥 왠지 이들은 세트로 함께 봐야 할 것 같은..
어떤 다변수 함수 \(f(x_1, x_2, x_3, \cdots, x_n)\)가 있을때, f 의 gradient 는
또한 반대로 gradient(그레디언트)에 음수를 취하면 즉, \(-\nabla f\)는 f값이 가장 가파르게 감소하는 방향을 나타내게 됩니다.
이러한 gradient의 특성은 어떤 함수를 지역적으로 선형근사(linear approximation)하거나 혹은 gradient descent 방법([:Gradient_Descent Gradient Descent 탐색] 방법 글 참조)처럼 함수의 극점(최대값, 최소값 지점)을 찾는 용도로 활용될 수 있습니다.
영상처리에서 gradient(그레디언트)는 영상의 edge 및 edge 방향을 찾는 용도로 활용될 수 있습니다. 이미지 I(x,y)를 (x,y)에서의 픽셀의 밝기를 나타내는 함수로 보고 각 픽셀 위치에서 gradient의 크기와 방향을 구하면 해당 픽셀이 얼마나 edge에 가까운지, 그리고 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)] 글을 참조하기 바랍니다.
어떤 다변수 함수 \(f(x_1,x_2, /cdots ,x_n)\)가 있을 때, f의 Hessian 행렬은
즉, 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, 이차미분값)을 나타낸다는 점에 있습니다.
어떤 다변수 함수 \(f(x_1,x_2, \cdots ,x_n)\)가 있을 때, f의 Laplacian(라플라시안)은
☞ Laplacian은 +,- 값을 갖기 때문에 0 ~ 255 사이로 스케일을 맞추어 이미지로 표시하면 <그림 3>의 가운데 그림처럼 보여집니다.
Gradient는 영상의 밝기 변화가 급격할수록 큰 값을 가집니다. 하지만 Laplacian은 영상의 밝기변화의 변화가 심할수록 큰 값을 가집니다. 즉, 아무리 밝기 변화가 크더라도 그 변화속도가 일정하다면 Laplacian은 0에 가까운 값을 갖습니다.
이미지 관점에서 보면 이미지 내의 두 영역의 경계(edge)에서는 급격한 밝기 변화가 일어나기 때문에 |gradient|나 Laplacian 모두 큰 값을 나타냅니다. 하지만 동일한 영역 내부에서 점진적인 밝기 변화가 일어날 때는 그 밝기변화 정도에 따라서 |gradient|는 큰 값을 가질 수 있지만 Laplacian은 작은 값을 나타내는 차이가 있습니다.
- HDCCTV50HZ . . . . 3 matches
본 문서는 HD 출력을 기존 60Hz에서 50Hz로 변경하는 것에 대하여 설명한다.
Sample clock rate는 고정이고 출력 frame refresh rate를 변경하려고 한다면 ①의 공식에서 frame refresh rate를 변경하고 이에 따른 HINT+1 값을 구하면 된다.
* 아래 코드는 VENC 메모리맵을 구조체로 선언한 부분입니다.
- HDCCTV_2M_SONY . . . . 4 matches
기존 HDCCTV는 REG Bayer 포멧으로 영상을 입력 받아 출력 하게 되어 있다.
이것을 수정해서 YUV 포멧으로 영상을 입력 받아 출력하려고 할 때 이루워 지는 작업
* 입출력 설정을 IPIPE_RAW2YUV에서 IPIPE_YUV2YUV로 수정한다.
- HDCCTV_BE_ycc8 . . . . 6 matches
HDCCTV에서 YCC8 출력을 내기 위함 작업
DM365쪽의 BE 레지스터를 수정해서 YCC8출력을 낼 수 있게 함.
NTSC Standard mode에서 BT.656 format으로 출력을 내려고 함.
OSD 설정이 최종 출력에 영향을 주는 것을 확인
VENC 설정은 HD_DIGITLA을 복사해서 수정해서 SD_YCC8로 만들었고
- HDCCTV_ISIF . . . . 5 matches
ISIF(Image Sensor Interface ) 센서나 외부로 부터 영상을 입력 받는 인터페이스이다.
본 장에서는 DM365가 제공하는 ISIF의 기능을 알아보고 각각의 설정 방법을 알아본다.
HSIZE 는 32bit 단위를 쓰기 때문에 80을 넣어주면 된다.
'''CCD에서 들어온 영상을 저장할 SDRAM 주소 지정'''
- HDCCTV_NTSC . . . . 20 matches
영상신호란, 빛을 전기신호로 바꾸어 전송 또는 기록하기 위한 신호이다.
브라운관은 하나의 전자 빔으로 좌측에서 우측으로 주사하여 주사선을 만들고 있다.
한번 주사가 끝나면 다시 전자 빔을 좌측의 시작점으로 되돌려야 한다.
화상의 주사 방법은 2개의 방법을 쓴다.
사람의 눈의 잔상작용을 이용해여 화상, 특히 동화상을 자연스럽게 볼 수 있도록 하기 위해 영화에서는 1초 동안 24장의 화상을 사용한다.
NTSC방식의 TV 화상에서는 초당 30장의 화상을 사용하고 있는데 영화와 같이 순간적으로 1장의 화상을 표시하는게 아니라 주사 방식을 사용하기 때문에 1초당 30장으로는 화상으로는 깜박거림을 막을 수 없다.
그리서 비월주사(Interlace)방식에서는 1장의 화상을 2회로 나누어 보내는 방법을 사용하여 1초당 60장을 출력하는 효과를 내고 있다.
1장의 완성된 화상을 "Frame"이라고 하고 1회 주사로 만들어진 절반의 영상을 "Field"라고 하면 "V"로 약칭한다.
TV뿐만 아니라, 컴퓨터 디스플레이의 화상도 주사로 이루어지고 있다. 컴퓨터에서는 비월주사는 사용하지 않고, 1장의 화상을 한번에 주사한다.
이 방식을 순차주사(Progressive 또는 Non-interlace)라고 한다.
따라서 '''1화면당 동일한 주사선을 사용할 경우 순차주사 쪽이 더 선명하다.'''
- HDCCTV_VPBE . . . . 3 matches
OSD는 on-screen display로 다양한 포멧의 출력 화면을 구성하는 windows라는 것을 형성해 주는 장치이다. 이렇게 구성된 화면은
VENC를 통해서 출력장치로 나가게 되는데 VENC는 출력 장치에 맞는 data, clock, sync 등을 만들어 준다.
- HDCCTV_package . . . . 1 match
1. 패키지를 svn에서 얻어 와서 컴파일을 하면 각 project에 lib 파일이 생성 되고 자동으로 lib 폴더에 .lib 파일들이 복사 된다.
- HDCCTV_조이스틱 . . . . 1 match
13 ~ 17번 레지스터를 1로 설정해서 direction을 INPUT으로 설정 한다.
- Hello드라이버예제 . . . . 3 matches
* '''firstminor'''는 사용을 요청하는 첫 minor 넘버(default 0)
file_opertaion에 대한 정의부는 ''리눅스 디바이스 드라이버'' 페이지 80, 3장 문자 드라이버 부분을 참고 하기 바란다.
위 코드는 file_operation의 초기화 부분이다. file_operation에서 정의 하고 있는 모든 함수를 정의 할 필요는 없다 사용할 함수만 정의 해서 쓰면 된다. 정의 되지 않은 함수는 NULL로 초기화 된다. 위 초기화 문법은 C99표준을 따르고 있다.
- HelpContents . . . . 2 matches
* HelpOnUserPreferences - 위키 사용자로 등록하고, 설정가능한 기본값을 입맛에 맞게 고쳐보세요.
HelpIndex를 보시면 자동으로 만들어진 도움말 목록을 보실 수 있습니다.
- HelpForBeginners . . . . 7 matches
위키위키웹는 여러 사람이 공동작업을 할 수 있는 하이퍼텍스트 환경을 말하며, 보다 쉽고 직관적인 정보의 수정에 초첨이 맞춰져 있습니다. 이곳 위키는 전체 위키위키웹의 일부분이며 각각의 개별 위키를 인터위키라고 말합니다.
처음 위키위키를 방문하신다면 무작정 다른 페이지를 고치려 하지 마시고 [위키모래상자]같은 곳에서 위키위키에 사용되는 간단한 문법을 테스트해보시기 바랍니다.
위키위키의 문법을 지금 당장 알고싶으신 분은 HelpOnEditing 페이지로 가시기 바랍니다.
위키위키 여행을 위한 좋은 출발점으로는
* RecentChanges: 사람들이 지금 무슨 작업을 하고 있는지
* WordIndex: 위키위키 페이지 이름을 구성하고 있는 단어들의 목록(따라서 이 위키위키의 주된 콘셉트를 보여줍니다.)
- HelpOnAdministration . . . . 1 match
* HelpOnUpdating - 예전에 설치된 것을 새로운 버전으로 업데이트 하려면
- HelpOnConfiguration . . . . 11 matches
MoniWiki는 `config.php`에 있는 설정을 입맛에 맛게 고칠 수 있다. config.php는 MoniWiki본체 프로그램에 의해 `include`되므로 PHP의 include_path변수로 설정된 어느 디렉토리에 위치할 수도 있다. 특별한 경우가 아니라면 MoniWiki가 설치된 디렉토리에 config.php가 있을것이다.
모니위키의 몇몇 플러그인중 외부 프로그램을 사용하는 프로그램은 환경변수 PATH를 참조하여 외부 프로그램을 호출하게 된다. 이때 PATH의 설정이 제대로 맞지 않아 외부 프로그램이 제대로 실행되지 않는 경우가 있다. 이 경우 config.php에서 `$path`를 고쳐보라.
config.php에 `$security_class="needtologin";`를 추가하면 로그인 하지 않은 사람은 위키 페이지를 고칠 수 없게 된다. 로그인을 하지 않고 편집을 하려고 하면 경고 메시지와 함께, 가입을 종용하는 간단한 안내가 나온다.
$logo_img를 간단히 조정하거나, $logo_string을 통해서 미세한 조정을 할 수 있다.
/!\ wiki.php에 정의되어 있는 WikiDB 클래스를 보면, 우선 하드코딩된 기본 설정이 있고, config.php에서 읽은 설정 사항을 그 위에 덧씌우는 방식이다.
/!\ monisetup.php은 config.php를 변경할 수 있으나, 간단한 변경만 지원하고 세세한 변경은 지원하지 않는다. 최근 1.1.3 버전부터는 여러줄의 config.php 설정을 읽고 수정할 수 있다. 단, monisetup.php를 사용할 경우 코멘트는 모두 제거가 되므로 주의해야 한다.
- HelpOnEditing . . . . 8 matches
위키위키는 기본적으로, 위키위키 내의 모든 페이지를 모든 사용자가 고칠 수 있습니다. 위키위키는 좀 더 편리하고 직관적인 페이지 편집을 지원하며 편집에 앞서 몇가지 포매팅 규칙을 배우셔야 합니다.
다음 페이지들은 위키위키를 고치는데 필수적인 규칙/문법을 설명합니다:
그리고 다음과 같은 고급 기능을 제공합니다.
모니위키는 다음의 특별 기능을 제공하며 참고적으로 알아두시면 좋습니다:
위키 포매팅 문법 (위키 마크업)을 테스트하고 싶으시면 WikiSandBox로 가셔서 [[GetText(EditText)]]를 누르시거나 [[Icon(edit)]] 아이콘을 누르시면 WikiSandBox에서 테스트 해보실 수 있습니다. 실제로 저장하지 않더라도 미리보기 버튼을 누르시면 위키 포매팅 결과를 그때 그때 확인하면서 연습하실 수 있습니다.
- HelpOnFormatting . . . . 20 matches
위키위키는 좀 더 직관적이면서 이해하기 쉬운 단순한 세트의 문법 규칙을 가지고 있습니다. HTML 문서를 만들기 위해서 HTML문법을 알아야 하는 것 처럼 위키위키 페이지를 만들거나 고치기 위해서 위키위키 문법을 알아야 합니다. HTML문법은 직관적이지 않고 복잡한 측면이 있습니다. 그러나 대다수의 HTML문서는 매우 간단한 문법을 알기만 하면 만들 수 있습니다. 위키위키는 이러한 문법을 좀 더 단순화 시키고 직관적이고 이해하기 쉬운 단순한 규칙으로 구성되도록 고안되었으며 조금만 시간을 투자한다면 위키위키의 문법을 쉽게 이해하고 배우실 수 있습니다.
그리고 이러한 포매팅을 ''있는 그대로'' 보여주기 위해 {{{ {{{ }}} }}} 중괄호 세개를 연달아 사용하는 문법이 있습니다.
글을 쓰더라도
{{{이렇게 글을
이렇게 한 줄을 띄우면
이렇게 글을
한 줄을 띄워 쓰면 단락이 나뉘게 됩니다.
한 단락 내에서 강제로 줄 바꿈을 하고 싶은 경우에는 {{{[[BR]]}}}를 씁니다.[[BR]]이것은 위키위키의 고급 기능에 속하는 [매크로문법] 입니다.
위키위키 문법을 무시하게 하기 위해서 중괄호 세개를 {{{ {{{이렇게}}} }}} 사용하게 되면 글꼴이 고정폭 글꼴로 보여지게 되며 ({{{monospace font}}}) 만약에 이 문법을 여러 줄에 걸쳐 사용하게 되면, 중괄호 블럭의 모든 공백이 보호되어 프로그램 코드를 직접 삽입하여 보여 줄 수 있습니다.
특별히 여러 줄 코드 블럭을 넣을 때 최 상단에 {{{#!php}}}, {{{#!python}}}과 같은 줄이 있으면 이것은 프로세서 해석기에 의해 해석되어
보여지게 됩니다. 모니위키는 php와 같은 기본적은 소스 코드 컬러링을 지원을 내장하고 있습니다.
- HelpOnHeadlines . . . . 4 matches
/!\ {{{= 레벨 1 =}}} 제목은 <h1>으로 랜더링되지만 다른 위키위키 마크업과 통일성을 위해 '''두개'''의 "==" 부터 제목줄을 사용하시는 것을 권장합니다. MediaWiki에서도 비슷한 이유로 ``레벨1`` 제목 사용을 제한적 허용하고 있는데, 그 이유는 <h1>은 ''페이지의 제목''에 할당하고 있기 때문이라고 합니다.
- HelpOnInstallation . . . . 34 matches
== 압축을 적절한 곳에 푼다 ==
압축을 풀면 moniwiki라는 디렉토리 밑에 화일들이 있는 것을 볼 수 있다.
디렉토리 이름을 원하는 것으로 바꿀 수도 있다. 예를 들어 {{{/wiki}}}라고 바꿀 수 있으며
monisetup.sh를 실행하여 디렉토리의 쓰기권한을 조정한다. (기본값은 2777) 이렇게 하여야 MoniSetup.php를 실행시킬 수 있게 된다.
처음 설치할 경우 MoniSetup을 이용해서 config.php를 만들게 된다.
이 값을 제대로 지정하면 MoniSetup에서 다음과 같은 로고 그림을 볼 수 있다.
1. MoniWiki를 처음 설치할 경우는 WikiSeed를 심을것인지를 선택한다.
씨앗을 심는 경우는 불필요한 페이지가 들어갈 수 있는데, 어느정도 익숙해졌다고 생각되면 지워도 되며, 아예 처음부터 설치하지 않아도 된다.[[BR]]
그러나 초보사용자라면 SystemPages는 반드시 설치하는 것을 권장한다.
{{{secure.sh}}}를 실행해서 다른 사람들이 자신의 Wiki 설정을 볼 수 없게,고칠 수 없게 한다.
모니위키 설치가 끝났지만 사용자의 입맛에 맞게 설정하고자 한다면 다음을 참고하세요.
* MoniWikiOptions 모니위키의 다양한 옵션을 조정한다.
1. MoniSetup을 실행시킬 때, {{{$admin_passwd}}}를 설정하면 자신만 DeletePage할 수 있다. 이 값을 설정하면, 차후에 MoniSetup을 할 때 이 값을 알아야 고칠 수 있으며, config.php에 이 값이 들어가므로 수동으로 고칠 수 있다.
1. $rcs_user의 기본 값은 "root"이나, 위키를 처음 설치할 경우는 이 값을 조절할 수 있다. 한번 결정한 후에는 이 값을 계속해서 써야한다.
업그레이드를 편리하게 하려면, 플러그인을 새로 추가할 경우는 원 파일을 고치는 것보다는 새롭게 플러그인을 만들어 준다. 이렇게 하면 tar파일을 덮어쓰는 것만으로 간단히 업그레이드 할 수 있다.
특별한 경우가 아니라면, 덮어쓰는 것만으로 업그레이드 할 수 있다. 원 파일을 수정하였을 경우라면 덮어쓰는 것을 선택적으로 해주어야 할 것이다.
* 기존의 data디렉토리는 전혀 덮어씌여지지 않는다. 그러나 만약의 실수를 대비하기 위해서 업그레이드 하기 전에는 data/text 디렉토리의 내용을 백업해 두는 것이 좋을 것이다.
root사용자라면 tar를 이용해서 간단히 백업할 수 있겠고, 호스팅을 하는 일반 사용자의 경우라면 backup restore를 액션을 이용할 수 있다.
* backup : {{{?action=backup}}}해 보라. 백업은 data 디렉토리의 user와 text를 및 기타 몇몇 설정을 보존한다. pds/ 디렉토리를 보존하지는 않는다. 백업된 파일은 pds/ (혹은 $upload_dir로 정의된 위치) 하위에 저장된다.
* restore : {{{?action=restore}}}한다. 백업된 tar 파일 목록이 나오고 tar 파일을 선택하면 관리 비번을 물어본다.
- HelpOnInstallation/MultipleUser . . . . 4 matches
모니위키 버전 1.0.9 이후부터 모니위키는 다중사용자를 위한 좀 더 편리한 설치환경을 제공합니다.
이 경우 대부분의 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 . . . . 1 match
현재 moniwiki tarball에는 압축을 푼 다음에 어떤 절차를 거쳐야 되는지 안내가 없습니다.
- HelpOnLinking . . . . 11 matches
외부 링크는 {{{http://kldp.org}}}같이 그대로 적어놓으면 '''자동'''으로 http://moniwiki.kldp.org 라고 링크가 걸립니다. 여기서 주의할 점은, 링크를 적을때 한글 토씨를 그냥 붙여 적을 경우에 한글까지 링크가 걸리게 됩니다. 이럴 경우에는 {{{[http://moniwiki.kldp.org]}}}라고 적으면 [http://moniwiki.kldp.org]와 같이 '''강제'''로 링크될 URL을 지정해줘서 자동으로 링크가 걸리지 않게 합니다. 강제로 링크를 걸러줄 경우는 모니위키에서는 그 링크 앞에 작은 지구 아이콘이 생깁니다.
모니위키는 페이지 이름을 넣는 여러가지 링크방식을 제공합니다.
/!\ 이 문법은 매크로 문법과 충돌합니다. 예를 들어 {{{[[Date]]}}}라고 링크를 걸면 Date가 링크가 되는 대신에, Date 매크로가 호출되게 됩니다. 따라서 영문으로 된 페이지 이름을 연결할 경우는 매크로 이름이 중복되어 있다면 이중 대괄호로 링크를 걸 수 없습니다.
공백을 포함하는 임의의 페이지 이름을 연결하고 싶은 경우가 있습니다.
위키위키에서는 외부의 위키 혹은 위키위에 준하는 다른 사이트를 좀 더 쉽게 연결하는 문법을 제공합니다. 예를 들어, {{{http://moniwiki.kldp.org/wiki/FrontPage}}}라고 링크를 거는 대신에 {{{MoniWiki:FrontPage}}}라고 링크를 걸면 MoniWiki:FrontPage 처럼 표시가 됩니다. 이를 인터위키 연결이라고 합니다.
앞부분에서도 언급한 내용이지만, 자동으로 링크가 걸릴 경우 URL 주소 되에 공백을 넣어주거나, <http://moniwiki.kldp.org/wiki.php/FrontPage>와 같이 연결해주어야 합니다. 정리해보면
* URL뒤에 공백을 넣는다.
- HelpOnLists . . . . 11 matches
숫자가 매겨진 리스트와 총알 리스트를 아주 자연스럽게 입력하실 수 있습니다. 총알 리스트를 만들고 싶으시면 그 줄의 첫 시작을 "{{{[공벡]*}}}"로 시작하여 써주시면 됩니다; 숫자가 매겨진 리스트는 그 줄의 시작을 {{{[공백]1.}}}으로 시작하시면 됩니다.
만약 공백을 넣어 들여쓰기만 하고 {{{*}}}나 번호리스트를 지원하는 {{{1.}}} {{{a.}}} 이외의 다른 문자가 온다면, 그 단락은 들여쓰기된 단락으로 인식됩니다.
공백을 하나 넣어 새로운 들여쓰기
단락을 만들었습니다.
이번에는 공백을 더 넣어
새로운 단락을
공백을 하나 넣어 새로운 들여쓰기
단락을 만들었습니다.
이번에는 공백을 더 넣어
새로운 단락을
- HelpOnProcessors . . . . 4 matches
다음과 같이 코드 블럭 영역 최 상단에 {{{#!}}}로 시작하는 프로세서 이름을 써 넣으면, 예를 들어 {{{#!python}}}이라고 하면 그 코드블럭 영역은 {{{plugin/processor/python.php}}}에 정의된 processor_python()이라는 모니위키의 플러그인에 의해 처리되게 됩니다. {{{#!python}}}은 유닉스의 스크립트 해석기를 지정하는 이른바 ''bang path'' 지정자 형식과 같으며, 유닉스에서 사용하는 목적과 동일한 컨셉트로 작동됩니다. (즉, 스크립트의 최 상단에 지정된 스크립트 지정자에 의해 스크립트의 파일 나머지 부분이 해석되어 집니다.)
이러한 방식으로 모니위키는 여러가지 다양한 프로세서 플러그인을 지원하고 있습니다.
프로세서중에 특별히 코드 블럭의 문법을 강조해주는 코드 컬러링 기능을 가진 프로세서를 가리켜 CodeColoringProcessor라고 불리입니다.
- HelpOnRules . . . . 1 match
/!\ 가로줄의 굵기는 문서의 통일성을 해칠 수 있으므로 옵션으로 제공합니다. config.php에 {{{$hr_type='fancy';}}}라고 하면 가로선의 굵기가 지원됩니다.
- HelpOnUpdating . . . . 9 matches
/!\ '''위키를 업그레이드 하기 전에 꼭 백업하세요!''' 특별한 경우가 아니라면 기존의 데이타를 잃게 되거나 하지는 않으나, 아주 사소한 실수로 예전의 데이타를 잃을 가능성도 있습니다. @)
MoniWiki는 기본적으로 backup과 restore 액션을 지원하므로 다른 사이트로 이전하는 것을 쉽게 할 수 있으며, rcs를 설치하지 않은 위키에 대해서도 정기적은 backup만으로 자신의 위키 데이타를 비교적 안전하게 보존할 방법을 제공합니다.
upgrade.sh가 하는 일은, 위키 엔진(*.php)을 업데이트하고, 기존의 위키엔진을 사용자가 변경하거나 해서 사용하고 있던 *.php는 없는지 검사하고 사용자가 변경한 *.php파일이 있다면 백업해줍니다.
아래는 upgrade.sh를 사용하지 않고 수동으로 직접 업그레이드 하는 방법을 설명합니다.
wiki.php, wikilib.php는 가장 중요한 위키엔진입니다. 이것과 함께 wikismiley.php lib/*.php plugin/*.php 등등의 파일을 새것으로 교체합니다.
다음은 css/*.css imgs/* theme/* 등등의 파일을 업데이트합니다. 기존에 사용자가 변경한 파일이 있다면 반드시 백업하시기 바랍니다.
- HelpOnUserPreferences . . . . 12 matches
위키위키를 여행하시는데에 사용자 등록을 하시면 편리합니다. 사용자 등록을 마친 후에는 우상단의 아이콘에 [[Icon(home)]]이 보이게 되며, 자신만의 [위키홈페이지]를 만들어 보실 수도 있습니다.
* '''[[GetText(Password)]]''': 비밀번호는 다른사람이 쉽게 알거나 추측할 수 없는 것을 사용하시기 바랍니다.
* 웹상의 비번은 쉽게 노출될 가능성이 많으므로 가능한 노출되어도 큰 문제가 되지 않을 비밀번호를 사용하시기 바랍니다.
* '''[[GetText(Email)]]''': 자주 쓸 이메일 주소. 이메일 주소를 넣어주면 원하는 위키페이지에 대하여 그 변경점을 구독신청하거나 취소하실 수 있습니다. 비밀번호를 잊으셨을 경우에도 이 이메일 주소를 사용해 새로운 비밀번호를 등록하실 수 있습니다.
* 시스템의 기본 설정에 따라서는 테마 변경을 지원하지 않을 수도 있습니다.
* '''[[GetText(User CSS URL)]]''': 자신이 원하는 CSS로 변경하고 싶을 경우에 사용합니다.
* 시스템의 기본 설정에 따라서는 CSS변경을 지원하지 않을 수도 있습니다.
* '''[[GetText(Quick links)]]''': 최상단에 있는 메뉴에 자신이 원하는 링크를 추가하거나 원하는 위키페이지에 대한 링크를 넣을 수 있습니다. QuickLinks 페이지를 참조해주세요.
- I2C . . . . 15 matches
* 클럭(SCL)과 데이터(SDA)의 2라인을 사용하는 동기 양방향 2선식 Bus.
* master : 전송을 개시하는 장치로 클럭 펄스를 만들고, 전송을 종료하는 장치
* master가 start condition을 만들면 버스에 연결된 slave 장치들이 이후 데이터를 기다린다.
* address가 일치한 장치는 acknowledge 신호 구간에서 데이터를 low로 유지해 응답을 보낸다.
* 모든 작업이 끝나면 마스터는 stop condition을 발생하고 버스를 release한다.
(클럭은 일정한 duty 사이클을 유지할 필요는 없다.)
* 클락이 Low일때 값을 변화 시키고
* 클락이 HIGH일때는 값을 유지 시켜야 함.
* master는 먼저 데이터 라인을 적당한 상태로 바꾸고 클럭 라인을 high로 한다.
* master든 slave든 transmitter는 8bit전송을 마치고 버스선을 high로 한다.
* 9번째 사이클 동안 receiver는 데이터 선을 low로 유지해서 acknowledge를 표시한다.
* SCL이 HIGH인 동안, slave칩에서 응답한 값을 읽어오는 형식이다.
- IPIPE . . . . 2 matches
IPIPE는 다음 세가지 처리 과정을 갖는다.
1. IPIPE는 CCD에서 원시 데이터를 얻어와 IPIPE의 모든 기능 블럭을 통과해 YCbCr(or RGB) data를 SDRAM에 저장 한다.
- IPNC_DHCP . . . . 2 matches
YAFFS를 사용할 경우 uboot에서 DHCP를 통해서 IP를 할당 받도록 커널에게 알려줘야 IP를 할당 받을 수 있음.
ip=dhcp로 되어 있어야 동적 할당을 받음.
- IPNC_EVM3 . . . . 5 matches
기존에 GPIO22~29번을 사용하고 있었던 것으로 추측
* '''mux_cfg.c 에서 dm365_pins에서 SPI 핀 설정을 수정한다. '''
* '''davinci_spi_platform.c 에서 SPI1을 사용하기 위해서 SPI 베이스 주소를 변경한다.'''
* '''davinci_spi_platform.c 에서 SPI1을 사용하기 위해서chip_select 설정을 변경한다.'''
- IPNC_filesystem . . . . 2 matches
target을 nfs로 부팅한 후, target에서 다음 컨맨드를 수행해서 yaffs file system을 업데이트 한다.
- IPNC_flash_utils . . . . 1 match
소스는 카메라 패키지 안에 들어 있다. 패키지에서 '''flash-utils''' 만을 받기 위해서는 다음의 url를 사용한다.
- Inception_GoogLeNet . . . . 64 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을 수행합니다.
* 보통 Conv 연산을 통해서 W, H의 크기는 줄이고 C는 늘리는 형태로 네트워크를 구성한다.
* (b) 그림에서 처럼 1x1 Conv 연산으로 C를 먼저 줄이게 되면 연산량을 줄여서 계산할 수 있다.
* Inception 모듈을 활용한 최종 모델은 아래와 같다.
* 레이어 초반에는 인셉션 모듈이 들어가 있지 않다. 이 영역을 Stem 영역이라고 하고, 실험을 통해서 초반에는 인셉션이 별로 효과가 없어서 사용하지 않았다고 하는데, __초반 Raw 데이터로 부터 정보를 추출하는 부분이 중요한 역할을 하는 것으로 보임__
* 그림 중간에 보이는 노란색 블록은 네트워크가 깊어짐에 따라 발생하는 vanishing 문제를 해결하기 위해 중간 층에서도 Backprop을 수행하여 weight를 갱신을 시도하는 것임. (Inception v2, v3에서는 보조 softmax가 별로 효용 가치가 없다고 해서 맨 앞단 softmax는 제거함.)
이러한 자기반성을 통해서 더 작은 단위의 conv를 사용하자는 결론으로 아래와 같은 시도를 함.
* N x N 형태의 Conv를 1 x N과 N x 1로 Factorization 하는 기법을 사용했다. 앞서 5x5를 3x3 2개로 분해 한 것을 다시 분해하여 위의 형태로 풀어서 계산할 수 있다. 이렇게 하면 연산량은 줄이면서 Non-linear 성분은 더 많이 사용할 수 있게된다.
기존에 해상도 (Resolution, Grid size)를 줄이는 방법은 Convolution 시 Stride를 1보다 큰 값으로 두거나 Pooling을 사용하는 것이었다. 그렇다면 다음 두 가지 방법 중 어떤 방법이 더 효과적인 방법일까?
왼쪽 방식은 Pooling으로 크기를 먼저 줄이고, Inception을 적용하여 Feature map을 얻는다. 연산량 관점에서는 효율적이지만 Pooling으로 인해 기존 Feature map에 숨어 있는 정보가 사라질 수 있기 때문에 최적이라고 하기는 어렵다.
반면, 오른쪽 방식은 Inception을 먼저 적용하여 Feature map을 생성한 후 Pooling으로 Feautre map의 크기를 줄이는 방법이다. 당연히 연산량은 약 4배 늘어나지만 줄이지 않은 상태에서 Feature를 추출했기 때문에 숨은 Feature를 더 잘 찾아낼 수 있게 된다.
- InterMap . . . . 3 matches
# 아래 인터위키 Uploads:는 노스모크 모인모인식 파일 연결을 지원하기 위함입니다.
# 아래의 문법을 쓰지 마시고, attachment: 문법을 사용하시기 바랍니다.
- IsbnMap . . . . 15 matches
IsbmMacro에서 사용하기 위해 다음과 같은 방식으로 ISBN을 등록하실 수 있습니다.
가 안됩니다. 어쩌면 좋을까요?
알라딘 같은 경우 품절이나 재발매 등으로 ISBN이 새로 배정됐을 때, 그림은 예전 껄 그대로 가져다 씁니다.
이런 경우, 어떤 식으로든 그림의 주소를 전달하는 방식을 만들 수 있을까요?
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 . . . . 2 matches
mount시에 super_block을 할당받지 못하면 그냥 mount fail로 끝나도 상관없으니, GFP_KERNEL option으로 kmalloc을 호출할 필요없이 그냥 GFP_USER를 사용해도 충분하다 정도로 이해하려 합니다.
- Kernel컴파일하기 . . . . 8 matches
리눅스 커널을 컴파일하는 과정에 대해서 알아본다.
1. 최신 커널을 구한다.
사랑넷은 국내 사이트이지만 접근이 되지 않는다. 로그인을 해야 하는데..
2. 다운로드 받은 파일의 압축을 푼다.
커널의 컴파일 옵션을 설정하는 방법은 make menuconfig 이외에 make config, make xconfig가 있지만 지금 사용할 방법은 make menuconfig이다.
== make menuconfig을 사용한 커널 컴파일 옵션 설정하기 ==
(arch/arm/configs/ 폴더에 xxxx_defconfig에 있는 설정 값을 갖고 오는 것)
주위) 컴파일 옵션을 잘 못 설정하면 컴파일이 안 되거나 부팅이 안 될 수 있음
- LAPACK . . . . 7 matches
http://www.netlib.org/lapack/ 에서 최신 릴리즈 버번을 받을 수 있다.
현제 가장 최신 버전을 받아서 압축을 풀면
lapack은 cmake 형식으로 배포 되기 때문에 컴파일을 하기 위해서는 gfortran와 cmake가 필요하다.
libblas.a 가 없을 경우 BLAS 드렉토리로 이동해서
make; make install을 수행해 줘라!!
- LMA_Levenberg_Marquardt . . . . 90 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 방법이 결합된 형태로 볼 수 있기 때문입니다. 그리고 당연히 최소자승법에 대한 이해도 필요합니다.
관련하여 먼저 아래의 글들을 읽어보면 도움이 되리라 생각합니다.
이 글에서는 먼저 위 내용들을 포함하여 관련 내용들을 전반적으로 정리한 후 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\)의 분산).
이 때 위 식의 에러합 부분을 행렬 형태로 표현하면 다음과 같다.
그런데 선형(linear) 최소자승문제의 경우에는 벡터미분을 이용하여 이러한 해를 직접적으로 구할 수 있다 (closed-form solution이 존재).
벡터미분을 이용하여 \(E(p), E_w(p)\)를 p로 미분한 후 0으로 놓으면
'''음함수 최소자승법''' 만일 모델이 양함수(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의 열벡터가 된다. 자세한 내용은 선형연립방정식 풀이 글 참조.
이상과 같이 선형(linear) 최소자승 문제의 경우에는 pseudo inverse나 SVD(singular value decomposition)을 이용하면 해를 손쉽게 구할 수 있다. 하지만 비선형(non-linear) 최소자승 문제의 경우에는 closed-form solution이 없기 때문에 점진적으로 해를 찾는 방법(iterative minimization)을 사용해야 한다. 즉, 어떤 초기값 p0에서 시작해서 점차적으로 E(p)를 최소화시키는 방향으로 p를 갱신하는 방법을 사용해야 한다. 그리고 이러한 iterative minimization 기법으로는 아래에 설명할 gradient descent 방법, 가우스-뉴턴법, Levenberg-Marquardt 방법 등이 있다.
어떤 다변수 함수 \(E(x_1,x_2,...,x_n)\)이 있을 때, E의 그레디언트(gradient)는
로 정의되며 함수값이 가장 가파르게 증가하는 방향을 나타낸다. 그리고 그레디언트의 크기는 그 증가의 가파른 정도를 나타낸다.
☞ 여기서 다변수 함수라는 말을 어렵게 생각할 필요는 없으며 예를 들어 사람의 외적인 아름다움이 키와 팔의 길이, 다리의 길이로 결정된다고 했을 때, '아름다움 = f(키,팔길이,다리길이)'와 같이 함수값이 여러 요인에 의해 결정된다는 의미이다. 키, 팔다리 길이와 아름다움의 관계를 실제 구하는 것은 어렵겠지만 만일 그 관계가 예를 들어 'f(키,팔길이,다리길이) = 키^3 - 팔길이^2 + 다리길이^2'라 한다면 f의 그레디언트는 ∇f = (3*키^2, -2*팔길이, 2*다리길이)가 된다. 따라서 어떤 사람 A의 키, 팔길이, 다리길이가 키 = 1, 팔길이 = 0.5, 다리길이 = 0.7과 같다면 A 위치에서의 그레디언트 값은 (3, -1, 1.4)이므로 현 시점에서 이 사람이 가장 아름다워지는 방향은 3:1:1.4의 비율로 키는 증가하고 팔길이는 감소, 다리길이는 증가하는 방향이다.
Gradient descent 방법은 아래 식과 같이 어떤 초기값 \(x_0 = (x_1^{(0)}, \cdots, x_n^{(0)})\)부터 시작하여 그레디언트의 반대 방향으로 계속 내려가다 보면 함수의 최소값을 찾을 수 있다는 방법이다 (자세한 내용은 [:Gradient_Descent Gradient Descent 탐색 방법] 글 참조).
만일 함수의 최대값을 찾고 싶을 경우에는 \(X_{k+1} = X_k + \lambda_k \nabla E(X_k)\) 형태의 gradient ascent 방법을 사용한다.
이제 gradient descent 방법을 앞서 설명한 최소자승 문제에 적용해 보자. 선형 최소자승 문제의 경우에는 gradient descent 방법과 같은 근사적 방법을 사용할 필요가 없이 직접 해를 구할 수 있으므로 여기서는 비선형 최소자승 문제에 한해 생각한다. 관측값을 \((x_i, y_i), i=1, \cdots,n\), 모델 파라미터를 \(P = ( p_1, p_2, \cdots, p_m) \), 모델을 \(y = f(x, P)\), 오차(residual)를 \(r(x,P) = y - f(x,P)\)라 하면 최소화시키고자 하는 목적함수는 다음과 같다.
그 원리는 미분이 접선의 기울기임을 이용하여 현재의 x에서 E(x)의 부호와 기울기 E'(x)의 부호에 따라 x를 증가시킬지 감소시킬지를 결정하고 그 기울기의 크기에 따라서 x를 얼마나 많이 증가(감소)시킬지를 결정하는 방식이다.
만일 뉴턴법을 함수 E(x)의 최소(최대)값을 찾는 최적화(optimization) 문제에 적용할 경우에는 다음과 같이 E'(x) = 0의 해를 찾는 문제로 식을 변형하여 적용할 수 있다.
- LVC_2016_Fall_Glasgow . . . . 4 matches
글래스고에 도착하고 이틀이 지나서 이글을 작성한다.
학회장소는 hillhead쪽에 위치한 힐튼 호텔로 약간은 외진곳에 위치해서 조용하고 주번에 갈만한 곳을 찾기 힘들다.
9월의 글래스고 날씨는 우리나라 늦가을 정도의 날씨로 쌀쌀한 편으로 밤낮의 일교차는 그리 크지 않다. 하지만 전반적으로 비에 대한 기후변화가 커서 따뜻한 옷을 준비해서 다녀야한다.
- LaTex_guide . . . . 23 matches
TeXLive와 ko.tex을 한꺼번에 설치할 수 있습니다.
* 압축을 해제하면 현재 디렉토리에 install-tl-XXXXXXXX라는 하위 폴더가 생긴다. (XXXX는 날짜)
* 새로 생긴 하위 디렉토리로 cd하여 다음 명령을 실행한다.
* 계정 사용자: 자신이 제어할 수 있는 위치에 설치할 것을 권장한다. 예를 들면 ~/.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(아이)를 눌러서 설치를 시작한다.
MacTeX을 설치하시거나
명령을 내리시면 ko.tex이 설치됩니다.
명령을 내리시면 현재 (또는 destination) 디렉토리에 기술보고서 양식을 받아볼 수 있습니다.
양식을 만들기 위해서 대충 채워넣은 것이고 여기 있는 내용은 항목 빼고는 다 지우면 됩니다.
윈도우 사용자는 MikTeX을 내려받아서 설치하고 사용하시면 됩니다.
- LaTex_syntax . . . . 13 matches
2. Tex에서는 보통 eps파일의 확장자를 가진 그림을 흔히 삽입하곤 하는데 아래 문구를 넣는다.
3. 그 아래 begin~end 부분은 실제 그림이 들어가는 부분이다. 보통 본문에서 그림에 대한 언급을 하는 문장이 속한 paragraph 아래에 넣는다.
!는 기존 설정을 무시하고 본 설정을 적용하라는 뜻
t (top)는 그림을 본문의 상단에,
즉, 보통 논문은 two-column인데 큰 그림의 경우 두 column을 모두 써야할 경우가 있다.
이 경우 figure 대신 figure*를 사용하여 그림을 두 column에 걸쳐 크게 넣는다.
column 폭의 두배로 그림을 넣되, 현재 폴더 내에 위치한 하위폴더인 fig 폴더의
fig_pmat.eps 파일을 넣는다.
columnwidth 말고 textwidth로 하면 다소 크게 넣을 수 있다.
columnwidth 말고 수치를 직접 입력할 수도 있다. 예를 들어 그림 폭을 20cm로 하려면
scale을 이용하여 배율 조정도 가능하고, angle로 회전도 가능하다.
\label{fig_pmat}: 본문에서 본 그림을 참조할 때 쓰인다.
- Ligo_clientLigo-client설치 . . . . 2 matches
LIGO Certification을 사용 해서 KISTI에 있는 ldg-ui.sdfarm.kr에 접속하기 위해서는 LIGO Client를 설치해줘야 한다.
이렇게 하면 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]
- Linux_device_DMA . . . . 25 matches
최신의 PC에서는 DMA 대신 '''버스 마스터링'''이라는 방식을 지원하는 PCI 버스를 많이 사용하기 때문이다.
프로세서로 부터 로컬 버스 제어권을 넘겨 받아 DMAC(Direct Memory Access Controller)가 데이터 전송을 하게 되고 데이터 전송이 끝나면
로컬 버스 제어권을 프로세서에게 넘기고 프로세서에게 전송을 끝났음을 인터럽트로 알려 준다.
DMA는 대부분 채널로 구성되는데, 이 채널을 데이터를 전송하는 기본 단위이고, 하나의 채널은 다음과 같이 구성된다.
보통 하나의 DMAC에서 여러 채널을 관리하는데, DMA에 채널이 있는 이유는 여러 디바이스에 DMA 전송을 동시에 수행한다는 개념이 아니고,
리눅스는 디바이스 드라이버에서 DMA를 다룰 수 있는 여러 함수를 지원한다. 하지만 DMA의 구현 방식이 시스템마다 다르기 때문에 DMA 처리와 관련된 함수나 구조체를 리눅스에서 완벽하게 표준화 하는 것은 무리가 있다. 따라서 공통 함수군을 벗어난 처리는 디바이스 드라이버에서 직접 처리해 줘야 한다.
디바이스 드라이버가 DMA를 사용하기 위해서는 가장 먼저 DMA 채널에 대한 소유권을 등록해야 한다. 이 소유권 등록은 디바이스 파일이 열렸을 때 호출되는 open() 함수에서 처리 한다.
반대로 디바이스 파일이 닫혀서 더 이상 DMA 채널을 사용하지 않는다면 채널 소유권을 반환해야 한며, release() 함수에서 처리한다. 소유권의 등록과 반환은 다음 함수를 이용해 처리한다.
request_dma()함수는 DMA 채널에 대한 소유권을 요구하는 함수다.
* dmanr : 사용하려는 DMA 채널을 지정.
* device_id : DMA 채널을 소유한 것을 proc 파일 시스템에 표시하기 위해 사용하는 문자열.
최근에 사용되는 PC 시스템은 대부분의 경우 PCI 시스템을 사용하기 때문에 4번 채널에 대한 내용만 볼 수 있다. 4번은 실제로는 사용되지 않는 채널이다. PC 시스템은 DMAC 두 개가 마스터 슬레이브 관계로 연결되어 총 8개의 DMA 채널을 제공하는데, 이중 4번은 마스터와 슬레이브 관계를 연결하는데 쓰이기 때문에 실제로는 7개의 DMA 채널만 존재한다.
== 디바이스 파일이 열렸을 때의 DMA 처리 ==
DMA를 사용하는 디바이스 드라이버는 request_dma() 함수를 이용해 소유권 등록을 하고 DMA 처리를 위한 버퍼와 DMA 처리를 종료시킬 때 발생하는 인터럽트를 처리해야 한다.
이와 같은 처리를 위해 디바이스 파일을 열었을 때 호출 되는 open()함수의 형식은 다음과 같다.
== 디바이스 파일이 닫혔을 때의 DMA 처리 ==
- Linux_device_Dynamic_DMA_mapping . . . . 14 matches
드라이버의 도움을 통해서 리눅스에서 dynamic DMA mapping을 사용 할 수 있다. DMA address는 실제 사용하는 순간에 연결 되고 사용이 끝나고 해제 되도록 하자.
꼭 DMA를 위해서 vmalloc() 함수를 통해서 할당 받은 메모리 주소만을 쓸 필요는 없다.
당신의 장치는 DMA 주소 제한 있는가? 예로 24bit 보다 적은 주소만을 갖어야 하나?
Consistent DMA 영역을 할당 받기 위해서는 위와 같이 해야 한다. dev 인자는 어떤 장치에 할당 할지를 식별하기 위해 필요하다.
size는 할당 받을 영역의 크기를 말한다.
이 방법은 페이지 단위로 DMA 영역을 할당 받는다. 사용하려고 하는 메모리 사이즈가 페이지 보다 작으면 pci_pool 인터페이스를 사용하길 바란다.
DMA 영역을 돌릴때는 위와 같이 한다. dev, size 는 할당 받을 때와 동일하게 입력한다.
만약 작은 사이즈의 메모리 영역이 많이 필요하다면 pci_pool API을 사용하라.
방향을 확실히 모른다면 양방향 PCI_DMA_BIDIRECTIONAL을 선택하라.
단지 Streaming mapping 방법만 명확한 방향을 갖지 consistent mapping 방법은 PCI_DMA_BIDIRECTIONAL 을 사용한다.
- Linux_device_driver_GFP_kernel . . . . 1 match
GFP_USER 옵션은 메모리가 부족하게 되면 대충 fail을 반환하고 끝내 버리게 된다.
- Linux_device_module_basic . . . . 3 matches
모듈이 적제 되고 해제될때 호출 되는 함수들만 갖고 있는 간단하 모듈 프로그램이지만 이 간단한 부분을 잘 못 하게 되면 모듈이 적제 되고 해제 될때 문제가 발생하게 된다.
하지만 x윈도우나 telent과 같은 터미널에서는 printk로 출력되는 것들을 볼 수 없기 때문에
이 장에서는 그것을 알아보도록 하겠다. ㅎ
- Linux_environment_PATH . . . . 3 matches
그 환경 변수는 '''/etc/profile''' 을 복사해서 만들게 된다.
각 사용자는 자기 홈폴터 아래 .bash_profile이라는 파일을 생성해서 환경 변수를 선언해서 사용 할 수 있다.
{{{{color: rgb(255, 1, 1); font-size: 13px;} 주의 : .bash_profile을 작성할 때 공백이 있으면 안 된다. 공백이 있게 되면 하나의 명령어로 받아 드려 에러를 낸다. }}}
- Linux_general_prompt_config . . . . 11 matches
또한, 프롬프트의 생각이랑 사용자가 입력한 명령의 구분이 명확하지 않아서 가독성이 떨어질 때 프롬프트의 색상을 변경하면 좋다.
예로 아래 명령을 입력해 보자
프롬프트의 색을 바꾸기 위해서는 ANSI 코드를 사용해야 하는데, 여기에 ANSI 코드표가 있습니다: ▶▶ [:Linux_general_prompt_config?action=show#s-3 ANSI Color Codes (안시/앤시 컬러 코드)]
각 코드의 앞에 \e 를 붙여야 하고, 코드를 중복시킬 때는 세미콜론(;)으로 구분하고, 끝낼 때에는 m 을 붙입니다.
가량 위의 예제에서, [32 는 '어두운 초록색'을 의미합니다. 이것을 '밝은 초록색'으로 만들기 위해, 세미콜론(;)을 찍고, 1m 을 추가했습니다.
0m 은, 모든 색을 초기화하는 것, 즉 검정 바탕에 밝은 회색 글자입니다.
[7m : 반전(글자색/배경색을 거꾸로)
[49m :바탕색을 기본값으로
- Linux_gtk_intro . . . . 5 matches
GTK와 Glade는 Linux환경에서 GUI 프로그램을 하기 위한 라이브러리쯤으로 이해 하고 있다.
ubuntu 에는 Software center라고 하는 패키지 관리툴을 제공하는데 glade로 검색하면
'''Glade Interface Desinger''' 라는 프로그램을 찾아준다. 이 프로그램은 GTK+를 이용해서 GUI 프로그램을 도와주는 프로그램이다.
Dependency 검사를 통해서 필요한 파일을 잘 설치해주는 Ubunte는 친절하게도 GTK+관련 패키지까지 몽땅 같이 설치해준다.
- Linux_gui_installation . . . . 1 match
원격터미널을 사용하기 위한 서버 설치
- Linux_iconv파일의언어설정변경Iconv설명 . . . . 9 matches
conv 로 데이터파일의 언어설정을 바꿀수 있습니다.
위와 같은 형식으로 변경이 가능합니다. -f 는 기존의 언어셋을 -t 는 변경할 언어셋을 설정해 주면 됩니다.
위에선 예제로 euckr 과 utf8 을 적어놨습니다. 하지만 iconv 의 지원언어는 엄청납니다.!
iconv -l 을 하게되면 지원가능한 언어가 좌르륵 나옵니다. 다만 변환을 위해서 기존언어가 어떤언어인지
주어진 파일의 인코딩을 한 인코딩에서 또 다른 인코딩으로 변환함.
iconv 로 다수의 파일을 인코딩 변경 하는 스크립트는 http://mindpower.kr/22 <- 여기에서^^
root로 로그인하면 윈도우에서 쓰던 EUC-KR 포매팅된 한글네임 디렉토리가 ????로만 보여서 로케일을 변경시키고자 한다.
- Linux_kernel_source . . . . 6 matches
이때, 어떻게 커널 소스를 갖고 오는지를 Ubuntu 환경을 기준으로 설명하겠다.
- # make menuconfig 명령으로 커널설정을 먼저 한다.
참고 : ncurses 가 없을 경우
패키지 목록을 읽는 중입니다... 완료
이들을 지우려면 'apt-get autoremove'를 사용하십시오.
이 작업 후 80.0M바이트의 디스크 공간을 더 사용하게 됩니다.
- Linux_kernel_system_call시스템콜이란 . . . . 8 matches
사용자가 OS에 기능을 요청하고 응답을 기다리는 방식이다.
사용자는 응용 프로그램 코드상에서 시스템 콜을 호출하면 사용자 모드에서 커널모드로 전환되어 운영 체제의 루틴을 수행한다.
* 커널 모드 : 프로세서의 특권 레벨(privileged level)로 프로세서의 모든 명령을 처리할 수 있고, 시스템 지원이나 하드웨어들을 직접 액세스 할 수 있다.
* 사용자 모드 : 일반 응용 프로그램이 동작하는 모드로 커널 모드와는 달리 비특권 레벨(nonprivileged level)이기 때문에 하드웨어나 시스템 자원을 직접 이용할 수 없고 시스템 콜을 이용해 접근해야 한다.
- Linux_openshot리눅스동영상편집프로그램OpenShot . . . . 1 match
동영상(http://vimeo.com/50513213)을 보시면 이해가 빠르실거라는..ㅋㅋㅋ
- Linux_pci_driver . . . . 1 match
각각의 숫자는 /proc/bus/pci 아래 드렉토리로 분류되어 표시 됨을 확인 할 수 있다.
- Linux_pci_driver_example . . . . 19 matches
리눅스 드라이버는 커널 버전에 따라서 중간 중간 많은 변화들을 격고 있는 것으로 보인다.
insmod : 커널에 모듈을 등록
rmmod : 커널에 등록된 모듈을 제거
modprobe : 모듈을 커널에 등록하거나 제거
드라이버를 module형태로 작성해 올렸을 때 사용자가 사용할 수 있는 파일 형태로 보여주기 위한 명령이 있다.
= Module 컴파일을 위한 Makefile =
||KERNERLDIR = /lib/modules/... ||모듈을 컴파일 하면서 참조할 커널 소스의 위치를 알려주는 곳입니다. ||
주의 : Makefile 작성에서 앞에 공백은 반드시 tab으로 띄어쓰기를 해야 합니다. 그렇지 않을 경우 에러를 방생하게 됩니다.
printk() 문으로 디버깅을 하려고 하는데 화면 출력이 안 되는 경우가 있다.
리눅스 시스템에서 모듈 프로그래밍을 할 때 printk()로 출력되는 문자열을 콘솔이 아닌
터미널에서 보고 싶은 사람이 있을 것입니다.
이 경우, 대개 syslog.conf 파일에 보면 kern.log 나 messages.log 파일에 저장되는 것을
볼 수 있습니다. 이를 바로 콘솔(console)로 출력하고 싶을 땐 /dev/console로 바꿔주면
됩니다. 하지만 이경우, x 윈도우를 사용하거나 putty 같은 클라이언트로 접속을 하게 되면
그런뒤 xterm -C 명령을 사용해서 콘솔 터미널을 시작하게 되면 커널 메시지가
기타 dmesg 명령과 /proc/kmsg 같은 파일을 열람하면 커널 메시지를 볼 수가 있습니다.
반대로 등록을 해지하기 위해서는 pci_unregister_driver() 함수를 이용한다.
- Linux_system_grub . . . . 4 matches
리눅스를 부팅할때 커널을 고를 수 있다. 이때 내가 사용하고 싶은 커널이 구버전일 때
이 파일을 보면 부팅하면서 보여지는 순서대로 커널 정보들이 들어 있다. 가장 앞에 있는 것이 '0'번이고 차례대로 아래쪽으로 붙어 있다.
여기서 부팅하려는 커널의 순번을 확인하고
GRUB_DEFAULT = 6 이 값을 원하는 값으로 수정하면 된다.
- Linux_system_syslog.conf . . . . 5 matches
리눅스 시스템은 로그 메세지를 관리하는 메카니즘을 제공하는데 그것을 로그 시스템이라고 한다.
printk()함수의 출력을 console에서 보고 싶었으나 잘 되지 않았다. ㅠ
결국은 /var/log/kern.log 파일을 살펴 보았다.
사용하면서 좋았던 기능 중에서 tail과 grep의 조합으로 원하는 로그만 출력해서 볼 수 있는 기능을 소개 한다
- Linux_ulimit_commandUlimit명령어 . . . . 38 matches
/etc/security/limits.conf 를 참조해서 사용자마다 프로세스 사용과 메모리 사용에 제한을 두고 있는데 이것을 변경하기 위한 명령으로
'''ulimit'''을 사용한다.
이 글은 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의 수도 증가했음은 물론이다.
-a 모든 제한 사항을 보여준다.
소프트 한도(soft)는 새로운 프로세스가 만들어졌을 때 디폴트로 적용되는 자원의 한도이다. 이것을 하드한도까지 등가시킬 수 있다. 그렇지만 이 한도를 넘어서 확장하는 것은 슈퍼유저만이 가능하다.
-> 절대 아니다. 이건 커널차원에서 지정을 해야 한다.
위에서의 각 항목을 살펴보자면…
의 뜻을 가지고 있다.
1. 소스파일을 수정한 후, 커널 재컴파일을 하는 방법.
3. /etc/security/limits.conf 파일을 수정하는 방법
하지만 /proc 를 사용하여 시스템 설정을 변경할 경우, 매 부팅시 설정을 다시 해주어야 한다는 단점이 있다.
/etc/rc.local 파일을 이용하여 명령어를 설정하던가 아니면 다음에 나오는 limits.conf 파일을 이용하도록 한다.
제일 아래 ‘oracle’ 과 같이 따로 설정된 부분과 같이 변경하면 된다. 이렇게 설정할 경우, 매 부팅시 자동 적용되어 별도로 적용하지 않아도 된다. 또한, 각각의 유저마다 다른 설정을 적용할 수 있으므로 보안 및 관리에도 용이하다.
# 마지막으로 프로세스에서 열어놓은 파일을 확인하는 방법에 대해 알아보자.
결론적으로 lsof 프로그램을 이용하면 된다.
- Linux_vim_hexcode . . . . 1 match
(1) 현재 파일을 헥사 모드로 전환 명령:
- Linux_vimrc . . . . 11 matches
vim을 사용하다 보면 나만의 특별한 설정이 필요할 때가 있다. 그 설정은 .vimrc 파일을 통해서 가능하다.
.vimrc 파일을 홈드렉토리에 생성하면 된다.
넘버링을 해주는 옵션
soft tab stop : Tap 키를 눌렀을 때 표시 되는 간격을 지정
tags에 저장된 것을 자동완성 해줌
syntax on 문법을 채크에서 칼라로 보여주는 기능
들여쓰기 설정 : 앞줄과 동일하게, C 문법에 맞게 들여쓰기, C 문법에 맞게 들여쓰기에 사용자에 따른 설정을 할 수 있다.
set autoread " 작업 중인 파일 외부에서 변경됬을 경우 자동으로 불러옴
" 파일 인코딩을 한국어로
- Linux_xwindows_shout_cut_keys . . . . 5 matches
{{{ 리눅스 윈도우는 기본적으로 멀치 화면을 제공한다. MS 윈도우와 비교했을때 큰 강점이라고 할 수 있는데
이 화면들을 자유롭게 이동 하는 단축키가 있다.
X11 데몬을 종료하고 싶을 때는
- List_license라이센스리스트 . . . . 2 matches
권고사항 - 다운받으신후 폴더에 압축을 푼 후 설치 하시기 바랍니다.(zip파일 더블클릭 후 설치시 오류나는 경우가 있습니다.)
Crack 폴더안에 있는 DLL 파일을 덮어 씌우세요.
- LocalKeywords . . . . 12 matches
누르면 바랍니다 비밀번호는 설정을 을 쿠키가 1
누르면 바랍니다 비밀번호는 설정을 을 쿠키가 1
누르면 바랍니다 비밀번호는 설정을 을 쿠키가 1
누르면 바랍니다 비밀번호는 설정을 을 쿠키가 1
누르면 바랍니다 비밀번호는 설정을 을 쿠키가 1
누르면 바랍니다 비밀번호는 설정을 을 쿠키가 1
- MCMC_index . . . . 61 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_i\)가 \(\theta_1, \theta_2, \theta_3, \cdot, \theta_n\)중 하나라고 했을때 다음이 성립하게 됩니다.
\(x\)라는 관측 데이터가 관측 되었을때 가장 높은 확률을 갖는 \(\theta\)를 찾을 수 있다.
이런 경우에 Markov Chain Monte Carlo라는 방법을 사용한다.
== 모델을 고려할 경우 ==
위에서 단일 모델의 경우의 베이지안 모델을 봤다면 이 번엔 각 모델에 가설 \(\def \hypo {\mathcal H} \hypo \)를 포함해서 생각해보자.[* https://link.aps.org/doi/10.1103/PhysRevD.91.042003]
가설\(\hypo\)에서 관측값 \(x\)가 발견되었을 때 Parameter 가 \(\theta\)일 확률을 구하면 아래와 같이 표현할 수 있다.
식 1)을 이용해서 관측값 \(x\)가 발견 되었을 때 가설 \(\hypo_i\)와 \(\hypo_j\)중 어느 것이 우세한가를 비교하면 아래와 같이 표현할 수 있다.
베이지안은 일반적으로 현상을 표현하는 '''latent variable'''을 가정한다.[* (29 Oct 2014). <http://enginius.tistory.com/514>]
현상, 혹은 관측을 Y라 하고, 이 현상 혹은 관측의 원인을 X라 했을때 다음 세 가지를 정의한다.
이것의 의미하는 것은 어떤 의도가 주어졌을 때 현상이 일어날 확률이다.
베이지안의 주된 목적은 바로 이것을 구하는 것이다. 다시 말해서 우리에게 현상이 주어졌을 때 원인을 찾는 것이다. 예를 들면 누가 웃고 있을 때 과연 이 사람이 슬픈지, 기쁜지를 알아내는 것이다. 이는 단순히 Likelihood를 계산하는 것과는 다르다. 현상에서 원인을 '역으로' 맞추는 것이기 때문에 추가 정보가 필요하다. 이것이 Prior이다. 이는 해당 사람이 평소 슬픈지, 기쁜지에 대한 사전 정보이다.
그리고, 위의 식들을 하나로 묶는 것이 바로 베이즈 법칙이다.
말로 풀어서 설명하면 어떤 사람이 울고 있을 때 이 사람이 기쁠 확률은
을 곱해서 구해진다.
{{{여기서 한 가지 주의할 점은 비례한다는 것이다. 정확한 확률 분포를 구하기 위해서는 normalize를 해줘야하고, 이는.. 어렵다! 특정 Likelihood와 Prior가 곱해졌을 경우 Posterior를 쉽게 구할 수 있는 경우가 있는데 이런 Prior를 Conjugate Prior라고 한다. 대표적인 예로는 가우시안-가우시안+인버스 감마, 디리클레-멀티노미알 등이 있다. 자세한건 위키를 참고하면 된다.}}}
40대 여성이 건강검진을 받았는데 의사가 유방암 진단을 내렸다.
그렇다면 유방암진단을 받은 이 여성이 실제 암에 걸렸을 확률은 얼만일까?
- MIB . . . . 7 matches
1.3.6.1.2.1.7.1.0 (참조는 Object ID에 “.0”을 추가)
i. MIB-1과 MIB-2에서는 규정되어 있지 않으나, 장비 제조 업체가 가지고 있는 독자적인 기능을 SNMP에서 관리 할 수 있도록 정의한 것
ii. MIB을 구연하기 위해서는 IANA에서 OID를 부여 받아야 된다.
1. ASN.1(Abstract Syntax Notation)을 사용
* 데이터와 데이터의 속성들을 설명하기 위한 공식 언어
1. 정의된 모든 객체는 name, syntax, encoding을 가짐
* encoding : 객체의 데이터가 어떠한 비트 패턴으로 전송 되는가? (SNMP는 ANS.1의 encoding rule중 BER을 사용)
- MMPC_CCPV&IPNC . . . . 2 matches
1. [:20100802_ipnc_osd IPNC OSD 출력을 위한 작업(작업중)]
1. [:HDCCTV_2M_SONY YUV입력을 YUV로 출력하기]
- MPI . . . . 3 matches
분산 메모리 환경 병렬 프로그래밍 모델의 표준으로 인정받고 있는 MPI에 대한 기본적인 개념들을 알아보자.
---기본적인 thread 기능만을 활성화 한 상태 입니다. progress-thread 의 경우 아직 문제가 있는 것 같습니다. 또한 intel compiler 와 같이 사용할 경우 정상적인 실행이 되지 않았습니다. --- {{{{color: rgb(255, 1, 1); font-size: 13px;} 2007년도 커맨트 지금은 정상으로 보임!}}}
패스설정 (사용계정을 moon으로 가정)
- Mame . . . . 11 matches
흔히 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를 받아서 클릭하면 압축 파일을 추는데 그때 압축 파일을 푸는 경로에 파일이 복사되고 별도의 추가적인 설치과정 없이 실행 가능하다.
게임롬은 저작권 문제로 구하기 쉽지 않지만 인터넷에 잘 찾아보면 찾을 수 있다. 힘들지게 게임롬 파일을 찾았다면 mame 폴더 아래 roms라는 폴더를 만들고 넣어주면 된다. 게임롬 파일은 주로 zip파일 형태로 압축되어 있다. 압축된 상태로 넣어주면 된다.
chb파일은 게임 구동 데이터 외에 비디오나 배경음 오디오트랙등을 저정한 bin/cue 계열의 이미지를 하나의 파일로 관리 하기 위해서 사용되었다. 오디오트랙이나 비디오 트랙을 압축할 수도 있고 복구 할 수도 있다.[* <https://gall.dcinside.com/mgallery/board/view/?id=emugame&no=935>]
보통은 만들어진 chb파일을 인터넷에서 구해서 사용하게 되는데 사용하다보면 mame 버전이 업데이트 되면서 구동이 안 되느데 아래와 같이 최신 버전의 mame에 포함된 chdman.exe 파일을 이용해서 변환해주면 된다.
- MoniWiki/HotKeys . . . . 3 matches
적수네 동네에 있던 기능을 GnomeKorea, KLE에서 쓰도록 개선시킨 것을 내장시켰다.
마우스 없이 거의 모든 기본적인 동작을 HotKeys로 쓸 수 있다.
- MoniWikiACL . . . . 19 matches
* 일부 POST액션은 관리자 비밀번호로 제한을 걸어둘 수 있는 액션은 protect 가능한 액션입니다. protect 액션은 ''제한된 allow''이며, 일부 POST액션만 지원합니다. 예) do_post_savepage()는 post 액션이며, 일반 do_goto()같은 액션과는 달리 관리자 비밀번호로 액션을 제한을 할 수 있습니다.
지정 방법은 {{{*}}}는 모든 액션을 가리키며, 페이지 이름은 regex가 가능합니다.
* @ALL deny * // 모든 페이지(*)를 모든 사용자(@ALL)에서 모든 액션(*)을 거부(deny)
* @ALL allow ticket // 모든 페이지를 모든 사용자에게 ticket 액션을 허락(allow)
// WikiSandBox 페이지를 @Guest 그룹에 edit,info,diff 액션을 허용(allow)
// 모든 페이지(*)를 모든 사용자(@ALL)에서 모든 액션(*)을 거부(deny)
// 모든 페이지(*)를 모든 사용자(@ALL)에게 ticket 액션을 허락(allow) ticket은 가입 폼에 나오는 로봇가입방지 captcha
// WikiSandBox 페이지를 @Guest 그룹에 edit,info,diff 액션을 허용(allow)
// 모든 페이지(*)에 대해 모든 사용자의(@ALL) detetefile,deltetepage 등등의 protect 가능한 액션을 protect
// MoniWiki 페이지를 @ALL 모든 사용자에게 edit,upload,diff등의 일부 액션을 거부
* {{{allow *}}} + {{{deny *}}} = {{{deny *}}} 모든 액션을 거부
* {{{deny *}}} + {{{allow *}}} = {{{allow *}}} 모든 액션을 승인
앞절의 설명은 priority가 같은 경우에 대한 일반적인 설명이었다. 그룹의 priority를 두었을 때는 어떻게 적용될까?
# 다음을 explicit하게 명시해야 의도대로 작동한다.
* {{{allow edit,savepage}}}라고 explicit하게 정의된 것을 다시 취소시켜야 의도대로 작동하는 것이다. 따라서 {{{ProtectedPage @User deny edit,savepage}}}라고 써 주어야 한다.
@Guest Anonymous # @ALL을 제외한 모든 그룹의 priority는 그 값이 지정되지 않으면 2 이다.
config.php에 {{{$acl_debug=1}}} 옵션을 넣으면, 어떤 식으로 적용될지를 보여줍니다.
- MoniWikiOptions . . . . 16 matches
* 1로 설정하면 테마의 기본 CSS만을 사용하도록 강제 설정. (기본값 0)
* 지정할 수 있는 값으로는 moni,moni2 등이 있다. 디렉토리를 추가하고 파일이름을 똑같게 하면 아이콘을 바꿀 수 있다.
* 대문을 지정한다. 기본값은 FrontPage.
* 기본값은 `$url_prefix.'/css/kbd.js'` : 사용하기 싫으면 그 값을 빈 문자열로 한다.
* 로고 그림. 없애고 싶다면 빈 문자열을 넣는다.
* wikismiley.php를 읽어들이게 된다. 이 값을 "foobar"로 고치고 foobar.php를 wikismiley.php 대신으로 쓰면 자신이 원하는 smiley를 설정할 수 있게 된다.
* 스마일리 사용을 켜거나 끈다.
* 언어를 설정한다. 기본값 'auto'로 브라우져 설정을 따르며, 강제로 한국어로 하고자 하면 'ko_KR'로 지정한다.
* Email Notification을 활성화 한다. 이 기능을 키면 SubscribePlugin을 사용할 수 있다.
* 모니위키 블로그에서 트랙백을 사용할 수 있게 한다.
* inline latex문법을 활성화하거나 끈다. latex, mimetex, itex 등등 지원 LatexProcessor
* "db3, db2, gdbm"등등. php가 지원하는 dba모듈의 유형을 지정한다. 기본값은 보통 db3이며, 처음 설치시 monisetup.php에 의해 자동으로 결정한다.
* favicon등을 이곳에서 직접 지정할 수 있다.
- MoniWikiPlugins . . . . 3 matches
모니위키는 MoinMoin과 호환하는 Macro를 가지고 있으며, 그 매크로에 상응하는 action을 각각 가지고 있는 경우 혹은 액션만 있고 매크로는 없는 경우가 있습니다.
== 모인모인에서 내장 함수였던 것을 매크로로 분리 구현한 것 ==
* format: 프로세서를 액션으로 이용하기위한 인터페이스 액션 (모인모인도 이 방법을 쓴다)
- MoniWikiProcessor . . . . 2 matches
MoniWiki에서는 이미 Processor와 Parser개념을 통합및 간소화 하여 Processor라는 이름으로 쓰이고 있다.
MoinMoin Processor및 Parser의 기능을 하며, {{{plugin/processor/}}}하위에 추가할 수 있습니다.
- MoniWikiTutorial . . . . 31 matches
위키위키에 첫발을 들여놓으신 것을 환영합니다!!
위키위키는 누구나, 언제 어디서나, 쉽고 빠르게, 무엇이나 고칠 수 있는 편집 시스템을 말합니다.
* '''언제 어디서나''': 인터넷을 통해서면 언제 어디서나
* '''쉽고 빠르게''': HTML 문법을 몰라도 누구나 쉽게, 그 결과는 바로바로 웹페이지로
* 계정 만들기: UserPreferences로 가서 사용자 등록을 합니다.
* 이메일주소: 시스템이 이메일을 지원하는 경우에는 자신의 이메일을 등록합니다. 페이지를 구독하거나 비밀번호를 잃어버렸을 때 필요합니다.
* FindPage: 상단의 검색 폼 혹은 FindPage를 통해서 위키위키의 내용을 검색합니다.
* TitleIndex: 위키위키의 모든 페이지 목록을 보여줍니다.
* [[Icon(edit)]] 이 아이콘을 누르면 편집창이 뜨게 됩니다.
* [[Icon(diff)]] 페이지가 다른 사람에 의해 고쳐졌을때 그 변화를 보여주는 3차원 입체안경 아이콘입니다.
* [[Icon(pref)]] 환경설정 혹은 로그인을 할 수 있는 폼을 보여줍니다.
자세한 내용은 HelpOnNavigation을 참조하세요.
* '''[[GetText(Preview)]]''': 편집된 내용을 미리볼 수 있습니다.
* '''[[GetText(Save)]]''': 편집이 완료되면 저장을 합니다.
* '''[[GetText(GUI)]]''': 자바스크립트가 지원되는 환경에서 GUI 편집창을 보여줍니다.
공백을 보존되는 preformat을 사용하고 싶은 경우는 중괄호`{{{{{{ ... }}}}}}`를 사용합니다.: {{{
단락의 구분이 모호할 경우는 "----"를 써서 <hr>을 넣을 수 도 있습니다.
''총알''을 안쓰면 ''들여쓰기가 됩니다''
고급기능인 플러그인을 사용할 수 있습니다.
* ` PageList` - 인수로 사용되는 패턴과 일치하는 페이지 목록을 보여줍니다.
- NAS_implement . . . . 7 matches
- XPENOLOGY 설치 실패 후 차선책으로 선택한 녀석입니다. 설치과정에서 역시나 문제들이 좀 있었지만 실사용에는 문제가 없었습니다. 하지만 개인적으로 사용이 불편했고 무엇보다 공유폴더를 사용자 또는 그룹별로 권한을 지정하는 것이 안되서 포기했습니다. 리눅스 명령어를 통해 이점을 수정할 수는 있는데.... 리눅스 ... 모릅니다 ㅜㅠ
메뉴 구성이나 설정 등은 NAS4FREE 유사하며 리눅스에 '리', 나스에 '나'도 모르는 저도 편하게 쓸 수 있을정도로 사용이 쉽습니다.
포고플러그 강좌 등을 보면 쉽게 볼 수 있는 리눅스 화면이나 명령어 등을 전혀 알필요가 없습니다.
OMV 설치시에는 FTP, SMB/CIFS 등의 기본적인 플러그인만 설치되어 있지만 필요에 따라 사용하고 싶은 기능을 플러그인 메뉴에서 손쉽게 설치/제거 할 수 있습니다. 어렵게 명령어 등을 칠 필요가 없음.
- NVML_driver_error . . . . 1 match
이 문제는 nvidia driver kernel module 이 잘못 로딩되어 있어서 발생하는 문제로 nvidia driver kernel module 을 언로딩 & 로딩 하면 된다.
- Notify_job_finish작업이끝남을리모트에알려주기 . . . . 4 matches
계산이나 시간이 오래 걸리는 작업을 서버에서 진행을 하다보면 작업이 끝났는지를 보기위해서 불필요하게 들여다 볼 필요가 생긴다.
보다 능동적인 방법으로 작업의 종료를 리모트에 알려주는 방법을 생각해 보자
= secure shell을 이용한 명령어 전달 =
- Nyquist-Shannon . . . . 1 match
\(x(t) = 2\sin(29\pi t + \frac{\pi}{4}) +3\cos(30\pi t + \frac{\pi}{6})\)로 표현되는 연속시간 신호를 샘플링하여 이산시간 신호를 구하려고 할 때, 에일리어싱이 발생하지 않도록하는 샘플링 주파수의 최솟값을 구하라.
- OSD . . . . 1 match
OSD 모듈은 DDR2/mDDR에서 여러 가지 윈도우 포멧을 읽어오고 YUV 데이터 포멧으로 바꿔준다.
- OekakiMacro . . . . 3 matches
{{{[[OeKaki(파일이름)]]}}}을 쓰면 "OeKaki_파일이름.png"가 만들어진다.
(!) 짧막한 코멘트를 달게끔 해도 괜찮을 것이다. Comment 플러그인을 만들고, Blog의 코멘트와 Vote매크로를 응용해서 페이지 임의의 부분에 좀 더 쉽게 코멘트를 덧붙일 수 있게 한다.
- PageHitsMacro . . . . 5 matches
PageHits을 보여주는 매크로.
옵션으로 제공하도록 하겠습니다. '''위키 주인'''은 여럿이 있을 수 있으니 배열로 하고 $owners=array("홍길동","철수");처럼 하면 되겠죠 ? --WkPark
PageHits에서 히트가 많은 페이지가 위에 오는데, 이를 거꾸로 해서 히트가 빈한 페이지에게도 꽃다발을 주고 싶습니다. r 옵션을 지원해서 arsort()만이 아니라 asort()도 되게 하면 어떨까요 ?
reverse 옵션을 넣었습니다. :) (rc16에 넣지요)
- PageListMacro . . . . 3 matches
SisterWiki에 있는 내용도 찾을 수 있으면 좋겠습니다. FullSearchMacro야 SisterWiki랑은 무관하지만 PageList는 SisterWiki까지도 수용할 수 있다고 생각합니다.
옵션을 metawiki 혹은 m으로 넣었습니다. 그런데, 서치 속도가 느립니다. metadb가 5메가 이상인데 약 2초 가까이 걸리네요. 페이지이 이 매크로를 넣으면 페이지 로딩속도가 느려지므로 그다지 바람직한 방법은 아닌 것 같습니다. 그리고, metadb를 다 서치하려면 메모리를 많이 잡아먹게 되어 멎는 경우도 생기므로, 100여개정도를 찾으면 끝내도록 되어있습니다.
FullSearch -> LikePages -> LikePages with MetaWiki의 순서로 찾을 수 있는 어포던스를 더 분명히 제공하도록 해야겠습니다. --WkPark
- RTA_ALARM_gio . . . . 1 match
Sensor In / Alarm Out을 처리하기 위한 작업
- RandomQuoteMacro . . . . 2 matches
이 내용을 좀 바꿔보고 싶은데 어떻게 해야 할지 알 수가 없네요. -- lordmiss
'''A''' : FortuneCookies 에 있는 내용을 뿌려주는걸로 알고있습니다.
- Random_stochastic . . . . 12 matches
* 각각의 확률변수의 확률을 나타냄.
* 주사위의 경우 모든 확률변수는 1/6로 같은 확률을 갖는다.
* 어떤 값을 취하느냐가 확률적으로 결정되는 변수.
* 표본공간[* 사건이 일어나는 가상의 공간, 주사위를 던진다거나 하는 랜덤한 사건이 일어나는 공간을 말함.]의 모든 값들은 특정 확률로 변수 X가 취할 수 있고, 그 확률의 합은 1이다.
* 이산확률변수 : 변수가 취할 수 있는 값을 헤아려열거할 수 있을 때(자녀의 수, 교통사고 회수)
* 연속확률변수 : 주어진 실수구간 내에 속하는 어떠한 실수도 취할 수 있을 때(몸무게, 키)
* P(X=1)=1/6, P(X=2)=1/6 처럼 변수 x가 특정 값을 취하는 확률을 저장하는 변수를 확률변수라고 한다.
* 변수 X가 x 이하의 값을 취할 확률 : $F_x(x) = P(X <= x)$
* 기대치는 자료의 중심적 경향을 나타내 주는 수치적 척도로써, 확률변수가 취할 수 있는 모든 값의 평균을 의미한다.
- Rosenblatt . . . . 19 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 . . . . 30 matches
말 그대로 1개의 명령어가 복수의 데이터를 처리한다는 얘기인데, 말은 어렵지만 다르게 생각하면 한 명령어가 뚜렷하게 특수한 목적성을 가지고 있다는 의미입니다.
위와 같은 형태에서, x, y, z, a , Θ 는 일단 변수 취급해야 하므로 레지스터에 저장을 한다고 쳐도 총 곱하고 더하는 연산에 삼각함수 연산까지 합치면 그냥 x86 명령어를 사용한다면 꽤나 길어지게 됩니다.
이런 것을 단 하나의 명령어로 한번에 처리하게 해주는 것이 바로 SIMD 연산입니다.
일단 뒤에서 설명할 몇 가지 예시들을 보면 이해할 수 있으니 넘어가겠습니다.
우선 이 글에서 처음 SIMD 라는 것을 접하신 분들이 가장 크게 의문점을 가지실 거라고 예상되는 부분이, 바로 연산 속도의 차이에 대한 부분입니다.
예를 들어 어떤 4개의 정수 집합을 다른 4개의 정수 집합에 각 각 하나씩 더하는 연산이 있다고 가정해봅시다.
흔히 이 연산을 쓸 때, add 명령어를 4번 쓰는 형태 정도로 나타냅니다.
요즘 같이 CPU가 고도로 발전한 시대에야 아니지만 저 연산을 처리하기 위해서 드는 소요 과정이 당연히 많을 수 밖에 없습니다.
그리고 규정된 연산이 단 한 번에 처리되기 때문에 속도 향상이 있을 수 밖에 없습니다.
기본적으로 SIMD는 내부적으로 병렬적 처리를 함으로써 성능 향상을 이끌어냅니다.
그리고 원래 같은 일을 하는 일반 명령어 집합의 전체 실행 사이클보다 적은 사이클에 실행할 수 있는것은 큰 장점입니다.
그런 점에서 특수한 목적 처리를 위한 연산에서 특히 SIMD 연산을 사용하여 많은 성능 향상을 이끌어 낼 수 있습니다.
※ ''인텔 CPU는 [[CISC]] 이기 때문에 애초부터 파이프라이닝을 고려하진 않고 설계된 명령어 집합을 갖고 있습니다. 병렬 처리를 생각하고 명령어를 설계한 [[RISC]] 와는 태생이 다릅니다.''
목차에서 이 파트 제목을 "장점과 단점" 이라고 썼지만 사실 단점은 그냥 적어본 것입니다.
있다는 점을 제외하고는 딱히 기술적인 면에서의 단점은 저도 모르겠습니다. 죄송합니다.
일단 필자는 Visual Studio 를 사용하고 있고, 예전엔 항상 인라인 어셈블리를 사용했지만 요즘에는 [[Intrinsic]] 을 사용하고 있습니다.
(망할 MS가 64비트 코드를 인라인 어셈블리로 작성을 못하게 해놨습니다.)
[[Intrinsic]] 이 사실 더욱 이름을 명확하게 표현해주는 장점이 있고 이것저것 좋은 점이 많아서 나름 더 편리하다고 할 수 있기 때문에 활용 예제도 [[Intrinsic]] 으로 작성하도록 하겠습니다.
(사실 정말 편리한 것도 많이 지원하고 있어서 좋습니다. 예전의 삽질을 줄여주는..)
그리고 Visual Studio 최신 버전에서는 이런 옵션을 지원하고 있습니다.
- SPI . . . . 2 matches
* I2C가 2개의 배선을 사용하는 것에 배해 많은 배선을 사용 (3~4 개)
- SVN . . . . 12 matches
우분투 apt-get을 이용해서 패키지 설치
저장소 conf폴더 안에 있는 파일을 이용해서 권한 설정을 해줘야 한다.
realm = project : 사용자가 접속시 표시되는 이름입니다. 프로젝트 명을 적어주면 됩니다.
{{{{color: rgb(255, 1, 1); font-size: 13px;} 보안을 위해서는 passwd 파일과 authz 파일을 설정해 줘야 한다. }}}
'''권한 설정을 변경하게 되면 데몬을 재시작해야 적용이 된다. '''
'''Apache에서 SVN 설정 (웹을 통해서 svn 접근 하는 경우만)'''
= commit 내용을 이멜로 보내기 =
1. commit 내용을 메일로 보내기 위해서는 sendmail이 필요함.
특정 리비전을 받아 오고자 할때는 리비전 번호를 지정해 주면 된다.
- TM_Upsampler_complete . . . . 21 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만을 취할 수 있도록 값들을 다시 정렬하는 것이다.
'''sincfuction을 계산하는 함수'''
- TM_Upsampler_lib . . . . 7 matches
sinc function을 계산해서 반환 한다.
* sinc : sin(x)/x 의 결과값을 받아갈 포인트 변수
* times : 몇배를 기준으로 sin(x)/x 값을 계산할지에 대한 값 sin( x / times * pi ) / ( x / times * pi )
계산된 sinc function 값을 계산 단위로 재정렬 한다.
* sinc_table : 정렬된 sinc function의 결과값을 받아갈 포인트 변수
* times : 몇배를 기준으로 sin(x)/x 값을 계산할지에 대한 값 sin( x / times * pi ) / ( x / times * pi )
사용한 OpenCL 자원을 반환하는 함수.
- TM_opencl_tutorial . . . . 11 matches
OpenCL의 기초적인 사용법을 알아보기 위해 이 페이지를 작성함.
=== OpenCL을 사용한 병렬화 (기본) ===
각각의 행렬의 곱을 얻는 과정은 독립적이다. 이 독립적인 과정을 하나의 Work Item으로 정의해서 병렬화 해보자.
계산하려는 메트릭스 M_C의 사이즈만큰 work item을 생성해서 처리하는 방식
=== OpenCL을 사용한 병렬화 (1차원 배열) ===
=== OpenCL을 사용한 병렬화 (Vectorization) ===
백터 연산은 모드 계산 디바이스에서 지원하는 기능은 아니다. 하지만 계산 디바이스가 지원한다면 좀 더 좋은 성능을 보장할 수 있다.
=== OpenCL을 사용한 병렬화 (Local Memory) ===
메모리 연산이 많을 경우 Local 메모리를 사용하면 메모리 액세스 속도에서 이점이 있을 수 있다. (단, Local 메모리가 존재할 경우)
- TM_upsampling_implementaion . . . . 8 matches
앞에 두가지는 플렛폼에 따른 구분으로 .amd는 GPU를 타겟으로 하며 오디오 셈플을 resample하고 X2 ~ X128 배에 해당하는 결과를 테스트 파일 형태로 만들어 줌.
.altera는 altera FPGA 플렛폼을 사용하게 설계 되어 있으며 kernel.cl 파일을 컴파일해서 '''kernel.aocx''' 생성해야만 사용 가능.
.eddy는 GPU 플렛폼을 사용하며 resample 소스의 데이터 타입이 float형을 사용하게 설계 되어 있음.
Data 폴더에 있는 sampler 텍스트 파일들을 각각 X2 ~ X128배로 resample 하여 합친 결과와 각각의 resample 결과를 텍스트 파일로 저장하도록 설계 되어 있음.
= Float Data 샘플을 Resample한 결과 =
각각을 Resampling한 결과
- TableOfContentsMacro . . . . 3 matches
제목줄을 찾아서 목차를 만들어 줍니다.
* ''simple'' : 목차의 링크는 번호에만 걸리게끔 기본적으로 되어있으나, simple을 옵션으로 쓰면 목차 전체가 링크가 걸린다.
* ''title'' : 목차의 제목을 다르게 바꿀 수 있다. {{{[[TableOfContents(title=차례)]]}}}
- Taylor_polynomials . . . . 28 matches
테일러[* 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\)에서 멀어지면 멀어질수록 오차가 발생하게 된다.
"테일러 정리는 위 식을 만족 시키는 실함수가 존재한다." 입니다.
위 식을 \(f(x)\)를 기준으로 이항 정리 하면 아래와 같은 관계식을 얻을 수 있다.
위 식을 유도하기 위해서 사용한 공식은 아래와 같다.
\(\int_0^x(x-t)f^{(2)}(t)dt\)을 다시 미분해보자.
어떤 항을 \(F(t)\)함수로 놓느냐 \(G(t)\)함수로 놓느냐에 따라서 문제가 풀리지 않을 수도 있다.
\(F(t)\)함수는 미분을 하면 자기 자신을 잃어버리는 함수로 정하고,
이유에 대해서는 생각을 좀 해봐야 하겠네요.
로 놓고 수식을 전개해보면 아래와 같다.
이렇게 전개를 계속하게 되면 테일러 급수를 얻을 수 있고 마지막에 없어지지 않는 잉여항이 있음을 알 수 있다.
이것을 '''[:Lagrange_note 라그랑주]의 잉여항(剩餘項, Lagrange form of the remainder term)'''이라고 한다.
테일러 급수가 필요한 이유는 쉽게 말하면 우리가 잘 모르거나 복잡한 함수를 다루기 쉽고 이해하기 쉬운 다항함수로 대체시키기 위함입니다. 또한 어떤 함수를 테일러 급수로 표현하면 그 함수의 특성을 분석하기가 좀더 용이해지기 때문입니다. 그럼 그 구체적 활용예들을 하나씩 살펴보도록 하겠습니다.
부정적분을 계산하기 힘든 함수의 경우에 아래와 같이 테일러 급수를 활용하면 정적분의 계산값을 근사적으로 구할 수 있습니다.
위 식에서 \(\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 . . . . 18 matches
'''통합 모델링 언어'''를 사용하여 시스템 상호작용, 업무흐름, 시스템 구조, 컴포넌트 관계 등을 그림으로 표현할 수 있습니다. UML 다이어그램을 사용하는 이유는 프로그래밍을 단순화 시켜 표현하여 의사소통을 쉽게하고 대규모 프로젝트 구조의 로드맵을 만들거나 개발을 위한 시스템의 구조의 틀을 마려하기 위함입니다.
|| Use Case Diagram ||요구 분석 과정에서 시스템과 외부와의 상호 작용을 묘사함 ||
|| Activity Diagram ||업무의 흐름을 모델링하거나 객체의 생명주기를 표현함 ||
|| Sequence Diagram ||객체 간의 메시지 전달을 시간적 흐름에서 분석함 ||
|| Class Diagram ||시스템의 구조적인 모습을 그림 ||
모든 다이어그램을 다 그릴 필요는 없고 그때 그때 필요한 다이어그램을 목적에 맞게 그래서 사용하면 된다.
UML을 그릴 수 있는 툴은 다양한데 그 중 StarUML[* http://staruml.io/]을 사용해 보려고 한다.
* 일반화(generalization) - 여러 클래스가 가진 공통적인 특성을 추출하여 공통적인 클래스를 일반화 하는 관계
* 집합 연관(aggregation) - 전체와 부분을 나타내는 모델 요소 단, 전체와 부분은 서로 독립적임.
* 복합 연관(composition) - 전체와 부분을 나타내는 모델 요소, 연관 관계를 맺고 있는 클래스와 생명주기가 같음.
- UPnP . . . . 1 match
UPnP 관련 open source들은 많은 vender들에 의해서 공개 되고 있어서 인터넷을 찾아보면 많이 보인다. 그 중에서 리눅스 버전의 오픈 소스가 있어서 보려고 한다.
- UploadFileMacro . . . . 26 matches
모니위키는 파일 업로드를 위한 3가지의 업로드 폼을 매크로로 지원하고 있다.
{{{[[UploadFile]]}}}: 이것은 자바스크립트를 전혀 쓰지 않는다. 그 대신에 간단한 여러개의 파일을 올릴 수 있는 방법을 제공한다.
{{{[[UploadForm]]}}} 혹은 {{{[[UploadFile(js)]]}}}: 이 매크로는 여러개의 파일을 올릴 수 있는 폼을 자바스크립트를 사용하여 만들어준다.
모니위키의 {{{[[UploadFile]]}}} 매크로는 업로드 된 파일을 {{{$upload_dir}}}로 정의된 디렉토리에 각 페이지별 디렉토리를 생성시키고, 그 디렉토리에 업로드된 파일을 저장한다.
업로드가 성공하면 업로드된 파일을 다음과 같은 문법으로 연결할 수 있다.
예를 들어, {{{MyPage}}}에 들어가서 {{{MyPage?action=UploadFile}}}을 하거나, MyPage에서 {{{[[UploadFile]]}}} 매크로를 사용하여 파일을 업로드를 하면 $upload_dir='pds';라고 되어있는 경우에 {{{pds/MyPage/}}}가 새롭게 만들어지고 거기에 올린 파일이 저장된다.
config.php의 $pds_allowed라는 변수를 조정하면 업로드가능한 파일을 제한을 걸 수 있다. $pds_allowed의 기본값은 다음과 같을 것이다.
아파치 mod_mime의 문제점으로 인해서 안전하지 않은 파일 이름을 점검합니다.
$pds_protected="pl|cgi|php"; # config.php에 정의하지 않았을 때의 기본값.
예를 들어 아파치의 mod_mime이 hwp 확장자를 인식하지 못하는데, {{{my.php.hwp}}}와 같은 파일이름을 업로드할 경우, 아파치의 mod_mime모듈은 my.php.hwp를 hwp가 아닌 php파일로 인식하게 됩니다.
$upload_masters=array('Foobar','Babo'); 여기에 등록된 모든 사용자는 파일 확장자와 무관하게 모든 종류의 파일을 업로드 할 수 있습니다.
이 값을 1로 설정하였을 경우, 업로드 할 때의 정보를 이용해서 파일 타입을 판별합니다.
안전한 업로드가 이미 보장 된 경우 사용하실 수 있을 것입니다.
그러나 노스모크 모인모인에서는 {{{pds/*}}} 하위 디렉토리로 모든 파일이 저장된다. 노스모크 모인모인과 호환을 보장하기 위해서 UploadFile액션은 특별히 {{{UploadFile}}}이라는 페이지에서 파일을 업로드하면 {{{pds/UploadFile}}}라는 디렉토리가 만들어지지 않고 pds 아래로 바로 업로드 되게끔 하였다.
pds 바로 밑으로 저장된 pds/* 파일을 연결하려면 {{{attachment:/foobar.png}}} 문법을 쓴다. 즉, "/"를 맨 앞에 붙여준다.
공백이 들어있는 파일을 링크를 걸 경우는 {{{attachment:"hello world.png"}}}와 같이 링크를 걸어 준다.
- UploadedFiles . . . . 7 matches
{{{UploadFile}}}은 업로드 폼(매크로)을 보여주고 업로드를 하는(액션) 플러그인이며,
{{{UploadedFiles}}}플러그인은 이미 업로드 된 파일 목록을 보여주는 플러그인이다.
{{{[[UploadedFiles]]}}} : 현재 페이지에 첨부된 파일 목록을 보여준다. pds/현제페이지이름/* 하위의 모든 파일 목록을 보여주게 된다.
{{{[[UploadedFiles(페이지이름)]]}}} : 지정된 페이지에 첨부된 파일 목록을 보여준다.
/!\ UploadedFiles 플러그인은 액션과 매크로를 동시에 지원하므로, 주소창에 {{{?action=uploadedfiles}}}를 덭붙여 주면 그 페이지에 첨부된 파일을 보여줍니다.
모니위키는 업로드된 파일의 검색(이름 및 내용)을 지원하지 않습니다.
- UserPreferences . . . . 6 matches
'''[[GetText(logout)]]'''을 누르면 쿠키가 지워지고, '''[[Gettext(Login)]]'''을 하시면 쿠키가 사용되며, 다른 곳에서도 같은 설정을 유지하며 사용하실 수 있습니다. 공공의 PC에서 [필명]이 도용되는 것을 막기 위해서 '''[[GetText(Logout)]]'''을 이용해 주시기 바랍니다.
설정을 변경한 후에 '''[[GetText(Save)]]'''를 누르면 그 설정이 저장됩니다.
- Variational_inference . . . . 35 matches
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는 입력으로 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의 합이 된다.
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을 따른다.
분모 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})}\)
Variational posterior \(q(z|x)\)가 진짜 posterior \(p(z|x)\)를 얼마나 잘 근사하는지 어떻게 알 수 있을까? q로 p를 근사할 때 정보 손실을 측정하는 Kullback-Leibler divergence를 사용한다.
왜 이 값을 바로 계산하는게 불가능한가? 귀찮은 evidence p(x)가 식에 나타나기 때문이다.
이 식을 Kullback-Leibler divergence와 합쳐서 evidence를 다시 쓸 수 있다.
Jensen’s inequality 에 의해, Kullback-Leibler divergence 는 항상 0 보다 크거나 같다. 이는 곧 Kullback-Leibler divergence 를 최소화하는 것이 ELBO 를 최대화하는 것과 동치임을 말한다. 요약하자면 Evidence Lower Bound (ELBO) 가 posterior inference 근사를 가능하게 한다. 우리는 더이상 Kullback-Leibler divergence 를 최소화하기 위해 시간을 쓸 필요가 없다. 대신, 우리는 ELBO 를 최대화하므로써 계산 가능한 동치의 일을 수행한다.
베이지안 딥러닝 하는 사람들이 무슨 일을 하는지에 대한 전반적인 내용.[* <http://whansunkim.ml/w2/wiki.php/cross_entropy> ELBO에 대한 설명]
- WikiSandBox . . . . 1 match
== Table을 넣어보자 ==
- Write_Combining_memory . . . . 6 matches
CPU의 처리 속도가 점점 빨라져 Main Memory(DRAM)을 엑세스하는 동안 수백의 명령을 처리 할 수 있을 정도로 빨라졌다.
Main Memory와 CPU사이의 처리 속도 차이에서 발생하는 지연을 해결하기 위해서 cache를 채용하였지만 완벽히 해결하지는 못하고 있다.
cache line에 없는 것에 대해서 쓰기(Write) 동작이 발생했을 때 메모리에서 해당 값을 cache line으로 갖고 온 후 쓰기를 수행한다.
- Xavier_He_initialzation . . . . 3 matches
초기값을 랜덤하지 않은 특정 값으로 설정한다면 트레이닝이 되지 않을 수 있다. 간단한 예로 모든 웨이트를 '0'으로 초기화 한다고 생각해 보자 모든 입력값에 대해서 0의 결과값을 주게 된다. 모든 네트워크의 레이어와 중간 로드의 값이 0으로 일치하기 때문에 다름이 생기지 않고 네트워크는 학습이 되지 않는다.
- YOLOv8 . . . . 8 matches
#title YOLOv8 알고리즘을 사용한 족윤적 분석
신발 바닥의 패턴을 AI 알고리즘을 통해서 분류하고 분석하는 알고리즘을 만든다.
신발 바닥의 패턴을 분류하고 학습하기 위해서 라벨링 작업이 필수적으로 필요하다. Object detection을 위한 라벨링 툴로 labelImg[* https://github.com/heartexlabs/labelImg]이라는 오픈소스를 사용해 보려고 한다.
YOLO등 Object detection 모델의 예측을 앙상블하여 성능을 향상시키는 방법에 대해서 알아보자.
- accelerator_programming . . . . 4 matches
OpenCL을 이용한 병렬 프로그램 작성을 목표로 한다.
큰 그림의 조각을 비슷한 작은 그림으로 치환해서 전체 이미지를 만드는 포토 모자이크 프로젝트를 수행한다.
또는 apt-get으로 설치 할 수 있는데 libjpeg를 검색해보면 몇개 버전의 libjpeg-dev를 찾을 수 있다. 그 중 하나를 설치해서 사용하자.
- algorithm_b . . . . 29 matches
직선알고리즘은 여러가지가 있지만 대부분 성능이 안좋은 부동소수점 나눗셈 연산을 필요로 합니다. 하지만 브레슨햄이 제안한 래스터화 알고리즘은 순수 정수의 덧셈/뺄셈 연산만으로 직선/원/타원을 래스터화하는 초고속 알고리즘입니다.
브레슨햄 알고리즘의 기본은 '오차항'의 누적입니다. 즉, 컴퓨터 화면은 색깔이 칠해진 정사각형의 거대한 2차원 배열이라고 보면 됩니다. 이때, 직선(혹은 다른 도형)을 그린다는 행위는 실수로 구성된 연속 좌표계를 불연속좌표계로 '근사'하는 과정입니다. 따라서 하나의 점을 찍으면 직선의 원래 좌표와 화면에 찍힌 불연속 좌표 사이에 오차가 존재하게 마련이며, 직선(혹은 다른 도형)을 그려 가면서 이 오차를 최대로 작게 하는 점을 선택하는 것이 브레슨햄 알고리즘의 핵심 개념입니다.
브레슨햄 알고리즘으로 직선을 그리는 과정은,
1) 직선을 나타내는 두개의 점 p1, p2을 좌표순서로 정렬합니다. 이때, 직선의 기울기가 1보다 작으면 x축 방향으로 정렬하고, 1 보다 크면 y축 방향으로 정렬합니다. (단, 여기서는 x축방향으로 정렬한다고 가정하겠습니다)
3) 현재 위치에 점을 찍습니다.
5) 다음위치의 오차값을 계산합니다. 이때 오차항은 p1,p2사이의 y좌표의 차이를 더합니다.
6) 오차항을 비교하여 이 오차분이 1개 픽셀보다 더 큰지를 검사합니다. 검사는 현재까지의 오차항과 p1,p2사이의 x좌표의 사이를 비교하여 오차항이 x좌표의 차이보다 크면 y축 방향으로 좌표를 1증가시킵니다.
7) 마지막 좌표를 찍을때까지 3)~6)과정을 반복합니다.
사각형을 그리는 과정은 브렌슨햄 알고리듬으로 직선4개를 그리는 과정을 반복하면 됩니다.
x^2 + y^2 = r^2으로 표현되는 원을 그리는 과정은 다음과 같습니다.
1) 원의 상단 정점으로부터 시작합니다. 이때, 시계방향으로 4분원을 그리고 이 4분원을 4번 반복하여 그리는 방법을 취하면 됩니다.
2) 현재 좌표에 점을 찍습니다.
그외의경우는 둘중 어떤 점을 선택해도 오차를 무시할 수 있습니다.
5) x==y가 될때까지 2)~4)의 과정을 반복합니다.
7) 현재 좌표에 점을 하나 찍습니다.
그외의 경우는 둘 중 어떤 점을 선택해도 무방합니다.
10) x==y가 될때까지 7)~9)의 과정을 반복합니다.
타원을 그리는 알고리즘은 원의 경우와 유사하며, 방정식을 교체하고 축의 방향을 뒤집는 지점만 계산하여 적용하면 됩니다.
- altera_opencl_init . . . . 3 matches
AOCL(Altera OpenCL)은 Quartus를 기반으로 해서 설치가 되기 때문에 Quartus를 설치하고 AOCL을 설채 해야 한다.
설치가 되지 않고 아무것도 출력 되지 않을 경우, 혹은 라이브러리 관련 에러가 발생할 경우
설치가 끝나고 다음을 실행해서 드라이버를 올리고 설치를 확인 할 수 있음.
- androd_store . . . . 4 matches
1. 모델명을 MB861로 변경한다.
2. 첨부된 어플을 설치한다.
3. 올레마켓을 실행한다. (설치가 정상적으로 ^#$%@$%@%@% 라고 할것이다. 무시한다.)
6. 부팅하여 올레마켓을 즐긴다.
- ann_exam . . . . 2 matches
* △t 의 값을 0 베이스로 변경함.
* △t 의 값을 0 베이스로 변경하지 않음.
- ann_exam_1250input . . . . 1 match
1250개의 입력 데이터를 이용해서 RBM을 시도해본다.
- ann_exam_part2 . . . . 3 matches
시그니피컨스에 대해서는 비례하고 델타 T에 대해서는 반비례함을 알 수 있다.
이것을 미리 계산해서 입력 데이터를 절반으로 줄여서 트레이닝을 시도했다.
- ann_exam_part3 . . . . 3 matches
1250개의 입력을 RBM을 통해서 Pre-training 시켜보려고 함.
RBM Layer 250 MLP 20 - 20 으로 네트워크를 구성하고 MBSGD Optimazor 의 반복 횟수와 CD의 샘플링 횟수만을 조정했다.
- ann_index . . . . 1 match
기계 학습법 중 인공 신경망에 대한 전반에 대한 내용을 다루고 있는 페이지
- ann_rnn . . . . 1 match
RNN이라는 약자는 때때로 Recursive Neural Networks 로도 쓰이지만, Recurrent Neural Networks의 의미로 사용하는 것을 추천한다. ( 죠시아 벤지오의 Lecture Note 10장에서..)
- application_list . . . . 1 match
로컬에 있는 파일을 찾아주는 프로그램
- arXiv_1911 . . . . 154 matches
최신 간섭계 중력파(GW) 감지기[1, 2]는 매우 복잡하고 민감한 기기입니다. 각 탐지기는 중력 복사뿐만 아니라 물리적 환경, 지진 활동 및 탐지기 자체의 복잡성을 포함한 소스의 노이즈에도 민감합니다. 따라서 이러한 감지기의 출력 데이터도 매우 복잡합니다. 원하는 신호 외에도 GW 데이터 스트림에는 원래 천체 물리학이 아닌 노이즈 스펙트럼과 가우스가 아닌 과도 현상 또는 "글리치"에 날카로운 선이 포함되어 있습니다.
GW 데이터 스트림의 도구적 아티팩트는 모델링되지 않은 짧은 기간의 GW 이벤트로 오인될 수 있으며, 노이즈가 있는 데이터는 컴팩트 이진 탐지의 신뢰도를 때로는 수십 배까지 감소시킬 수 있습니다[3]. 우리는 글리치가 있는 GW 신호를 검색하는 어려움을 설명하기 위해 그림 1에서 글리치와 GW 신호 간의 유사성의 예를 보여줍니다. 따라서 글리치를 포함하는 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]. 우리의 방법은 이러한 접근 방식을 보완합니다. 우리는 모든 보조 채널을 고려하여 글리치를 포함하는 세그먼트를 식별하고 이러한 세그먼트에 플래그를 지정하고 감지기 문제를 식별하는 데 사용합니다.
분류는 기계 학습 모델이 두 개 이상의 범주 중 하나에 속하는 데이터 샘플의 측정된 특성 집합 또는 "특징"을 고려하도록 훈련되는 기계 학습의 근본적인 문제입니다. 범주가 알려진 샘플 세트를 모델에 제공함으로써 실제 범주가 알려지지 않은 샘플의 범주를 예측하도록 모델을 훈련할 수 있습니다.
LIGO 보조 채널을 기반으로 주어진 시간에 글리치가 발생하는지 여부를 감지하는 문제를 이전 연구[13, 15]에서와 같이 간단한 2가지 분류 문제로 제시하고 잘 이해되고 효율적이며 일반적으로 적용 유망한 결과와 함께 이 문제에 대해 기계 학습 방법을 사용했습니다.
우리는 GW 검출기의 보조 채널에서 파생된 기능을 사용하여 주어진 시간에 글리치가 발생하는지 여부를 예측하는 분류 모델을 훈련합니다. 분류가 수행된 데이터는 보조 채널에서만 파생되기 때문에 우리 방법은 변형률을 분석하는 기존 방법과 독립적으로 변형률 데이터를 사용하지 않고 글리치의 유무를 확증할 수 있습니다.
아래에서는 이해를 위한 Elastic-net 기반 기계 학습(EMU 방법 또는 이후 방법)이라고 하는 방법의 변형을 설명합니다. Ⅱ; 우리는 최근 LIGO 데이터에 대해 이 방법을 테스트한 결과를 보여줍니다. III; 그리고 우리는 Sec에서 결과를 논의합니다. IV.
보조 정보를 사용하여 GW 데이터 스트림에서 글리치의 존재를 예측하려면 보조 채널에서 유용한 정보를 추출하고 이 정보를 사용하여 결정을 내리는 방법이 필요합니다.
모든 보조 채널을 고려할 때 분류를 위해 큰 고차원 데이터 세트를 생성하고 처리해야 합니다. 선형 모델은 이러한 유형의 대규모 데이터 세트에서 간단하고 효과적이며 훈련하기 쉽습니다. 이진 분류를 위한 표준 선형 모델인 로지스틱 회귀를 사용합니다. 글리치 근처(또는 글리치 부재)에서 채널 동작의 속성을 캡처하기 위해 각 보조 채널에 대한 대표적인 통계 그룹을 기능 세트로 선택합니다.
감지기 문제도 진단하려면 알고리즘의 출력을 해석할 수 있어야 합니다. 로지스틱 회귀는 이에 대한 간단한 방법을 제공합니다. 훈련 중에 각 기능에 가중치가 부여됩니다. 더 큰 가중치는 샘플에 결함이 있는지 여부를 결정하는 데 더 관련성이 높은 기능을 나타냅니다. 큰 가중치가 적은 모델은 직관적으로 더 쉽게 해석할 수 있습니다. 이 속성을 장려하기 위해 우리는 가장 관련성이 높은 기능만 모델에 의해 선택되고 정보가 없는 기능에 해당하는 기능이 0이 되도록 탄력적 순 정규화를 사용하여 가중치에 페널티를 부여합니다. 이것은 또한 다음과 같은 경우에 필요한 것보다 더 작은 데이터 세트로 훈련할 수 있게 합니다. 우리는 희소 정규화를 부과하지 않았습니다.
각 LIGO 검출기에는 약 250,000개의 보조 채널이 있습니다. 이러한 채널 중 상당수는 일정하거나 항상 일관된 패턴으로 변경되며(예: 시간 추적 또는 CPU 주기 계산) 무시해도 됩니다. 처리해야 하는 데이터의 양을 줄이기 위해 분석에서 글리치에 대한 정보가 없는 이러한 채널을 제거합니다.
보조 채널 시계열 데이터는 사용자 지정 형식[30]으로 인코딩되고 각 채널에 대해 64초의 연속 데이터를 포함하는 파일에 저장됩니다. 이러한 파일을 "원시 프레임 파일"이라고 합니다. 정보가 없는 채널을 식별하기 위해 각 분석의 교육 기간에서 몇 개의 원시 프레임 파일을 선택하고 해당 프레임에서 채널을 비교합니다. 선택한 각 프레임의 각 채널에 대해 해당 프레임의 다음 값에서 채널의 첫 번째 원시 값을 빼고 결과 시계열을 선택한 다른 각 프레임의 해당 시계열과 비교합니다. 모두 동일하면 나머지 분석 동안 채널이 무시됩니다. 이 절차 후에 추가 분석을 위해 약 40,000개의 채널이 남습니다.
일부 보조 채널은 GW 스트레인 채널과 직접 연결되거나 GW 신호에 의해 다른 방식으로 오염됩니다. 이러한 채널 중 다수는 내부 LIGO "채널 안전성" 연구에서 확인되었습니다[8, 9]. 알려진 모든 채널을 제거했습니다. 또한 사전 교육 및 전문가와의 논의를 거쳐 균주에 의해 오염되었을 수 있지만 안전성 연구에서 고려되지 않은 추가 채널을 제거했습니다.
우리는 Omicron[7] 이벤트 트리거 생성기를 사용하여 모델 교육 및 테스트를 위한 글리치 시간을 식별합니다. (일단 훈련되면 우리 모델은 Omicron 및 스트레인 데이터와 완전히 독립적입니다. 아래 설명된 대로 보조 채널에서 계산된 매개변수만 고려합니다.) Omicron은 대기 시간이 짧은 스트레인 데이터를 분석하여 초과 전력 이벤트를 찾고 이러한 글리치의 매개변수를 보고합니다. 시작 시간, 피크 시간 및 지속 시간을 포함합니다.
훈련을 위해 우리는 (i) 글리치의 피크 시간("글리치" 시간)에서 추출한 시점("글리치" 시간), (ii) 기록된 글리치가 없는 최소 4초의 스트레치("글리치 없는" 시간)에서 추출한 시점을 수집합니다. . 글리치가 없는 샘플의 경우 샘플 시간 전후 2초 이내에 글리치의 어떤 부분도 포함되지 않는 시간을 선택합니다(전체 지속 시간 고려). (우리는 이것이 우리가 방법 플래그의 잠재적인 각 결함에 대해 4초의 데이터를 거부한다는 것을 의미하지 않는다는 점에 주목합니다. 이는 단순히 훈련 프로세스 동안 결함이 없는 훈련 예제 주변의 시간 세그먼트가 충분히 깨끗해야 함을 의미합니다.)
각 글리치 또는 글리치가 없는 시점에 대해 각 채널에 대해 10개의 통계량(다음 단락에서 설명)의 배열을 생성하여 해당 시간 주변의 채널 동작을 특성화합니다. 이 양은 우리의 분석을 위한 특징이 됩니다.
주어진 글리치 피크 시간 또는 글리치 없는 샘플 시간을 각각 t0으로 표시하고 1초 전과 1초 후 시간을 t−1 및 t1로 표시합니다. t−1, t0 및 t1을 중심으로 w−1, w0 및 w1로 표시된 0.5초 지속 시간의 3시간 창을 고려합니다. 이것은 그림 2에 나와 있습니다.
- artificial_neural_networks . . . . 50 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를 출력한다.
임계치 \(\theta\)를 조정하으로써 초평면 경계의 위치를 변경 할 수 있고 가중치를 변경함으로써 초평면의 방향을 조정할 수 있다
\(X·W-\theta=0\)에서 X벡터에 '''1'''의 값을 갖는 성분 하나를 추가하고 W벡터에 \(\theta\)의 음수값을 성분으로 추가함으로써 간단하게 표현 할 수 있다.
가중치를 조정하여 원하는 결과가 나올 수 있도록 조절하는 과정을 학습이라고 하는데 이때 사용 되는 에러 함수는 아래와 같다.
원하는 값과 실제 값의 차이인 \(\varepsilon\)의 최소값을 '''기울기하강([:Gradient_Descent Gradient Descent])'''에 의한 탐색 과정을 수행함으로써 찾을 수 있다.
이다. 그러나 s에 대한 f의 편미분을 구하려 할때 문제가 되는 것은 임계 함수의 존재 때문에 TLU의 출력 f는 s에 대하여 연속적으로 미분 가능하지 않다는 점이다.
1이라고 표시된 모든 훈련 벡터는 정확히 1의 내적값을 나타내고, 0이라고 표시된 모든 벡터는 -1의 내적값을 나태내도록 가중치를 조정한다고 가정하자.
이 방법은 ''Widrow-hoff''(1960) 또는 delta 규칙으로 알려져 있다. 가중치 집합을 찾은 후에 f가 0 또는 1의 값을 나타내도록 임계 함수를 다시 넣을 수 있다.
이식을 \(\frac{\partial \varepsilon}{\partial W} = -2(d-f)\frac{\partial f}{\partial s}X\)에 대입하면
가 되고, 이것은 '''일반화된 델타 방법(Generalized delta procedure)'''이라고 알려진 다음과 같은 가중치 변경 규직을 만든다.
1. 일반화된 델타 방법에서는 시그모이드 함수 때문에 덧붙여진 항 f(1-f)가 존재한다. 시그모이드 함수[[footnote(시그모이드 함수는 어떤 퍼지 초평면(N차원 공간을 두개의 영역으로 나누는 평면)을 구현한 것으로 생각 할 수 있다.)]]에서 f(1-f)는 0부터 1까지 변한다.
이런 문제를 풀기 위해서 다층 피드 포워드 신경망을 고려해 본다.
\(\frac{\partial \varepsilon}{\partial W} = -2(d-f)\frac{\partial f}{\partial s}X\) 이 공식을 다층을 갖는 시그모이드 함수로 일반화 하면
\((d-f)\frac{\partial f}{\partial s} = -\frac{1}{2}\frac{\partial \varepsilon}{\partial WX} = -\frac{1}{2}\frac{\partial \varepsilon}{\partial s}\)를 얻을 수 있고 이 식을 확장하면 아래의 식을 얻을 수 있다.
이 식을 \(\delta_i^{(j)}\)로 정의 하자.
이제 \(\delta_i^{(j)}\)와 가중치 변화량을 계산해 보자.
\(\delta_i^{(j)} = (d-f)\frac{\partial f}{\partial s_i^{(j)}}\) 이 식에서 우리는 역치함수(임계함수)로 시그모이드 함수\(f(s) = \frac{1}{1 + e^{-s}}\)를 사용하기 때문에 \(\frac{\partial f}{\partial s_i^{(j)}} = f(1-f)\) 와 같은 식을 얻을 수 있다. 따라서,
j 번째 \(\delta\)를 계산하기 위해서는 이전 j+1 층의 \(\delta_j^{j+1}\)값의 계산이 끝난 후에 가능하다. 최초의 \(\delta^{(k)}\) 값은 최종층의 값을 사용한다.
인공지능 책에 중간 증명에 대한 내용을 참조 하기 바란다.
- association_rule . . . . 42 matches
어떤 사건이 얼마나 자주 함께 발생하는지, 서로 얼마나 연관되어 있는지를 표시하는 것을 '''Association rule'''이라고 한다.
위 3가지 척도로 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값을 계산하면 아래와 같다.
간단한 예제로 위에서 설명한 지표들을 계산해보고 의미를 파악해보자. 표 1은 5명의 고객이 마트에서 장을 본 것이다.
위 자료를 보고 Beer를 구매한 사람들에게 어떤 상품을 추천하는 것이 옳을까를 생각해보자.
위 표를 기준으로 Beer를 구매한 사람에게 추천할 수 있는 상품을 나열해 보면
신뢰도라는 지표를 뽑은 이유는 특정 수치 이상의 값만 의미가 있다고 주장할 수 있는 기준을 설정할 수 있기 때문이다. 기준을 50% 이상으로 보면 Diapers, Bread, Milk 정도가 추천 가능한 물품이 되겠네요. 하지만 뭔가 이상하죠?
신뢰도만 보고 추천하기엔 부족하 부분이 있다 우연하게 출현 빈도가 겹친 경우에 대해서도 신뢰도를 보면 높은 신뢰도를 얻을 수 있기 때문이다. 전체 거래에서 어느정도 비율을 차지하는가를 보면
신뢰도의 값을 얼마나 신뢰할 수 있는가를 지지해주는 것이라고 볼 수 있다.(우연히 일어난 일이 아님을 알 수 있다.)
그럼 Bread와 Milk는 어느 것이 더 우위에 있을까? 여기서 하나의 지표를 더 사용해 보자.
Bread와 Milk는 신뢰도와 지지도의 값이 같다. 하지만 구지 둘 중 하나를 꼽자면 어떤 것을 추천하는 것이 좋을까?
이런 지표만 갖고 단순히 수치가 높으니 추천할 수 없음을 알 수 있다. 이러한 연관 분석에서는 가짜 결과가 존재하고 이런 가짜 결과 막기 위해서 발견한 패턴들을 평가하고 검사해야 한다.
= Association Rule을 찾는 방법 =
위 3가지 척도를 이용해서 데이터셋으로 부터 의미 있는 association rule을 만들어내려면 어떻게 해야할까. 그 방법으로는 brute force, apriori algorithm, FP-growth algorithm 등이 있다.
1. 모든 frequent item set을 만든다. (support 값이 최소 기준을 넘는 모든 item set)
- atrix_custom_rom . . . . 39 matches
= Telstra롬을 올리자! =
커스텀롬 올리기의 시작은 telstra롬을 올리는 것부터 시작합니다.
''이 telstra롬을 밀기위해선 또 RSDLite[[footnote(telstra롬은 확장자 .sbf 파일이고 RSDLite는 확장자가 sbf란 파일을 구동시키기위한 프로그램이죠.)]]란애가 필요합니다.''
설치는 일반적인 윈도우 프로그램 설치와 동일하고 설치가 끝났다면 프로그램을 실행합니다.
전원 버튼과 볼륨 다운 버튼을 같이 누르고 있어야 합니다.
이렇게 되면 ''Fastboot'' 라는 글이 보이는 것을 확인 할 수 있다.
이 상태에서 볼륨 다운 버튼을 12번 누르면 RSD라는 모드로 변경이 되게 되는데
이 상태에서 볼륨 업 버튼을 부르게 되면 ''Starting RSD Protocol support''라는 글이 보인다.
이 상태에서 PC와 USB로 연결하게 되면 아래와 같이 장치가 연결된 것을 확인 할 수 있다.
파일을 받아서 압축을 풀면 .sbf 파일이 생긴다. 경로를 지정하고 '''Start''' 버튼을 클릭하면 알아서 롭업이 시작 된다.
= 부트로더 언락을 하자! =
다른 커스텀롬을 올릴때 흔히 초기화 용으로 RSD Lite를 써서 텔스트라를 민다음에 다시 시작합니다.
이 텔스트라가 핸드폰의 모든것(sd카드 제외)을 처음으로 만드는것이기 때문에 부트로더 또한 락이 되고,
아래 준비물을 다운 받는다.
두번째 파일을 받아서 압축을 풀면 '''intl-fix-try1.sbf'''이 나온다.
위의 sbf파일 경로 지정법과 똑같이 해주시면 됩니다.(아트릭스 rsd모드 진입 필수![텔스트라로 밀을시 부팅이 완료되어 있으므로 수동으로 종료])
이제 rsd Lite프로그램과는 바이바이~~(다시 커스텀롬을 올리려면 만나야하지만...)
연결 방법은 전원 버튼과 볼륨 다운 버튼을 눌러 fastboot 모드를 선택하고 볼륨 업 버튼을 눌러 줍니다.
fastboot를 받아서 압축을 풀면 cmd창에서 실행 할 수 있는 파일이 보인다.
cmd창을 열어서 오래 스크립트 실행
- attribute_ex . . . . 6 matches
기존 C코드에 있는 inline은 잘 사용하면 굉장히 편리한 기능이다. inline으로 선언된 함수의 경우 컴파일 단계에서 코드가 확장이 되서 함수 호출에 의한 자원 손실을 회피할 수가 있다. 함수 호출에 의한 자원 손실의 문제는 잘 알고 있을 것이라고 생각한다. 그리고 컴파일에 따라서 사용자가 inline을 선언하지 않아도 간단한 함수에 대해선 자동적으로 inline이 적용이 되서 컴파일시 코드 확장이 되는 경우가 있다. 하지만 간혹 프로그램에 따라서 코드가 확장이 되지 않고 함수 호출에 의한 프로그램이 진행이 되야 하는 경우가 있다. 그 때 사용할 수 있는 코드가 있다.
C에서 구조체를 선언한 경우 메모리는 워드 단위로 할당이 되게 된다. 즉 4byte가 1word라고 가정을 한 경우(64bit의 경우 1word는 8byte일 수 있다. sizeof(int)가 1word의 값이다.)
의 경우 총 12byte의 메모리가 할당이 될 것이다. 하지만 선언시 packed코드를 사용을 한다면 위의 구조체는 7byte의 메모리가 할당이 되게 된다.
위의 변수는 변수가 메모리에 할당되는 주소는 4의 배수로 정렬이 되어 메모리에 할당이 된다. 예제는 위의 참조 주소에 잘 나와 있다. 캐시 메모리의 크기를 알고 있다면 변수를 캐시 메모리의 크기만큼 정렬을 한다면 프로그램의 속도는 매우 큰 차이가 날 것이다.
- autoencoder . . . . 22 matches
통상적인 Neural Network는 샘플 데이터 입력값(\(x\))와 목표값(\(y\))이 모두 주어진 Labeled data를 사용해서 학습을 진행하는 지도학습(Supervised Learning)을 생각했다. Autoencoder는 목표값(\(y\))이 없이 입력값(\(x\))만 주어진 상태로 학습을 하는 비지도학습(Unsupervised Learning)이다.
기본적인 구조는 Neural network구조 이며, 다른점이라면 입력과 출력이 동일하다는 것이다. (반듯이 동일할 필요는 없지만, 목표값(\(y\))이 없기 때문에 변형된 출력값을 사용한다.)
그림과 같은 네트워크 모델이 있다고 하자. 하나의 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/>.]
아래 그림은 2차원 데이터를 압축하고 복원한 결과이다. 데이터가 선형이면 PCA와 autoencode가 비슷하게 잘 되는 것을 확인할 수 있다. 하지만 비선형 데이터에서는 확연한 차이를 보인다.
- auxMVC . . . . 13 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 등 머신러닝 알고리즘을 적용하여 비슷한 결과를 얻었다.
'''라이고 검출기의 목표''': 쌍성의 병합, 슈퍼 노바의 폭발 등과 같은 천체 현상으로 부터 중력파 검출을 목적으로 한다.
'''일시적인 잡음''': 지진, 음향, 자기장 장애, 전력 과도 현상, 산란광, 빔을 가로 지르는 먼지, 간섭계의 불안정성, 기기와 환경의 비선형적 복합적인 잡음.
* 찾은 신호가 글리치가 아니고 중력파임을 증명하기 위한 방법으로 여러 검출기에서 동일하게 관측 되었는지를 이용해서 확인한다. 지금까지 가장 효과적인 방법임.
* 중력파 채널에 나타난 신호가 보조 채널에 반영되는 경우가 있다. 이 경우 보조 채널을 분석에 활용해서 노이즈를 검출하게 되면 중력파도 노이즈로 분석하게 된다. 이것을 막기 위해서 중력파 채널에 임의의 노이즈를 삽입한다. (Hardwhare injection) 이렇게 삽입한 신호가 보조 채널에 나타난다면 이 채널은 "unsafe"하다고 정의하고 이러한 분석에 사용하지 않는다. 사용되는 채널들은 "safe" 채널이라고 한다.
* Non-Gaussian trnsient 신호를 검출하는 방법으로 '''Kleine Welle'''이라는 방법을 사용하고 5가지 feature 데이터를 뽑아준다.
- aux_paper_review . . . . 2 matches
영민씨가 작성한 보조 체널 논문을 리뷰하고 딥러닝 알고리즘을 적용해서 포스터 발표 준비를 하기 위한 테스크 #1
- auxcam_job . . . . 28 matches
titanv 서버 /home/wskim/work/auxcam/data 폴더에 기본적인 데이터 셋 저장, KISTI ldg-ui에 오상훈 박사님이 /data/ligo/scratch/sanghoon/AuxCAM/dataset 폴더에 작업해 놓은 파일을 복사해서 사용
gwpy, lalsuite를 설치하여야 gwf 파일을 읽어볼 수 있다.
보조 채널은 중력파 채널에 직접적으로 영향을 주지 않는 safe channel을 사용한다. Livingston, Hanford 둘의 채널 리스트가 약간 다를 수 있다.
172.21.2.57(일명 titanv) work/auxcam/ 폴더에 AuxCAM Data Read.ipynb 파일에서 작업을 수행하고 있음.
Livingston, Hanford 두 곳의 '''safe channel list'''를 갖고 .gwf 파일을 읽어들임.
767개의 채널을 모두 사용하기에는 메모리 사용량이 너무 크기 때문에 reduced channel list를 사용하고 그 중에서 데이터가 없거나 변화가 없이 일정한 값이 출력되는 채널을 제거하였다.
보조 채널 데이터는 256Hz ~ 16kHz까지 다양한 샘플링 레이트를 갖고 있다. 라이고에서는 주로 수십 Hz에서 수천 Hz까지를 분석하기 때문에 2kHz로 resample을 진행하고 화이트닝해서 데이터를 분석에 사용하려고 한다.
화이트닝은 8초 데이터중 1초 단위로 0.5초 중첩하여 fft를 계산하고 그 값중 median값의 제곱을 PSD로 사용해서 나눠주었다. [[footnote( [:iEEG_seizure 라이고 화이트닝 방법])]]
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개 이상으로 확장해볼 수 있다. 체크 포인트!)
실험 1에서 사용했던 CNN feature extractor 파트에서 Weight를 공유했던 부분을 각 채널별로 독립적인 weight를 갖는 것으로 수정 했다.
다중분류를 위한 대표적인 손실함수, 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 . . . . 6 matches
이러한 성공적인 검출을 위해서는 검출기 특성화에 대한 연구가 필요하다. 이러한 연구 중 하나는 시민 과학을 사용한 "Gravity Spy"입니다.[2] 이 프로젝트는 중력파가 아닌 LIGO 감지기의 글리치로 알려진 노이즈 특성의 분류를 제시합니다. 지금까지는 이미지 글리치의 형태학적 분류만 수행되었습니다. 또 다른 연구로 LIGO 보조채널 데이터만을 이용하여 중력파 채널의 신호가 글리치인지 아닌지를 판단하는 연구가 있었다.[3] 다시 말하지만, 이것은 결함인지 깨끗한 것인지에 대한 단편적인 정보만 제공할 수 있습니다. 그래서 두 연구를 통해 얻은 지식을 바탕으로 LIGO 보조채널 데이터를 이용하여 딥러닝 모델을 학습시키고 글리치 분류 작업을 수행하였다.
- auxcam_script . . . . 94 matches
발표 순서는 LIGO Detector에 대한 간단한 소개와 본 연구에서 사용한 데이터 전처리 과정에 대해서 말씀드리고 이 연구에 사용한 딥러닝 알고리즘을 소개하는 것으로 마치겠습니다.
저보다 더 잘 아시는 분들도 계시겠지만 간단하게 중력파 검출 원리에 대해서 알아보겠습니다. 본 영상에서 보시는 것과 같이 빛이 가로 세로로 일정 거리를 지나 합쳐 졌을 때 보강 간섭과 상쇄 간섭 발생하게 됩니다. 이러한 간섭 현상이 발생하기 위한 조건으로 광원은 일정한 위상을 갖고 단일 파장을 가져야 하는데 이미 라이고 검출기는 모든 조건을 충족하고 있습니다.
검출기 끝에 거울이 설치 되어 있는데 거울은 중력 방향으로 자유 낙하를 끝없이 하고 있는 상태로 중력 변화가 발생하는 중력 경사면을 따라 움직이게 됩니다. 이로 인해 빛의 경로차가 발생하게 되고 보강 간섭과 상쇄 간섭이 발생하게 됩니다. 이를 이용해서 h of t 를 측정합니다.
라이고 검출기는 미국 hanford와 livingston에 설치 되어 있고, 유럽에 VIRGO 검출기가 O2기간 부터 관측가동을 함께하고 있습니다.
다가오는 04부터는 일본의 KAGRA 검출기가 관측가동을 하려고 준비하고 있습니다.
지상에 설치된 중력파 검출기들은 필현적으로 지구의 영향을 받을 수 밖에 없습니다. 그리고 검출기 자체가 갖는 기기 노이즈에도 영향을 받습니다. 오른쪽 그림은 이 두 가지 노이즈를 고려한 검출기의 디자인 센서티비티입니다. 검출기를 가동하면 이 정도 수준의 배경 잡음이 발생합니다.
이 신호를 타임-프리퀀시맵으로 보면 아래 그림과 같이 주파수가 올라가면서 엠플리튜드가 같이 증가하는 것을 확인 할 수 있습니다.
관측 가동중 검출기에 검출된 중력파가 아닌 신호들을 많이 모으다 보니 형태적으로 비슷한 모양을 갖는 노이즈들이 발생한다는 것을 알게 되었습니다. 원인은 모르지만 형태적으로 분류가 가능하니 나중에 유용하게 쓰일 수 있도록 형태적 분류라도 해보자는 목적으로 Glitch에 이름을 붙이고 분류하는 일을 했습니다. 프로젝트 명은 Gravity Spy 라고 Cityzen sience라는 형태로 진행 중입니다.
검출기는 각 분야에서 최고의 기술력을 집약해서 만들어졌습니다. 각 모듈마다 기능을 검증하고 모니터링하기 위한 센서들을 포함하고 있습니다. 센서마다 측정하는 것이 다른고 단위가 다릅니다. 또한 중력파 검출기와 직접적인 상관성이 있을 수도 있고 그렇지 않을 수도 있습니다. Input mode clearer와 output mode clearer처럼 중력파 검출기와 직접적으로 연관이 있는 모듈들의 센서는 중력파 채널과 상관성이 높은 센서들이 다수 존재할 수 있습니다. 이러한 센서들을 unsafe channel이라고 하고 직접적인 연관성이 없는 센서들을 safe channel이라고 합니다.
지금 보시는 채널들은 PEM 채널로 대표적인 safe channel들 입니다. PEM은 Physics Environment Monitoring의 약자로 검출기 주변의 설치된 진동계, 온도계, 습도계, 자기장 측정기 등등으로 구성되어 있습니다. 이런 것들은 중력파와 직접적인 상관성이 없는 것들이기 때문에 이런 보조 채널들의 신호와 중력파 채널의 신호가 강한 상관성을 보인다면 그 신호는 중력파에 의한 것이 아니라 주변 환경에서 온 신호라고 볼 수 있습니다.
이렇게 중력파 채널에 발생한 신호를 노이즈로 판단하고 제거하기 위해서 중력파 보조채널을 사용할 수 있는데 이런 목적으로 사용해도 안전하도고 해서 safe channel이라고 합니다.
지금까지가 배경 설명이였습니다. 중력파 데이터 분석을 일을 진행하면서 가장 어려운 부분이 이 배경 설명 입니다. 실제 한 일에 비해서 설명해야 할 내용이 많고 복잡해서 항상 이 부분에서 시간을 제일 많이 사용하는 것 같습니다.
제가 진행한 일은 앞서 설명 드렸던 중력파 보조 채널중 290개의 safe chennel을 사용해서 6개의 글리치를 분류하는 일을 했습니다.
사용한 데이터는 O1기간 중 리빙스턴 관측소의 보조 채널 데이터만을 사용했습니다.
딥러닝 알고리즘의 input data로 사용하기 위해서 화이트닝과 rasamping을 했습니다.
중력파 채널에 글리치가 발생한 시점과 일치하는 보조채널 데이터를 8초씩 취해서 INPUT DATA로 만들고 해당 글리치로 라벨링을 했습니다.
8초 시계열 데이터에 대해서 PSD를 구해서 화이트닝에 사용하고 4초 데이터만을 취해서 사용했습니다. 이 과정에서 중심으로 부터 +, - 1초를 쉬프트하면서 추가 셈플을 얻는 방식으로 데이터 어그멘테이션을 했습니다.
트레이닝과 검증을 위해서 데이터를 10등분해서 8할은 트레이닝에 사용하고 나머지를 VALIDATION과 TEST에 사용하는 k-fold cross validation을 수행했습니다.
문제를 해결하기 위해 사용했던 딥러닝 알고리즘과 경험을 말씀 드리겠습니다.
먼저 간단하게 각 시계열 데이터로 부터 특징 백터를 뽑아 내고 그 것들을 CLASSIFIER에 전달하면 되겠다고 생각했습니다. 최대한 시계열 데이터가 다른 채널과 혼합 되지 않는 방향을 생각했습니다. 이유는 각 채널간에는 상관성이 없고 우연히 데이터상의 상관성이 생겼다고 하면 채널의 순서에서 생기는 무의미한 상관성일 수 있겠다는 생각에서 컨볼류션 연산이 채널방향으로 넘어가지 않도록 했습니다.
- back_end_lcd . . . . 2 matches
Back End VENC 출력을 LCD쪽으로 내기 위한 작업에 관련된 것을 모아 놓으려고 한다.
- bandwidth_test . . . . 28 matches
본 문서는 ''AMD Accelerated Parallel Processing OpenCL Programming Guide ver 2.7''을 기준으로 쓰여지고 있으며, 본인이 확인한 내용들을 정리하고자 하는 목적임.
Host PC에 있는 DDR3메모리로 malloc()을 통해서 활당받은 메모리를 말한다.
* > 16MB: Runtime은 16MB block size 단위로 host memory를 pinned 시키고 DMA 엔진을 통해 device memory로 전송 시킨다. pinning과 전송을 통시에 실행하기 위해서 더블 버퍼를 사용한다.
Runtime이 pinned Host Memory를 Device로 전송할 때, Host Memory를 전송할 때 처럼 복사를 하거나 pinning/unpinning을 반복하지 않고 바로 전송한다. 이 점을 이용하면 조금 더 향상된 전송 성능을 얻을 수 있다.
현재 runtime은 clEnqueueReadBuffer/ClEnqueueWriteBuffer 와 clEnqueueReadImage/clEnqueuWriteImage 의 인자로 넘어온 Pinned host memory만을 인지하고 동작한다.
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 사용이 없다는 점을 염두해 둘 필요가 있다.
UC(UnCachable Memory)보다 빠른 [:Write_Combining_memory WC(Write Combining memory)]를 사용할 수 있는데, CPU Chip-set에서 지원을 해줘야 한다.[[footnote(http://download.intel.com/design/pentiumii/applnots/24442201.pdf)]]
(실제로, BIOS에서 GPU가 사용하는 메모리 공간을 할당하고 CPU에서 보이지 않게 설정하고 있지만 Zero Copy로 접근 가능하다.)
아래는 메모리 객체(cl_mem)을 생성하는 함수인 clCreateBuffer() 함수의 프로토타입이다.
Device에서 결과를 얻어 오기 위해서 clEnqueueReadBuffer나 clEnqueueMapBuffer를 사용할 수 있는데 이 둘의 프로토타입을 보면 clEnqueueReadBuffer는 ''map_flags'' 인자가 없고 받아올 버퍼를 인자로 넘겨서 값을 받아오고 clEnqueueMapBuffer는 ''map_flags'' 인자를 설정하고 반환값으로 결과값이 들어있는 포인터를 넘겨 받음을 알 수 있다.
'''Tip :''' ''non-blocking copy or map command가 command queue에 들어왔을 경우 command queue가 flushed 될 때까지 실행 되지 않는다. 실행 시키기 위해서는 clFlush()를 사용해야 한다.''
10600 은 10.6GB/s을 의미한다. 초당 10.6Gbyte를 전송할 수 있다는 의미다.
DIMM 은 듀얼 채널로 구성이 가능하다는 말인데.. 듀얼로 구성하면 10.6GB/s * 2 = 21.2GB/s의 대역을 갖게 된다.
하드웨어가 낼 수 있는 속도는 수십기가를 육박하지만 실제 시스템 상에서는 그런 성능을 볼 수 없다. 최대한 하드웨어가 갖고 있는 성능에 근접하게 소프트웨어를 만드는 과정을 최적화라고 할 수 있다.
[:cl_mem_object_experiment 위 내용을 토대로 실험을 해보자.]
- batch_normalization . . . . 51 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를 작게 취하는 등의 전략을 사용했다. 하지만 이러한 것들이 문제를 해결하는 실질적인 방법은 되지 못했다.
다층 구조를 갖는 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를 줄이는 대표적인 방법 중 하나는 각 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/>]
training과 inference 단계에서 normalize에 사용하는 평균 분산이 다름을 위 알고리즘에서 설명하고 있다. 위 알고리즘은 두 부분으로 나눌 수 있는데 입력 \(x^{(k)}\)의 \(k\)는 입력 x의 각 차원에 해당하는 attribute이고 '''알고리즘 1'''에 의해서 구해진 \(\mucal, \sigcal, \gamma, \beta\)에 의해서 \(y^{(k)}\)를 계산해서 다음 레이어의 입력으로 사용한다.
infercence 단계에서는 각 mini-batch에서 계산된 \(\mucal, \sigcal\)의 평균을 계산해서 normalize에 사용하는 부분이 training 단계와 다르다.
첫 번째 결과가 BN을 적용했을 경우, 두 번째 결과가 BN을 적용하지 않았을 경우이다.
- bayes_formula . . . . 14 matches
베이즈 공식 (Bayes' formula)는 다음의 식을 뜻합니다.
사건 \(A\)가 일어난 상태에서 사건 \(B\)가 일어날 확률을 알고 있으면서
사건 \(B\)가 일어난 상태에서 사건 \(A\)가 일어날 확률을 계산하고 싶을 때 쓰입니다.
[조건부 확률의 활용] 양성반응일때 실제 병에 걸려있을 확률? - 계산편
[조건부 확률의 활용] 양성반응일때 실제 병에 걸려있을 확률? - 이해편
병에 걸릴 확률, 양성반응이 나올 확률 그리고 병이 있을때 양성반응이 나올 확률을 이용하여
양성반응이 나왔을때 병에 걸려있을 확률을 알 수 있습니다.
전체 확률의 법칙을 이용하면
따라서 \(A\)가 \(A_1,~ A_2, \cdots, ~A_n\)중 하나라고 했을때 다음이 성립하게 됩니다.
이 식이 베이즈 공식 혹은 베이즈 정리를 찾을때 가장 많이 나오는 식입니다.
- bicycle . . . . 2 matches
Rolling efficiency 2.5, Wet Crip 3, Robustness 3, 3x120 TPI[* Tread Per Inch - 단위 인치당 트래드의 수, 타이어를 만들때 들어가는 섬유의 수로 높은 TPI 값을 가질 수록 가느다란 섬유질을 사용하여 구름 저항(rolling resistance)가 낮아지고 지면과의 밀착력이 좋아짐], 235g(25c)
- big_file_copy . . . . 1 match
복사하려는 위치로 이동하고 압축하고 복사할 장소에서 압축을 푸는 행위를 동시에 진행함으로서 복사가 수행된다.
- bldc_motor . . . . 3 matches
장난감에 사용할 수 있을 정도로 구동이 간단하지만 모터 안에 브러시가 들어 있어 수명이 짧고 소음이 발생한다. 이런 단점을 보안하기 위해서 나온 모터가
아래 그림은 N극, S극을 각각 1개씩 갖고 있는 2극 BLDC 모터 입니다.
- bucket_sort . . . . 1 match
if( bucket[i][j] != 0 ){ // 배열이 비어있지 않다면 값을 원래 배열로 복사
- c_1_ans . . . . 34 matches
'''해석''' Colby Tucker는 CEO에 의해 홍보부 부장으로 임명되었으며, 현재의 부장이 다른 지사로 전근 갈 때 그의 직책을 맡을 것이다.
'''어휘''' public relations 홍보, 선전 head 부장, 책임자 assume a post 직책을 맡다 present 현재의, 지금의 transfer 전근하다, 옮기다 branch 지사, 지점
빈칸이 동사(satisfy)의 목적어 자리이므로 명사인 (A)와 명사 역할을 하는 동명사인 (B)가 정답의 후보이다. ‘수요를 충족시키는 데 도움이 되고자 추가 교대 근무조를 두었다’라는 문맥이 되어야 하므로, ‘수요’라는 뜻을 지닌 명사 demand의 복수형 (A) demands가 정답이다. (B)를 쓸 경우, ‘요구하기를 충족시키는 데 도움이 되고자 추가 교대 근무조를 두었다’라는 어색한 의미가 된다. 동사 (C)와 준동사 (D)는 명사 자리에 올 수 없다.
'''해석''' 음식점에서 식사를 한 음식 평론가가 그가 먹은 음식에 대해 비판적으로 평가했을 때 그 요리사는 망연자실했다.
‘음식 평론가가 그가 먹은 음식에 대해 비판적으로 평가했을 때 요리사는 망연자실했다’라는 문맥이 되어야 하므로 ‘비판적으로, 불리하게’라는 뜻의 부사 (D) unfavorably가 정답이다. 참고로 (A) ultimately는 ‘결국, 궁극적으로’, (B) appreciably는 ‘눈에 띄게’, 그리고 (C) exclusively는 ‘배타적으로, 독점적으로’의 의미임을 알아둔다.
'''해석''' chef 요리사 devastate 망연자실케 하다, 엄청난 충격을 주다 critic 평론가, 비평가
'''해석''' 자금 제공에 관하여 관리자에 의해 추천된 기획안이 그들의 것이었음을 알게 되자 그 팀은 완전히 놀라워했다.
'''해석''' 스마트폰과 태블릿 기술의 이용이 가능해진 이후로, 사람들은 그들의 메시지와 이메일을 훨씬 더 자주 확인한다.
‘사람들은 그들의 메시지와 이메일을 훨씬 더 자주 확인한다’라는 문맥이 되어야 하므로 ‘자주, 흔히’라는 뜻의 부사 (D) frequently가 정답이다. 참고로 (A) anxiously는 ‘근심하여, 걱정스럽게’, (B) consequently는 ‘그 결과, 따라서’, 그리고 (C) obviously는 ‘명백히, 분명히’의 의미임을 알아둔다.
'''해석''' 그 발표자는 프로젝트의 최종 승인을 내리고 투자를 유치할 이사진에게 수익 계획을 설명했다.
‘그 발표자는 이사진에게 수익 계획을 설명했다’라는 문맥이 되어야 하므로 ‘설명하다’라는 뜻의 동사 explain의 과거형 (A) explained가 정답이다. 참고로 (B)의 limit은 ‘제한하다, 한정하다’, (C)의 excuse는 ‘변명하다, 용서하다’, (D)의 convert는 ‘전환시키다, 바꾸다’라는 의미임을 알아둔다.
and와 함께 상관접속사를 이루는 (A) Both가 정답이다. 참고로 상관접속사 Both A and B가 명사구(regular meals)와 명사구(special meals)를 연결하고 있음을 알아둔다.
'''해석''' regular 일반적인, 보통의 serve (음식 등을) 제공하다, 내다 in-flight 기내의, 비행중의 passenger 승객 submit 제출하다 in advance ~ 전에, 미리, 사전에
‘많은 학생들이 무료 세미나에 참석하기 위해서 도착했다’라는 문맥이 되어야 하므로 ‘많은’의 뜻을 지닌 형용사 (B) Numerous가 정답이다. 참고로 (A) Extended는 ‘길어진, 늘어난’, (C) Common은 ‘공통의, 보통의’, 그리고 (D) Excessive는 ‘지나친, 과도한’의 의미임을 알아둔다.
‘그 여행 단체는 박물관 안내원에게 전시된 공예품에 대하여 질문했다’라는 문맥이 되어야 하므로 ‘~에 대하여’의 뜻을 지닌 전치사 (B) about이 정답이다. 참고로 (A) during은 ‘~동안에’, (C) given 은 ‘~을 고려했을 때’, 그리고 (D) besides는 ‘~이외에’의 의미임을 알아둔다.
그 학생이 수강하길 원했던 선택 과목에 더 이상 이용 가능한 자리가 없어서, 그녀는 그 과목을 신청하는 것을 미루기로 결정했다.
‘선택 과목에 더 이상 이용 가능한 자리가 없었다’라는 문맥이 되어야 하므로 ‘이용 가능한, 구할 수 있는’의 뜻을 지닌 형용사 (D) available이 정답이다. 참고로 (A) spacious는 ‘넓은, 거대한’, (B) achievable은 ‘성취할 수 있는, 달성할 수 있는’, 그리고 (C) convenient는 ‘편리한’의 의미임을 알아둔다.
slot 자리 elective course 선택과목 postpone 미루다, 연기하다 enroll in ~을 신청하다, ~에 등록하다 subject 과목
그 손님은 값비싼 음식점에서 어떤 음식을 주문해야 할 지 전혀 알지 못했기 때문에, 종업원에게 추천을 해 달라고 요청했다.
빈칸이 타동사(make)의 목적어 자리이므로 목적어 자리에 올 수 있는 동명사 (B)와 명사 (D)가 정답의 후보이다. ‘그 손님은 종업원에게 추천을 해 달라고 요청했다’라는 문맥이 되어야 하므로 (D) recommendations(추천)가 정답이다. (B)를 사용할 경우 ‘그 손님은 종업원에게 추천하는 것을 해 달라고 요청했다’라는 어색한 문맥이 된다. 동사인 (A)와 (C)는 명사 자리에 올 수 없다.
- caffe_installation . . . . 4 matches
Caffe는 대부분의 경우 GPU에서 사용하는 것으로 알고있다. Caffe 컴파일을 위해서 CPU용 BLAS는 그냥 설치하기 쉬운 ATLAS로 설치해두면 편하다.
이제 github에서 Caffe를 받아서 컴파일을 할 수 있다.
python에서 model을 불러와 visualization등을 하기 위해서는 pycaffe를 컴파일 해야한다.
- centos_chrome_yum_install . . . . 4 matches
chrome은 더 이상 공식 지원을 하지 않기 때문에 대신 chromium을 설치해 보겠습니다.
2. 그리고 나서 yum을 이용해서 설치
Chromium에서 Adobe Flash Player가 동작을 하지 않네요 ㅎㅎ
- cl_mem_object_experiment . . . . 16 matches
실험의 내용은 간단하다. User 영역에 있는 데이터를 디바이스에 전달해서 간단한 연산 후 돌려 받는 과정을 몇몇 시나리오를 통해서 실험하고 결과를 비교한다.
1. '''usermem'''의 데이터를 디바이스로 전달하고 모든 값에 100을 더한다.
1. 디바이스로 부터 값을 전달 받아 확인한다.
* clEnqueueReadBuffer/clEnqueueWriteBuffer 를 사용했을 경우
* clEnqueueMapBuffer/clEnqueueUnmapBuffer를 사용했을 경우
* CL_MEM_ALLOC_HOST_PTR 로 정의해서 사용했을 경우
* CL_MEM_USE_HOST_PTR로 정의해서 사용했을 경우
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)
결과를 보면, Data Size 가 64MB 보다 작은 경우에는 '''CL_MEM_USE_HOST_PTR''' 가장 성능을 보여주는 것을 볼 수 있다.
64MB에서 256MB 구간에서는 Default Memory를 사용하는 '''Map/Unmap'''이 가장 좋은 성능을 보인다.
Data Size가 512이상이 되면 Default Memory를 사용하는 '''Read/Write'''가 가장 좋은 성능을 낸다.
- cluster_install_work . . . . 19 matches
이전 사용하던 시스템을 클러스터로 구축해서 사용하려고 함.
운영체제는 [http://voyagerlive.org/ VOYAGER Linux] 최신버전인 14.04.3 TLS 버전을 사용하기로 한다.
unetbootin-linux-608.bin을 이용해서 만들었음.
gparted를 사용하면 쉽게 파티션을 나누고 특정 파티션으로 포멧이 가능하다. 여기서는 ext4 파일 시스템을 사용하는 두개의 파티션으로 구성하였다.
여러 시스템을 하나의 계정정보로 묶어 사용하기 위해서 계정정보를 통합 관리해야 할 필요가 있다. 이 역할을 NIS가 수행해준다.
NIS가 사용할 도메인을 설정해준다. 서버와 클라이언트가 동일한 도메인을 사용한다.
nis 설치과정에서 도메인 네임을 설정하게 되어 있음.
/etc/hostname 에 사용할 노드의 이름을 적어준다.
/etc/hosts 파일에 사용할 네트워크 구성을 적어준다.
/etc/host.conf 파을을 수정해줘야 한다.
이 파일을 열어 보면
이라고 되어 있는 것을 볼 수 있는데 DNS 보다 NIS를 먼저 참조 하도록 bind 앞에 nis를 추가해줘야 한다.
nis 설정파일에 서버 노드의 이름을 설정해준다.
사용자가 추가 되거나 변경 되었을 경우 새로이 컴파일해야 한다.
설치 방법은 조금 오래된 문서지만 [http://www.supertom.com/code/condor_ubuntu_installation_configuration.html 다음을] 참조하면 될 듯하다.
- cmake_guide . . . . 1 match
CMAKE는 환경에 맞게 Makefile을 만들어 주는 유틸리티다.
- cnu_digital_signal . . . . 3 matches
Matlab을 사용한 디지털 신호처리 수업을 필기 하도록 한다.
Sampling - 일정한 간격으로 샘플을 취함.
- coding_role . . . . 2 matches
* 기능을 설명할 수 있는 동사로 시작한다.
* 반환값을 사용하고 예상할 수 있는 에러를 처리한다. (void 형 사용하지 않음)
- coffee . . . . 1 match
* 커티버 사람들이 만든 품종, 맛보다는 생산량에 중점을 둠.
- config.php . . . . 8 matches
/tools/mkpasswd.pl 을 이용해서 암호를 생성하고 생성된 암호를
== ACL을 이용한 접근권한 설정 ==
ACL을 사용하기 위해서는 config.php를 수정한다.
자동으로 특정 단어에 링크를 생성해주는 기능을 끈다.
섹션 제목을 클릭하면 섹션이 접힙니다. 긴 문서일 경우 유용하게 사용할 수 있게 되었습니다.
1과 2는 Folding을 사용할 것을 설정하는 것이다.
2로 설정 했을 경우 $javascripts=array("folding.js",....);를 추가해야 합니다.
- contrastive_self_supervised_learning . . . . 12 matches
[* https://blossominkyung.com/f4370b4e-a0b1-4009-81eb-dcc772e27265]의 내용을 Wiki Page로 옮겨옴.
:기본 데이터는 희소 레이블이나 보상이 제공할 수 있는 것보다 더 풍부한 구조를 가지고 있기에 Supervised Learning 알고리즘을 위해 다량의 샘플들이 필요하고, 이는 다루기 힘든 솔루션으로 수렴하는 결과를 야기한다. (관찰하는 실험의 데이터를 다 수집할 수 없고 수집된 데이터 샘플이 대표성을 갖기 힘들 수 있는 경우가 많다. 이런 경우 수집된 샘플로 모델을 학습하게 되면 모델이 엉뚱한 방향으로 수렴하던가 샘플 데이터에 오버피팅되기 쉽다)
:고차원 문제에서는 Direct Supervision에 의존할 수 없고, RL과 같은 문제에서는 레이블을 획득할 수 있는 마진가가 비싸다.
:용도 변경이 가능한 Knowledge 별 솔루션이 아닌 Task-specific 솔루션을 제공한다.(제공된 트레이닝 데이터에만 작동하는 솔루션을 만들어 내기 쉽다.)
이러한 문제에 대해 Self-Supervised Learning은 데이터 자체가 학습 알고리즘에 대한 Supervision을 제공할 수 있는 방안을 제안한다. 그럼 이제부터 다른 Self-Supervised Learning 기술과 어떻게 다른지 비교하며 최근 논문들을 살펴보도록 하자.
Contrastive 방법은 긍정적인 사례와 부정적인 사례를 대조하여 representation을 학습한다. 새로운 패러다임은 아니지만, Unsupervised Contrastive 사전 훈련으로 컴퓨터 비전 분야에서 큰 경험적 성공을 이끌었다.(RBM의 학습 알고리즘과 유사한것 같은데.. 조사가 필요함)
- cpp_algorithm_median_finding . . . . 6 matches
어떤 데이터가 있을때 이 데이터의 평균과 분산을 사용해서 데이터의 특성을 이야기 하곤하는데 데이터의 분포에 따라서 평균보다 '''중간 값'''을 사용하기도 한다.
'''중간 값'''의 의미는 데이터를 크기에 따라 정렬했을때 중간에 의치하는 값을 의미한다.
- cpp_programming_boost_lib . . . . 6 matches
Boost[[footnote( http://www.boost.org/)]]는 C++ Library로 우리가 자주 사용하는 알고리즘을 모아놓은 것입니다. 여러 개발자들이 만든 오픈 소스 라이브러리로, 사용할 수 있는 OS는 Windows, Linux 입니다. 저는 개인적으로 서버를 운영하여 리눅스에 설치해 사용 중입니다만, 몇몇 Windows 유저들은 Visual Studio와 연동하셔서 하는데, 최근에 나온 2012 버전에는 잘 안된다는 얘기도 있더군요...
RedHat 계열의 리눅스(CentOS)에서는 Boost Library가 개별적으로 지원되는 경우가 없다고 합니다. boost가 패키지 목록에 포함되어 있지 않다면, Windows에 설치 항목에 링크를 따라가 Unix용으로 tar 파일을 받으신 후 소스 설치하셔야 합니다.
위 코드는 rand48 함수를 사용하여 난수를 생성한 방법입니다. 1,100까지 아무 숫자나 뽑아서 20개의 숫자를 출력하는 방법입니다. 더 나아가서 time 함수를 쓴다면 프로그램 실행할 때마다 숫자가 바뀌겠지요? 처음부터 설명해보자면, 먼저 난수 발생기 하나를 정해줍니다. rand48을 정해줬지요. 그 다음 int면 int, double이면 double 등 자료형을 정해 랜덤으로 뽑아올 숫자의 범위를 지정해줍니다. 여기서는 1에서 100까지를 지정해줬지요. 중간과정이 빠져있지만 나중에 seed라는 값을 멤버함수로 넘겨줘서 쓰는 방법이 있는데, 여기서는 빠진 상태입니다. 만들어준 generator와 범위를 variate_generator (여기서는 using namespace를 사용)로 전달하여 마지막으로 출력을 하였습니다.
- cprogramming_file_inout . . . . 16 matches
다시 말해보면, fopen() 함수는 ANSI-C 규정에 따르는 그 어떤 컴파일러에서라도 사용할 수 있습니다만, open() 함수는 POSIX.1 규정에 따르는 운영체제에서만 사용할 수 있습니다. 따라서 이 둘은 기종간 이식성과 호환성에서 차이가 있습니다. fopen() 함수가 좀 더 호환성이 좋다고 봐야겠죠. POSIX.1 표준을 따르지 않는 운영체제는 많이 있습니다만 ANSI-C 표준을 따르지 않는 C 컴파일러는 없으니까요.
*프로그램소개 : 프로그램 매개변수 두개의 스트링을 읽어서
첫 번째 인자는 읽어들일 파일경로로 파일을 여는데 사용한다.
두 번째 인자는 저장 할 파일경로로 파일을 저장하는데 사용한다.
프로그램은 파일의 내용을 읽어 새로운 파일에 읽는 내용을 복사하는 프로그램입니다.
기능: 파일을 연다.
O_CREATE 해당파일이 없으면 파일을 생성한다.
O_EXCL 해당파일이 존재하면 오류를 발생시키고 파일을 열지않는다.
O_TRUNC 해당파일이 존재하면 파일의 길이를 0으로 만든다. 즉, 파일의 내용을 모두 지운다.
// 첫번째 인자를 읽을파일의 경로로 설정합니다.
fd : 읽을 파일의 파일식별자
//읽을 데이터가 없으면 read 함수는 0을 리턴하게된다.
기능: 파일을 닫는다.
- cprogramming_malloc . . . . 2 matches
* malloc은 할당 받는 메모리를 초기화 해주지 않으면 할당 받을 메모리의 사이즈를 바이트(Byte)단위로 입력 받는다.
* calloc은 할당 받는 메모리를 '0'으로 초기화 해주고 할당 받을 메모리 사이즈를 두가지 인자의 곱으로 입력 받는다.
- cross_entropy . . . . 36 matches
평균, 기댓값이라고 하면 보통은 어떤 값(변수)에 대한 기댓값만을 생각하는데 함수에 대한 기댓값도 계산할 수 있다.[* Kiho Hong (5 Apr 2017). <https://www.slideshare.net/lovelykihohong/variational-inference-intro-korean-ver>. (16 Jan 2018)]
* 낮은 확률로 발생하는 일에서 더 많은 정보를 얻을 수 있고 빈번하게 발생하는 일에 대해서는 적은 정보를 얻는다.
* \(p(x)\)는 확률이기 때문에 (0,1) 사이 값을 갖고 \(log_2(p(x))\) 는 (\(-\infty, 0\)) 사이의 값을 갖는다.
* 특정 사건의 확률이 1인 또는 0인 으로 사건의 변화가 없을 경우의 엔트로피 계산은 \(\lim_{p\to0}p\log_2p=0\)로 로피탈의 정리로 구할 수 있다.
* 클래스가 \(2^K\)개이고 이산 확률변수가 가질 수 있는 엔트로피의 최대값은 각 클래스가 모두 같은 확률을 가질 때이다.
조건부 엔트로피[* admin (17 Jun 2016). <https://datascienceschool.net/view-notebook/d3ecf5cc7027441c8509c0cae7fea088/>. (23 Jan 2018)]는 상관관계가 있는 두 확률변수 X, Y가 있고 X의 값을 안다면 Y의 확률변수가 가질 수 있는 정보의 양을 뜻한다.
* 잘 못된 information gain을 사용하게 되면 Enropy 값이 늘어나게 된다.
* 잘 못된 information gain을 사용했을 때와 최적의 information gain을 사용했을 경우의 차 \(-\log(q(x)) + \log(p(x))\)
* 분포 p, q의 중간 지점을 잡고 각각에서의 거리의 앞으로 표현했다.[* HyeongMin Lee (15 Mar 2018) <https://hyeongminlee.github.io/post/prob002_kld_jsd/> (4 Apr 2019)]
가능도는 주어진 표본(\(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\)의 확률분포를 구하는 것이다. 가능도 함수의 계산을 위해서, 함수에 로그를 씌워서 계산을 하기도 하는데 이를 '로그가능도함수'라고 한다.
\(\mathcal{L}(\theta, \phi;x)\)을 x의 확률인 evidence의 lower bound라고 해서 줄여서 ELBO로 표현한다.
maximum log-likelihood를 구하기 위한 방법으로 ELBO를 최대화 하는 방법을 사용한다. lower bound를 끓어 올림으로서 자연스럽게 log-likelihood의 값도 상승하기 때문이다.
또 다른 방법으로 위 식을 다시 정리하면 아래와 같은 식을 구할 수 있다.
L개의 샘플을 뽑아서 계산함.
샘플링을 통한 expectation 계산 부분은 미분이 안 되기 때문에 expectation 부분을 미분식 밖으로 빼줘야 한다.
z를 평균과 분산을 이용해서 다시 정리하면 아래와 같이 표현할 수 있다.
- cscope설정하기 . . . . 10 matches
cscope는 드렉토리에 있는 text에서 함수 정의, 함수 호출, 문자열, 파일 등을 쉽게 찾아주는 프로그램이다.
메뉴에 찾고자 하는 문자열이나 함수등을 입력하게 되면
아래와 같이 찾은 문자열을 포함하고 있는 파일들을 찾아 준다.
gpio23을 키워드로 해서 찾았을때의 예
이것은 cscope가 unix 시스템에서 개발 되면서 생기는 문제로 문장의 끝에 ^M을 처리 하지 못 하는 문제가 있다.
^M을 지우거나 추가 해주는 방법으로 해결 할 수 있다. 아래는 tofrodos라는 프로그램을 사용하는 방법이다.
find 명령을 이용해서 recursive 하게 모든 파일에 적용 할 수 있다.
- cubic_spline_interpolation . . . . 10 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\)을 곡선이 지나간다.
4. 두 곡선이 '더욱' 매끄럽게 만나게 하자. 즉, 각 점 \(x_i\)에서 두 곡선의 이차미분값을 같게 한다.
위 사안 중 1,2 번은 당연히 필수적인 것이고, 나머지 사안들은 '부드럽게 연결'시키기 위해 사용할 수 있는 조건들이라 할 수 있겠다. 4번은 3차 다항식의 계수값을 계산할 수 있게 하기 위해 사용하는 목적도 있다. 또한 양 끝 쪽에서의 조건도 필요한데, 가장 양 끝에서 두 번 미분한 값이 0 이거나, 한 번 미분한 값이 원래의 데이터의 미분값과 같다는 조건 둘 중 하나를 이용하곤 한다. 위 조건은 수학적으로 다음과 같이 표현할 수 있다.
- cv_report1 . . . . 19 matches
derivation 계산을 위해 sobel filter[* https://kr.mathworks.com/help/images/ref/fspecial.html]를 사용했음.
Harris measure를 계산하기 위해서 두개의 수식을 사용하였는데 아래의 수식이 더 좋은 결과를 보여줬음.
ordfilt2함수를 사용해서 일정 영역 안에서 가장 큰 값을 취하고 취해진 값이 설정한 threshold 이상인 경우의 좌표를 구함.
flat 영역과 안 좋은 curvature를 영역을 제거 하기 위한 값으로 0.5와 10을 사용했습니다.
* 위에서 구해진 Diffence of Gaussian에서 자기 자신을 중심으로 위 아래 3x3x3 영역을 설정하고 자기 자신이 가장 크거나 적은 경우를 extrema로 취함.
위 식을 이용해서 magnitude와 angle을 구했다.
angle를 구하는 과정에서 atan을 사용했는데 atan을 출력 범위가 \(-\pi/2, \ \pi/2\)이기 때문에 위 식을 약간 변형해서 atan2를 사용해서 \(-\pi, \ \pi\)의 결과를 얻었다.[* http://blog.daum.net/aero2k/42]
\(0,\ 2\pi\)영역을 8등분해서 해당하는 영역의 magnitude의 합을 구하는 함수를 만들어 사용했음.
이렇게 만들어진 orientation histogram을 합쳐 128 dimensions feature vector를 구성하고
아래 과정을 통해 normalization을 수행하고 gradient가 0.2 이상인 것을 0.2로 보정해서 다시 re-normalization을 수행하였음.
- cv_report2 . . . . 15 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]
기본적인 알고리즘 구현은 MATLAB을 사용하였으며, SIFT는 MATLAB에서 제공하지 않기 때문에 opencv의 sift[* https://docs.opencv.org/3.0-beta/doc/user_guide/ug_features2d.html#descriptors]를 사용하였고 matlab에서 호출하여 사용하는 방식으로 구현하였다.
sift로 추출한 디스크립터로부터 유사도를 측정하여 가장 가까운 점을 찾고 두번째로 가까운 점과의 유사도 차가 일정 수준 벗어나지 않으면 매칭이 느슨한 것으로 판단해서 제거하는 방법으로 정교한 매칭점을 찾았다. 이 과정을 통해서도 완벽한 메칭점을 찾기는 쉽지 않음을 확인 했다.
이미지를 붙이기 위해서 매칭점을 이용해서 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. 4개의 임의의 매칭점을 선택하여 trasformation matrix를 계산한다.
1. 모든 매칭점에 대하여 transform을 적용하고 원하는 위치와의 거리를 계산한다.
1. 위 과정을 통해서 찾은 inliner가 4개 이상이면 inliner만을 이용해서 trasformation matrix를 계산한다.
1. inliner를 4개 이상 찾지 못했다면 현재까지 가장 좋은 trasformation matrix을 반환한다.
- cv_report3 . . . . 26 matches
사용할 영상은 Daniel Scharstein의 2003년 CVPR 논문에 사용한 ''Cones''와 ''Teddy'' [* Daniel Scharstein. (16 Jen 2015). "2003 Stereo datasets with ground truth" <http://vision.middlebury.edu/stereo/data/scenes2003/>. (2 Dec 2017)] 사진을 사용하겠다.
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 과정이 필요하다.
Optimazation으로 Dynamic programming[* ZeroCho. (2016). "동적 프로그래밍(Dynamic programming)" <https://www.zerocho.com/category/Algorithm/post/584b979a580277001862f182>. (4 Dec 2017)]을 사용하겠다.
이 부분은 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에 시간이 너무 오래 걸려서(대략 3시간쯤 소요) cost aggregation을 생략하고 dp(패널티 3 적용)를 수행해 보았다.
작은 윈도우를 설정하고 cost aggregation 수행 aggregation을 수행하지 않을때 보다는 좋은 결과를 얻었지만 노이즈가 보인다.
윈도우 크기를 조금 더 키워서 테스트 해보았다. 경계면이 조금 더 부드럽게 처리됨을 확인 했다.
아래 그림은 패널티 모델을 potts 모델을 적용한 것이다. 조금 더 많은 경계면이 잘 구분 된다.
- dailynote_24_11_2014 . . . . 4 matches
* 중력가속도(Gravitational acceleration) : 뉴턴의 제2법칙에 따르면 물체의 단위 시간당 속도 변화량, 즉 가속도는 힘에 비례하는 값을 가진다.
* 하나의 물체에 위의 4가지 힘이 복합적으로 상호 작용하여 물체에 힘을 작용하여 속도 변화를 일으키게 된다.
* 지표면에서 낙하하는 물체의 경우 중력의 영향을 받아 운동 가속도가 발생한다. 이를 특별히 중력가속도라고 한다.
(단 \(\widehat{r}\)은 물체 중심과 행성 간 중심을 연결하는 크기 1의 단위 벡터이며 방향은 지구 중심 방향이다.)
- dailynote_25_11_2014 . . . . 9 matches
* ePub는 HTML과 CSS릐 일부분을 차용한 오픈된 파일포멧 표준이다.
* 기본적으로 HTML으로 구성된 문서가 ZIP으로 압축된 모양을 갖는다.
2007년 부터 기존 전자책 표준을 승계하여 나온 표준이다. 기존의 전자책은 텍스트(txt)에 가까운 원시적인 형태를 갖고 있었고 이를 개선하기 위해서 HTML과 CSS를 도입하여 새롭게 만든 것이다. 표준화가 서양에서 부터 이루워졌기 때문에 2.0.1까지는 세로 쓰기 및 다국어 표시에 제한적이였다. 3.0 이후 버전 부터는 다국어 기능과 CSS3의 일부 기능을 체용하여 문제를 해결하고 있다.
DRM[[footnote(Digital Rights Management. 디지털 저작권 관리.)]] 기능도 있어서 저작권 관련 컨텐즈는 읽는 것을 제한할 수 있도록 하고 있다.
똑같다. 웹에서 쓰는 HTML, CSS와 구문 및 사용방법이 완전히 똑같다. 애초에 HTML과 CSS를 별다른 변형 없이 필요한 기능만 그대로 가지고 왔기 때문이다. 이 때문에 웹 기반으로는 epub 뷰어를 만들기도 쉽다. 애초에 epub는 zip 파일 안에 HTML, CSS와 전자책에 쓰는 각종 이미지 및 미디어를 내장하고 있기 때문에, zip 파일만 풀어낸다면 웹 브라우저에 그냥 뿌리는 것이 가능하기 때문이다. 실제로 zip 파일을 풀어서 나온 html 파일을 웹 브라우저에서 열면 웹과 비슷한 화면이 뜨는 것을 볼 수 있다.
epub 2 버전의 기반은 XHTML 1.1과 CSS 2.1인데, XHTML 1.1은 너무 엄격해서 웹에서는 잘 쓰지 않는 규약이다. 새로 나온 epub 3 버전은 요즘의 트렌드에 맞게 HTML5와 CSS3을 기반으로 하고 있다.
- data_mining_weka . . . . 10 matches
수업시간에 배운 classification algorithm들을 모두 적용해 보고 예측 정확도가 가장 좋은 3개의 분류 방법에 대해서 결과를 비교 분석한다.
각 알고리즘의 성능을 비교 하기 위해서 5 cross-validation으로 실행한다.
Letter Image Recognition Data : 손으로 작성한 알파벳을 인식하는 문제
* 두 데이터에 대해서 모두 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 . . . . 14 matches
SuperMarket 데이터로 216개의 아이템을 갖고 있다. 마지막 total field는 100 이상이면 'high' 그렇지 않으면 'low' 값을 갖도록 처리 되어 있다.
출력 결과의 내용을 살펴보면 가장 빈도고 높은 Rule 10개를 출력했다. 추가 적으로 '''confidence''', '''lift''', '''leverage''', '''conviction''' 값을 내어줬다.
K-Means 알고리즘 특성상 초기 Centroid의 위치에 따라서 상이한 결과를 내여줌을 확인 하였음.
유사도가 가장 높은 그룹(Cluster)끼리 통합(Merge)하면서 단계적으로 클러스터를 형성하는 방법으로 그룹간 유사도 계산 방법에 따라 다른 결과를 얻을 수 있다.
Weka에서는 Single, Complete, Average 외에 다양한 방법을 제공하고 있다. 그 중 몇 가지를 사용해 본다.
데이터의 분포와 밀도에 따라서 Epsilon과 MinPoint 값을 잘 설정해 줘야 한다.
계산 시간이 오래 걸리기 때문에 모든 경우의 수를 다 실행할 수는 없었기 때문에 Epsilon을 작게 설정해서 원하는 클래스의 수가 나오도록 천천히 올려가면서 수행했고 MinPoint를 조절하면서 미분류도와 정확도를 알아 보았다.
* Epsilon을 0.2로 설정했을 경우는 설정값이 데이터의 밀도에 비해서 너무 작게 설정 되어 있어서 대부분의 데이터 포인트가 noise point로 분류됨.
* Epsilon을 0.4로 설정하고 MinPoint 값을 서서히 늘리면서 데이터의 분류 성능이 좋아짐을 확인함.
- debian_release_info . . . . 4 matches
이 배포본은 데비안의 프로덕션 릴리스입니다. 이 배포본을 사용하기를 권합니다.
testing 배포본은 stable 릴리스에 아직 들어가지 않았지만 곧 들어갈 패키지를 포함하고 있습니다. 이 배포본을 사용해서 얻을 수 있는 이점은 더 많은 최신 소프트웨어를 사용할 수 있다는 것입니다.
unstable 배포본은 개발중인 데비안 배포본입니다. 이 배포본은 개발자와 위험을 마다하지 않는 사용자들이 사용합니다.
- deep_learning_transformer . . . . 1 match
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 . . . . 18 matches
\(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)\)의 주파수 영역에서의 표현이라 할 수 있다.
일반적으로 이산 시간 푸리에 변환은 \(w\)의 복소 함수이다. 이것을 직각좌표 형식으로 쓰면 아래와 같다.
이산 시간 프리에 변환으로 시간에 대한 (time domain) 신호를 각 주파수 \(w\)를 갖는 \(X(e^{jw}\)의 신호로 변환하였다. 이것을 \(w_k\) 로 확장해서 각각의 각 주파수 성분을 계산하는 것으로 확장해보자.
위 식은 주파수 \(\left [ 0, \pi \right ]\) 사이의 (M +1)개의 등간격 주파수들이다. 이 각각의 주파수들에 대해 프리에 변환을 적용하면 식 1.1을 아래 식으로 확장할 수 있다.
여기서 W는 각 주파수 k와 시간의 함수 \(x(n_l)\)의 인덱스의 행렬임을 알 수 있다.
게다가 \(\{k\},\ \{n_l\}\)을 각각 행 벡터 k 와 n 으로 배열하면 다음과 같이 표현할 수 있다.
따라서 식 2.2의 전치 행렬을 취하면 다음을 얻을 수 있다.
식 1)을 이용해서 연속 함수를 불연속 함수꼴로 변환하는 과정을 설명한다.
- diffusion . . . . 3 matches
이미지를 백터화 할 수 있는 방법으로 Clip을 이용해서 feature vector를 생성하는 방법을 사용하고 생성된 vector를 cosine simularity를 사용해서 비교한다.
위 와 같이 cudatoolkit을 별도로 설치하면 설치하는 tensorflow와 pytorch에 맞는 cuda를 같이 설치하는 공간이 만들어지는 듯하다.
- dm365_filter_change . . . . 4 matches
Full Stepping으로 사용하려고 한다면 4스텝으로 하나의 동작을 구성하게 된다.
step 1에서 step 4까지 시그널을 보내게 되면 한각을 전진하게 되고
반대로 step4에서 step1으로 시그널을 보내게 되면 한각 뒤로 후퇴하게 된다.
- dm365_isif . . . . 3 matches
DM365의 Image sensor interface(ISIF)에 대해서 알아보고 센서나 기타 입력으로 부터 영상을 받아 들이는 과정을 설명한다.
ISIF는 sensor로 부터 RAW image/video data를 받아 들이거나, video decoder devices로 부터 YCbCr 포멧의 영상 데이터를 받아 들이는 것을 담당한다.
- dm365_wdr_driver . . . . 1 match
One shot mode만 구현 되어 있는 부분을
- dnn_study . . . . 1 match
아래 내용은 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 . . . . 10 matches
docker-compose.yml파일을 다음 아래와 같이 작성해준다.
이미지는 해당 시점에서 최신버전을 다운받으며 Influxdb:2.2 버전이다
다음 아래와 같이 Docker Compose파일을 실행시켜 준다
혹시나 docker-compose.yml 파일을 다른 이름으로 작성했다면 다음 아래와 같이 실행시켜준다.
이미 실행된 컨테이너에 대해 자동 재시작을 설정하는 방법도 있습니다.
위와 같이 데이터베이스와 measurement (test_table)을 생성했다. 여기서 tag key와 field key를 알아보자.
위 명령어를 실행하면 tag key는 ''name'', ''text''이고 field key는 ''number1'', ''number2'', ''value''임을 알 수 있다.
하나의 데이터 베이스에 여러개의 measurement가 있을 수 있는데, 각 데이터는 Point라는 틀을 갖는다.
입력하는 순가의 시간적인 지점(Point)을 말하는 것으로 내부에는 여러 개의 key가 존재한다.
- docker_mongodb . . . . 1 match
-v ~/data:/data/db는 호스트(컨테이너를 구동하는 로컬 컴퓨터)의 ~/data 디렉터리와 컨테이너의 /data/db 디렉터리를 마운트시킨다. 이처럼 볼륨을 설정하지 않으면 컨테이너를 삭제할 때 컨테이너에 저장되어있는 데이터도 삭제되기 때문에 복구할 수 없다.
- docker_redis . . . . 12 matches
; 메모리 사용량이 너무 많으면 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]
image 구동 상태 확인 및 image 재시작을 위한 명령어
시스템을 재시작하면 redis docker container가 자동으로 실행되지 않아서 위에 있는 과정을 다시 수행해야만 하는 불편함이 발생한다. 이를 극복하기 위해서 redis docker container 재시작하는 루틴을 서비스로 등록하자.
''/etc/systemd/system/redis.service'' 파일을 생성하고, redis docker container의 실행을 위한 서비스를 아래와 같이 정의했습니다.
그리고 나서 다음의 명령을 순서대로 실행하면 redis docker container를 위한 서비스를 등록할 수 있습니다.
- docker_ssh . . . . 1 match
위 도커 파일을 빌드하기 위한 명령은 아래와 같다.
- docker_tutorial . . . . 115 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 환경을 사용하길 권장합니다. 네, 글을 쓰는 편의상.
Wow! 훌륭합니다. 필요하다면 ufw(방화벽) 설정을 통해서 도커가 사용하는 4243/tcp 포트도 열어줍니다.
명령어들을 실행하고 재로그인을 하게 되면 더 이상 sudo 명령어를 앞에 붙이지 않아도 docker 명령을 사용할 수 있습니다. 단, 이 방법을 사용할 경우엔, 공식 문서에서도 경고하고 있듯이 docker group은 root와 같은 권한 가지고 있다는 사실을 인지하고 있어야합니다.
설치만 끝났다면, 이제 끝이 보입니다. 대단해보이지만 정말 별 게 없습니다. 먼저 도커를 시작하면 이미지 개념을 이해할 필요가 있습니다. 처음에 보여드린 예제를 보면 centos 이미지를 다운로드 받고, 이 이미지에 shell을 실행시킵니다. 그런데 여기에 약간의 함정이 있습니다. Docker에서 실제로 실행되는 건 이미지가 아닙니다! 이미지는 추상적인 개념입니다. 실행되는 건 이미지를 기반으로 생성된 컨테이너입니다. 먼저 어떤 일이 일어나는지 확인해보도록 하겠습니다.
docker images 명령어는 현재 시스템에서 사용가능한 이미지 일람을 보여줍니다. 이미지가 어디서 오는지 궁금하게 느껴지실지도 모릅니다. 이미지는 크게 세 가지 방법을 통해서 추가할 수 있습니다.
하나는 처음 예제에서와 마찬가지로 docker pull <이미지 이름>을 통해서 가져오는 방법입니다. 바로 이 명령어를 사용하면 docker.io의 공식 저장소에서 이미지를 다운로드 받아옵니다. 쉘을 활용하는 개발자라면 이런 개념이 낯설지는 않을 것입니다. 리눅스에서 apt-get이나 yum 혹은 gem이나 pip, cpan, npm 같은 명령어를 사용해보셨다면 바로 이해하실 수 있을 겁니다. 이런 유틸리티를 사용해본 적이 없다고 하더라도 마찬가지 개념으로 docker 이미지 파일들을 관리하는 중앙 저장소가 있다고 이해하셔도 무방합니다. 독특한 점은 intsall이 아닌 pull 명령어를 사용한다는 점입니다. 이에 대해서는 개념적으로 VCS(버전 관리 시스템)을 알고 계신다면 추가적인 설명이 필요없겠습니다만, 어쨌거나 단순히 다운로드라고 이해하셔도 현재 단계에서는 무방합니다.
(두 번째 방법 커밋을 하는 방법입니다. 아래에서 설명합니다. 또 다른 방법은 Dockerfile을 통해서 기술된 과정을 거쳐 도커 이미지를 생성하는 방법입니다. 이에 대해서는 맨 마지막에 자세히 다룹니다.)
여기서는 편의상 ubuntu 이미지를 다운로드 받아오겠습니다. 이 이미지에 대한 정보는 웹을 통해서 확인하실 수 있습니다. 공식 저장소에 있는 이미지 정보들은 https://index.docker.io에서 확인할 수 있으며 우분투 이미지에 관해서는 이 페이지에서 찾을 수 있습니다.
우분투 안에 우분투에 접속하는데 성공했습니다! 짝짝짝. 그런데 앞서 말씀드렸다싶이 이미지에 접속했다는 말에는 함정이 있습니다. 이 말은 마치 가상머신 ssh 프로토콜을 사용해 접근한 것과 같은 착각을 일으킵니다. 이제 새로운 명령어를 하나 배워보도록 하겠습니다. 앞서서 우리가 사용한 사용가능한 이미지들을 확인하는 명령어는 docker images입니다. 이번에 사용할 명령어는 현재 실행중인 컨테이너들을 출력하는 명령어 docker ps입니다. 별도의 쉘이나 터미널을 열고 docker ps 실행시켜보시기 바랍니다.
4분 전에 만들어진 컨테이너가 실행되고 있는 것을 알 수 있습니다. 여기서 우리가 실행한 컨테이너 정보를 알 수 있습니다. 우리는 ubuntu:14.04 이미지로부터 컨테이너를 생성했고, 이 컨테이너에 /bin/bash라는 쉘을 실행시켰습니다. 그 외에도 맨 앞의 컨테이너 아이디는 앞으로 Docker에서 컨테이너를 조작할 때 사용하는 컬럼이기 때문에 필수적으로 알아둘 필요가 있습니다.
유난처럼 느껴질지도 모릅니다만, 이미지와 컨테이너를 정확하게 짚고 넘어갈 필요가 있습니다. 하지만 그렇다고 이미지와 컨테이너 개념은 아주 헷갈리는 개념인 것은 아닙니다. 단지 이미지는 추상적인 존재라는 것을 이해하실 필요가 있습니다.
또한 위의 예제에서는 직접 명령어를 넘겨서 이미지를 컨테이너로 실행시켰습니다만, 보통 이미지들은 자신이 실행할 명령어들을 가지고 있습니다. 예를 들어 레디스, 마리아db, 루비 온 레일즈 어플리케이션을 담고 있는 이미지라면, 각각의 어플리케이션을 실행하는 스크립트를 실행하게되겠죠. 컨테이너는 독립된 환경에서 실행됩니다만, 컨테이너의 기본적인 역할은 이 미리 규정된 명령어를 실행하는 일입니다. 이 명령어가 종료되면 컨테이너도 종료 상태(Exit)에 들어갑니다. 이러한 죽은 컨테이너의 목록까지 확인하려면 docker ps -a 명령어를 사용하면 됩니다. 실제로 쉘을 종료하고 컨테이너 목록을 확인해보겠습니다.
- dsp_report10 . . . . 13 matches
이 식에서 N =3, \(\Omega_c = 0.5\)를 얻을 수 있다.
다음 사양을 만족시키는 저역통과 버터워스 필터를 설계하라.
\(\Omega_p\)에서 사양을 정확하게 만족시키기 위한 아래 식을 얻었다.
\(\Omega_s\)에서 사양을 정확하게 만족시키기 위한 식을 얻으며 아래와 같다.
MATLAB을 사용하여 예제 8.3에 있는 아날로그 버터워스 저역통과 필터를 설계하라.
다음 사양을 만족하는 제1형 체비셰프 저역통과 필터를 설계하라.
MATLAB을 사용하여 예제 8.5에 주어진 제1형 체비셰프 아날로그 저역통과 필터를 설계하라.
예제 8.5에 주어진 사양을 만족시키는 제2형 체비셰프 아날로그 저역통과 필터를 설계하라.
예제 8.5에 주어진 사양을 만족시키는 타원형 아날로그 저역통과 필터를 설계하라.
제1형 체비셰프 원형 필터를 사용하여 다음 사양을 만족하는 디지털 저역통과 필터를 설계하라.
제2형 체비셰프 원형 필터를 사용하여 다음 사양을 만족하는 디지털 저역통과 필터를 설계하라.
- dsp_report7 . . . . 49 matches
가장 높은 차수를 갖는 항으로 분모 분자를 나눠주고 정리하면 식 1) 과 같은 식을 유도 할 수 있다.
식 1) 의 결과에서 2개의 극점 \(z_1 = 1\)과 \(z_2=\frac{1}{3}\)을 갖고 있음을 알 수 있다.
\(\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. 을 참조하면 아래의 식을 얻을 수 있다.
MATLAB을 사용하여 검증하기 위해서 위 식을 \(z^{-1}\)의 오름차순 함수가 되도록 분자 분모를 \(z^{2}\)으로 나눠준다.
두 번의 residuez() 함수를 통해서 원래의 식을 얻음을 확인했다.
MATLAB을 사용하여 얻은 파라메터로 아래식을 유도할 수 있다.
이 식을 표1.을 참조해서 변환하면 아래식을 얻을 수 있다.
MATLAB을 이용해서 pole을 구하면 아래와 같이 구할 수 있다.
위 식을 표1 을 이용해서 변경하면 아래와 같은 식을 얻을 수 있다.
MATLAB으로 검증하면 아래와 같은 결과를 얻을 수 있다.
a. \(H(z)\) 을 구하면 아래의 식으로 변환할 수 있다.
MATLAB을 이용해서 그려보자.
표1을 이용하면 아래의 식을 얻을 수 있다.
z-변환을 하면 아래의 식을 얻을 수 있다.
c. MATLAB을 사용하면 아래와 같은 결과를 얻을 수 있다.
\(y(n)\)을 z-변환하면 아래와 같다.
표1을 참조해서 변환하면 아래와 같다.
\(y(n)\)을 z-변환하면 아래와 같다.
- dsp_report8 . . . . 12 matches
a. L과 N으로 \(|\tilde{X}(k)|\)을 표현하라.
기하수열의 합 공식을 이용해서 간략화 하면 아래와 같이 할 수 있다.
b. L = 5, N = 20; L = 5, N = 40; L = 5, N = 60; L = 7, N = 60인 경우에 대해 크기 \(|\tilde(X)(k)|\)을 그려라.
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과 같음을 보여라.
\(\tilde{X}_2(k)\)의 역 DFS를 가진 신호 \(\tilde{x}_2(n)\)을 구하라.
DTFT, DFS 또는 역 DFS를 계산하지 않고 에일리어싱 공식을 이용함으로써 \(\tilde{x}_2(n)\)을 구할 수 있다.
\(x(n) = (0.7)^nu(n)\)이라 하자. 이의 z-변환을 단위원에서 N = 5, 10, 20, 50으로 샘플링하고 이의 시간 영역에 대한 영향을 조사하라.
- earthquakeWithAI . . . . 15 matches
내용은 큰 지진이 발생후 수개월 동안 발생하는 여진에 관해서다. 주 지진에 의한 직접적인 피해도 있지만 더 걱정이 되는 것은 주 지진에 의해서 약화 된 구조물들이 여진에 의해서 무너 지면서 발생하는 피해다. 이 때문에 구조작업이나 피해복구에 상당한 어려움을 격고 있다. 과학자들은 여진의 크기와 시기를 예측하기 위한 많은 연구를 진행해왔다. 그럼에도 예측성능이 그리 좋지 않았는데 구글과 하버드 연구팀이 딥러닝을 적용해서 예측성능을 획기적으로 높일 수 있는 방법을 제안했다. 기존 “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배 많은 지진을 탐지하였다고 발표했다.
{{{대만 IT 소식지 디지타임즈는 대만 국립 응용 연구소(National Applied Research Laboratories, NARLabs) 지진 공학 연구센터가 2017년 12월 28일에서 30일까지 대만에서 열린 'Future Tech 2017' 전시회에서 인공지능 기반 지진 조기경보 시스템을 선보였다고 보도했다.
이 연구소가 선보인 인공지능 기반 지진 조기경보 시스템은 인공지능 딥 러닝 기술을 사용, 축적된 지진 데이터를 바탕으로 지진 예측의 정확성을 높인 것이 특징이다. 지면에 설치된 센서를 통해 사람이 느낄 수 없고 매우 빠르게 전파되는 미세 지진(microseismic)의 P파(지진파의 일종)를 감지, 3초 이내에 지진 발생 지역과 진도 규모를 예측할 수 있다.
또한, 이 시스템은 최근 도입이 늘고 있는 다양한 스마트 시티, 스마트 홈 및 스마트 방재 솔루션에 함께 도입될 수 있으며, 제조업체와 보안 서비스 업체, 빌딩과 같은 대형 건물 관리 책임자들이 빠르게 지진 상황을 파악하고 대비할 수 있도록 도와준다고 연구소 측은 밝혔다.
- embaded_nand_flash_memory . . . . 19 matches
예를 들어 최근에 출시되는 삼성 NAND는 공장 출하시부토 존재하는 bad block을 표시하기 위해서 bad block의 마지막 page의 첫 byte를 Non-FF value로 표시함.
1. File system Info : 특정 file system은 이부분을 사용하여 구현됨.
'''SLC/MLC- NAND flash'''의 type에는 SLC/MLC가 있는데 이는 각각 Single Level Cell/Multi Level Cell을 뜻함.
'''BBT (Bad Block Table)''' - BBT는 boot loader나 flash관련 tool을 사용하여 flash를 erase 할 때 OOB를 참조하여 만들 수 있으며, Linux의 경우 kernel과 boot loader간에 BBT생성 규칙과 구조에 대해서 상호 협의가 되어 있음.
- 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와 부트로더의 구현에 따라 적절히 설계되어야 한다.
- NAND flash는 NAND controller의 도움을 받아야만 부팅장치로 사용될 수 있다. 만약 NAND controller가 HW적인 ECC를 지원한다면 부팅 속도가 NOR보다 빠를 수도 있다. 최근의 SoC들은 대부분 HW적인 ECC및 부팅기능을 지원하는 NAND flash controller를 가지고 있다.
- energy_model_based_restrict_boltzmann_machines . . . . 61 matches
현재 머신러닝과 인공지능 분야에서 주목받고 있는 ‘딥러닝’의 경우 학습과정에서 Restricted Boltzmann Machine(RBM)을 사용하는 경우가 많습니다. 특히, Deep Beleif Network에서 파라미터의 pretraining을
위해 사용되면서 RBM은 머신러닝에서 빼놓을 수 없는 모델로 자리잡게 되었습니다. 물론 학습 알고리즘 그 자체로만은 어렵지는 않다고 볼 수 있지만, RBM의 경우 Energy Based Model(EBM)의 한 종류로써 다른 기계학습 모델들에서는 잘 사용하지 않는 개념을 사용한다보니, 처음 접하는 사람들에게는 이해하기 어려운 부분이 있는 것이 사실입니다. EBM과 RBM을 그 컨셉인 물리학적인 접근을통해서 설명하므로써 처음 접하는 많은 이들에게 도움이 되기를 바랍니다.
확률모델링을 비롯하여 다수의 기계학습 모델들은 변수들 사이의 “상관관계”를 수치적으로 계산하는 것에서 시작한다. 예컨데 가장 기초적인 분류를 위한 확률모델을 살펴보자.
\(x_i\)라는 변수들에 대해 가능한 클래스 변수들 \(C_j\)의 조건부 확률 \(p(C_j |x_i)\)를 구함으로써 분류를 수행하였다. 우리가 가장 보편적으로 알고 있는 나이브 베이지안 모델의 경우 그 “상관관계”를 [:bayes_formula 베이즈 통계]를 사용하므로써 연산하였다. 이는 단순히 모델 특정적인 성격이 아니다. 생성적 모델에서 \(p(x|C_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)로 확장시켜서 생각해봤을 경우, 이 배열의 연관성 역시 에너지값으로 인코딩하였을때,
즉, 입력변수의 공간과 은닉변수의 공간 내의 배열에 대한 ‘연관성’을 에너지 함수를 통하여 정의하고, 에너지함수의 파라미터를 ‘실제데이터의 에너지값이 최저값이 되도록’ 학습시키므로써, 에너지 모델 관점의 비교사학습을 진행할 수 있게 된다.
K-means, autoencoder 등, 실제 모델을 에너지 모델 관점으로 기술된 학습 방법 등은 reference[[footnote(Marc'Aurelio Ranzato, Y-Lan Boureau, Sumit Chopra, Yann LeCun (2007)A Unified Energy-Based Framework for Unsupervised Learning)]] 참조
이 쳅터의 소제목을 (거창하게) 통계물리라고 써놓았기는 하지만 이 쳅터에서 다루고자하는 것은 EBM과 RBM의 이해를 돕기위한 고전 열통계역학의 극히 컨셉적인 내용입니다. 혹시 통계물리학에 대한 더 깊은 이해를 원하시는 분들은 물리학과 학부 수준의 교재인 reference [[footnote(Walter Greiner, Ludwig Neise, Horst St¨ocker Thermodynamics and Statistical Mechanics. Springer (November 14, 2001))]]를 읽어보시기를 권합니다.
한 기체의 거시상태는 물리적으로 측정이 가능하다. 예컨데, 어떠한 기체의 부피가 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)\)는 다음과 같다.
어떠한 배열 v에 대해서 에너지 함수 E(v)가 있다고 가정해보자. 가능한 모든 배열의 집합 V = {v1, v2, ...}에 대한 에너지 \({E(v_1), E(v_2), ...}\) 가 에너지 함수에 의하여 계산이 가능하며, 이를 위에서 언급한 미시상태로써의 앙상블을 구상하였을때, 이 배열이 V의 i 번째 배열일 확률은 앙상블의 볼츠만 분포를 따른다고 볼 수 있다. (실제 물리학적 수치가 아니므로 편의를 위해서 β = 1 로 단순화 했을 경우)
에너지함수의 파라미터가 W라고 했을 경우, 에너지함수가 정의된 상태에서 배열의 확률분포는 p(v) =f(W) 로 파라미터의 함수가 된다. 즉, 실제 데이터 x ∈ X 를 ‘잘’ 생성하는 ‘생성적 모델’을 파라미터 W를 ‘학습’시키므로써 만들 수 있게된다. p(x|W) 를 최대화 시키는 W를 찾는, 로그우도 학습법을 쓰게된다.
이를 h의 은닉 배열이 있는 경우로 확장시켜도 마찬가지이다. 어떠한 배열 (v, h)의 에너지함수 E(v, h)가 있다고 가정하였을때, 가능한 모든 배열의 집합 V, H에 대해서 배열(v, h)의 확률분포는 위와 같은 이유로 다음과 같다.
따라서 은닉배열이 없는 경우와 마찬가지로, v배열은 에너지함수에 따른 확률분포로 존재하게 되며, v에대한 생성적 모델이 된다. 큰 범주에서 보면 이런 볼츠만 분포를 따르는 모델을 Boltzmann Machine(BM)이라고 한다. 실제로 BM의 경우, 에너지 함수를 배열의 모든 두 원소의 곱의 선형결합으로 정의한다.
visible 배열과 hidden 배열의 합집합을 U = {V, H}이라고 했을때, BM의 에너지함수는 다음과 같다.
- error_zlib_h . . . . 3 matches
컴파일시 zlib.h: No such file or directory 와 같은 에러 메세지가 낳을 경우 처리 방법에 대해서 기술 한다.
apt-get을 사용하는 경우.
yum을 사용하는 경우.
- etri_LLM . . . . 5 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]으로 수정해야 하는 이유
- factorized_vae_and_annealed_vae . . . . 38 matches
''Factorized Variational Autoencoders for Modeling Audience Reactions to Movies''(CVPR 2017) 일명 '''factorized variational autoencoders (FVAE)'''[* http://zpascal.net/cvpr2017/Deng_Factorized_Variational_Autoencoders_CVPR_2017_paper.pdf]논문을 리뷰한다.
이 논문은 Matrix, Tensor factorization method의 방법을 개선하기 위한 방법으로 VAE를 응용한 '''비선형 텐서 분해 방법'''에 대한 연구이다.
이 논문에서는 영화 관람 관객 (1600만 명 이상의 얼굴)의 얼굴 표정에 대한 대규모 데이터 세트에 적용하여 기존 __선형 인수 분해 방법__과 본 논문에서 제안한 __비선형 인수 분해 방법__을 비교했다.
''영화를 관람하는 관람객의 표정을 추출해서 그 얼굴 표현을 학습하려고 한다. 직관적으로, 각 영화는 장르와 각 장면에 따라서 어떠한 의도를 갖고 만들어 지기 때문에 청중과 상호 작용한다고 생각한다. 따라서 청중 분석을 협업 필터링 (Collaborative filtering)의 한 형태로 볼 수 있다. 청중의 표정을 검출하기 위해서 68개의 facial landmarks를 측정하여 136(68*2) 차원으로 표현했다.''
''추천 문제 (Recommendation problem)''를 하나 정의하고 그것을 풀기 위해서 ''Matrix Factorization''가 어떻게 사용되는지 알아보자.
먼저 데이터에 대해 살펴보자. 이 문제는 '''사용자'''와 '''상품'''이라는 두 가지 요소가 존재한다. 사용자 \(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'''이다.
\(p_u\) 와 \(q_i\)는 각각 \(P\)와 \(Q\)의 \(u\), \(i\)번째 row vector라고 정의하면 (둘 다 k차원 벡터가 된다) 앞선 수식에서부터 우리는 다음과 같은 수식을 얻을 수 있다.
이 사실로부터 user \(u\)가 item \(i\)의 점수를 주는 방식은, user \(u\)의 item들에 대한 latent interest \(p_u\)와 그에 대응하는 item들에 대한 latent interest \(q_i\)에 의해 결정된다는 것을 알 수 있다.
본 논문에서는 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}\)
X tensor의 각 요소는 아래의 식을 통해서 구할 수 있다.
식 1을 K 차원과 D 차원 vector와 matrix 연산으로 바꾸면 아래의 식과 같이 표현 된다.
이 논문에서는 이러한 선형 조합으로 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 구조를 따른다.
\(U\)와 \(V\)가 특정 확률분포를 갖는다고 가정했다. \(U_i\)는 로그 정규분포(log normal)을 따른다. \(U_i \equiv e^{u_i}\), \(u_i \sim \mathcal{N}(0, I)\) 이렇게 함으로써 Matrix \(U\)가 양의 값을 갖음을 보장한다. \(V\)는 가우시안 확률분포를 따른다. \(V_t \sim \mathcal{N}(0,I)\), 이렇게 얻은 \(U_i, V_t\)를 통해서 \(z_{ij} \sim \mathcal{N}(U_i \circ V_t, I)\)을 얻어서 \(x_{ij} \sim \mathcal{N}(f_{\theta}(z_{it}), I)\)를 관찰할 수 있는데, \(f_{\theta}\)는 Decoder에 해당한다.
* 데이터의 제약을 사용자가 주고 그 의도에 맞게 특성을 학습할 수 있다는 것에 큰 의미가 있다.
- fastapi . . . . 1 match
간이 로그인 기능 구현 실제 사용하기엔 부족한 코드, JWT(JSON Web Token)[* https://pronist.dev/143]을 사용해서 인증하는 코드
- fft_signal_processing . . . . 20 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을 사용하면 시간에 따른 푸리에 변환을 볼 수 있다. 전체 신호를 한번에 푸리에 변환을 하게 되면 전체적인 주파수 통계는 알 수 있지만 특정 시간에 어떤 변화가 있는지는 알 수 없다.
Spectrogram을 그리는 방법은 여러가지가 있을 수 있다. Wavelet을 이용한 방법도 있고 STFT를 이요한 방법도 있다. STFT의 magnitude를 db스케일로 변환해서 그리기도 한다. [* https://sanghyu.tistory.com/37]
- fftw_tutoral . . . . 1 match
fftw[[footnote(http://micro.stanford.edu/wiki/Install_FFTW3)]]을 사용하기 위해서 간단한 예제를 만들어 사용해 보도록 하자
- filesystem_yaffs_jffs2 . . . . 20 matches
임베디드 환경에서 nand에 파일 시스템을 올리려고 할때 사용 가능한 jffs2 & yaffs에 대한 조사
임베디드 리눅스 장비에서 램디스크를 이용하여 푸트 파일 시스템을 구현 하였을 경우에는 보드 동작 중에 파일로 기록된 내용이 전원이 꺼짐과 동시에 소실된다. 기록된 내용을 연구 저장 하기 위해서는 일반적으로 플래시 메모리에 기록하여야 한다.
블럭형은 플래시를 파일 시스템에서 접근하게 한 것이다. 단연히 이 장치파일은 응용 프로그램에서 직접 접근하면 곤란하다. mount 명령을 통해서 접근 한다.
1. mkfs.jff2 실행 파일이 있음을 확인.
NAND Flash에서 사용을 목적으로 만들어진 파일 시스템으로 YAFFS 파일 시스템의 업그레이드 버전이다.
'''git을 이용해서 소스 얻어오기 '''
위 링크에서 받은 소스 util을 컴파일 해서 mkyaffs2image를 얻을 수 있다.
git으로 얻어온 소스 파일을 보면 patch-ker.sh라는 패치 스크립트가 있다.
c/l : 소스 파일을 카피할 것인지 링크를 만들 것인지 결정
s/m : 소스 파일의 버전을 결정한다. single or multi version
마지막으로 커널이 들어 있는 경로명을 알려주면 자동으로 패치가 이루워 진다.
mkyaffs2image는 아래 링크의 util에서 받을 수 있음.
소스는 아래 링크에서 받을 수 있다.
* 사용하고 있는 U-BOOT에서 Yaffs Writing을 지원 하지 않음
'''yaffs 파일 시스템을 Write 할 수 있도록 u-boot 수정'''
'''Yaffs2 파일 시스템을 Write하는 함수 추가'''
'''do_nand() 함수에 .yaffs 명려을 추가 해준다.'''
- flask . . . . 5 matches
신청 페이지는 구글 폼을 사용할까 한다. 구글 폼에서 신청을 받고 신청 받은 양식을 csv 파일로 다운 받아 서버에 넣고 그걸 데이터 베이스에 저장하고 진행에 관련한 일련의 로그 역시 데이터 베이스로 저장할 계획이다. 데이터 베이스는 저장하고 관리해야 할 데이터의 크기나 양이 적을 것으로 예상 되어 sqllite3을 사용하려고 한다. 이와 관련해서는 [:python_chat_program 이전 쳇팅 프로그램 작성]에 관련 글이 있어서 참고 하려고 한다.
- food_beef_treatment . . . . 15 matches
쇠고기 지방은 사람의 몸에 좋지 않다. 우리나라의 쇠고기 등급제는 지방의 함량과 분포에 따른 등급으로 건강한 먹거리를 나타내는 지표가 아님을 알아야 한다.
쇠고기를 건강하고 맛 있게 먹기 위해서 '''숙성'''이라는 과정을 갖는다.
한국에서 도축되는 쇠고기도 일주일에서 열흘간의 시간을 두고 소비자에게 전달 된다.
이렇게 숙성을 시키는 이유에는 육질을 부드럽게 하는 것과 풍미를 끌어 오리는 데 있다.
드라이 에이징은 통풍이 잘 되는 곳에 고기를 매달아 놓는 것인데 이 과정에서 겉은 육포처럼 말라 수분이 날아가지만 아미노산의 농축된 향은 속으로 응축돼 진한 육향을 느낄 수 있다.
하지만 이러한 드라이 에이징은 상당히 까다로운 조건을 만족해야 한다.
* 1~2도 사이 온도에서 4~6주간의 숙성 기간을 거친다.
이렇게 숙성하면 겉은 비틀어지고 곰팡이가 필수도 있어 상당부분을 잘라내고 먹어야 한다.
우리가 마트나 정육점에서 사다 먹는 쇠고기는 전부 웻 에이징이라고 보면 된다. 진공 포장으로 공기의 노출을 차단해서 수분 증발을 막고 촉촉한 상태로 숙성한다.
드라이에이징은 육즙이 적은 대신 육향이 최고조에 달해 맛과 풍미가 진하지만, 웻 에이징은 육즙이 많고 촉촉해 부드러운 질감을 갖는다.
마트나 정육점에서 구입한 쇠고기는 이미 숙성이 된 상태인데. 또 숙성을 하느냐?
낮은 등급의 쇠고기를 숙성이라는 과정을 더해 맛을 끌어올리려는 목적입니다.
- fpga_fast_fourier_transform . . . . 1 match
FFT를 구현하기 위한 공식과 이론을 정리하자!!
- fpga_fft_structure . . . . 14 matches
=== 두개의 입력을 받아서 하나를 선택해서 출력하는 모듈 ===
=== 다중 클럭을 이용한 메모리 접근 ===
DCM을 외부로 빼서 두개의 클럭을 외부로 부터 받는 것으로 수정
하지만, 메모리에서 값을 읽어 오는 과정이 half 클럭에 처리 되지 않는 것으로 보임 출력 신호에서 timming error 발생!
문제점 1을 해결하기 위해서 클럭을 쪼개지 않고 메모리를 두개 사용 하는 것으로 구조 변경
=== 테이블을 이용한 FFT 입력 구조 ===
=== 테이블을 이용한 twiddle vector 구조 ===
좀 더 정확한 값을 구하기 위해서 MATLAB을 사용했다.
{{{{color: rgb(255, 1, 1); font-size: 13px;} MATLAB는 배열의 index가 1부터 증가 하기 때문에 real(0) 가 있을 수 없다.}}}
1. ''use ieee.std_logic_unsigned.all'' 을 사용해야만 연산을 할 수 있다.
- fpga_fifo_core_gen . . . . 4 matches
본인이 사용하고 있는 Virtex-6 대한 내용에 포커스하여 알아보기 때문에 여타 다른 칩에 대한 내용은 없을 수 있음을 상기하기 바란다.
읽기와 쓰기의 클럭을 설정할 수 있는데 읽기와 쓰기를 동일 클럭으로 묶어서 쓸 수도 있고 독립적으로 설정하여 사용 할 수도 있다.
그리고 메모리 타입을 선택할 수 있다.
- fpga_memory_core_gen . . . . 2 matches
IP Coregen을 사용해서 메모리를 만들고 사용하는 간단한 예제
메모리는 Distributed Memory와 Block Memory가 있는데 Distributed Memory는 LUT를 사용해서 메모리를 만들고 Block Memory는 전용 블럭을 사용해서 메모리를 만든다.
- fpga_test_guide . . . . 6 matches
app는 사진을 2차원 FFT를 하기 위한 응용프로그램 입니다.
드라이버가 올라가 있지 않을 경우 드라이버를 올립니다.
fft_loader() 파일로 부터 계산할 값을 읽어 들이는 함수, size변수에 읽어 드린 파일의 사이즈를 반환합니다.
fft_out() 함수는 메모리에 있는 값을 파일로 출력하는 함수.
fft() 함수는 실제 fft를 수행하는 함수 입니다. 계산할 데이터와 결과 같을 받을 포인터 변수와 전체 데이터 사이즈를 인자로 갖습니다.
- fpga_tutorial . . . . 21 matches
clk, rst을 input으로 받아 동작하는 간단한 DCM을 만들어 본자.
output port의 경우 값을 저장해야 하는 경우도 있을 수 있기 때문에 필요에 따라 reg로 선언 할 수 있다.
반면 input port와 inout의 경우 값을 저장하지 않고 값을 전달만 하기 때문에 reg로 정의 할 수 없다.
게이트 수준의 설계를 구조적 설계라 할 수 있는데 물리적 wire의 연결이나 게이트의 나열등을 정의 하는 설계를 말 한다.
보통 clock을 기준으로 해서 동작을 정의 하는 설계를 지칭하며 '''always @(posedge clk)''' 아래에 정의 하는 것들을 말함.
'''reg에 값을 변경하는 일들은 always 구문 안에서만 이루워 진다. '''
Verliog에서도 배열을 지원한다. 배열은 특정 자료형의 집합이다.
하드웨어 특성을 반영하고 있는 자료형으로 wire는 넷(Nets)를 정의하기 위한 키워드이다.
그런 의미에서 값을 저장하지 못하고 그냥 입출력을 연결해주는 역활로만 쓸 수 있다.
반면 '''reg'''는 값을 저장 할 수 있다.
레지스터는 다른 논리값이 들어오기 전까지 값을 유지한다.
block 에 이름을 명시하지 않을때 나는 경고 메세지이다.
'''begin:init_loop''' 과 같이 블럭의 이름을 명시 할 수 있는데 생략했을 경우 볼 수 있는 경고
- fpga_ucf_ex . . . . 33 matches
############################################## # "#" 도형은 주석문자 입니다. 이 예제 파일을 사용하려면, 필요한 규격을 찾아서, 행의 시작에 있는 주석#
# 표기 용 문자(#)를 지우시길 바랍니다. 만일 필요하다면 당신의 디자인에 맞게 행의 내용을 수정하십시오.
# 방법 1 : 네트 이름을 이용하여, my_net라는 net가 logic_grp라는 group에 속해 있는 모든 logic에
# 방법2 : 'TIMEGRP' 라는 key word를 사용하여 그룹화하고 여러분 디자인의 로직의 이름을 사용하여 선
# U1으로 불리는 계층구조 안에 있는 모든 flip-flop에 위한 'group_name'이라 불리는 그룹을
# 매우 중요합니다. 단지 하나의 클럭을 가지는 디자인의 중요 부분을 위해서는 간단한 광역 제한 사항을 사용
# 사용방법은 먼저 원하는 TIME GROUP을 정의하고 TIMESPEC이름을 정의하여 사용하시면 됩니다.
# 위의 두 문장은 RFFS와 FFFS라는 TIME GROUP을 정의한 것입니다.
# 다. 위의 문장에서 우리는 TSF2F는 FLIPFLOP TO FLIPFLOP에 대한 TIMESPEC임을 알 수 있습니다.
# 위의 두 문장을 해석하면 clock1 net를 clk1_grp라고 net에 timespec를 정의한다.
# 위의 문장을 해석하면 TS_clk1이라는 TIMESPEC은 clk1_grp라는 TIMEGROUP에 주기 50NS을 할당하고
# 있음을 알 수 있으며, 나머지도 CLK1 과 CLK2사이의 시간 관계를 정의하고 있습니다.
# FROM: FFS : TO: PADS constraints는 flip flop 그 자체에서 지연분석(dalay analysis)을 시작
# 하며 클럭 입력핀에서 시작하지 않는다. clock-to-out constraint을 만들기 위해, 권고하는 방법은
# OFFSET constraint을 사용하는 것이다.
# 여러분의 입력 setup timing specifiactions안에 clock delay에 대한 합산을 자동적으로 넣으려면,
# OFFSET constraints을 사용하시오.
# FROM: PADS : TO: FFS constraints는 clock path에 대한 어떤 합산도 취하지 않는 것을 주의하시오.
# input setup time constraint을 만드는 권고 방법은 OFFSET constraint을 사용하는 것입니다.
# 만일 여러분이 path(경로)의 timing을 무시할 수 있다면, Timing Ignore(TIG)을 사용하시오. 주의 사
- game_pvpgn_install . . . . 1 match
위 사이트에서 최신 소스를 얻을 수 있다.
- git_client_user_guide . . . . 16 matches
Git을 사용해서 프로젝트에 참가하기 위해서 알아야 할 것들을 실무관점에서 기술한다.
리눅스 시스템을 사용하고 있다면 보통은 설치 되어 있다.
하지만 git이 설치 되어 있지 않다면 사용하는 리눅스 배포판[[footnote($yum install git or $apt-get install git)]]에서 제공하는 것을 설치하던 소스[[footnote(http://git-scm.com)]]를 받아서 설치하길 바란다.
''ssh-keygen -t rsa'' 라는 명령으로 본인이 사용하는 컴퓨터의 ssh 공개키를 생성해서 관리자[[footnote(관리자 메일 : iou78@nims.re.kr)]]에게 보내주고 공개키 등록을 요청해야 한다.
* git 서버 접속을 위한 '''config''' 파일 생성
.ssh 드렉토리 아래 config라는 파일을 생성한다.
= Git을 사용해서 소스를 관리하자 =
지금 git의 상태를 알려준다. 어느 브렌치에서 작업을 하고 있고 수정된 파일이 있는지등 현재 상태를 알려줌.
파일을 수정하고 수정한 파일을 로컬 저장소에 저장하기 위해서는 '''git add''' 명령으로 수정된 파일의 staged 상태로 변화 시켜야 한다.
'''git commit'''이라는 명령으로 staged 상태에 있는 파일들을 하나의 revision으로 저장하게 된다.
'''git add'''명령으로 파일을 staged 상태로 만들었다. 하지만 그 파일을 다시 unstaged 상태로 돌리고 싶을때가 있을 것이다. 이럴때 사용할 수 있는 명령이다.
- google_tensorflow . . . . 12 matches
파이션은 사용자에게 많은 편의를 제공해주지만 계산 성능(속도)는 떨어진다. 이 점을 보완하기 위해서 계산 부분을 외부에서 할 수 있도록 허용한다. 이렇게 계산 부분을 외부에 놓더라도 파이션 내부와 외부에 데이터를 주고 받는데 여전히 오버헤드가 존재하게 된다.
텐서플로우는 이런 오버헤드를 줄이기 위해서 최대한 많은 부분을 파이션 외부에 두려고 했다.
실수형 32비트 데이터 타입을 갖는 2차원 텐서를 정의한다.
텐서플로우에서는 변수를 아래와 같이 정의해서 사용한다. 텐서플로우가 동작하면서 값을 변경할 수 있는 부분을 구분해서 사용한다.
입력 x와 웨이트 W의 곱에 바이어스 b를 더한 것을 softmax activation function에 전달한다는 내용이다.
모델을 훈련 시키기 위해서
트레이닝 데이터중에서 mini-batch 사이즈만큼 렌덤하게 선택해서 러닝을 수행할 수 있다.
범위는 0부터 x <범위까지가 되며, 시작점을 정해주게 되면 시작점을 포함해서 끝점보다 적은 값 사이의 값으로 난수를 내러주게 된다.
- google_tensorflow_index . . . . 6 matches
Anaconda를 설치하고 Conda로 환경을 분리해서 사용하면 하나의 컴퓨터에서 각기 다른 버전의 Python과 TensorFlow를 사용할 수 있다.
Conda 환경을 새로 생성하자.
만들어진 Conda 환경을 활성화 하는 방법
새로 만들어진 conda환경에 들어가게 되면 Prompt가 환경의 이름을 포함하는 형태로 변경된다.
이 상태에서 필요한 패키지들을 설치하면 분리된 환경에서 각종 패키지들을 설치해서 사용할 수 있다.
- google_tersorflow_installation . . . . 7 matches
설치 방법은 바이너리로 설치하는 방법과 소스를 받아서 직접 컴파일하는 방법이 있다. 본인은 후자인 소스를 받아서 컴파일하는 방법을 선택했다.
소스를 받아서 설치하는 것은 아래 있는 bazel을 통해서 해야 하기 때문에 소스를 받아서 할 수 있는 것은 없다.
아래 관련 툴들을 다 설치 했으면 bazel를 사용해서 설치해보자
리눅스 환경에서 설치하기 위해서는 Bazel이라는 별도의 프로그램을 사용하게 된다. Bazel의 설치 역시 소스를 받아와서 설치하도록 한다.
사용하는 리눅스 배포판에서 지원하는 자바 JDK버전을 확인하고 설치하도록 하자
이렇게 컴파일을 하고 나면 output 디렉토리에 bazel 실행파일이 생성된걸 확인할 수 있다.
bazel실행 파일을 본인의 bin폴더에 복사하던지 환경변수 PATH에 bazel의 경로를 추가하도록 하자.
- google_tersorflow_start . . . . 1 match
텐서플로를 사용해 보고 경험한 것을 기록하기 위해 시작했다.
- grad_cam . . . . 71 matches
* (2019-09-28) CAM과 Grad-CAM을 비교하는 글 최초 작성
초기 인공신경망 및 딥러닝에서는 네트워크 모델을 블랙박스로 표현하며 해석불가능한 것으로 치부했다. 이때문에 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를 통해 어느 클래스에 해당하는지 확률값을 얻어 내는 구조를 갖는다.
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장 있을 경우이다.
GAP를 사용해서 CAM을 도출하는 과정은 아래와 같다.
* 마지막 Convolution layer를 거쳐서 얻은 feature map에 집중해 보자. 여러장의 feature map을 채널이라고 하는데 \(k\)번째 채널의 값들 중 \((x,y)\)에 위치한 값을 \(f_k(x,y)\)로 표현하자.
* \(k\)번째 채널에 대해서 GAP를 계산한 것을 \(F^k\)라 하자 위 그림 기준으로 \(F^1 = 4\) 이다.
* 이렇게 만들어진 벡터에 weight를 곱해서 각 클래스의 softmax의 입력으로 사용하는데 이것을 \(S_c\)라 하자.
* 이 식에서 뒤쪽 Summation을 Class Activation Map \(M_c(x,y)\)로 정의한다.
* 위 수식을 말로 풀이하면 아래 그림에서 보는 것과 같이 각 feature map에 weight를 곱하고 하나의 이미지로 합치면 CAM이 된다는 것이다.
앞서 살펴본 CAM은 CNN 내부를 이해하는데 좋은 도구임에 틀림이 없다. 하지만 GAP를 사용하는 방식때문에 태생적인 단점이 있다. 너무도 당연하게 GAP를 사용해야 하고 마지막 Convolution layer에만 적용할 수 있다. 이러한 문제로 Object detection 외에 Visual Question Answer(VQA)나 Captioning처럼 다양한 목적을 수행하는 CNN에는 적용할 수 없다.
이러한 단점을 보완하고 CAM을 일반화하여 CNN뿐만 아니라 다양한 네트워크 모델에 적용 가능한 Grad-CAM에 대해 알아보자.
위 그림을 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}\)는 없다.__
\(\alpha_k^c\)는 타겟 \(c\)를 결정하기 위해 사용된 feature map \(k\)의 ''importance''를 나타낸다. CAM에서와 같이 \(\alpha_k^c\)를 각 feature map \(A^k\)에 곱해서 합쳐준다. 이미지의 경우 양수는 타겟을 결정하기 위한 가중치고 음수는 다름 클래스에 대한 가중치로 보고 버린다. 식으로 표현하면 아래와 같다.
CAM 아키텍쳐로 부터 Grad-CAM을 유도해보자.
CAM 아키텍쳐는 Convolution layer + GAP + FC + softmax로 구성되어 있다. 마지막 convolution layer의 \(k\)번째 feature map을 \(A^k\)라 하자. 가로 세로의 인덱스는 \(i, j\)를 사용해자. 그러면 \(A^k_{ij}\)는 \(k\)번째 feature map의 \((i,j)\) 위치에 있는 엑티베이션을 의미한다.
--- 식 (3)을 \(A^k_{ij}\)에 대해서 편미분을 구하면 \(\cfrac{\partial F^k}{\partial A^k_{ij}} = \cfrac{1}{Z}\)가 된다. 이를 식 (5)에 대입하면, ---
- gunplot_tutorial . . . . 1 match
gnuplot으로 그린 그림을 Latex에 사용 할 수 있도록 하기 위한 방법에 대해서 설명한다.
- gw_ml_review . . . . 11 matches
이 논문에서는 Simulated NR Data에 Noise를 단계적으로 입혀 트레이닝 시키고 이것을 통해서 Heavy noise 속에 들어있는 중력파 시그널의 유무를 Classification하고 그 시그널의 Parameter를 Prediction하는 일을 진행하였다.
트레이닝 데이터는 시뮬레이션[* effective-one-body(EOB) waveforms, quasi-circular, non-spinning BBHs]을 통해서 만들어진 데이터를 사용했고 바이너리 블랙홀 쌍성의 질량 파라메터만들 고려해서 진행 되었다.
아래 그림에서 처럼 4000개의 templates of BBH mergers 에 white noise을 더해서 100,000개의 데이터 샘플을 만들었다.
붉은색 점으로 표시된 질량 파라메터를 갖는 신호는 트레이닝에 사용되었고 파란색 점으로 표시된 부분은 검증으로 사용 되었다. 트레이닝 데이터 사이에 존재하는 파란색 점에 대해서 잘 찾아짐을 확인했다.
'''ImageNet Challenge'''를 통해서 잘 알려진 GoogLeNet, VGG, AlexNet, ResNet, ZFNet 등을 언급하긴 했지만 실제 사용한 네트워크는 3개의 Convolution layer와 MaxPooling layer를 중첩해서 사용하고 Output Layer를 포함한 2개의 Fully connected layer를 사용하였다.
Activation function으로는 Output Layer의 softmax를 제외하고 모두 ReLU(Rectified Linear Unit)을 사용하였다.
'''Predictor'''는 위 네트워크 구조에서 마지막 softmax 함수만 제거하여 트레이닝 시키고 트레이닝이 끝나고 나면 이 네트워크의 최종 weight값을 '''Classifier'''의 pre-train으로 사용한다.
'''Classifier'''는 50%의 노이즈 데이터를 트레이닝 세트에 추가해서 트레이닝을 진행한다. 이렇게 하면 '''Classifier'''의 트레이닝 시간을 상당히 단축시킬 수 있다.
- hawkes_process . . . . 6 matches
아래 코드는 \(\lambda^*(t)\)의 그래픽 표현이다. exponential decay 함수는 \(\varphi(x) = \alpha \beta \exp (-\beta x)\)를 사용했고 새로 도착할 때마다 강도가 확률적으로 흥분됨을 알 수 있다.[* https://github.com/canerturkmen/hawkeslib]
시간에 따른 측정값을 갖는 것을 상상해 보자.\(\{(t_i, c_i)\) 시간은 실수 공간에서 표현 된다.\(t_i \in \mathbb{R_+}\) 측정값은 \(c_i \in \{0, 1, \dots, K\}\) 양의 정수값을 갖는다. multivariate Hawkes process의 conditional intensity function은 다음과 같다.
예로 8가지 물건의 가격 변동이 서로 어떻게 영향을 주웠는지 Multivariate Hawkes Process로 알아보자.
3번 상품의 가격 변동이 1번 상품의 가격 변동에 영향을 준 것으로 보인다.
- hdf5 . . . . 9 matches
file directory 구조와 유사한 방식으로 데이터를 저장하기 위한 데이터 구조로 '/' 루트로 부터 directory-file 구조와 유사하게 group-dataset 구조를 사용해서 트리형태로 데이터를 저장한다. 각 group과 dataset는 metadata로 attribute를 사용해서 사용자가 부연 설명을 넣을 수 있다.
* 그룹(Group): 데이터셋이나 다른 서브그룹을 포함할 수 있는 드렉토리와 같은 역할을 한다.
* 속성(Attribute): 그룹과 데이터셋의 부연 설명을 위한 주석과 같은 역할을 한다.
간단하게 파일을 생성하고 읽고 쓰는 방법에 대해서 기술한다.
기존에 파일이 있거나 신규로 생성하거나 경우에 따라서 파일을 오픈하는 옵션이 달라진다.
옵션에 따라서 파일의 생성, 읽고, 쓰기 기존에 있던 파일에 덮어 쓰기 및 추가 등을 할 수 있다.
- hecto_pascal . . . . 3 matches
대기압의 국제단의 '''__파스칼(Pa)__'''은 \(1m^2\)의 넓이에 1N(뉴턴)[* 1kg의 물제가 작용하여 \(1m/s^2\)의 가속도를 발생시키는 힘]의 힘이 작용할때의 압력을 나타낸다.
헥토파스칼은(hecto Pascal)은 그리스어의 '100'을 뜻하는 헥토(hecto)를 붙여 1hPa = 100Pa 을 뜻하는 단위이다.
- history_computer . . . . 19 matches
덥셈과 뺄셈을 할 수 있었음.
해석기관(analyical engine)을 고안하였으나 그 당시의 기술 부족을 실패
현대 컴퓨터의 개면을 최초로 제시하였다는 점에서 가치가 있음.
논리 대수를 창조하여 전보 이론에 대한 매우 중요한 기분을 구축
데이터를 카드에 천공하는 방식을 고안.
* 프로그램 내장 방식이란 처리할 문제의 해결 방법과 순서를 작성하여 컴퓨터에 기억 시킨 후, 자동적으로 저장된 명령을 하나씩 꺼내어 순서대로 수행하는 방식.
* 1800여개의 진공관을 사용 무게 약 30톤
* 2진법이 아닌 10진법을 사용한 오늘날의 대형 컴퓨터의 구조와 비슷 (현대 컴퓨터의 기원)
* 1초 5000회의 덧셈연산, 두 숫자를 3/1000초에 곱셈(마크-I 보다 300배 빠름) 내부기억장치가 없는 계산 순서를 지시하는 프로그램을 배선판에 일일이 배선하는 외부프로그램 방식을 채택하였기 때문에 배선판 교체 작업과 계산 명령을 사람이 직접해야 함.
* 에니악을 만든 모클리와 에거트가 에니악을 개량해서 만듬.
* 진공관을 사용하여 발열이 심함, 냉각기 필요
* 신뢰도가 낮고, 많은 공간을 차지함.
* 2진 연산, 자료의 임의 접근, 프로그램 내장 방식을 채택함.
* 다중프로그램 시스템을 사용하여 온라인 실시간 처리 시스템이 실용화되기 시작.
* 컴퓨터가 급속도로 보급 되었고, 시분할 시스템이 실현되었으며 동일 기종간 호완성이 가능하게 되었으면 통신회선을 이용한 실시간 처리 방식 도임.
- homebrew . . . . 1 match
맥을 사용하면서 App Store를 통해서 소프트웨어를 설치하는 것은 기본이지만 리눅스처럼 개발툴이나 라이브러리를 설치하는 것은 좀 다르다. 그 중에 가장 많이 쓰는 패키지 관리 툴은 Macport와 Homebrew[* http://brew.sh/index_ko.html]이다.
- hub_gardening . . . . 2 matches
약효로는 두통, 신경과민, 구내염, 강장효과, 건위, 진정, 살균, 불면증과 젖을 잘 나오게 하는 효능이 있고, 졸림을 방지하여 늦게까지 공부하는 수험생에게 좋다.
- iEEG_seizure . . . . 20 matches
파일을 읽어서 AutoEncoder를 작성한 프로젝트를 통해서 필요한 부분만 알아보자.
edf 파일을 열기 위해서는 '''mne.io.read_raw_edf''' 가 필요하다. 나머지는 신호처리와 시스템에서 파일 정보를 얻어 오기 위해서 사용한다.
파일의 위치와 파일명을 알고 있다면 바로 파일만 읽으면 되겠지만 특정 폴더에 있는 파일을 모두 처리하기 위해서는 아래와 같이 파일 리스트를 작성하는 것이 편하다.
edf파일을 하나 읽었다면 어떤 내용을 담고 있는지 확인해보자.
channel name, sampling frequency 등 eeg 데이터를 처리하기 위한 정보들을 확인 할 수 있다.
필요한 정보들을 추출해서 사용하자.
화이트닝 방법은 여러가지 방법이 있으며 그 중 ligo에서 사용하는 화이트닝 방법을 선택했다.
bandpass filter를 걸어서 불필요한 고주파 성분을 제거했다.
AutoEncoder를 적용해서 차원을 축소하고 저차원의 feature를 클러스터링에 활용하기 위한 작업을 수행했다.
우선 학습을 위한 데이터를 준비하기 위해서 신호를 모양을 유지한체 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에 분산을 추가 했는데 이부분에 대해서는 조금 더 연구가 필요하다.
- iir_filter . . . . 6 matches
..식을 보면 알 수 있듯이, IIR 필터에는 피드백이 있습니다.. FIR에는 없죠..
위 식은 attachment:img03.png 을 계산하는 부분과 attachment:img04.png 을 계산하는 부분 2개 블록으로 나눌수 있습니다.
이 식은 곱셈으로 되어 있으므로, 순번을 바꿔도 같은 결과를 얻을 수 있습니다.
//clipping -> short범위에 값을 맞춰줌.
- index_2012 . . . . 2 matches
== [:linux_command_find find grep 명령을 사용한 파일 찾기] ==
* [:programming_atod 문자열을 Double형으로 바꿔주는 함수]
- index_2016 . . . . 3 matches
9. [:linux_port_forwarding 방화벽을 우회접속하는 방법(Port Forwarding)]
13. [:rsync_cron_data_backup Rsync와 Cron을 이용한 데이터 백업]
12. [notify_job_finish 작업이 끝남을 리모트에 알려주기]
- index_2019 . . . . 2 matches
* [:vi_for_gravitational_wave_parameter_estimation 중력파 모수추정을 위한 VI 논문 리스트]
* [:vi_for_gravitational_wave_note 중력파 모수추정을 위한 VI 알고리즘 연구 노트]
- index_2023 . . . . 2 matches
[:big_file_copy 대용량 파일을 복사하는 효과적인 방법]
[:slack_api_chatbot SLACK API with Python을 이용해 메세지 보내기]
- ipnc_factory_reset . . . . 5 matches
소프트웨어로 GPIO입력을 받아서 카메라 설명 화일을 초기화 시키고, 리붓을 수행하는 기능을 구현한다.
GPIO85번을 입력으로 사용한다.
- ipnc_rs485_pelco-d . . . . 2 matches
RS485를 통한 Pelco d 프로토콜 통신 방법을 알아 본다.
UART1_TXD 와 UART1_RXD 를 사용해서 RS485통신을 하게 된다.
- ipnc_true_day_night . . . . 1 match
AE 시작시 필터를 정렬하기 위해 AE 초기화 루틴에 필터를 정렬하는 명령을 호출한다.
- iptables_cross . . . . 8 matches
패킷 필터링 기능을 추가 하기 위해서 리눅스에서 iptables라는 프로그램을 사용하는데 이것을 임베디드 시스템에 포팅해 보자
iptables-1.4.8.tar.bz2 프로그램을 다음과 같이 다운로드 받습니다.
다운로드 받은 iptables-1.4.8.tar.bz2 프로그램의 압축을 해제 합니다.
압축을 해제한 디렉토리로 이동 합니다.
confiuration을 수행 합니다.( arm-linux 로 컴파일 하기 위한 configuration 하기 )
Make install 을 이용하여 설치 하기
- iterative_solver . . . . 9 matches
wget http://icl.cs.utk.edu/projectsfiles/magma/downloads/magma-1.4.1.tar.gz 으로 패키지를 받을 수 있다.
설치 하기 위해서는 make.inc 파일을 수정해야 한다고 하는데 make.inc.xxxx 샘플을 수정해서 만들 수 있다.
사용할 BLAS 패키지에 따라서 make.inc 파일의 내용이 다름을 짐작할 수 있다.
여러 가지 make.inc.xxx 파일로 컴파일을 시도 해보았는데 실제로 성공한 make 파일은 make.inc.mkl-icc 였다.
관련 문서[[footnote(http://math-atlas.sourceforge.net/atlas_install/#sec-install-step)]]를 참조해서 설치하는 과정을 설명한다.
1. tar xvf atlas3.11.17.tar.bz2 #압축을 풀면 ATLAS라는 폴더가 생긴다.
1. CPU Throttling 기능 끄기[[footnote(전력 관리를 위해서 동작 클럭을 변경하는 기능)]] : cpufreq-selector -g performance
1. mkdir build #임의의 장소에 폴더를 생성 컴파일을 수행할 장소가 된다.
- julia . . . . 14 matches
Julia 프로젝트 별로 환경을 따로 설정하기 위한 방법을 설명한다.[* https://towardsdatascience.com/how-to-setup-project-environments-in-julia-ec8ae73afe9c]
Julia가 실행되고 있는 폴더를 기준으로 프로젝트 환경을 생성하는 간단한 방법을 알아보자.
그런 다음 ''generate'' '''Project_name'''을 실행하게 되면 project가 생성되면서 Project.toml와 빈 소스 파일 하나가 생성된다.
생성된 Project 환경을 사용하려면 ''activate'' '''Project_name'''을 입력하면 프롬포트의 이름이 프로젝트명으로 변경되고 프로젝트 환경이 활성화 된다. 이 상태에서 프로젝트에서 사용할 패키지들을 추가해주면 된다.
생성된 프로젝트 환경을 사용하는 방법은 앞에서 설명한 것처럼 ''activate'' '''Project_name'''를 실행할 수도 있고 julia를 실행할 때 명시할 수 도 있다.
Module을 사용하기 위한 방법 using, import, include를 사용할 수 있다.
* include는 C언어의 include와 유사하게 파일을 직접 로드한다. 동작은 import와 유사하다.
* '''Main''': Julia를 실행했을 때, 상위-계층(top-level)이 되는 모듈, 현재 작업 중이게 되는 모듈
* C언어의 main함수처럼 줄리아를 실행했을 때 가장 기본으로 사용하게 되는 작업 공간은 Main Module입니다.
* Core Module은 말 그대로 Core입니다. 이 언어에 내장된 모든 식별자들을 담고 있습니다. 이 모듈이 없으면 아무것도 못하기 때문에 모든 모듈은 암시적으로 using Core가 돼있습니다.
- jupyter_notebook . . . . 13 matches
Jupyter lab 및 Notebook 환경을 보다 스마트하게 사용하기 위한 방법을 소개한다.
다음과 같이 jupyter notebook을 서버에서 실행해고 다른 컴퓨터에서 서버에 접속하는 방식으로 사용할 경우 token 혹은 password를 입력하라는 표시가 뜬다. [* https://financedata.github.io/posts/jupyter-notebook-authentication.html]
또 다른 방법으로 jupyter Notebook 서버에 프로파일을 생성하고 자신이 원하는 패스워드를 설정하는 방법이다.
생성된 파일에 아래 처럼 설정을 추가하면 토큰이 아니라 패스워드로 접속이 가능하며 jupyter 실행시 별도 옵션을 설정하지 않아도 사전에 설정한 옵션으로 실행 된다 .
Jupyter Notebook에 여러가지 확장 기능들을 제공하고 있는데 아래와 같은 명령으로 설치 가능하다.[* https://towardsdatascience.com/jupyter-notebook-extensions-517fa69d2231]
Jupyter 환경에서 프로그램을 실행 시키기 위해서 Python 뿐만 아니라 R, Julia, Matlab 등 다양한 언어를 사용할 수 있다. Python도 다양한 버전을 활용할 수 있는데 Python이 설치된 가상환경을 kernel로 사용할 수 있다.
'''jupyter kernelspce list''' 명령으로 현재 사용할 수 있는 kernel을 확인 할 수 있다. [*https://yahwang.github.io/posts/42]
명렁으로 kernel을 다시 설정할 수 있다. 가상환경을 종료했다가 다시 실행하면 제대로 작동한다.
- kolmogorv_arnold_network . . . . 24 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의 결합에 불과하다는 말이다.
Kolmogorov-Arnold representation theorem (or superposition theorem)[* https://en.wikipedia.org/wiki/Kolmogorov%E2%80%93Arnold_representation_theorem]은 다변량 연속 함수 \(f: [0,1]^n \rightarrow \mathbb{R}\) 단변량 함수의 합으로 나타낼 수 있다는 것을 증명했다.
attachment:kan_table.png?width=750px&align=center&title=''MLP와 KAN을 비교한 도표(Liu et al., 2024)''
위 표는 MLP와 KAN을 비교한 논문에 개제된 표이다. MLP를 그래프 구조로 표현하면 왼쪽의 (a)와 같이 각 노드에 활성함수(Activation function)을 대응시키고, 각 엣지에 가중치(\(\omega\))를 대응시킬 수 있다. 반면, KAN은 각 노드에 함수값이 대응되고, 각 엣지에 임의의 함수 \(\phi, \Phi\)가 대응 된다. 또한, 가중치를 학습하는 MLP와 달리 임의의 함수 \(\phi, \Phi\)를 학습시킨다는 차이점이 있다.
입력 데이터의 각 성분 \(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 수식에 대응하는 네트워크 구조는 \( 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]로 주어진다.
\(\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 . . . . 10 matches
가설을 업데이트 하는 과정을 학습이라고 한다.
딥러닝과 같이 노드들이 많은 경우 시그모이드 처럼 미분값이 0에 가까운 값을 갖게 되었을때 값을 잃어버리는 경향이 있다. ( 때문에 계산 중간에 있는 히든 노드의 activation function은 ReLU를 사용하고 종단에 시그모이드나 소프트 멕스를 사용한다.)
데이터를 확보하고 라벨을 정하는 것이 중요하다.
TensorFlow[* https://github.com/bi-lab/deeplearning_tutorial/tree/master/Deep_RL_tensorflow] : Computation Graph - Theano 의 장점을 차용해서 개발 되었음.
session이라고 자원을 관리하는 추상화 오브젝트에 Computation Graph를 넣어서 실행한다.
one_hot : 레이블을 하나의 스칼라 값을 사용하게 되면 각 레이블 사이의 거리차가 발생하게 된다. 이 거리는 실제 데이터의 거리라고 할 수 없기 때문에 거리를 균일하게 정의 하기 위해서
- kubernetes . . . . 4 matches
서비스 --> pod 구조에서 Ingress는 라우터 역활을 하게 된다.
인그레스 컨트롤을 설치해야 사용할 수 있음.
bootstrap을 제외한 모든 work node에 아래 설정을 해줘야 한다.
- kullback-Leibler_vs_cross-entrypy . . . . 19 matches
원문[* Mert Cokluk, (20 Jan 2019) <https://medium.com/@mertcoklukttttt/kullback-leibler-divergence-loss-vs-weighted-cross-entropy-loss-79126dccc8a2>]을 번역하는 수준에서 작성하고 의견을 다는 것으로 구성한다.
기계 학습 모델에서 손실 기준이 가장 중요한 것 중 하나임은 의심의 여지가 없다. 다중 라벨 분류 작업에는 수많은 선택사항이 있다. 가장 적합한 기준을 선택하는 데 문제가 있을 수 있다: 교차 엔트로피 손실, 가중 교차 엔트로피 손실, Kullback-Leibler 분산, ML 프레임워크는 문제를 훨씬 더 복잡하게 만들기 위해 다소 지저분한 미로적 공식을 제공한다. 이러한 손실 기능을 살펴보면서 차이점을 강조해 보십시오.
* '''rather''' : 꽤, 약간, 상당히 (비판, 실망, 놀람을 나타내는 표현에 사용)
교차 엔트로피 손실 기본은 단순히 대상 라벨에 대한 모델별 부정 로그 확률 점수 출력이다. 마이너스 로그의 성격상 문제가 발생할 수 있다. 특히 잘 분류된 표본의 경우, 점수가 나쁜 표본에 비해 처벌은 매우 가혹하다. 이것을 해결하기 위해, 종종, 긴장을 푸짐한 상실처럼 적용했다.
글쎄, 꼭 그렇지는 않다. 지상 진실에 대한 분포를 적합시킬 수 있다. 극단적인 경우, 표적 라벨에서 1 값을 지정하고 다른 모든 라벨은 0으로, 즉 대상 라벨에 대해 1-핫 인코딩 벡터 표현으로 분류한다. 그 특정한 경우, KL 분산 손실은 교차 엔트로피 손실로 귀결된다.
그래서 우리 손에는 꽤 많은 자유가 있다. 즉, 대상 클래스 라벨을 컨버전스 시 모델의 전진 패스에서 나타날 수 있는 적절한 분포로 변환하는 것이다.
예를 들어, 각 샘플에 대한 정량화 수준(8비트=256레벨)을 예측하는 FFTNet 또는 Wavenet 변형을 통한 오디오 생성을 고려해보자. 의심할 여지 없이, 이 문제에 대해 잘 훈련된 모델은 대상(희망적으로) 수준 주위에 가우스와 같은 분포를 반환한다. 이러한 분포를 목표로 삼아 KL 분산의 성과를 관찰하는 것이 이로울 수 있다. 공간적으로 관련된 라벨에 더 많은 문제를 제공할 수 있다.
포장: ML이 출시될 때, 대안에 대한 개방성을 유지한다. 특히 여기에서 논의된 바와 같이, 하이퍼 파라미터 튜닝 방법, 최적화 도구, 학습 속도 체계 및 기타 일반적인 것들이다. 가장 잘 어울리는 방법을 찾고, 옵션의 본질을 파악하며, 강력한 정교한 표현이 당신을 익사시키지 않도록 하라.
- lalsuite_info . . . . 5 matches
LALSuite는 LIGO 데이터 분석을 목적으로 사용하는 여러가지 라이브러리의 모음[* http://smirshekari.wikidot.com/lal]이다.
--소스는 Git repository로 관리되며 python 2.6을 기반으로 하기 때문에 python 2.6이 시스템에 설치 되어 있어야 설치가 가능하다.--
설치 과정을 간단히 요약하면 아래와 같다.
bash shell을 사용하는 linux 환경을 기준으로 설명한다.
- lasso_regression . . . . 12 matches
간단한 예로 상점의 판매량을 예측하는데 판매량에 영향을 줄 수 있는 변수가 무엇인지 생각해보자. 그 중 하나인 '매장의 크기'가 판매량에 영향을 미칠 것이라고 생각할 수 있다고 하자.
매장들의 크기와 판매량을 기록해 보았더니 정말로 선형 관계가 있었다고 하자. 이를 이용해서 얻어낸 일차 함수식을 얻어 낼 수 있을 것이고, 이렇게 얻어낸 함수식에 대입해서 어떠한 상점의 판매량을 예측할 수 있을 것이다. __이것이 바로 선형회귀이다.__[* https://zimkjh.github.io/ml/Lasso-Regression]
선형 회귀는 사용하는 특성의 갯수에 따라 단순 선형 회귀, 다중 선형 회귀로 분류할 수 있고, ''Lasso는 선형 회귀의 단점을 극복하기 위해 개발된 방법''이다.
단순 선형 회귀란 단 하나의 특성을 가지고 타깃을 예측하는 것으로 변수 하나를 가지고 하나의 변수를 예측한다.
인공신경망에서 하나의 뉴런을 사용하는 것과 같다. 각 입력에 대한 Weight와 bais를 찾는 것으로 다중 선형 회귀를 계산한다.
- latex_lyx_installation . . . . 6 matches
Ubuntu 환경에서 레이텍을 설치하도록 한다. [* http://faq.ktug.org/faq/Ubuntu%BF%A1%BC%ADTeX%C7%CF%B1%E2]
ko.TeX/Download에서 ko.TeX의 배포판을 내려 받는다. 컴파일 없이 바로 설치하고 싶은 사람은 util-bin 피일도 내려 받는다.
적당한 폴더에 압축을 푼다.
[http]다음 링크와 [http]ko.tex. v0.1.0 사용설명서의 20쪽에 있는 표를 참고하여, 실행 파일과 스크립트 파일, 폰트와 각종 파일들을 각각 맞는 폴더에 복사한다.
터미널에서 다음을 실행한다.
LyX[* https://launchpad.net/~lyx-devel/+archive/ubuntu/release] 는 레이텍을 편하게 사용할 수 있는 편집기에 해당한다.
- layer_wise_relevance_propatation . . . . 43 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)\)라 하자.
위 그림과 같은 뉴럴 네트워크를 생각해보자. 앞서 설명한 것과 같이 뉴럴 네트워크의 예측값 혹은 출력값을 \(f(x)\)라 하고 이것을 수학적으로 어떻게 분해하고, '''기여도'''로 정의할 수 있는지 알아보자.
그러므로, 어떻게든 식과 같이 \(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를 쓰면 다음과 같다.
위 식에서 우변의 두 번째 term이 의미하는 것이 바로 \(x_i\)가 변했을 때 \(f(x)\)는 얼마나 변했는가이다.
식 (4)에서 \(f(a)\)와 \(\epsilon\)을 제거할 수 있다면 두 번째 term만 남길 수 있는데 이를 정리하면 아래와 같다.
식 (5)를 도출하기 위한 과정을 아래에 설명하도록 하겠다.
= ReLU의 특성을 통해 epsilon = 0 임을 확인해보자 =
2차원 입력을 갖고 활성화 함수 ReLU를 사용하는 뉴런을 수학적으로 표현하면 아래와 같다.
양수의 경우에 대해서만 식을 전개하고 이를 Taylor 급수로 나타내면,
테일러 급수를 이용한 함수 근사화에서 시작점 \(x = a\)는 어느 위치여도 관계 없이 무한한 항을 다 더할 수 있다면 정확하게 그 함수를 근사할 수 있다. 다만 LRP에서는 식 (5)에서 보았듯이 \(f(a) = 0\)이라는 제약조건을 만족해야 한다. 이 조건을 만족 시키는 \(a\)는 무수히 많다.
위 그림은 식 (6) \(f(x) = \max \left ( 0, \sum_{i=1}^2 w_i x_i +b \right )\)의 입력과 출력을 그림으로 표현한 것이다. 입력 \(x_1, x_2\)는 우리가 입력한 것이니 알고 있고, 출력값 \(f(x_1,x_20\) = ReLU(x_1, x_2)\)는 뉴럴네트워크 모델에 의해 결정되는 값이다. 출력값은 흰색과 붉은색의 그라데이션으로 표현되었다. 흰색에 가까울 수록 '0'에 가깝고 붉은색으로 갈 수록 큰 값을 갖는다. 실선은 출력값이 '0'인 지점을 이은 것이고 점선은 등일한 값을 갖는 등고선이다.
이 식을 약간 변경하면,
식 (11)을 식(9)에 다시 대입하면,
앞에서 정리한 내용을 바탕으로 하나의 뉴런의 결과 \(f(x)\)는 다음과 같이 분해될 수 있음을 알았다.
- lecture_note_machine_learning . . . . 68 matches
나는 잠시동안 머신러닝에 대해서 배우길 원했다. 나는 강화학습에 익숙한만큼 머신러닝 기본에 대해서는 알고 있다. 아래 노트는 내가 머신러닝을 이해하기 위해 정리한 것들이고 대부분의 강의 자료는 Cal Tech CS 1156을 참고 했고 보조적으로 Stanford CS 229 Courera를 참고 했다.[* Aka Blaenk.Denum <https://www.blaenkdenum.com/notes/machine-learning/>]
우리가 존재할 수 있는 모든 데이터를 다 알고 있다면 모든 데이터를 원하는데로 나눌 수 있을 것이다. 하지만 현실적인 문제에서 존재할 수 있는 모든 데이터를 아는 것은 쉽지 않은 것이다. 때문에 샘플링이라는 것을 통해서 문제에서 정의하고 있는 데이터의 분포가 이럴 것이라는 추정을 한다.
학습도 in-sample에서의 가장 좋은 Hyporthesis를 선택하는 과정을 반복하게 된다.
때문에 학습이 가능하다는 것을 보이기 위해서는 아래의 가정을 만족해야 한다.
Hyporthesis g가 in-sample의 에러와 out-sample의 에러를 따름을 보여줌으로 학습이 가능하다는 것을 보였다.
우리는 학습을 미지의 target function f와 유사한 Hyporthesis g(\(g \approx f\))를 찾는 것으로 정의했다. 또한 out-of-sample의 에러가 '''0'''에 가까워져야 한다. 에러가 크다면 학습이 되었다고 볼 수 없다.
Testing 시나리오에서 일반적으로 학생이 기말시험을 얼마나 잘 보았느냐로 그 학생이 수업을 얼마나 잘 이해하고 있는지를 평가할 수 있다. 이 평가를 조금 더 잘 하기 위해서는 시험문제의 수\(N\)가 많아야 한다.
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임을 보였다.
위 수식에서 \(M=\infty\) 이기 때문에 M을 조금 더 의미 있는 것으로 바꾸려고 한다.
Bad Event \(B_m\)을 아래와 같이 정의 하자.
각 Bad Event들을 벤다이어그램을 그려서 보면 서로 Overlapping 되어 있을 것이다.
결과적으로는 각각의 Bad Event의 확률을 합보다는 적을 것이다.
실제로 Perceptron의 Hyporthesis를 보면 대부분의 Error에서 Overlap이 됨을 알 수 있다.
Hyporthesis를 셀때 모든 input space를 고려하게 되면 무한대의 수가 될 것이다. 때문에 모든 input space를 고려하는 대신에 선택된 Sample만을 구분하는 Hyporthesis의 수를 세는 것으로 바꿔보자.
위 식에서의 Hyporthesis의 수는 무한대이다. 이것을 sample 관점에서 보면 최대 \(2^N\)개가 된다. N은 sample의 숫자 이다.
Growth Function은 주어진 N 개의 데이터 포인트을 구분하는 최대 Dichotomic를 세는 함수이다.
구분하는 방법과 데이터가 놓여지는 차원에 따라서 최대 Dichotomic이 결정 되는데 최대 \(2^N\)을 넘어 설 수 없다.
예로 Perceptron의 경우 2차원 평면의 4 포인트 점을 구분한다고 했을때 아래 그림처럼 데이터가 찍힌다면 구분할 수 없다.
4포인트를 구분하는 조합 \(2^4\)에서 그림과 같이 구분이 안 되는 경우(색을 반전한 경우까지 포함) 두 가지를 제외하면 \(m_{\mathcal H}(4) = 14\)가 된다.
한 점을 기준으로 그 보다 크면 +1 그렇지않으면 -1을 갖는다고 할때,
- lecture_note_machine_learning_exercise . . . . 36 matches
SVM은 Decision Boundary에 가장 가까이 있는 support vector만을 고려하고 그 이외의 점에 대해서는 Decision Boundary의 결정에 고려하지 않는다. 반면 logistic reression은 모든 데이터 포인트에 가중치를 결합하여 Decision Boundary를 결정하기 때문이다.
분류 결과와 의도한 값이 같은 부호를 가지면 loss는 0가 되고 다른 부호를 가지면 0 보다 큰 값을 갖게 된다.
하지만, 만약 차원이 아주 큰 고차원으로 변환한다면, 고차원 데이터를 SVM으로 연산(내적)하는 것은 많은 계산비용을 소모한다.
이것을 해결하기 위해서 '''커널 트릭(Kernel Trick)'''을 활용한다.
이 특성을 활용해서 비교적 계산비용이 저렴한 저차원에서 내적을 계산하고 그 결과를 고차원에 매핑하는 방법을 사용한다.
Error function과 모델을 아래와 같다고 하면,
미분을 정리하면,
식 (4)와 같고 그 것을 각각의 w에 대해서 정리하면 아래와 같다.
leave one out cross validation(LOOCV)은 샘플 수 만큼 모델을 만들고, 각 모델을 만들 때에 하나의 샘플만 제외하면서 그 제외한 샘플로 Test set performace를 계산하여 평균을 내는 방법이다.
위 그림에서 한점을 제외한다고 하더라도 Support vector의 변화가 없기 때문에 LOOCV는 0가 된다.
각 웨이트에 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로 값는다.
히든 레이어에 activation function을 liner function을 사용하면 선형 결합에 의해서 레이어가 유지 되지 않음.
히든 레이어에 activation function을 liner function을 사용하면 선형 결합에 의해서 레이어가 유지 되지 않음.
문제 자체가 선형이기 때문에 임의의 두점만 사용해도 모든 점을 표현할 수 있음.
문제 자체가 선형이기 때문에 임의의 두점만 사용해도 모든 점을 표현할 수 있음.
입력 \(x = {1,2,3}\)에 대해서 출력 \(y = {1,2,1}\)을 갖기 때문에 \(y = \frac{4}{3}\)으로 fitting할 수 있다. 이것을 기준으로 각 입력에 대해서 에러를 계산하면,
- lets_encrypt_ssl . . . . 4 matches
키 생성은 도메인과 이메일 정보등을 넣어서 만들어준다.
아주 오래걸림. 이것까지 완료되면 whansun.iptime.org에 대해서 ssl을 사용할 수 있고 모든 설정에 대해서 ssl 접속이 된다.
Let's Encrypt는 무료인 대신 90일 마다 갱신을 해줘야 한다. crontab으로 자동 갱신하자
이것이 잘 안된다면 stackoverflow[* https://stackoverflow.com/questions/42300579/letsencrypt-certbot-multiple-renew-hooks] 등을 찾아보고 수정해야 한다. 아직 정상 동작하는지 확인 되지 않았다.
- linux_Voyager_install . . . . 7 matches
http://get.adobe.com/flashplayer/ 에서 ''tat.gz for other Linux''를 선택해서 압축 파일을 받아서 직접
받은 파일을 압축 해제하면 libflashplayer.so 파일이 나오는데 이걸 '''/usr/lib/mozilla/plugins''' 폴더에 넣어주면 된다.
bin, cue 파일에서 음원을 추출해주는 프로그램으로 간단히 wav파일을 얻을 수 있어서 좋다.
윈도우, 리눅스, MacOS까지 다양한 Platform을 지원하며 다양한 기능을 갖고 있으면서 가벼운 편집기.
- linux_apache2_init . . . . 11 matches
웹서버 설정을 할때마다 조금씩 뭔가가 다르고 안 된다. ㅠ 아 짜증나..
웹서버로 moniwiki와 gitweb을 사용하려고 한다.
아파치 설정을 변경 후 설정을 다시 적용할 때는
available 이라는 디렉토리들은 보통 사용가능한 설정 파일들을 저장하고 여기서 enabled 라는 디렉토리로 심볼릭 링크를 걸어서 사용하는 경우가 많습니다.
아파치를 시작한 후 퍼니오 가상서버 호스팅 신청 후 발급된 접속 도메인으로 브라우저에서 접속을 해 보면 됩니다.
= moniwiki 설정을 위한 아파치 구성 =
보통의 경우 libapach2-mod-??? 이런식의 모듈을 함께 설치해줘야 한다. nginx와 같은 웹서버를 쓴다면 해당사항이 없겠다.
php5.conf 와 php5.load 라는 심볼릭 링크가 만들어져 있고 실제 파일들은 mods-available 에 있는 것을 볼 수 있습니다. 여기서 dir.conf 파일을 vi 등으로 열어서 index.php 가 index 파일에 추가되어 있는지 확인해 보도록 합니다.
/var/www/html 아래에 phpinfo.php 파일을 만들어서 php 설치를 확인해 봅니다.
- linux_compiler_assembler_process . . . . 307 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 pre processor'') : 소스 파일의 주석 제거 및 define을 치환 하는 기능을 처리 합니다.
'''컴파일러''' (''C Compiler'') : 전처리기를 거친 소스 파일을 어셈 파일(ADD,MOD,SUB,CALL 등으로 작성되어 있는 파일)로 변환 합니다.
'''어셈블러''' (''Assembler'') : 어셈 파일을 오브젝트 코드 파일로 변환합니다.
'''링커''' (''Linker'' ) : 오브젝트 파일들을 묶어서 실행 코드 파일로 변환합니다. (운영체제의 Loader가 로딩할수있도록, 주소등을 적절히 계산해서 실행 파일을 만들어줍니다.)
소스코드를 컴파일해서 만들어진 오브젝트 코드는, 실행을 위한 코드들은 주소 정보는 확정되지 않은 채 기계어로 만들어집니다.
(하나의 C소스코드만 작성했을지라도, 표준함수들이 정의되어있는 모듈들, 그리고 특히 C0.obj 라는 Start-up 코드와 결합(링크) 되어야 합니다.)
그래서 링크 과정을 거쳐야만 주소가 확정됩니다.
링크 과정을 거치면 실행 가능한 코드로서, EXE 파일이 만들어집니다.
그럼 EXE 파일이 주소를 가지고 있을까요? 네 가지고 있습니다. 하지만, 확정된 주소는 아닙니다.
EXE 파일을 실행시키기위해 OS가 메모리에 로드하는 과정에서 주소는 재배치가 됩니다. 즉, EXE 파일은 주소 재배치에 필요한 정보를 포함합니다.
여러개의 프로그램을 메모리에 동시에 로드해서 실행시킬수 있는 이유 역시 이런 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 이야기는 이 정도만 우선 알아두면 될 듯 싶다.
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 코드라고 하지 않고 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와는 다른 말이다.
- linux_dasom_installation . . . . 1 match
리눅스에서 한글을 입력하기 위해서는 한글 입력기를 설치해야 하는데 지금까지 사용해본 입력기 중에서 가장 완력하게 동작하는 입력기다.
- linux_environ_variable . . . . 10 matches
* 이러한 변수들은 프로그램 내의 사용자 변수들과 구분하기 위해서 일반적으로 대문자로만 구성하는 관례가 있으며, 환경변수들은 사용자마다 개인설정에 따른 다른 값을 갖는다.
* 대표적인 환경변수에는 사용자의 홈드렉토리를 가르키는 $HOME, 명령을 검색할 드렉토리 목록인 $PATH, 전달된 매개변수의 개수를 나타내는 $# 등이 있다.
환경변수를 찾아 값을 돌려주는 함수.
* 해당 이름의 환경변수가 존재하지 않을 경우 null을 반환하고, 환경변수는 존재하나 값이 비어 있을 경우 빈문자열을 반환한다.
'''"이름=값"''' 형태의 문자열을 입력받아서 그것을 환경변수에 추가하는 함수.
* 메모리 부족이나 시스템적인 이유로 환경변수를 추가, 확장할 수 없는 경우에는 함수 호출 실패(-1)을 반환하고, 정확한 에러의 원인은 오류변수인 errono에 설정한다.
- linux_environment_module . . . . 2 matches
받은 파일의 압축을 풀면 소스를 얻을 수 있는데 소스를 컴파일 하기 전에 tcl이 설치 되어 있는지 확인해서 없다면 설치 해줘야 한다.
- linux_exfat_ubuntu . . . . 2 matches
exfat 파일 시스템을 사용하는 대용량 USB를 마운트 하기위해선 exfat를 별도로 설치해줘야 한다.
배포판에서 제공하는 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보다 파일시스템의 복수/보안기능을 크게향상되었고 현재 기본 파일시스템으로 쓰이고 있습니다.
ext4 -16TB까지만 지원하던 ext3과 달리 더큰 용량을 지원하며, 삭제된 파일 복구, 파일 시스템 점검속도가 훨~씬 빨라진 파일시스템입니다.
iso9660 -DVD/CD-ROM을 위한 표준 파일시스템으로 읽기만 가능합니다.
msdos -MS-DOS파티션을 사용하기위한 파일시스템에 사용합니다.
ramdisk -RAM을 지원하기위한 파일시스템에 사용합니다.
파일시스템에 맞게 사용되는 옵션들을 설정하는 필드입니다.
default - rw, nouser, auto, exec, suid속성을 모두 설정
exec - 실행파일이 실행되는것을 허용
noexec - 실행파일이 실행되는것을 불허용
suid - SetUID, SetGID 사용을 허용
nosuid - SetUID, SetGID 사용을 불허용
1 - 우선순위 1위를 뜻하며, 대부분 루트부분에 설정을 해놓습니다.
- linux_git_install_guide . . . . 18 matches
원격지에 저장소를 만들고 공유하고자 한다면 사용자 접근과 몇몇 보안을 고려해야 한다.
지금 여기서는 ssh 프로토콜을 사용하는 것을 기준으로 설명하겠다.
등의 파일들이 생기는 것을 확인 할 수 있다.
ssh 프로토콜을 사용해서 git을 접속하기 위한 방법으로 사용자들에게 각각의 계정을 만들어 줄 수도 있지만
git서버가 계정을 다 갖고 있는다는 것도 경우에 따라서는 좋은 방법이 아닐 수 있다. 그래서 공통의 계정 하나를 생성하고 같이 쓰도록 설정하자. (git 계정 생성)
이렇게 하면 git 계정 하나로 git 서버에 접근할 수 있다. 하지만 또 하나의 문제가 모든 사람이 접근할 수 있다는 문제가 생긴다. 이것을 방지하기 위한 방법으로 ssh 공개키를 사용한 보안 설정을 하도록 하겠다.
접속 하려는 PC의 ssh 공개키를 git 계정에 등록해서 접근을 제어하는 방법이다.
위와 같이 ssh 공개키를 생성해서 git 서버에 등록해주는 방식을 취한다. 공개키를 생성할때 엄호를 넣지 않고 만들면 별도의 암호 입력이 필요 없어짐.
git 서버의 git 계정 아래 미리 만들어 놓은 .ssh 폴더에 ''authorized_keys'' 파일을 생성하고 보내온 공개키를 추가 하면 됨.
- master라는 브랜치에 파일을 push함.
자유롭게 push, pull을 할 수 있음.
원격 저장소에서 git을 복사해 오면 로컬에 git 저장소가 생기게 된다. 원격지에 push할때 내 서명을 어떤것을 사용할지 정하기 위해서
- linux_gitweb_install_guide . . . . 5 matches
git용 web interface인 Gitweb을 설치하는 과정에 대해 기술한다.
저장소를 /repo로 했을 경우의 설정이다.
gitweb설정은 절대 경로가 아닌 아파치에서 설정한 web root 설정을 기준으로 한다.
를 실행서서 gitweb 웹관련 파일을 갖고 오면 끝이 난다.
아파치는 사용하는 모듈을 별도로 추가 설정해줘야 한다. cgi도 사용하기 위해서는 별도의 설정이 필요하다.
- linux_iconv . . . . 8 matches
conv 로 데이터파일의 언어설정을 바꿀수 있습니다.
위와 같은 형식으로 변경이 가능합니다. -f 는 기존의 언어셋을 -t 는 변경할 언어셋을 설정해 주면 됩니다.
위에선 예제로 euckr 과 utf8 을 적어놨습니다. 하지만 iconv 의 지원언어는 엄청납니다.!
iconv -l 을 하게되면 지원가능한 언어가 좌르륵 나옵니다. 다만 변환을 위해서 기존언어가 어떤언어인지
주어진 파일의 인코딩을 한 인코딩에서 또 다른 인코딩으로 변환함.
iconv 로 다수의 파일을 인코딩 변경 하는 스크립트는 http://mindpower.kr/22 <- 여기에서^^
- linux_ifconfig . . . . 8 matches
시스템 관리자를 할때 가장 기본이 되는것이 네트워크 설정이지 않을까 한다.
X 윈도우 환경이 있을 수도 있지만 서버의 경우 윈도우 환경이 없이 사용 하는 경우도 있다.
이런 경우 네트워크 설정을 하는 것은 난감한 일이다.
ifconfig 명령을 이용해서 네트워크 설정을 변경하는 방법이다.
이 방법은 시스템 메모리상의 네트워크 설정 값을 바로 변경하는 것이기 때문에 네트워크 설정과 동시에 적용 되지만 시스템이 재부팅 되게 되면 사라진다는 점을 주의해야 한다.
= 네트워크 설정 파일들을 이용하여 네트워크를 설정하는 방법 =
- linux_index . . . . 2 matches
1. [:linux_locale 시스템에 설치된 로케일을 변경하는 방법]
1. [:opencl_reqd_work_group_size attribute을 이용한 워크 그룹 사이즈 설정]
- linux_init_setup . . . . 38 matches
Linux 개발 환경을 구축하기 위한 가이드
http://www.ubuntu.com/ 에서 최신 배포판을 무료로 받을 수 있다.
데비안 계열에서는 개발에 필요한 것들을 한번에 설치 할 수 있는 패키지가 있다.
외부에서 터미널 접속을 지원하기 위해서 가장 먼저 해줘야 할 것이 SSH 설치이다.
port 부분을 변경해 주면 된다.
[http://www.netsarang.co.kr/download/font.html Xmanager 폰트]를 다운 받을 수 있다.
-- /home/user01 디렉토리를 갖고 bash쉘을 사용하고 admin그룹에 속한 user01을 만들어라
2. '''사용중인 계정을 sudo user만들기'''
sudo vi /etc/group 파일을 열어
/etc/sudoers 파일을 확인해서 자신이 추가한 user나 구룹이 추가 되어 있는지 확인해야 한다.
스냅틱 패키지 관리자로 설치 하는것을 추천함.
(rw, root_squash) : NFS클라이언트가 root권한으로 NFS마운트를 하면 nfsnobody 권한을 부여하게 됩니다.
(rw, no_root_squash) : NFS클라이언트가 root권한으로 NFS마운트를 하면 root권한을 부여하게 됩니다.
(rw, all_squash) : NFS클라이언트가 NFS서버로 마운트를 하면 일반사용자도 nfsnobody 권한을 부여하게 됩니다.
아래의 명령을 실행하여 nfs 관련 의존 패키지를 설치합니다
NFS 설정 파일을 편집합니다. 원격에서 접속할 경우 방화벽 정책에 의하여 해당 연결이 되지 않을 경우가 있어, 해당 포트를 고정을 합니다.
아래의 항목을 검색하여 주석을 해제합니다.
(rw, root_squash) : NFS클라이언트가 root권한으로 NFS마운트를 하면 nfsnobody 권한을 부여하게 됩니다.
(rw, no_root_squash) : NFS클라이언트가 root권한으로 NFS마운트를 하면 root권한을 부여하게 됩니다.
(rw, all_squash) : NFS클라이언트가 NFS서버로 마운트를 하면 일반사용자도 nfsnobody 권한을 부여하게 됩니다.
- linux_kernel . . . . 19 matches
때문에 중요한 몇 가지 라이브러리만을 커널 내에서 사용하도록 한다.
2. 커널 프로그램에서는 메모리 보호 기능을 사용할 수 없다. 응용 프로그램에서는 메모리 참조를 잘 못 하게 되면 "segmentation error"라는 메시지를 출력하며 응용 프로그램이 종료 되지만 커널 프로그램에서는 시스템의 치명적인 결과를 초래 할 수 있다.
3. 커널 내에서는 float형 변수를 사용하기 어렵다[[footnote(float형은 하드웨어 아키텍처에 의존적이므로 커널 내에서는 float형 연산을 지원하지 않는다.)]].
4. 스택 공간을 고려해서 써야 한다. 인텔 x86 아키텍처에서는 커널 스택은 8KB 이하이다. 만약, 큰 데이터 공간이 필요하다면 kmalloc 함수를 사용하여 커널 동적 메모리를 할당 받거나 전역 변수를 사용하는 방안을 고려해야 한다.
기존에 설정 되어 있던 커널 옵션들을 초기화 시켜 주는 명령어
커널 옵션을 설정해 주는 명령어
이 명령으로 옵션을 설정하게 되면 해당 디렉토리에 .config 라는 옵션 설정 저장 파일이 생성 된다.
이 파일을 재설정하려면 '''make oldconfig''' 명령을 수행하면 된다.
소스간의 의존성을 검사하여 의존성에 대한 설정을 수행한다.
기존 컴파일 시 생성된 오브젝트 파일과 같이 이전 컴파일시에 생성된 파일들을 삭제한다.
zImage나 bzImage는 gzip으로 압축 되어 있고[[footnote(압축이 안 된 커널 이미지는 arch/i386/boot/vmlinux 파일로 존재한다.)]] 그 차이는 압축된 이미지의 사이즈가 1MB 이하이냐 아니냐의 차이다. '''b'''는 ''big''을 의미한다.
make bzImage를 수행하면 arch/i386/boot 디렉토리에 bzImage 파일이 생성 된다. 이 파일을 /boot로 복사해서 사용한다. 복사할때는 고유한 이름을 갖도록 변경해서 복사한다.
모듈을 컴피알 한다.
컴파일된 모듈을 적절한 위치로 복사해 준다.
lilo.conf, grub.conf 파일을 수정해 줘야 한다.
- linux_kernel_asmlinkage . . . . 8 matches
커널 소스를 보다보면 asmlinkage로 선언된 함수들을 볼 수 있다.
그렇다면 어셈블리 코드에서 직접 호출할 수 있다는 것은 무엇을 의미할까?
함수의 인자를 넘기거나 리턴값을 받는 부분 등의 호출 규약이 필요하다.
최적화 옵션을 켜고 컴파일하는 경우 인자를 레지스터를 통해 전달하도록
이 경우 GCC를 통해 자동 생성되는 코드는 적절히 변환되므로 문제가 없을테지만
인자를 (레지스터를 이용하지 않고) 스택을 이용해서 전달하도록
위의 코드에서 <asm/linkage.h> 파일을 #include 하고 있는 것에 주의하자.
asmlinkage로 선언된 경우 모두 스택을 이용하고 (레지스터로 0개의 인자 전달)
- linux_locale . . . . 11 matches
로케일을 변경할 수 있는 방법은 세 가지가 있습니다.먼저 로케일이 시스템에 설치
locale -a 명령을 실행합니다.
이 명령은 시스템에 설치된 모든 로케일을 출력합니다. 필요한 로케일이 설치되어
하단에 있는 "참고" 내용을 참조하십시오.
1) CDE 로그인 화면에서 로케일을 변경하려면
(new locale)을 선택합니다. 그런 다음 시스템에 로그인합니다.
2) 로케일을 일시적으로 설정하려면(쉘에 따라 다름)
3) 시스템 전체의 로케일을 변경하려면
다음 항목을 추가하십시오.LANG= LC_ALL=
옵션 없이 locale 명령을 실행하여 로케일이 변경되었는지 확인하십시오.
http://docs.sun.com을 참조하십시오.
- linux_openshot . . . . 1 match
동영상(http://vimeo.com/50513213)을 보시면 이해가 빠르실거라는..ㅋㅋㅋ
- linux_port_forwarding . . . . 7 matches
ssh를 이용해서 터너링을 할 수 있는데 그 방법에 대해서 알아보도록 하자.
방화벽 안쪽에 있는 본인의 노트북(210.119.60.156)을 집에서 접속하려고 한다.
그리드는 게이트역할을 하는 오픈된 서버이다.
위의 방법은 게이트 역활을 해주는 서버에 접근 할 수 있는 권한이 있을 경우에 가능한 방법이다. 하지만 게이트 서버가 없다면 방화벽 안 쪽에 있는 서버에 접속할 방법이 없을까?
이렇게 접속을 유지하고 있으면 원격지에 있는 서버의 Port 2222과 방화벽 안 쪽에 있는 서버의 22번 포트가 연결 되게 된다.
- linux_programming_EXPORT_SYMBOL . . . . 2 matches
이 심볼을 사용하고자 하는 모듈에서는 extern 변수or함수명; 선언하고 사용한다.
2. 커널 Makefile에 CFLAGS 부분에 -DEXPORT_SYMTAB 추가 (없을 시)
- linux_smbfs_mount . . . . 3 matches
apt-get을 통한 설치
삼바 사용자 등록을 해줘야 외부에서 그 사용자 권한을 갖고 접근 할 수 있다.
- linux_ssh_keygen . . . . 13 matches
인증키를 사용하는 것은 로그인 할때마다 암호를 직접 입력하는 것보다 더욱 안전하며, 하나의 암호로 여러 ssh서버에 접속할수 있는등의 장점을 가진다.[[footnote(http://kltp.kldp.net/eunjea/ssh/x87.html, 인증키 사용하기)]]
인증키는 ssh-keygen로 만든다. 키를 만들때는 사용할 키의 형태를 지정해 주어야 하는데 원격 서버가 ssh 프로토콜 버전 2를 지원한다면 ``rsa'' 또는 ``dsa'', 프로토콜 1만을 지원한다면 ``rsa1''을 사용한다.
키가 저장될 곳과 이름을 물어 오는데 디폴트로 그냥 엔터를 치고 넘어가면, 다음과 같이 인증키 암호를 물어온다. 원하는 암호를 두번 반복해서 입력해주면 키가 생성된다.
인증키 생성시 인증키 암호를 공백으로 (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 해준다.
키 파일을 다른 이름으로 저장했거나 서버마다 다른 키를 사용하려면 ssh에 -i 옵션을 사용해 키 파일을 직접 지정해 주면 된다.
이제 인증키를 복사해둔 ssh서버에 접속하면 이 세션에서는 더 이상 암호를 묻지 않을 것이다.
서버가 지원한다면 되도록 SSH2 프로토콜을 사용하도록 한다. SSH2는 SSH1과는 전혀 다른 프로토콜이며 더욱 안전하고, 성능이 좋다.
- linux_system_guid . . . . 12 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 등의 네트워크 정보 파일들을 하나의 서버에서 관리하도록 하여 나머지 시스템에서 서버에서 제공하는 새로운 정보를 받을 수 있도록 하는 것이다.
그렇기 때문에 /etc/hosts 파일에 각각의 서버 클라이언트의 호스트들을 등록해 두는 것이 사용이 원할하다.
NIS를 구성하기 위해서는 도메인을 하나 설정해야 하는데 아래와 같이 nims라는 nis 도메인을 설정한다.
shadow 패스워드를 인식하기 위해서는 /var/yp/Makefile에서 shadow publickey 부분의 주석을 제거해 줘야 한다.
ntsysv를 실행하고 ypserv와 yppasswd에 체크 표시를 하고 확인을 누른다.
- linux_ubunt_subversion . . . . 22 matches
우분투에 서브버전을 설치해보자
Apt-get으로 서브버전을 설치한다.
{{{{color: rgb(255, 1, 1); font-size: 13px;} PS. /home/svn/db/txn-current-lock에 접근 할 수 없다는 에러 때문에 권한을 777로 해줘야 했다. }}}
프로젝트로 구성된 것을 저장소에 저장하는 방법은 '''import''' 명령을 사용한다.
현제 디렉토리에 있는 모든 파일들을 저장소에 저장한다는 뜻이다.
작업하던 프로젝트를 '''commit'''하기 전에 작업 내용을 확인하고 싶을 때가 있다.
우선 작업이 된 파일을 확인 하기 위해서 '''status'''라는 명령을 사용한다.
변경된 파일이나 추가/삭제된 파일을 보여주는데 이것은 아직 저장소에 적용된 것이 아니다.
또한, 변경된 파일의 내용을 비교해서 보고 싶을때가 있을 것이다.
이때는 '''diff''' 명령을 사용한다.
그래서 외부 프로그램을 연결해서 사용할 수 있는데 다음과 같다.
프로젝트를 저장소에 저장하기 위해서는 '''commit''' 명령을 사용한다.
svn commit -m "변경 사항을 입력한다."
이렇게 저장 될 때마다 리비전이 하나씩 증가하게 되는데 지난 기록을 보고자 할때는 '''log''' 명령을 사용한다.
'''verbose''' 옵션을 추가 하게 되면 comment와 변경된 파일의 정보까지 상세한 정보를 볼 수 있다.
'''svnserve''' 명령어로 svn을 데몬 형태로 구동 할 수 있다.
- linux_ubuntu_rpm_deb_conversion . . . . 1 match
#title RPM 배포 버전을 deb로 변환하여 설치 하기
- linux_ulimit_command . . . . 38 matches
/etc/security/limits.conf 를 참조해서 사용자마다 프로세스 사용과 메모리 사용에 제한을 두고 있는데 이것을 변경하기 위한 명령으로
'''ulimit'''을 사용한다.
이 글은 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의 수도 증가했음은 물론이다.
-a 모든 제한 사항을 보여준다.
소프트 한도(soft)는 새로운 프로세스가 만들어졌을 때 디폴트로 적용되는 자원의 한도이다. 이것을 하드한도까지 등가시킬 수 있다. 그렇지만 이 한도를 넘어서 확장하는 것은 슈퍼유저만이 가능하다.
-> 절대 아니다. 이건 커널차원에서 지정을 해야 한다.
위에서의 각 항목을 살펴보자면…
의 뜻을 가지고 있다.
1. 소스파일을 수정한 후, 커널 재컴파일을 하는 방법.
3. /etc/security/limits.conf 파일을 수정하는 방법
하지만 /proc 를 사용하여 시스템 설정을 변경할 경우, 매 부팅시 설정을 다시 해주어야 한다는 단점이 있다.
/etc/rc.local 파일을 이용하여 명령어를 설정하던가 아니면 다음에 나오는 limits.conf 파일을 이용하도록 한다.
제일 아래 ‘oracle’ 과 같이 따로 설정된 부분과 같이 변경하면 된다. 이렇게 설정할 경우, 매 부팅시 자동 적용되어 별도로 적용하지 않아도 된다. 또한, 각각의 유저마다 다른 설정을 적용할 수 있으므로 보안 및 관리에도 용이하다.
# 마지막으로 프로세스에서 열어놓은 파일을 확인하는 방법에 대해 알아보자.
결론적으로 lsof 프로그램을 이용하면 된다.
- linux_util_tar . . . . 10 matches
리눅스 환경에서 파일을 묶고 압축하기 위한 유틸 Tar의 사용법
엄밀히 말하면 Tar은 파일을 압축하는 것이 아니라 하나로 묶어주는 유틸이지만 gzip과 함께
== 압축하지 않을 경우 ==
묶을 때
묶음을 풀 때
== gzip을 사용해서 압축할 경우 ==
묶을 때
묶음을 풀 때
묶을 때
묶음을 풀 때
- linux_wol . . . . 2 matches
WOL(Wake-on LAN)은 LAN을 통해서 PC를 부팅하는 것으로 메인보드에서 지원해야 한다.
''' 1. 스크립트 파일을 작성한다. '''
- mAP . . . . 9 matches
mAP는 이진 분류기의 성능 지표로 사용되는 정밀도와 재현율을 이용한 지표이며 객체 검출 알고리즘의 성능을 평가하는데 널리 사용합니다.[* https://inspaceai.github.io/2017/11/07/Mean_Average_Precision/]
* 정밀도(Precision)는 양성으로 판정된 것 중 실제로 참인 것의 비율을 나타냅니다. ‘참 양성 / (참 양성 + 거짓 양성)’으로 정의됩니다.
* 재현율(Recall)은 실제 값이 참인 것 중 판정이 양성인 것의 비율을 나타냅니다. ‘참 양성 / (참 양성 + 거짓 음성)’으로 정의됩니다.
딥러닝 객체 검출 알고리즘에서는 검출된 상자가 참일 가능성(확률)이 같이 출력됩니다. 확률이 몇 퍼센트 이상일 때 양성으로 판정할지의 기준선인 ‘임계값’을 몇으로 정하는지에 따라서 예측 결과가 참인지 거짓인지가 달라지기 때문에 정밀도와 재현율도 모두 달라지게 됩니다. 임계값을 바꿔가면서 실제로 참인 객체가 임계값 내에 포함될 때마다 정밀도와 재현율을 모두 측정하면 실제로 참인 객체 만큼의 정밀도, 재현율 쌍이 생기게 됩니다. 여기서 정밀도만을 골라 내어 평균을 낸 것이 평균 정밀도(AP; average precision)입니다.
- make_clock_skew_detected . . . . 3 matches
git을 사용해서 각기 다른 시스템에서 작업하고 commit을 반복하다 보니 컴파일하는 시스템과 소스의 시간이 달라서 이런 에러가 발생하는 것을 알게 되었다. 컴파일 하는 것에는 큰 문제는 아니지만 컴파일시 지저분하게 출력되는 것이 보기 싫어서 아래와 같이 해결 했다.
- mamory_leak_valgrind . . . . 2 matches
메모리릭을 검사하기 위해 유용하게 사용할 수 있는 프로그램으로 valgrind을 알아보자.
- math_Euler_number . . . . 26 matches
지수 함수(exponential function)는 아래 성질을 가진 함수입니다.
사람들은 수를 어떻게 사용하고 있을까요?
숫자 자체의 기호의 의미로 사용하는 numbering이 있을겁니다. 루이 13세, 철인 28호와 같이 기호적 의미가 있을테고,
또 다른 사용으로는 개수가 있을겁니다.(counting) 같은 것이 중복해서 여러 개가 있을때 수를 사용하지 않고 이것들을 표현한다면 어떤까요?
예로 계란이 30개 있다고 생각해 봅시다. 계란, 계란, 계란, ... 계란을 30번 외치면 될까요?
더하기로만 표현하니 사람이 인식하기에 너무 길죠? 이것을 다시 확장하는 개념으로 곱하기를 사용해서 표현하면
그러면 여기서 잠깐 동일한 곱셈이 덥셈처럼 많으면 어떻게 표현하면 좋을까요?
이것을 표현하기 위한 방법이 '''지수'''입니다.
이 성질을 잘 이용하면 곱셈을 덧셈 관점으로 바꿀 수 있기 때문에 수학에서 많이 사용하고 조금더 편하게 사용하기 위해서 지수 함수의 역함수인 로그 함수의 가장 중요한 성질이 됩니다.
로그는 지수의 밑보다는 지수 자체에 관심을 갖는다. 밑을 통일하고 지수 관점에서만 보면 복잡한 곱셈이 단순 덧셈으로 치환되기 때문이다.
미분을 하는 이유는 해당 곡선의 기울기(slope)를 알기 위해서이고 일차 함수인 \(y =ax +b\)에서 a에 해당하며 변화율을 이용하면 아래 식과 같이 정의한다.
1. '''차분'''(difference) : 두닶을 뺀 차로 \(x_2\)와 \(x_1\)의 간격을 의미한다. \(\Delta x = x_2 - x_1\)
3. '''미분법'''(diffentiation) : 미분소의 비율을 미분값으로 정의하고 이런 미분값을 구하는 방법을 미분법이라고 한다.
극한(極限, limit)은 특정한 점으로 한없이 가까이 가는 것을 수학적으로 자명하게 정의한 것이다. 가까이 가는 모습 자체는 생각하기 쉽지만 수학적으로 명쾌하게 정의하기는 매우 어렵다. 극한 개념을 수학적으로 표현할 때 사용하는 개념은 코쉬(Augustin-Louis Cauchy)가 제안한 \(\epsilon - \delta\) 정의(定義, definition)이다.
당연한 말을 수학적으로 명확하게 정의하기 때문에 처음 접하면 상당히 거북하다. 예를 들면 아래 대화를 보자.
\(\left | \cfrac{l_2 - l_1}{t_2-t_1} -100 \text{km/h}\right | \lt \epsilon\)을 만족하는 \(\delta\)가 항상 존재할 때가 시속 100km라고 한다.
- math_complex_analsys . . . . 60 matches
복소 함수론의 시작과 끝이며 가장 중요한 정리는 다음 식 (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.]. 자, 그럼 복소 함수론의 아름다움을 느낄 수 있는 다음 식을 보자.
단순 연결 경로는 '''그림 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)'')이라면 상황은 더 복잡해진다.
복소 함수의 미분이 정상적으로 정의되기 위해서는 어떤 경로를 따라 미분하더라도 그 값이 같아야 한다. (''이런 함수는 정칙 함수(正則函數, holomorphic function)라고 한다. 로랑 급수(Laurent series)를 이용하면 복소수 범위에서 정칙 함수와 해석 함수는 서로 등가라는 것을 증명할 수 있다.'') 예를 들어 실수축(x축)과 허수축(y축)을 따라 미분하면 다음을 얻는다.
\(x\)축을 따라 미분한 결과와 \(y\)축을 따라 미분한 결과를 같다고 연립하면 식 (5)로부터 다음 방정식을 얻을 수 있다.
식 (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)을 구해야 한다. 이 점을 이해하지 못하면 코쉬-리만 방정식의 의미를 알 수 없다.
식 (6), (8)을 식 (7)에 대입해보자.
식 (9)를 다시 식 (7)에 넣으면 복소 함수 \(f(z)\)의 미분을 구할 수 있다.
식 (10)은 어떤 미분 경로를 택하더라도 미분값은 고정이므로 '''코쉬-리만 방정식'''이 잘 성립한다. 물론 이런 방식으로 리만이 증명한 것은 아니다. 이것은 수학적으로는 부실하지만 코쉬-리만 방정식이 성립하는 것을 편하게 보일 수 있다. 실제 리만은 '''켤레 복소수'''(complex conjugate)를 이용해 식 (6)을 증명했다.
식 (11)의 결과를 식 (7)에 넣으면 다음을 얻는다.
코쉬-리만 방정식은 복소 함수론에서 풍성한 결과를 만들어낸다. 대표적인 것이 식 (1)의 증명이다. 코쉬의 적분 정리를 실수부와 허수부로 쓰면 다음을 얻는다.
식 (13)의 선적분(line integral)을 위해 다음 '''그린 정리'''(Green's theorem)를 생각하자.
식 (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 . . . . 17 matches
실수(實數, real number)는 연산이 잘 정의되어 누구나 사칙 연산과 대수(代數, algebra)를 손쉽게 사용할 수 있다. 하지만, 복소수는 식 (1)의 규칙에 따라 계산을 해야 원하는 답을 얻을 수 있다.
숙달이 되면 그리 어렵지는 않지만 식 (1)의 규칙으로 인해 초보자들은 복소수 계산을 제대로 하지 못하는 경우가 많다. 단지, 식 (1)과 같이 \(i\)와 \(i\)가 곱해지면 실수 -1로 바꾸면 된다. 이 규칙만 기억하면 복소수 계산은 실수 계산과 거의 동일하다.
'''이차 방정식'''(二次方程式, ''quadratic equation'': \(ax^2+bx+c=0\))의 해(解, solution)를 구할 때 실수만 고려하면 해가 존재하지 않는 문제가 발생하기 때문에 모든 이차 방정식의 해를 항상 찾을 수 있도록 도입한 상상의 수가 복소수이다. 즉, 식 (2)를 만족하는 새로운 수를 찾은 것이 식 (1)에 제시한\(i = \sqrt{-1} \) 상수이다.
식 (2)와 같이 원식을 변형해 가고 식 (1)의 허수를 상수처럼 취급하면 식 (2)의 세째줄은 논리적으로 의미 있는 부등식이 된다. 왜냐하면 제곱한 값이 0보다 크기 때문이다.
따라서, \(ix\)는 실수값이 되므로 식 (2)의 답\((x)\)은 0을 제외한 허수축에 있는 모든 수이다. (∵ xx가 실수라면 \(ix\)는 실수가 될 수 없다. 따라서 \(x\)는 실수 이외의 수이다.) 하지만, 복소수 자체는 식 (2)의 첫째줄 같이 제곱한 값이 0보다 작아서 부등식 자체가 성립하지 않기 때문에 복소수는 크기 비교를 할 수 없다. (∵ 크기 비교는 실수축에서만 한다는 것을 생각하자. 그림 1 을 보면 허수축은 원점 좌우가 아닌 위아래에 존재한다. 허수는 크지도 작지도 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_eigenvalue . . . . 4 matches
1. 위의 식을 만족하는 λ의 값을 찾는다.
1. ''A가 역행렬을 가지는 특이행렬일때만 0이 아닌 해를 갖게 된다.''
'''(λⅠ - A)χ = 0''' 는 0이 아닌 해공간을 가지게 된다.
- math_liner_algebra . . . . 1 match
아래는 mpif90을 테스트한 것이다.
- math_log_history . . . . 14 matches
일과 십, 백, 천, 만 까지는 일상적으로 통용되는 수이지만, 억이라는 단위 부터는 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)''에 의해 만들어졌다.
- math_trigonometric_function . . . . 1 match
위 그림처럼, __반지름과 원주의 길이가 같아지는 각을 1라디안이라고 한다__. 같은 중심각이라면 반지름과 원주의 길이는 비례하므로, 이것으로 각도가 정의될 수 있다. 반지름이 1인 원의 둘레의 길이는 \(2\pi\)이므로, 360도와 \(2\pi\)라디안의 크기는 같다.
- math_variational_formulation . . . . 11 matches
자연현상을 수학적으로 표현하게 되면 거의 대부분 시간 그리고 공간에 대한 변화율을 포함하는 미분 방정식(differential equation)으로 귀착된다. 그런데 이러한 미분 방정식으로 표현된 수식을 강형(strong form)이라고 부르는데, 그 이유는 미분 방정식이 너무 높은 차수의 변화율을 요구하기 때문이다. 예를 들어, 분포하중을 받는 보(beam)의 처짐량은 4차 미분방정식으로 표현되기 때문에 보의 처짐량 분포는 4차 미분이 가능하여야 한다. 하지만 실제로 보의 처짐은 이보다 절반에 해당되는 2차까지 미분이 가능하면 된다.
변분 정식화는 물체 거동을 수학적으로 표현하는 또 다른 표현식으로써 요구되는 미분 차수가 강형의 절반에 해당된다. 이 표현식은 미분 방정식에 가상 변위(virtual displacement)를 곱한 다음 물체 전 영역에 대해 적분(integration)을 취하고, 부분적분(integration by parts)을 통해 미분 차수를 절반으로 감소시켜 구하게 된다. 표현식에 포함되어 있는 가장 높은 미분차수가 강형의 절반 수준이라는 측면에서 변분 정식화를 약형(weak form)이라고 부르기도 한다. 변분정식화는 물리적인 측면에서 가상일의 원리(principle of virtual work)와 일맥 상통하며 이 원리에 대한 수학적 표현식에 해당된다.
그리고 유한요소법(finite element method)을 위시한 모든 수치해석(numerical analysis)에서는 변분 정식화를 토대로 근사해(approximate solution)를 계산하기 위한 최종 행렬 방정식을 유도한다. 미분 방정식으로부터 변분 정식화를 구하는 부분적분 과정에서 해당 자연현상에 대한 경계조건(boundary condition)을 찾아낼 수 있다.
- math_지수함수_삼각함수 . . . . 9 matches
삼각함수의 덧셈정리와 복소수의 극형식을 써서 복소수 곱셉 공식을 표현하자.
두 복소수 \(z_1, z_2\)를 극형식으로 바꾸고 곱셈을 한다.
두 복소수의 곱은 반지름의 곱과 각을 더한 것으로 정리할 수 있다.
이것을 n승으로 확장하면 아래와 같이 정리된다. 이를 '''드 므아브르'''의 정리라 한다.
먼저 복소수 \(1+\cfrac{i\phi}{n}\)의 크기와 편각을 \(r, \theta\)로 놓고 극형식으로 고치면 아래와 같다.
이제 \(n \rightarrow \infty\)일 때, 극한값을 살펴보자.
이므로 두식을 더해
와 같이 지수함수와 삼각함수가 다르지 않은 하나임을 알 수 있다.
- metamaterial . . . . 65 matches
메타물질은 넓은 의미로 '자연계에 존재하지 않는 물성을 가진 가공된 인공적 물질'을 말한다. 또 다른 정의로, '물질' A와 B가 구조적으로 섞여서 나타나는 '복합물질'의 '유효물성'이 물성 A와 B의 단순 합으로 나타나지 않을 때를 이르기도 한다. 보다 정교한 정의로 메타물질은 '메타원자'(meta-atom)로 구성된 물질을 칭한다. 메타원자는 목적에 따라 설계된 내부구조를 가지며, 그 구조와 크기, 주기적(periodic), 혹은 준주기적(quasi-periodic) 배열 등에 따라 다양한 유효물성을 발현시키게 된다.[1]
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로, 이는 현재까지 구현된 그 어떠한 메타물질보다도 더 넓은 주파수 대역에서의 저주파 진동 차단 기술이다. 이 와 같이 굽힘 메타물질의 특성을 이용하여 보다 효율적인 진동 차단을 구현하고자 하는 다수의 연구가 진행되고 있으며, 이러한 연구들이 향후 진동 분야에서의 혁신을 가져올 수 있으리라 기대한다.( 오주환, 울산과학기술원, 기계항공 및 원자력공학부 조교수)
== 음향 블랙홀을 응용한 진동 차단 및 감소 메타물질 ==
음향 블랙홀 효과란 평판이나 보의 진동을 음향 블랙홀 끝단에 집중시킨 후, 끝 단에 부착된 소량의 감쇠 물질을 통해 탄성 변형을 열로 소산시킴으로써 본래 구조물로의 탄성파 반사율을 낮추어 진동을 감쇠하는 효과이다. 기존의 음향 블랙홀은 진동 감쇠 성능을 향상시키기 위해서 길이를 길게 할 경우 많은 공간을 차지하는 단점이 있었다. 이를 보완하기 위해서 중고주파 영역에서 진동 감쇠 성능은 유지하면서 차지하는 공간을 줄이기 위해서 나선형 음향 블랙홀이 제안 되었다. (전원주, KAIST, 기계공학과 부교수)
최근 사물인터넷(IoT), 5G 등 첨단 ICT 기술 발전과 함께 첨단 부품에 대한 수요가 급증하면서, 기존 소재의 한계를 뛰어넘을 수 있는 새로운 소재나 구조에 대한 관심이 높아지고 있다.[3]
- ml_revie_infogan . . . . 5 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'')를 전개할 수 있다.
위 식에 Discriminator와 Generator 입장에서 어떤 값을 기댓값으로 갖고자 하는지를 정리해 보았다.
- modern_cpp . . . . 2 matches
위 4가지 방법은 모두 같은 결과를 나타낸다. 그 중 중괄호를 사용한 생성 방법을 균일 초기화(Uniform initialization)[* https://pppgod.tistory.com/27] 이라고 한다.
R-Value는 표현식이 종료되면 더이상 존재하지 않는 값들을 말한다.
- mp3_unicade_change . . . . 4 matches
mp3 파일의 한글 입력 방법에 따라서 리눅스에서 한글이 깨져 보이는 현상이 있는데 이것을 해결해보자.
이것을 자동으로 해주는 프로그램이 있다.
이것을 이용해서 하위 폴더에 있는 모든 음악 파일을 수정해 보자.
- multi_GPU_pytorch . . . . 24 matches
Multi-GPU를 사용해서 딥러닝을 수행하는 방법은 간단하면서도 어렵다. 이유는 많은 부분을 딥러닝 라이브러리에서 수행해 주기 때문이고 이 기능이 GPU를 100% 활용하지 못하기 때문이다. 7-80% 정도 GPU를 활용하는 것에 만족한다면 딥러닝 라이브러리에서 제공하는 Data Parallel을 사용하면 된다. 갖고 있는 모든 GPU를 100% 활용하고 싶다면 아래 방법들을 공부하고 연구해보자.
NLP분야에서도 2018년 BERT 기점으로 큰 데이터셋에 큰 모델을 사용하여 성능을 높이는 방향으로 연구가 진행되었다.
PyTorch에서 기본적으로 Multi-GPU 학습을 위한 Data Parallel 기능을 제공한다. 아래 그림은 Data Parallel이 작동하는 방식을 보여준다.
위 방법으로 딥러닝을 여러 개의 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 . . . . 35 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% 활용)
* spinner 함수는 문자열 |/-\ 을 순차적으로 thinking 이라는 문자열과 함께 무한히 출력한다. 기존 출력을 지우고 새로 출력하기 때문에 막대기가 회전하는 것처럼 보이게 된다.
* 가상의 시간이 오래걸리는 I/O bound 작업을 처리하는 함수이다.
* time.sleep 을 호출하면 주어진 시간동안 메인 쓰레드는 블락된다. 하지만 그 동안 GIL이 해제되어 다른 쓰레드가 작업을 진행할 수 있게 된다.
* supervisor 함수는 별도의 쓰레드를 생성해서 spinner 를 처리하도록 하고, 이어서 slow_function 작업을 처리한다. slow_function 의 처리가 끝나면 별도의 쓰레드에서 돌고있는 spinner 함수의 루프도 종료시킨다.
* slow_function 을 실행시킨다. 이 부분에서 메인 쓰레드는 result 값을 받을 때까지 블락되어 있다. 이 동안 별도의 쓰레드에 넘겨진 spinner 함수가 실행된다.
* slow_function 의 실행이 끝나면 signal.go 의 값을 False 로 바꾸어주어서 spinner 함수의 루프가 종료되도록 한다.
* 별도로 생성했던 쓰레드가 종료되는 것을 기다린다.
1. time.sleep 대신 asyncio.sleep 을 활용하면 이벤트 루프를 블락하지 않고 sleep 할 수 있다.
1. slow_function 은 이제 코루틴이 되었다. await 문을 사용해서 I/O bound 작업을 하는 동안 이벤트 루프를 진행시킨다.
1. slow_function 을 실행한다. 이 부분 또한 await 를 사용하기 때문에 slow_function 안의 asyncio.sleep 의 실행이 종료될 때까지 이벤트 루프가 진행되도록 한다.
Multiprocessing을 사용하게 되면 프로세스 생성하여 계산을 수행하게 되는데 이 경우 각 프로세스별로 독립적인 메모리를 사용하기 때문에 프로세스간 데이터를 공유하기 위한 방법이 필요하다. 그 방법 중에 하나로 Shared Memory가 있는데[* https://mingze-gao.com/posts/python-shared-memory-in-multiprocessing/#test-result] 아래 코드는 이 Shared Memory를 테스트한 것이다.
- neovim . . . . 14 matches
설치가 되면 nvim을 실행보자 v0.4.0-dev 버전이 설치 되었음을 확인했다.
.vimrc 파일의 설정을 그대로 사용할 수 있다.
.config 디렉토리를 만들고 init.vim등을 만들어 사용하면 되는데 vim 설정을 그래로 사용하고 싶다면 아래와 같이 할 수 있다.
vi plug-in 관리자로는 [https://github.com/junegunn/vim-plug vim-plug]을 설치했다. 다른 패키지 관리자도 많이 있지만 선택한 이유는 병렬처리가 된다는 점이다 병렬로 설치와 업데이트가 되기 때문에 다른 패키지 관리자들 보다 빠르다는 장점이 있다.
설치는 .config/nvim/autoload/ 아래에 plug.vim 파일을 복사해서 넣어주면 된다.
[:https://vimawesome.com/ Vim Awesome]에서 다양한 vim관련 테마와 plug-in을 찾을 수 있다.
뛰어쓰기 가이드로 코딩을 하거나 할때 사용하면 좋음.
let g:indentguides_tabchar = '|' " tab을 표시하는 문자를 다르게 지정 해줄 수 있습니다.
" vimwiki의 conceallevel 을 끄는 쪽이 좋다
== 새로운 문서 파일을 만들었을 때 기본 형식이 입력되도록 하기 ==
- netstat . . . . 16 matches
netstat -nap : 연결을 기다리는 목록과 프로그램을 보여준다
netstat -nlpt : TCP listening 상태의 포트와 프로그램을 보여준다
(클라이언트가 서버의 SYN을 받아서 세션이 연결된 상태) ||
||FIN_WAIT1 ||클라이언트가 서버에게 연결을 끊고자 요청하는 상태(FIN을 보낸 상태) ||
||FIN_WAIT2 ||서버가 클라이언트로부터 연결 종료 응답을 기다리는 상태
(서버가 클라이언트로부터 최초로 FIN을 받은 후, 클라이언트에게 ACK를 주었을 때) ||
||LAST_ACK ||호스트가 원격지 호스트의 연결 종료 요구 승인을 기다리는 상태
(서버가 클라이언트에게 FIN을 보냈을 때의 상태) ||
||LISTEN ||서버의 데몬이 떠 있어서 클라이언트의 접속 요청을 기다리고 있는 상태 ||
||SYN_SENT ||클라이언트가 서버에게 연결을 요청한 상태 ||
||SYN_RECEIVED ||서버가 클라이언트로부터 접속 요구(SYN)을 받아 클라이언트에게 응답(SYN/ACK)하였지만, 아직 클라이언트에게 확인 메시지(ACK)는 받지 못한 상태 ||
||TIME_WAIT ||연결은 종결되었지만 당분간 소켓을 열어 놓은 상태, 약 1분 정도이며 시간이 지나면 사라짐 ||
- network_QoS_diffserv . . . . 10 matches
QoS 란 Quality Of Service 의 약자로서, 네트워크의 품질을 보장한다는 의미이다. 즉, 실시간 트래픽 (음성, 영상) 등을 처리함에 있어서 많은 트래픽으로 인해 장애가 발생하지 않도록 해주는 것이다.
이 때 트래픽을 우선순위에 따라 차등 처리되게 함으로써 품질을 보장해주게 된다.
비슷한 성질을 가진 트래픽을 하나의 클래스로 묶어 각 클래스에 가중치를 부여하고, 이 가중치에 따라 서비스를 처리하는 방식이다.
1. 트래픽이 들어오면 Classifier 는 비슷한 성질을 가진 트래픽끼리 묶어 클래스로 분류한다. (ACL 과 Class-Map 을 통해 분류)
1. 미터에 의해 측정된 트래픽 플로우를 사전에 약속한 트래픽 특성과 비교하여 결과에 따라 마킹한다. (구분한 클래스에 대해 Policy-Map 을 통해 마킹하여 우선순위 지정한다. IP Precedence, DSCP 가 L3 마킹 종류이다.)
1. 마킹 된 패킷은 컨디셔너를 통해 약속된 트래픽 대역폭에 맞추어 조절한다. (약속된 대역폭을 초과할 경우, Shaping 혹은 Drop 방식으로 처리한다는 의미이다)
- neural_additive_models . . . . 2 matches
NIPS2021에 발표된 '''Neural Additive Models: Interpretable Machine Learning with Neural Nets'''[* https://papers.nips.cc/paper/2021/file/251bd0442dfcc53b5a761e050f8022b8-Paper.pdf]를 읽고 내용을 정리해본다.
찾아보니 국내 이 논문에 대해서 작성된 리뷰가 있다. [* https://themore-dont-know.tistory.com/14?category=837958] 간단한 설명이지만 참고가 될만한 코드[* https://github.com/merchen911/NAM]가 있어서 기록을 남긴다.
- nextcloud_installation . . . . 5 matches
Nextcloud는 홈페이지(https://nextcloud.com/changelog/)에서 최신 버전을 다운 받아서 설치한다.
이렇게 하면 Nextcloud 설치는 끝이다. 여기서 주의해야 할 것은 사용자와 권한이다. __사용자로 새로운 사용자 nextcloud를 추가해서 사용한다는 것을 기억해 둬야한다.__
위에서 설정한 사용자에 맞게 php 설정을 추가해준다.
'''/etc/php/7.3/fpm/pool.d''' 폴더에 '''nextcloud.conf''' 파일을 만들어 준다.
설정을 적용하기 위해서는 아래와 같이 php를 재시작한다.
- nginx_php . . . . 9 matches
NextCloud 설치 과정을 정리한다. 웹서버와 db 관련해서 ''Nginx, PHP-FPM, MariaDB, Let's Encrypt SSL'' 라이브러리를 사용했다.[* 가장 잘 정리된 nextcloud 설치 메뉴얼 <https://pyxispub.uzuki.live/?p=601#8_Nginx>]
웹서버로 Nginx를 사용하려고 한다. 기본적으로 php를 설치하면 Apache 웹 서버가 설치된다. 웹 서버를 설치하지 않으려면 php-fpm을 먼저 설치해줘야 한다. [* 출처: JEUK's blog <https://blog.jeuke.com/55>]
위 명령을 수행하면 nginx 웹서버와 php가 설치 된다.
'''post_max_size''': php를 통해서 만들어지는 게시물의 최대 용량으로 첨부파일을 포함하는 것으로 upload_max_filesize 보다 큰 값을 준다.
'''max_execution_time''': php 스크립트가 실행되는 최대 시간을 의미하며, 용량이 큰 파일을 업로드할 경우를 대비해서 넉넉히 잡아준다.
'''max_input_time''': php 스크립트가 입력을 기다리는 시간
특별히 수정해줘야 할것은 없지만 보안을 위해서 '''server_tokens'''만 '''off'''로 설정해준다.
- nims_cluster_install_guide . . . . 20 matches
소규모 클러스터를 구성해 보는 과정을 기술한다.
Intel OpenCL은 Intel Software[[footnote(http://software.intel.com/en-us/vcsource/tools/opencl-sdk)]]에서 최신 버전을 받아서 설치 할 수 있다.
문서를 작성하고 있는 현재 2013 버전을 받을 수 있다.
Intel은 리눅스 버전으로는 RPM버전으로 배포를 한다. RPM 버전을 우분투에 설치하기 위해서는 deb형태로 변경해 줘야 한다.
Intel OpenCL를 설치하고 실행 시켜 보면 라이브러리를 찾을 수 없다는 에러를 볼 수 있다. 이것은 '''libOpenCL.so'''가 /usr/lib64에만 설치 되기 때문이다.
문서를 작성하고 있는 현재 v2.8 버전을 받을 수 있다.
AMD-APP-SDK-v2.8-lnx64.tgz 압축을 풀면 아래 파일들이 나온다.
그래픽 카드 드라이버[[footnote(https://help.ubuntu.com/community/BinaryDriverHowto/ATI 우분투에 ATI 그래픽 카드 드라이버 설치하는 법)]]를 설치해줘야 사용 할 수 있다. 그래픽 카드 드라이버는 System Settings -> Additional Drivers에 보면 AIT 그래픽 카드를 볼 수 있는데 선택하고 Activate 버튼을 누르면 알아서 설치 된다.
nVidia OpenCL은 nVidia Developer Zone[[footnote(https://developer.nvidia.com/cuda-downloads)]]에서 최신 CUDA Toolkit을 받아서 설치 할 수 있다.
문서를 작성하고 있는 현재 v5.0 버전을 받을 수 있다.
알테라 OpenCL을 사용하기 위해서는 알테라 HDL 빌더인 Quartus[[footnote(https://www.altera.com/download/dnl-index.jsp)]] 를 설치해줘야 한다.
네트워크를 통해서 파일을 받아와서 설치하는 방식으로 설치에 상당한 시간이 걸린다. (퇴근하기 전에 설치를 하는 것이 좋다. 너무 오래 걸림)
1. make mrproper 로 기본 작업을 한다. (한번이상 컴파일했다면 안해도된다.)
1. make install 로 기본커널을 설치한다.(LILO에는 기본적으로 들어갈 수 있다.)
1. make modules 로 모듈을 컴파일한다.
1. make modules_install 로 모듈을 설치한다.
1. svn을 사용하기 위한 클라이언트를 설치 한다.
- nims_rule . . . . 119 matches
제 1조 (목적 )이 규정은 국가수리과학연구소(이하 “연구소”라 한다)에서 시행하는 소규의 제정 및 개폐에 관한 사항을 규정하여 연구소 운영의 합리화를 기함을
① 이 규정에서 “소규”라 함은 연구소에서 계속적 ,반복적 효과를 가진 규범적 문서로서 규정 ,세칙 및 지침을 말한다.
② 세칙은 규정의 하위 소규이며 ,지침은 세칙에서 위임한 세부사항인 사무기준과 작업표준에 관한 사항을 명시하는 세칙의 하위 규정이다.
제 4조 (규정 )규정은 연구소의 기본조직 또는 중요업무의 운영에 관한 사항을 정 하는 문서를 말한다.
제 5조 (세칙 )세칙은 규정의 시행 또는 소규의 유지관리를 위하여 구체적이며 개별적인 사항을 정한 문서로서 다음 각 호의 사항을 내용으로 정한 것을 말한다.
제 6조 (지침)세칙에서 위임한 세부사항,사무기준 또는 작업표준을 정한 것을 말한다.
제 7조 (소규화)각 부서는 소관 업무수행상의 절차 및 기준을 정하여 이 규정이 정하는 바에 따라 가능한 한 소규화하여야 한다.
② 지침은 주무부서에서 입안하여 주관부서장과의 협의를 거쳐 소장의 승인을 받아
③ 위원회에 간사 1인을 두되 ,간사는 주관부서장이 된다.(개정 2013.7.16)
제 10조의 3(소규심의위원회 의결정족수)위원회는 재적위원 과반수의 찬성으로 의결한다.다만,가부동수인 경우에는 위원장이 결정권을 가진다.(개정 2013.7.16)
제 10조의 4(소규심의위원회 출석요구)위원회는 소규안의 심의에 관하여 필요한 때에는 관계직원을 회의에 참석하게 하여 의견과 설명을 청취할 수 있다.(개정 2013.7.16)
제 10조의 5(소규심의위원회 서면결의 )위원장은 경미한 안건에 대하여는 위원회의 의결을 서면결의로 갈음할 수 있다.이 경우 다음 위원회에 그 결과를 보고해야한다.(개정 2013.7.16)
① 주관부서는 소규의 제정,개정,폐지에 대한 제정권자의 승인 또는 결재를 필한 즉시 전자문서 및 전자게시판을 통하여 전 직원에게 공지한다.
제 1 조 (목적) 이 규정은 기초과학연구원 부설기관운영규정 제8조(직제)에 의거 국가수리과학연구소(이하 “연구소”라 한다)의 조직 및 직능에 관한 대강을 정하여 효율적인 업무의 수행을 기함을 목적으로 한다.
제 4 조 (소장) 소장은 연구소를 대표하며, 업무를 통할하고 그 운영에 대한 책임을 진다.
① 부설기관운영규정 제 9조에 의거 연구소의 운영 및 중장기 발전계획 등 중요사항에 대한 토의, 결정 또는 소장의 자문에 응하게 하기 위하여 학계, 연구계, 산업계 등의 전문가로 구성하는 운영위원회 등을 둘 수 있다.
제 6 조 (조직의 구분) 연구소의 조직은 주요조직과 하부조직으로 구분하고, 주요조직은 설립목적과 주요기능 실현을 위한 최소 조직으로서 제7조에 명시한 조직을 말하며, 하부조직은 주요조직의 원활한 기능수행을 위해 주요조직 밑에 두는 조직을 말한다.
① 소장 밑에 산업수학연구본부장(이하 “연구본부장”이라 한다), 경영관리부장, 정책평가실장을 두어 소장의 연구업무와 경영업무를 보좌하게 한다. (개정 2016.1.4., 2017.1.23., 2018.3.8.)
⑥ 정책평가실은 정책, 평가, 대외협력 업무 수행 등을 통해 소장 직무의 효율성 제고를 담당한다. (신설 2018.3.8.)
제 8 조 (하부조직) 연구부, 센터, 실에 분야별 또는 기능별로 하위 센터, 팀 또는 전담을 운영할 수 있다. (개정 2018.3.8.)
- nips2016 . . . . 8 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 . . . . 3 matches
[:weight_training 운동을 하자]
[:wireshark 네트워크 패킷을 캡쳐해주는 프로그램 WireShark]
[:linux_ubuntu_rpm_deb_conversion RPM을 deb로 변환하기]
- notebook_lenovo_e145 . . . . 18 matches
Bootable USB[[footnote(http://www.pendrivelinux.com/)]]을 만들어서 설치 하는 과정을 설명한다.
USB 무선랜카드 설치하기 정식 버전을 제공하고 있지는 않은데 같은 칩셋으로 랜카드 드라이버로 동작을 하는 것을 확인 했다. [* https://github.com/abperiasamy/rtl8812AU_8821AU_linux/issues/105]
받은 파일을 소스 컴파일하고 USB 랜카드를 연결하면 바로 사용할 수 있다.
그래도 평소에 가장 편리하게 자주 사용하게 되는 단축키 Best 10을 올려봅니다.
별도의 설정을 해야하지만,설정해서라도 사용하게되는 필수 단축키죠
별도의 단축키 설정은 아래글을 참고하세요
주의 하세요,아무 경고도 없이 모든 프로그램을 종료하고 로그아웃시킵니다.
게임 화면,오피스화면,인터넷 화면등등 쓰임에 맞게 작업공간을 따로 열어서 사용할때 쓰입니다.
라디오를 듣거나, 음악을 들으며 자려고 할때, 모니터를 끄는것 보다는 주로 사용하게 되더군요.
지금 실행중인 프로그램들이 많거나 다른프로그램 실행중에 일일이 창을 찾아가기 번거롭죠?
그럴때 실행중인 프로그램들을 바로 찾아갑니다.(윈도우도 같은 단축키를 사용합니다)
터미널을 실행하지 않고 프로그램을 바로 실행할때 사용합니다.
실행중인 프로그램을 바로 닫아버립니다.
복사한 파일이나,경로를 터미널에서 붙여 넣을때 사용합니다.
- notebook_msi_x200 . . . . 1 match
/etc/apt/sources.list에 다음줄을 추가한다
- notion_api . . . . 2 matches
Notion을 사용하다보면 자동화와 약간의 프로그래밍이 필요하다는 생각이 들어서 찾아보니 비공식 API이지만 notion-py[* https://butter-shower.tistory.com/189]라는 python api가 있음을 알았다.
- numerical_analysis_note . . . . 6 matches
위 결과는 10년 주기의 인구조사 결과이다. 이 결과에서 1975년도의 인구수와 또는 2020년의 인구를 예측할 수 있을까?
이런 물음에 의미 있는 답을 내어주기 위한 방법을 보간법(Interpolation)이라고 한다.
구간 $[a,b]$ 에 연속인 함수 $f$ 가 정의 되어 있다고 하자. 양의 정수 $\epsilon$ 가 $(\epsilon > 0)$ 주어지면, 모든 $x \in [a,b]$ 에 대하여 아래의 성질을 만족하는 다항식 $P(x)$ 가 존재한다.
다항식(polynomials)과 다항식의 미분, 적분을 구하기 쉽기 때문에 연속 함수의 근사에 다항식을 사용하는 이유로 꼽고 있다.
- odroid_index . . . . 22 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 카드에 쓰기가 안 되는 경우가 있기 때문이라고 함.
맥에서 dd 명령을 수행하면 옵션에서 에러가 발생하는데 bs=1m 옵셥만 넣어주면 된다. M, m 대소문자 구별한다.
장치 확인은 mac 기준으로 ''diskutil list'' 수행하면 현재 마운트 되어 있는 장치를 확인 할 수 있다. 마운트 된 장치를 '''diskutil unmountdisk /dev/diskX''' 명령으로 언마운트 하고 위 명령을 수행한다.
아파치보다 좋은 성능을 보인다고 해서 설치 시도해보려고 한다.
a2enmod rewrite는 아파치를 설치하면 생기는데 사용가능한 모듈을 연결해주는 역할을 한다.
exfat를 사용하기 위해서는 파일시스템을 설치해줘야 한다.
실제 물리적으로 잘 연결 되어 있는지 확인하기 위해서는 '''fdisk -l''' 명령을 사용해서 장치를 확인하자.
이제 부터 논리적인 파티션을 나누고 마운트할 파일시스템을 입히는 일을 해야 한다.
먼저 파티션을 나누는 일은 fdisk로 가능하다.
파티션을 나눴다고 바로 쓸수 있는 것은 아니다. 이 파티션을 사용할 파일 시스템으로 포멧팅을 해줘야 한다.
위와 같이 생성된 파티션을 포멧해고 마운트하면 끝.
토펜트 파일을 받을 수 있도록 설정한다.
- omicron_installation . . . . 1 match
>> make 최초 컴파일시 예러 발생 아래 파일을 제거하고 컴파일해야 한다.
- opencl_atomic_cmpxchg . . . . 4 matches
포인터 변수 p에 있는 값을 비교해서 업데이트하는 함수로 모든 커널 엘리먼트 중에서 특정 값만을 취하거나 할때 사용하면 용이 하다.
64bit 데이터를 처리하기 위해서는 확장기능을 사용해야 한다.
이 확장을 통해서 사용할 수 있는 함수는 아래 표와 같다.
- opencl_dot_product . . . . 6 matches
두 벡터를 서로 곱하고 그 합을 구하는 것을 벡터의 내적이라고 하는데 이 과정에서 가장 중요한 것이 합을 구하는 파트다.(Reduction)
곱을 하는 과정은 서로 독립이라서 병렬처리가 힘들지 않은데 Summation 과정은 병렬화 알고리즘이 다소 복잡할 수 있다.
이곳에서는 OpenCL을 이용한 내적의 병렬화 과정을 알아보도록 하자.
- opencl_guide . . . . 68 matches
하나의 호스트와 한개 이상의 OpenCL 다바이스로 구성된 OpenCL 플랫폼. 각 OpenCL 디바이스들은 한개 이상의 계산 유닛을 가지고 있고, 각 계산 유닛은 한개 이상의 PE(Processing Element)를 가지고 있다.
OpenCL은 Host 프로그램과 Kernel 프로그램으로 나뉠 수 있는데 Kernel 프로그램은 Opencl 디바이스에서 동작될 프로그램이고 Host 프로그램은 Kernel 프로그램의 생성 및 실행을 포함하는 Host 프로그램이다. Kernel에서 실행 될 kernel 프로그램의 인스턴스 하나 하나를 '''작업 아이템'''(Work Item)이라고 한다.
이런 작업 아이템들의 집합을 '''작업 그룹'''이라고 하는데 작업 아이템과 작업 그룹에는 Index 번호가 부여 된다. 작업 아이템에는 총 3개의 번호가 부여 되는데 다음과 같다.
Context가 정의 된 후 OpenCL 디바이스마다 하나씩 연결 된다. 호스트는 명령을 Command Queue에 담고, 명령은 연관된 디바이스에서 실행 되기 위해 스케줄링 된다.
OpenCL은 세가지 종류의 명령을 지원한다.
* '''커널 실행 명령''' : OpenCL 다바이스의 PE에서 커널을 실행.
* '''메모리 명령''' : 호스트와 다른 메모리 객체 사이에서의 데이터 전송을 발생시키고 메모리 객체들 사이에서 데이터를 이동시키며, 호스트 주소 공간에 메모리 객체를 매핑시키거나 매핑을 해제시킴.
* '''동기 명령''' : 명령들이 실행되는 순서에 제한을 가함.
'''이미지 객체'''는 이미지만을 담아야 하는 제약이 있다. 이지미를 저장하는 형식은 특정 OpenCL 디바이스마다 서로 다르게 최적화 될 수 있다. (이해하는데 시간이 필요할 듯)
OpenCL 메모리 모델은 5가지 서로 다른 메모리 영역을 정의 한다.
OpenCL에서의 프로그래밍 모델은 데이터 병렬성과 태스크 병렬성 모델을 염두해 두고 만들어 졌다. 하지만 프로그래밍 모델은 유연하기 때문에 혼합되거나 다른 프로그래밍 모델을 생각해 볼 수 있다.
데이터 병렬성 프로그램이라고 하면 SIMD(Single Instruction Multiple Data)나 SPMD(Single Program Multiple Data)[[footnote(Matton의 ''Patterns for Parallel Programming''을 참고 하길 바람.)]] 모델을 생각해 볼 수 있다.
명령어 메모리의 대역폭이 제한되어 있거나 혹은 PE들이 벡터 유닛에 매핑되어 있을 경우 SIMD 모델이 훨씬 더 효율적이다. 따라서 프로그래머가 두 모델을 이해하고 언제 어떤 모델을 사용해야 할지 이해하는 것이 매우 중요하다. (결국은 하드웨어(Processor)에 대한 이해가 필요하다는 것이다.)
OpenCL 프로그램에서 엄격하게 SIMD인 경우가 한 가지 있다. 벡터 명령에 대한 처리 이다. 프로그래머가 명시적으로 PE에 있는 벡터 유닛을 사용하게 될 때는 분기문을 포함할 수 없다.
태스크 병렬성 프로그래밍 모델에서는 다른 커널에서 사용하는 NDRange와는 상관없이 단일 작업 아이템으로 실행 되는 커널을 정의 한다.
Intel 사이트[[footnote(http://software.intel.com/en-us/vcsource/tools/opencl-sdk)]] 에서 최신 SDK를 받을 수 있다.
''' rpm을 deb로 변환 하기'''
그래픽 카드 드라이버는 System Settings -> Additional Drivers에 보면 AIT 그래픽 카드를 볼 수 있는데 선택하고 Activate 버튼을 누르면 알아서 설치 된다.
문서를 작성하고 있는 현재 v2.8 버전을 받을 수 있다.
AMD-APP-SDK-v2.8-lnx64.tgz 압축을 풀면 아래 파일들이 나온다.
- opencl_reqd_work_group_size . . . . 1 match
를 이용해서 kernel 컴파일러에게 work group size 정보를 미리 알려주게 되면 워크 그룹 사이즈에 맞게 최적화 된 커널 이미지를 얻을 수 있다.
- opencl_subdevice . . . . 1 match
멀티 코어 cpu를 사용한 병렬 컴퓨팅 방법으로 OpenCL을 사용할 수 있는데
- opencv_c_c++ . . . . 9 matches
'''capture.set(option, n)'''과 같이 카메라 객체에 속성을 설정할 수 있음.
'''if cv2.waitKey(1) > 0: break''' 무한 루프를 탈출하기 위한 장치로 키 입력을 받는 것으로 했다.
waitKey(time) 설정한 시간 만큼 키 입력을 기다리라는 명령으로 0으로 설정하면 무한한 시간을 기다리기 때문에 프레임이 넘어가지 않음.
'''cv2.destroyAllWindows()''' 열려 있는 모든 윈도우창을 닫음.
로컬 영역에서 대비 정보를 이용하여 표현하는 특징으로 지역적으로만 특징을 추출하기 때문에 전체적으로 조도 변화에 둔감하여 광원 변화에도 일정한 결과를 내어준다.
각 픽셀의 밝기가 위 그림과 같다고 하면 중심 픽셀의 밝기보다 주변의 픽셀이 밝으면 '1' 그렇지 않으면 '0'이라고 하면 중심 픽셀에 대한 feature로 8bit 정보를 얻을 수 있다. 이 8bit 정보는 사용하는 것이 CT이고 알고리즘을 살짝 수정해서 9개의 픽셀의 평균 밝기를 계산하고 그 평균보다 밝으면 '1' 그렇지 않으면 '0'을 할당하여 중심 픽셀에 대한 정보를 포함해서 9bit 정보를 사용하는 것이 MCT이다.
- osx_utility . . . . 1 match
아래 소스를 컴파일하기 위해서는 컨맨드라인 명령어 셋을 설치해야 한다.
- p_value . . . . 51 matches
미국 통계학회(ASA)는 {통계적 유의성과 P값에 대한 성명서}를 통해, "확실성을 추구하다가 발을 헛딛는 우(愚)를 범하지 말라"고 권고 했다.[* http://www.ibric.org/myboard/read.php?Board=news&id=270293]
'어떤 가설이 참일 때 하나의 결과를 관찰할 확률'은 '어떤 결과가 관찰되었을 때 하나의 가설이 참일 확률'과 다르다.
P값(녹색 부분)이란 ‘영가설이 참이라고 가정할 때, 관찰된(또는 그보다 더 극단적인) 결과가 일어날 확률’을 말한다.
P값을 판단척도로 사용하면, 조건을 뒤바꾼 오류(transposed conditional fallacy)라는 지독한 논리적 잘못을 범하게 된다. / © Wikipedia
미국 통계학회(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값을 좀 더 잘 이해한다고 해서, 사람들이 통계학을 이용하여 불가능한 수준의 신뢰감을 얻으려는 충동에서 벗어나지는 않을 것이다"라고 콜럼비아 대학교의 앤드루 겔먼 박사(통계학)는 경고했다. "사람들은 실제로 얻을 수 없는 것을 원하는 경향이 있다. 그것은 바로 확실성이다"라고 그는 덧붙였다.
마침내 미국통계학회가 「통계적 유의성과 P값에 대한 성명서」을 발표하고 ‘P-값의 적절한 사용과 해석에 관한 6대 원칙’을 공개했다.
3. 과학적 결론이나 사업이나 정책적 결정이 'P-값이 특정 문턱값을 넘어서는지'에 의해서만 내려져서는 안 된다.
4. 적절한 추론을 위해 충분한 보고와 투명성이 필요하다.
- parallel_processor_flynn . . . . 2 matches
하나의 명령 스트림이 하나의 데이터 스트림을 처리하는 병렬성이 없는 순차적인 시스템, 싱글코어 프로세서 하나가 탑재된 PC
클러스터 시스템이나 SMP 시스템 등 병령 컴퓨팅을 실행하기 위한 하드웨어 아키텍처 대부분이 MIMD에 속한다.
- parallel_programming_ex . . . . 10 matches
병렬화 할 예제로는 메트릭스 곱을 사용한다.
= OpenCL을 사용한 병렬화 =
앞으로 설명할 모든 코드를 아래에서 받을 수 있다.
각각의 행렬의 곱을 얻는 과정은 독립적이다. 이 독립적인 과정을 하나의 Work Item으로 정의해서 병렬화 해보자.
계산하려는 메트릭스 M_C의 사이즈만큰 work item을 생성해서 처리하는 방식
== 1차원 배열 행태로 Work Item을 정의 하자! ==
컨테스트 스위칭의 오버헤드를 고려할때 하나의 Work Item에 많은 일을 할당하는 것이 유리하다.
하나의 Work Item이 행렬의 곱의 한 라인을 계산하도록 수정한다.
백터 연산은 모드 계산 디바이스에서 지원하는 기능은 아니다. 하지만 계산 디바이스가 지원한다면 좀 더 좋은 성능을 보장할 수 있다.
- pci_express_spec . . . . 10 matches
LTR 메카리즘은 Endpoint 가 서비스 지연 요구사항을 메모리 읽기와 쓰기를 위해서 Root Complex에게 보고 할 수 있게 한다. 그래서, 메인 메모리, RC internal interconnect과 snoop 자원과 같은 전원 관리 정책은 Endpoint 서비스 유구사항을 고려하겠끔 구현 되어질 수 있다.
LTP 메카리즘은 링크 전원 관리 시스템이나 스위치 내부 전원 관리 시스템에 직접적인 영향을 주지는 않는다. 비록 간접적인 효과를 주는 것이 가능하더라도
Root Complex는 요구된 서비스 지연을 honor 하는 것을 요구하지 않는다. 그러나 최악의 서비스 지연에 대해서는 LTR 메카리즘에서 지사하고 있는 지연을 초과하지 않을 것을 강력히 권장한다.
LTR 지원은 쳅터7에 기숙 된 것 처럼 보고와 컨트롤 레지스터들에 의해서 가능하다. Root Complex와 모든 intermediate Switch들이 LTR을 지원하게 설정 되어 있지 않다면 소프트웨어는 LTR을 enable하면 안 된다.
- pci_interface_review . . . . 1 match
|| 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 . . . . 18 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이 된다. 이렇게 수정하면 하루에 두 명 이상이 방문하는 것도 표현 가능하다.
이항 분포는 단위 시간당 사건이 한 번 일어날 확률에 기대고 있기 때문에, 앞서 언급한 것처럼 단위 사간을 최대한 잘게 쪼개면 어찌 어찌 될거 같다.
푸아송 분포 확률 질량 함수 앞 뒤로 붙은 극한값 (가)와 (나)에 관해 살짝 설명을 덧붙여보자. 먼저 (가)는 아래와 같다.
- poisson_process . . . . 6 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 . . . . 4 matches
cmake.. 를 실행하면 아래와 같이 FFMPEG관련 경로가 잘 못 설정 되는 것을 알 수 있다.
이부분을 바로 설정해주도록 CMakeList.txt파일을 수정해야 한다.
와 같이 해주면 라이브러리 경로가 설정 되는데 그래도 원하는 경로로 설정이 안 되면 CMakeList.txt파일을 수정 하자.
- program_language_c . . . . 8 matches
'''const'''는 상수를 의미하며 값이 변하지 않음을 주의해야 한다.
|| %g ||%e와 %f 중 더 짦은 표현을 사용한다. ||
|| %G ||%E와 %f 중 더 짦은 표현을 사용한다. ||
같은 명령을 반복 수행하기 위해서 쓰임.
각각의 프로그램은 독립적인 가상 메모리 공간을 갖는다. 위 그림은 메모리 공간을 도식화한 것이다.
연속된 메모리 공간을 할당 받는다 컴파일시점에 사이즈가 결정 된다.
메모리의 주소공간을 지칭하는 데이터를 저장하는 변수
- programming_atod . . . . 2 matches
String형을 Double형으로 바꾸 주는 함수
파일로 부터 받아 들이 문자열을 double형 배열에 저장하는 프로그램
- programming_cli_ex . . . . 1 match
외부로 부터 명령을 입력 받아 작동하는 프로그램의 예시
- programming_clock_gettime . . . . 14 matches
gettimeofday는 유닉스, 리눅스 시스템 프로그래밍에서 시간을 구할 때 쓰던 함수이다. 마이크로초(백만분의 1초)단위로 구할 수 있는 기능을 가지고 있어서 많이 사용되는 함수이다.
물론 하위 호환성을 위해서 gettimeofday 함수는 계속 제공될 것이다. 하지만 기본 시스템 라이브러리에서는 제거되고, 구식 라이브러리를 따로 포함해야 사용할 수 있게 될지도 모르기 때문에 차후에는 gettimeofday는 쓰지 않는 편이 좋다. 참고로 지금까지의 표준안의 행보로 봤을 때 obsolescent 함수로 지정되면 약 10여년의 유예를 거치는 것 같다. 따라서 지금 당장부터 쓰지 말아야 하는 것은 아니다.
대신에 새로운 함수인 clock_gettime을 사용하면 된다.
gettimeofday는 1988년도에 SVR4에서 표준에 지정되어 20여년을 넘게 사용되던 함수이다. 아직도 수많은 프로그래밍 서적이나 소스 코드의 예제에서 사용되고 있다. 실제로 최근에 개발되던 몇몇 실무 코드 조차 gettimeofday를 사용하고 있는 실정이다.
또한 clock_gettime은 멀티코어 CPU 시대에 걸맞게 쓰레드 안전(thread safety)을 만족하고 있다.
여기서 CLOCK_REALTIME을 사용하면 실제 시간을 구하므로 gettimeofday의 기능과 같은 기능을 제공한다. 이제 현재 시각을 버퍼에 저장하는 간단한 예제 코드를 살펴보자.
main 함수는 생략했으니 적당히 붙여서 코딩하면 될 것이다. 화면에 출력되는 것을 보고 싶다면 printf로 buf 문자열을 출력하면 된다.
/* 리얼타임 시계로부터 현재 시간을 구한다. */
- programming_cpp_cout_cin . . . . 5 matches
C++에서는 '''iostream'''을 include해서 standard 입출력을 수행한다.
= Km와 Mile을 환산해주는 프로그램 예제 =
cout, cin 함수는 std 클래스의 내장 함수이다. 위의 네임 스페이스 명령을 쓰지 않았다면 매번 cout(), cin()함수를 쓰기 위해서는
std::cout(), std::cin()과 같이 클래스 이름을 명시해줘야 한다.
- programming_cpp_list . . . . 1 match
C++에 대한 기본적인 문법과 관련 내용을 설명하는 페이지를 작성 중입니다.
- programming_cpp_overloading . . . . 4 matches
연산자라고 하면 흔히 +, -, *, /등을 말한다. 그런데 이런 연산자들은 이미 정의 되어 있는 자료형(기본 자료형)에 대해서만 연산을 해준다. 근데 우리가 세로운 자료형을 정의 했다면??
그 자료형에 맞는 연산자 수행을 정의 해줘야 한다는 것이다.
- programming_cpp_template . . . . 9 matches
탬플릿은 메크로와 비슷한 성격을 갖고 있는데 그것은 컴파일시에 자료형이 결정이 되고 구문이 치환이 된다는 것이다.
템플릿 구문이 들어가면서 보기 생소한 코드라서 그렇지 템플릿 구문을 제거 하고 나면 극히 평범한 코드가 된다.
= Template을 사용하는 경우 =
와 같은 함수가 있다고 합시다. 이 함수는 int형 변수를 2개 받아서 서로 값을 바꿔 주는 역할을 합니다.
그런데 다른 자료형도 이와 같은 작업을 해야 한다고 했을때 어떻게 할까요?
위 예제 코드는 좌표를 표현하기 위해서 간단하게 Point 클래스를 정의하고 연산자 오버로딩을 한 것이다.
다음은 어려 자료형을 표현 할 수 있도록 템플릿으로 구성한 것이다.
- programming_f_function . . . . 16 matches
시스템 함수인 open(), read(), write(), 등의 함수들과 비슷한 일을 해주는 것들인데.. 뭔가가 다르다.
|| "w+" ||읽기와 쓰기용으로 열기 파일이 없으면 생성하고, 파일이 있다면 내용을 지우고 기록한다. ||
|| "a+" ||읽기와 쓰기용으로 열기 파일이 없으면 생성하고, 파일이 있다면 파일 끝에 내용을 추가한다. ||
하지만, 보통 C코드에서 '\n'는 줄을 바꾸고 맨 처음으로 이동하는 것을 볼 수 있다.
'''참고''' : 텍스트 모드와 2진 모드의 차이는 논리적인 파일의 끝을 표현하는 방법의 차이도 있다. 더블어 유닉스 계열의 운영체제는 2진 모드와 텍스트 모드를 구분 짓지 않는다.
''puts 함수는 문자열을 출력하고 나서 줄을 자동을 바꿔 주지만, fputs 함수는 문자열 출력 후 줄을 자동으로 바꿔주지 않는다.''
{{{{color: rgb(1, 1, 1); font-size: 16px; font-weight: bold;} 리턴 값을 참조하는 방법 }}}
파일의 끝에서 더 이상 읽을 것이 없을 경우 리턴하는 값을 확인해서 파일을 끝을 확인하는데 각각의 함수에 따라서 리턴하는 값이 다르다.
- programming_gettimeofday . . . . 2 matches
때때로 코드를 작성하고 그 코드의 수행 시간을 측정해야 할 경우가 있다.
아래 예제는 '''gettimeofday()'''함수를 이용해서 시간을 얻어 오는 예제 코드 이다.
- programming_index . . . . 1 match
* [:programming_atod 문자열을 Double형으로 바꿔주는 함수]
- programming_library . . . . 81 matches
라이브러리란 특정한 코드(함수 혹은 클래스)를 포함하고 있는 컴파일된 파일이다. 이러한 라이브러리를 만드는 이유는 자주 사용되는 기능을 main 함수에서 분리시켜 놓음으로써, 프로그램을 유지, 디버깅을 쉽게하고 컴파일 시간을 좀 더 빠르게 할수 있기 때문이다.
공유 라이브러리는 프로그램이 시작될 때 적재 된다. 만약 하나의 프로그램이 실행되어서 공유 라이브러리를 사용했다면, 그 뒤에 공유 라이브러리를 사용하는 모든 프로그램은 자동적으로 만들어져 있는 공유 라이브러리를 사용하게 도니다. 그럼으로써 우리는 좀 더 유연하게 프로그램을 만들 수 있다.
공유 라이브러리가 프로그램이 시작 될때 적재되는 반면 이것을 프로그램 시작 중 특정한 때에 적재되는 라이브러리이다. 플러그인 모듈등을 구현할때 적합하다. 설정 파일등에 읽어들인 라이브러리를 등록시키고 원하는 라이브러리를 실행 시키게 하는 등의 매우 유연하게 작동하는 프로그램을 만들고자 할때 유용하다.
== 왜 정적 라이브러리의 사용을 지양하는 가 ==
예전에 libz 라는 라이브러리에 보안 문제가 생겨서 한창 시끄러웠던적이 있다. libz 라이브러리는 각종 서버프로그램에 매우 널리 사용되는 라이브러리였는데, 실제 문제가 되었던 이유는 많은 libz를 사용하는 프로그램들이 "정적 라이브러리" 형식으로 라이브러리를 사용했기 때문에, 버그픽스(bug fix)를 위해서는 문제가 되는libz를 사용하는 프로그램들을 다시 컴파일 시켜야 했기 때문이다. 한마리로 버그 픽스 자체가 어려웠던게 큰 문제였다. 도대체 이 프로그램이 libz를 사용하고 있는지 그렇지 않은지 알길이 없었을 뿐더러 그 많은 프로그램을 다시 컴파일 한단는 것이 힘들었다.
만약 libz를 정적으로 사용하지 않고 "공유 라이브러리" 형태로 사용했다면 bug fix가 훨씬 쉬웠을 것이다. 왜냐면 libz 공유라이브러리는 하나만 있을 것이므로 이것만 업데이트 시켜주면 되기 때문이다.
하나는 덧셈을 할 함수로 "ysum" 또 하나는 뺄셈을 위한 함수로 "ydiff" 으로 할 것이다.
오브젝트를 만든 다음에 ar 이라는 명령을 이용해서 '''라이브러리 아카이브'''를 만들면 된다.
ar 명령의 몇가지 옵션을 이해해야 한다. 위의 예는 ar을 이용해서 libmysum.a라는 라이브러리 아카이브를 만드는 것이다.
'c' 옵션은 아카이브가 없을 경우 새로이 생성하라는 옵션이다.
// 100+20, 100-20 과 같이 연산자와 피연산자 사이에 공백을 두지 않아야 한다.
위의 프로그램을 컴파일 하기 위해서는 라이브러리의 위치와 어떤 라이브러리를 사용할 것인지를 컴파일러한테 알려줘야 한다.
'-l' 옵션은 사용할 라이브러리를 지정한다. '-l' 옵션 뒤에 사용할 라이브러리의 이름을 적어주게 되는데 'lib'와 확장자 '.a'를 제외한 나머지 이름을 적어주면 된다.
우선 mysum.c를 -fPIC 옵션을 주어서 오브젝트 파일을 만들고, (-fpic 옵션을 줄수도 있는데 이경우 동작하지 않을 수 있으며 보다 작은 사이즈의 바이너리를 생성한다.)
'''-W1''' : 옵션 뒤에 오는 옵션들을 링크에게 gcc를 거치지 ㅇ낳고 바로 전달하라는 옵션
'''-soname''' : 링커인 collect2에 전달 되는 옵션으로 공유라이브러리의 soname을 정하는 옵션, 실행시 참조할 파일 이름을 지정한다.
만들어진 라이브러리를 적당한 위치로 옮기고 ln을 이용해서 컴파일러에서 인식할 수 있는 이름으로 심볼릭 링크를 걸어준다.
''컴파일시 참조하는 파일과 실행시 참조하는 파일이 다름을 알 수 있다.''[[footnote(유닉스·리눅스 프로그래밍 필수 유틸리티 3-4 ''라이브러리를 만들어보자'' 中)]]
공유 라이브러리는 실행시에 라이브러리를 적재함으로 프로그램을 배포할때는 공유라이브러리도 함께 배포되어야 한다.
그렇지 않을 경우 다음과 같이 공유 라이브러리를 찾을 수 없다는 메시지를 출력하면서 실행이 되지 않는다.
- programming_mpi . . . . 15 matches
* '''buf''' : 주고 받을 데이터
* '''count''' : 주고 받을 데이터의 사이즈
* '''datatype''' : 주고 받을 데이터의 타입
* '''buf''' : 주고 받을 데이터
* '''count''' : 주고 받을 데이터의 사이즈
* '''datatype''' : 주고 받을 데이터의 타입
위 코드를 컴파일하고 실행하면 다음과 같은 결과를 얻을 수 있다.
아래와 같이 비동기 방식으로 코딩을 하게 되면 결과가 조금 달라진다.
Rank 3의 결과를 마지막에 받기 때문에 Rank3의 종료가 Rank 0 이후로 넘어가는 모습을 확인할 수 있다.
※ MPI_Wait()함수는 통신의 종료를 확인할 뿐만 아니라 통신에 사용한 버퍼를 free 시키는 함수 이기 때문에 비동기 통신 함수와 짝을 이루워야 한다. 짝이 안 맞으면 메모리 누수가 발생함.
MPI_Send는 버퍼 통신을 하게 되는데 보내려는 데이터의 사이즈가 시스템 버퍼 보다 작을 경우 Block 되지 않고 넘어간다.
이 전까지 다룬 내용은 점대점 통신으로 특정 rank간의 통신을 다루웠다.
지금부터는 점대다 통신을 알아보자
모든 rank에 source를 지정한 OP에 따라서 합하고나 곱해서 target에 모으는 행동을 한다.
- programming_open_flag . . . . 9 matches
이 옵션은 fcntl.h에 정의 되어 있기 때문에 헤더 파일을 추가 해줘야 한다.
* '''O_APPEND''' : 파일 오프셋을 파일의 끝으로 이동, 끝부분에 추가할 수 있게 해줌
* '''O_TRUNC''' : 파일을 쓰기 위해서, 열은 파일의 내용을 지워서 길이가 0이 되도록 만든다.
* '''O_CREAT''' : 명시된 파일이 존재하지 않으면 파일을 만든다.
이 플래그를 넣으려면 반듯이 다음 아규먼트로 원하는 권한을 명시해야한다.
혹시라도 있을지 모르는 파일 덮어 쓰기를 방지하고 싶다면 O_CTREAT | O_EXCL
조합을 사용할 것을 추천한다. 이경우에 파일이 존재하면 에러를 리턴한다.
- programming_openmp . . . . 41 matches
요즘 들어 멀티코어라는 말을 흔하게 듣게 되는데 컴퓨터뿐만 아니라 휴대폰 및 모발일 기기에도 듀얼 코어니 쿼드 코어니 하는 말을 한다. 모든 기기의 멀티코어 시대가 도래한 것이다. 싱글 코어로 계산량을 늘리는데 한계(?)에 부딪친 CPU 제조사들은 싱글 코어를 여러게 붙인 멀티코어 제품을 속속 내놓고 있다.
이들 라이브러리를 사용하면 더욱 쉽게 멀티 스레드를 할용한 프로그램을 만들 수 있다.
기본적인 병렬 프로그래밍 이슈들에 대해 알아보고 OpenMP를 사용해서 병렬 프로그램을 만들어 보도록 하겠다.
* 하나의 자원을 놓고 여러개의 프로세스가 접근할는 경우 발생 된다.
* 참조만 할 경우에는 크게 상관 없지만 자원의 값을 업데이트 하는 경우에는 접근하는 프로세스의 순서에 따라서 결과를 예측할 수 없게 된다.
1. sum에 있는 값을 읽어 오고
1. 읽어온 sum의 값과 val을 더한다.
1. 더해진 값으로 sum을 업데이트 한다.
여러 쓰래드가 동시에 위의 코드를 진입했을 경우 내부에서는 여러 단계로 구분 되는데 각각의 경우가 혼합 되면서 예측할 수 없는 결과를 만들어 낸다.
포크와 나이프가 사람 수 만큼 충분하지 않을 경우를 생각해 보자.
이렇게 자원은 쥐고 서로 놓지 않을 경우 스테이크를 먹지 못하고 굶주린 상태(Starvation)이 발생하게 된다.
이런 경우를 피하기 위해서는 자신이 작업을 진행하기 위해서 필요한 모든 자원원 얻지 못해 작업을 수행하지 못 하는 상태에서는 확보한 자원을 반환하고 일정 시간 후에 자원 할당을 받을 수 있도록 해서 특정 자원을 잡고 있는 상태가 지속 되지 않게 해야 한다.
너무 간단한 소스라서 코드 설명은 필요 없을 것이다. 결과에서 중요한 것은 “200203”이라는 수이다. _OPENMP 매크로의 릴리즈 값은 YYYYMM형식의 수로 나타납니다. 그래서 값과 버전을 값이 볼 필요가 있습니다. 아래 표를 버전과 릴리즈 값 비교표입니다.
버전에 따라서 적용되는 범위를 지정하여 사용할 수 있는데, 왜 이런 작업을 해야 하는지 의문이 들 수 있는데, 아무래도 컴파일러 마다 적용되는 OpenMP 버전이 다르고 또 버전별로 지원이 되는 사양이 다를 수 있기 때문이다. 특히 아래와 같은 for 문을 적용할 때 2.0 버전의 경우 정수형만을 적용을 받지만 3.0이상은 포인터도 적용이 가능하다.
OpenMP 버전을 확인 하는 방법
결과는 200203, 200805 으로 나오는데 200203은 2.0이고 200805는 3.0을 말한다.
스래드 마다 별도의 캐쉬를 사용하기 때문에 비연속 메모리를 엑세스 하는 것보다 연속된 메모리를 엑세스 하는 것이 캐쉬 미스를 줄일 수 있어서 보다 좋은 성능을 기대 할 수 있다.
동기화 부분은 피할 수 있으면 가장 좋겠지만 피할 수 없을 경우가 많다. 그럴때는 최소화 하는것이 답이다.
동기화 파트에서 사용했던 local_sum 부분을 생략 가능한 명령어 '''reduction'''이다.
부분을 하나로 표현 할 수 있다.
- programming_popen_fuction . . . . 1 match
프로세서를 열어서 결과 스트링을 받아오는 예제
- programming_sh_copy . . . . 1 match
쉘명령어를 이용해서 간단한 프로그램을 하는 방법에 대해서 설명 한다.
- programming_struct_usage . . . . 2 matches
Struct에 열거 된 데이터들 중 임의의 값을 초기화 하기 위한 코드
== 스트럭트를 배열로 선언 했을 경우 ==
- public_problem . . . . 27 matches
㈜조인트리는 2000년 법인을 설립하여 높은 기술력과 경험을 바탕으로 SI/SM 사업, 공공과 민간시스템 구축/유지보수, TMS, E-learning 개발/납품, 맞춤형 응용 소프트웨어 개발/구축운영, R&D 등 다양한 분야의 업무를 수행하고 있습니다.
㈜조인트리는 지속적인 투자를 통해 높은 매출 증가 추이를 보이고 있으며, 외부로부터의 안정적인 신용평가를 바탕으로 성실하게 사업을 수행하여 2017년 이후 4차산업 혁명을 준비하기 위해 SI/SM 사업 기반 신기술 R&D와 HRD을 통해 사회공익증진과 지식공유를 실천하고 있습니다.
순돌이드론은 특수 산업용 무인기 개발, 제조 전문기업이다. 농약살포드론을 개발, 보급화하며 산업용드론의 포문을 연 선두기업으로, 다년간 축적된 기술력과 수준 높은 석박사의 기술개발로 쉼 없이 도약하고 있다.
기본에 충실한 기술력을 바탕으로 솔루션의 목적, 환경, 용도에 맞추어 제품을 커스터마이징하여, 다양한 산업분야에서 적용하고 있다.
대한민국 육군, 경찰, 해군 등 정부주요 기관을 중심으로 군수용 · 산업용 · 특수임무용에 특화된 드론을 주문 제조하고 있으며, 민수용으로는 농업용, 촬영용, 교육용드론을 제조하고 있다. 또한 2019년 국내최초로 해외에 수출을 하며 국내드론의 글로벌 산업용 드론시장의 문을 열었다.
2019년 개발 완료, 2020년 출시된 유선드론, “T-Dori”는 2020년 가장 주목받는 제품으로 유선을 이용하여 전력을 공급받아, 24시간 비행한다. 촬영, 감시, 인명구조, 서치라이트 드론 등에 활용되고 있다. GCS(Ground Control Station) 탑재, 통제차량은 드론의 관제 및 안전제어 등 다양한 외부환경에서 드론을 효율적으로 통제하고, 실시간 영상수신 및 분석을 통하여 드론을 활용한 공공서비스 분야에서 효율적인 미션 수행을 지원한다.
그 외 엔진을 장착하여 비행성능을 높인 하이브리드드론, 실시간 미세먼지를 분석하고 포집하는 미세먼지 측정드론 등 임무 특화용 드론은 소방, 해양, 환경, 산림 등 다양한 산업분야에서의 효율적인 미션 수행을 지원한다.
또한, UHD 재난방송서비스 시나리오 등 다양한 재난분야 연구과제를 수행함으로써 최신의 기술력을 확보하였습니다.
안전한 세상을 만들기 위해 주식회사 온품은 최고의 품질과 기술을 바탕으로 무한한 도전과 혁신을 만들어 가겠습니다.
- python_animation_plot . . . . 7 matches
collections 라이브러리는 파이션 내장 데이터 타입 위해 편의를 제공하기 위해서 특별한 자료형을 만들어줬다.
double-ended queue 자료형으로 말 그대로 규라고 보면 된다. List 자료형을 큐로 사용할 수 있지만 List 자료형에서 값을 추가하고 빼는 것은 O(n)의 계산량을 갖는 것에 반해 deque는 O(1)의 계산량을 갖는다.
위 코드는 뷰에 '>--------------------' 스트링을 넣어 놓고 특정 시간 스텝마다 하나씩 로테이션 시켜주는 예제이다. ''print문 종말에 ,는 줄바꿈을 하지 않기 위해서 쓰여짐.''
- python_c_c++ . . . . 51 matches
파이션을 사용하다 보면 필연적으로 C나 C++을 찾게 된다. 이유인즉,
파이션을 사용자에게 여러가지 편의를 제공해주는 아주 좋은 인터프린터 프로그램 언어임에 틀림 없지만 사용하다 보면 성능 측면에서 부족함과 답답함을 느끼는 순간이 있다. 텍스트를 파싱하고 간단한 벡터와 메트릭을 연산할때는 좋은데 계산량이 많거나 처리해야 할 일이 많을 경우 C나 C++에 비해 상대적으로 느림을 알 수 있다. 이런 경우 계산 부분만 C나 C++로 할 수 없을까 하는 생각을 하게 된다. 지금 부터 알아보려고 하는 것은 이런 문제를 해결하기 위한 방법이다.
그 반대의 경우도 가능하나 지금은 파이션에서 외부 모듈을 불러서 사용하는 것만을 다루도록 하겠다.
그 중에서 여기서 사용할 방법은 Boost라이브러리에서 제공하는 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 파일이 생성 되는데 생성된 파일을 열어서 실제 설정값이 잘 들어 갔는지 확인해봐야 한다. 설정값이 정상적이지 못하면 문제가 발생한다.
소스코드를 보면 두개의 헤더 파일을 포함하고 있는 것을 볼 수 있다.
파이션으로 받은 인자에 오류가 발생했을 경우 그 오류를 C모듈에서 처리하고 그 것을 파이션에게 알려주기 위함이다.
'''BOOST_PYTHON_MODULE''' 이것은 파이션에서 사용할 파이션 모듈을 등록하기 위한 부분이다. 파이션에서 제공하는 API에 비해서 단촐한 모습을 하고 있다.
컴파일은 아래와 같이 갖가지 옵션들을 넣어서 직접 컴파일 할 수 있다. (옵션이 너무 많다... ㅠ)
더 간단하고 편한 방법으로는 파이션에서 제공하는 distutils을 사용해서 setup.py 파일을 만들어 사용하는 방법이다.
컴파일러나 컴파일 옵션을 변경하기 위한 방법으로 아래와 같이 환경변수를 변경해서 넘기는 방법을 쓸 수 있다.
1.63버전 부터 numpy가 boost_python에 내장 되면서 numpy 모듈을 사용할 수 있게 되었다.
파이션에서 C로 만들어진 모듈을 사용해 보자
파이션 입장에서 C로 만들어진 모듈이라고 해서 특별한 사용법이 있는 것은 아니다. 그냥 파이션 모듈을 사용하는 것과 같이 사용하면 된다.
간단하지만 최초의 파인션 연동을 성공했다면 이제는 조금더 확장된 클래스 객체를 파이션과 연동 시키는 작업을 진행해 보도록하자.
- python_chat_program . . . . 111 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)]
SQLite는 별도의 DB 서버가 필요없이 DB 파일에 기초하여 데이타베이스 처리를 구현한 Embedded SQL DB 엔진이다. SQLite는 별도의 복잡한 서버 설치가 필요 없고, 쉽고 편리하게 사용할 수 있다는 점에서 널리 사용되고 있다. 오늘날 대부분의 Mac OS X 나 리눅스에서는 SQLite을 기본적으로 내장하고 있지만, 만약 시스템에 내장되어 있지 않는 경우는 http://www.sqlite.org 에서 다운받아 설치할 수 있다. SQLite는 기본적으로 SQLite DB 엔진과 "sqlite3" 라는 Command line tool 을 갖고 있다.[* Alex Lee. (2016-2017). "예제로 배우는 Python 프로그래밍 - SQLite 사용" <http://pythonstudy.xyz/python/article/204-SQLite-사용>. (21 Nov 2017)]
아래 내용은 Command line를 사용하는 과정을 예시로 설명한 것이다.
간단한 예제로 사용자에 해당하는 테이블을 만들고 각각의 사용자의 Password를 저장하는 테이블을 name_table, passwd_table 이라는 이름으로 만들어 보고 "wskim", "test" 두 명의 사용자를 생성하고 각각의 Password를 넣어주고 "test" 사용자의 Password를 확인하는 과정을 기술해 보았습니다.
이 과정에서 복수 개의 테이블을 연결하고 연결된 테이블에서 조건을 설정해서 원하는 결과를 얻어 왔습니다. 이 과정에서 JOIN[* 수까락. (20 Jun 2014). "INNER JOIN" <http://egloos.zum.com/sweeper/v/3002133>. (21 Nov 2017)]이라는 명령어를 사용했습니다.
- python_generator . . . . 22 matches
지난 글에서는, 생산자-소비자 패턴(Producer-Consumer Pattern)의 소비자 쪽의 코드를, 함축적이면서도 자연스럽게 기술할 수 있는 방법을 제공하는 이터레이터를 살펴봤습니다. 오늘은 생산자 쪽을 들여다봅니다.
앞서 Range 라는 클래스를 통해 이터레이터를 살펴보았습니다만, 이 코드에는 불편한 부분이 있습니다. 대부분의 작업은 __next__() 메쏘드를 통해 구현되는데, 매번 예전의 상태를 복구한 후, 작업을 수행하고, 다시 상태를 저장하는 작업을 반복하게 됩니다. Range 와 같은 간단한 작업에서야 문제될 것이 없지만, 알고리즘을 기술하는 자연스러운 방식에서 벗어나 있기 때문에, 작업이 복잡해질수록 점점 문제가 됩니다. 이런 스타일의 프로그래밍은 이벤트 주도형 프로그래밍(event-driven programming)에서 자주 등장하는데, 비동기 IO(Asynchronous IO) 나 GUI 프로그래밍을 해 보셨다면 이미 익숙할 겁니다.(지금 우리가 걷고 있는 길은 이 문제들에 대한 직접적인 해결책으로 이어집니다. 하지만 아직은 갈 길이 멉니다.)
파이썬에서는 제너레이터(generator)라는 이터레이터의 확장을 제공합니다. 이터레이터가 단지 프로토콜인데 반해, 제너레이터는 yield 라는 전용의 키워드를 통해 문법적인 특별함을 더합니다. Range 를 제너레이터로 다시 구현해 보겠습니다. (되도록 이터레이터 구현과 유사하게 코드를 구성했습니다.)
파이썬은 함수 정의에 yield 키워드가 등장하면 그 함수 전체를 제너레이터로 인식하고, 특별한 VM 코드를 생성해냅니다. 함수의 코드를 재구성해서 같은 일을 하는 이터레이터를 만든 다음, 원래 함수는 그 이터레이터 인스턴스를 돌려주는 함수로 바꾼다고 보시면 됩니다.
* 제너레이터에서 return 문은 StopIteration 예외를 일으킵니다. 함수의 끝에 도달해도 마찬가지 입니다. 파이썬 3 에서는 return 문이 값을 포함할 수도 있지만, 오늘 다룰 범위를 벗어납니다.
재진입(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 . . . . 2 matches
부스트 파이션을 사용한 파이션 연동 테스트
실시간으로 업데이트 되는 그래프를 파이션을 사용해서 그려보자.
- python_install_guide . . . . 3 matches
Python 을 설치해서 사용해 보고자 한다.
http://python.org/ftp/python/ 에서 원하는 버전의 python을 받아서 설치 한다.
wget http://cython.org/release/Cython-0.17.4.tar.gz 을 받아서 설치 한다.
- python_installation . . . . 9 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 버전을 구분해서 제공합니다.
- python_iterator . . . . 9 matches
대부분의 파이썬 튜토리얼들과는 달리 파이썬 3.3을 중심으로 기술하고 파이썬 2를 포함한 하위 버전에서 차이를 보이면 따로 설명합니다.
next() 를 사용해 한 번에 하나씩 탐색해 나가다가, StopIteration 예외가 발생하면 끝냅니다. 이러한 탐색 법에 대한 약속을 이터레이터 프로토콜(Iterator Protocol)이라고 부르는데, for 루프는 간결한 문법을 제공합니다.
사용자가 정의한 클래스가 이터레이터를 지원하려면 {{{__iter__()}}} 메쏘드를 정의하면 됩니다. iter() 는 객체의 {{{__iter__()}}} 메쏘드가 돌려주는 값을 이터레이터로 사용합니다. next() 에 이터레이터를 전달하면 이터레이터의 {{{__next__()}}} 메쏘드를 호출합니다. 때문에 최소한의 이터레이터는 이렇게 구성할 수 있습니다.
... return self # 이터레이터인 경우는 자신을 돌려주면 됩니다.
이렇게 for 루프에 이터레이터를 직접 요구하지 않고, 이터레이터를 만드는 객체를 요구함으로써, 많은 경우에 for 루프가 깔끔해지기는 하지만, 간혹 혼란을 야기할 수 있는 경우도 발생할 수 있습니다.
프로그래밍을 하다 보면 한쪽에서 생산하고(produce), 다른 쪽에서 소비(consume) 하는 상황을 자주 만납니다. 이를 생산자-소비자 패턴(Producer-Consumer Pattern)이라고 하는데, 이터레이터는 소비자 쪽의 코드를 함축적이면서도 자연스럽게 기술할 수 있는 방법을 제공합니다. 이제 필요한 것은 생산자 쪽의 코드를 자연스럽게 구성할 수 있는 방법입니다. 다음에 다룰 제너레이터(Generator) 가 파이썬의 대답입니다.
- python_logging . . . . 15 matches
Python 프로그램을 작성하면서 프로그램 동작 중 발생할 수 있는 다양한 로그를 출력하기 위한 방법으로 logging 라이브러리를 사용하여 로그를 작성하는 방법을 알아보자.[* https://jh-bk.tistory.com/40]
||DEBUB ||프로그램 작동에 대한 상세한 정보를 가지는 로그, 문제의 원인을 파악할 때 사용 ||
||ERROR ||심각한 문제로 인행 프로그램이 의도한 기능을 수행하지 못하고 있는 상황을 표시. ||
||CRITICAL ||더욱 심각한 문제로 인해 프로그램 실행 자체가 언제라도 중단될 수 있음을 표시. ||
로거 설정 시 레벨을 지정해 주면 해당 레벨 이상의 로그 이벤트만 기록한다. 디폴트(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’ 형식입니다 (쉼표 뒤의 숫자는 밀리 초 부분입니다). ||
||funcName || %(funcName)s ||로깅 호출을 포함하는 함수의 이름. ||
||relativeCreated || %(relativeCreated)d ||logging 모듈이 로드된 시간을 기준으로 LogRecord가 생성된 시간 (밀리 초). ||
- python_module_pyaudio . . . . 10 matches
Python으로 1분단위로 오디오를 녹음해서 mp3파일을 만드는 프로그램을 라즈베리파이에서 구동하려고 한다.[* https://whansunkim.top/wiki.php/raspberry_pi_pyAudio] 이 프로그램의 목적은 실험 장비의 이상 유무를 오디오로 모니터링하기 위함이다. 그 과정에 대해서 자세히 설명하고자 한다.
systemd(System daemon)은 Unix 시스템이 부팅후에 가장 먼저 생성된 후 다른 프로세스를 실행하는 init 역할을 대체하는 데몬입니다. Rad Hat의 주도로 개발되어 지금은 RHEL/CentOS/Ubuntu 나 Arch 등 많은 리눅스 시스템에서 채택하고 있습니다.
systemd(system daemon)는 1번 프로세스 ID를 갖고 있으며 부팅부터 서비스관리 로그관리 등을 담당합니다. 또한 부팅시에 병렬로 실행되어서 부팅속도가 빠릅니다. 오래전에 사용하던 init방식은 부팅 과정에서 단계적으로 run-level을 올려가며 해당 run-level에 포함된 스크립트들을 순차적으로 실행시키니 설정이 복잡했으며 속도마저 느렸었습니다.
부팅시 필요한 작업을 systemd unit으로 등록하여 사용할 수 있으며 unit 파일 생성 방법은 아래와 같습니다.
service 구동하는 계정, 그룹, 퍼미션등을 설정할 수 있다.
* 서비스 구성 파일을 수정했다면 서비스를 다시 시작한다.
# 자신이 사용하는 마이크에 따라서 해당 옵션을 설정해줘야 한다.
- python_object_oriented . . . . 14 matches
기본적으로 파이션의 모든 요소들이 객체(''Object'')로 되어 있다. 나는 파이썬을 처음 접하고 스크립트 수준으로 그때 그때 필요한 것들을 만들어 쓰고 버렸다. 이 시간 이후 부터는 코드의 재사용성을 높이기 위해서 객체지향 프로그래밍 방법을 사용해서 코드를 만들어 보려고 한다.
클래스 아래에 정의 되는 함수(function)를 메소드(method)라고 하는데 파이썬 클래스는 3가지 Method를 갖을 수 있다.
각각은 인자로 무엇을 받느냐에 따라서 그 성격이 달라지며 메소드 앞에 어떤 데코레이터가 주워지는지에 따라서 구분 된다.
* '''instance method'''는 첫번째 인자로 self [* 관례적으로 self, cls로 인자를 받고는 있지만 변수명은 변경 가능하며 첫번째 인자 위치에 있는 변수에 인스턴스 객체나 클래스 객체가 넘어온다는 것만 알고 있으면 된다.]키워드를 사용하며, instance 자기 자신을 첫번째 인자로 받는다.
* '''static method'''는 자동으로 넘어오는 인자 없이 클래스와 인스턴스에 종속되지 않은 일을 수행한다.(@staticmethod)
파일을 다루기 위한 방법으로는 크게 3가지 방법이 있다고 하는데 여기서는 두가지 방법만을 다룬다.
파이썬에서는 iterator라고 하는 반복자를 사용하는 방식이나 참조로 묶인 자료형을 많이 사용한다. 이때 참조를 갖고 있는 구조체를 벗겨내고 알맹이를 넘기고 참조하고 싶거나 여러가지 객체를 하나로 묶어서 넘기고 싶을때 사용할 수 있는 특별한 형식을 알아보자
선언하는 인자형에 *을 붙이게 되면 한번에 여러 객체를 받아 넘기겠다는 것이고 코드 중간에 *를 사용하게 되면 컨데이너 혹은 iterator가 지칭하고 있는 참조를 풀어서 각가의 객체를 바로 보겠다는 의미가 된다.
- python_re . . . . 3 matches
#title 정규표현을 사용한 문자열 처리 with Python
정규표현을 이요한 문자열 처리를 도와주는 re 모듈을 사용하는 방법에 대해서 알아보자.[* https://engineer-mole.tistory.com/189]
- python_tip . . . . 67 matches
파이썬 프로그래머라면 누구나 한 때는 배워야 했고, 초보자로 시작했을 것이다. 초보자는 실수를 저지른다. 이 글은 내가 저질렀던 실수를 포함하여 몇가지 흔한 실수들을 밝힌다.
초보자의 실수는 파이썬의 잘못도 아니고, 초보자의 잘못도 아니다. 실수는 단순히 파이썬 언어를 잘못 이해한 결과일 뿐이다. 그렇지만, 언어의 특징을 잘못 이해(때로는 미묘한) 하는 것과 언어를 전반적으로 잘못 이해하는 것 그리고 그것으로 무엇을 할 수 있는지 (그리고 할 수 없는지)에는 차이가 있다. 함정수 글은 앞에 초점을 두었다; 이 글은 뒤의 문제를 다룬다.
다른 말로 하면, 이 글에서 실수란 코딩 실수나 비밀스런 언어의 함정이 아니라, 흔히 "잘못된 도구로 일을 하는" 경우를 이른다.
== 실수 1: 낮은-수준의 연산을 시도한다 ==
파이썬은 보통 VHLL 즉 아주-높은-수준의 언어(Very High-Level Language)라고 기술된다. 그래서, 당연히 높은-수준의 작업에 알맞다. 예를 들어 HTML 페이지를 만들거나 해석하는 것, 게임 엔진 스크립팅, 또는 웹 작업틀을 작성하는 것, 기타 등등의 예에 알맞다. 전형적으로 낮은-수준의 언어로 성취되는 작업에는 알맞지 않다. 예를 들어 장치 드라이버를 작성하는 것이 있겠다. 또는 수행속도가 중요한 작업에도 알맞지 않다. 예를 들어 3D 그래픽의 화면가공, 또는 무거운 숫자-쪼개기가 있다.
이는 곧 파이썬으로 이런 일들을 하는 것이 불가능하다는 뜻은 아니다; 그러나 이런 일을 하는 데 별로 알맞지 않을 것이다. 이를 처리하는 한가지 해결 방법은 C로 저-수준 코드를 작성하고, 파이썬에서 그 코드를 호출하는 것이다.
== 실수 2: 파이썬을 "X 언어" 식으로 코딩한다 ==
이는 거의 피할 수 없는 실수이다. 파스칼 같은 언어에서 왔고, 바로 파이썬을 시도한다면, 처음 작성한 코드는 아마도 파이썬 구문의 파스칼처럼 보일 것이다. 파이썬으로 파스칼 코드를 작성하려고 한다.
"X 언어"의 몇가지 악명높은 증상과, 그 증상을 야기하는 언어들:
특성(properties)을 남용한다 (파이썬 2.2의 새로 도입된 빛나는 특징 중 하나이다). (Java, Delphi, 어쩌면 Visual Basic, C++?)
함수나 클래스를 사용하기 보다, 기나긴 서술문을 줄줄이 사용한 프로그램을 작성한다 (그 옛날 Basic)
몇가지 객체면 충분한데도, 약간만-다른 객체들을 너무 많이 작성하려 한다 (Java, C++, 기타 정적-유형의 OO 언어들)
(나의 경험에 의하면 파이썬이면 클래스를 덜 써도 된다는 것인데, 덜 유연한 언어라면 따로 클래스가 요구될 정도의 차이라도 파이썬의 동적 특징을 사용하면 그 차이를 다룰 수 있다.)
많은 함수/메소드 호출을 사슬처럼 엮는다. 이 때문에 코드의 가독성이 떨어진다 (Lisp, Scheme, 어쩌면 Perl?)
객체가 더 적절한데도, 함수에서 함수를 (...등등...) 돌려주는 함수들과 이런 함수들로 둘러싸인 이름공간을 조작하는 함수들을 많이 작성한다. (Lisp, Scheme, 기타 기능적 언어)
바이트코드 해킹으로 "예전 언어의(come from)" 서술문을 구현한다 (Intercal - 역주:언어의 일종)
여기에서 요점은 예전에 익숙했던 언어를 단죄하자는 것이 아니다 (비록 언제나 재미있겠지만 말이다;-). 요점은 좋은 "X 언어" 코드와 좋은 관행이 늘 파이썬으로 직접 번역될 수 있는 것은 아니라는 점을 강조하는 것이다.
== 실수 3: 기존 환경에 파이썬을 맞추려고 하지 말자 ==
이에는 약간 설명이 필요하다. 예전 1996-1997에 파이썬을 배울 때, 나는 도스의 터보 파스칼에 익숙했었다. 종종 문자(ASCII 0-255)로 구성된 16 칼러의 "텍스트 그래픽"을 사용하는 프로그램을 작성했다. VGA 카드의 성능을 최대로 이용하면서 말이다. 코드에 인라인 어셈블러와 도스 인터럽트 호출을 섞어서, 하드웨어와 직접 대화했다. (사운드, 비디오 카드, CD-ROM).
이런 환경의 이런 작업에는 파이썬이 이상적인 언어가 아니라는 것은 명백하다. 그렇지만 나는 파이썬이 마음에 들었고 사용하고 싶었다. 그래서, 나는 둥근 구멍에 사각형 기둥을 박으려 시도했다. 파이썬은 내가 원하는 일을 해 줄 수 없었다 (오히려 그 때는 그게 "정상"이라고 간주했다. 심지어 "꼭 필요하다"고 느꼈다.) 그래서 실험을 했다. 예를 들어, ANSI 드라이버를 사용하여 텍스트 그래픽을 그렸다 (아주 느렸다). 결국, DJGPP로 컴파일해서 나만의 파이썬 버전을 만들었다 (어떤 독자는 Python-DX를 기억하실지 모르겠다; 예전 실행파일은 여전히 내려받을 수 있다). 저-수준 도스 호출, 인터럽트, 텍스트 그래픽, 등등을 위한 모듈을 추가했다.
- pytorch_exeample_mnist_grad_cam . . . . 17 matches
기본적으로 numpy, torch 모듈중 기본적인 학습에 필요한 모듈들과 matplotlib, skimage, random을 사용하였다.
batch size, learning rate, epoch 등은 학습과 관련된 것으로 학습을 진행하면서 약간씩 조절해 보자.
torchvision.datasets 모듈에 다양한 데이터셋이 있는데 이를 받아와서 딥러닝 모델에 넣어주기 위한 과정을 설명한다.
[torchvision]는 널리 사용되는 데이터 셋과 아키텍쳐 모델 등을 갖고 있고 '''이미지 변환''' 모듈을 포함하고 있다.
'''shuffle''': True, False 데이터를 섞어서 뽑을 것인지
'''num_workers''': 데이터 전처리에 사용할 프로세서의 수 (전체 프로세서의 1/2, GPU를 사용한 연산을 할 경우. 그렇지 않은 경우 2개 정도, 근거는 없다 그냥 해봐라)
사용할 딥러닝 모델을 만든다. 모델은 Nural network 클랙스의 Module를 상용해서 만든다.
CNN 클래스로 모델을 만들었다. 내부를 보면 초기화 함수에 layer, fc_layer를 정의하고 초기화 했다.
'''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에서는 하나 이상의 인자를 요구한다. 때문에 버번 호환성을 위해서는 넣어주는게 좋지만 클래스 이름이 변경되면 신경써서 같이 바꿔줘야 한다.
torch.nn은 각종 loss function[* https://pytorch.org/docs/stable/_modules/torch/nn/modules/loss.html]을 갖고 있다.
loss를 구현해서 사용할 수 있지만 매번 같은 일을 하는 것도 귀찮은 일이다. 그냥 만들어진 것을 쓰자.
- pytorch_multiGPU . . . . 1 match
GPU는 TITAN V 2장을 사용하려고 한다.
- pytorch_tutorial . . . . 8 matches
PyTorch의 기본은 메트릭스(텐서) 연산을 기본으로 한다 그런점에서는 Numpy와 별 다를게 없을 수도 있다. 하지만 torch 클래스와 torchvision 클래스에 구현되어 있는 다양한 머신러닝 관련 컨포넌트들을 잘 사용하면 딥러닝 모델을 쉽게 구축하고 사용할 수 있다.
autograd 패키지는 텐서의 모든 연산에 대해서 자동 미분을 제공한다.
torch.Tensor는 PyTorch의 기본 자료형이라고 볼 수 있다. Tensor 클래스는 .requires_grad 속성을 갖고 있는데 이 속성을 True로 설정하면 텐서의 모든 연산에 대해서 추적하게 된다. 계산 작업이 모두 수행 되면 .backward()를 호출하여 모든 gradient를 자동으로 계산할 수 있다. 계산된 gradent는 .grad 속성에 저장 된다.
기존적으로 Tensor를 wraping하고 있으며, Tensor 기반으로 정의된 거의 대부분의 연산을 지원한다. 계산이 완료된 후 .backward()를 호출하여 모든 변화도를 자동으로 계산할 수 있다.
- pytorch_with_tensorboard . . . . 4 matches
파이토치에 Tensor Board를 적용하기 위한 방법을 알아보자. 참고할 만한 사이트로 파이토치 공식 튜토리얼[* https://tutorials.pytorch.kr/intermediate/tensorboard_tutorial.html]이 있다.
tensorboard 웹서버에서 읽을 수 있는 형태로 기록하기 위한 모듈은 Pytorch에서 from torch.utils.tensorboard import SummaryWriter 를 통해서 사용할 수 있다.
같은 기능을 하는 패키지로 tensorboardX 가 있는데 이것은 별도로 설치를 해야 한다.
로그를 저장하기 위한 모듈로, 인자로 저장할 폴더의 위치를 받는다. default 값은 ''runs'' 폴더 아래에 실행한 날짜와 서버의 이름을 조합한 폴더를 만들어준다.
- qt_programming_index . . . . 14 matches
https://www.qt.io/download 에서 간단히 계정 정보를 입력하고 Downloads for open source users를 클릭하고 파일을 받아서 설치하면 된다.
qt wiki[* https://wiki.qt.io/Main]를 방문하면 설치부터 다양한 정보를 얻을 수 있다.
버전이 업데이트 되면서 메뉴 구성이 달라져 있을 수 있기 때문에 설정에 대한 부분은 잘 찾아서 해보자. ㅎㅎ
Qt에서 파일 입출력을 위한 클래스를 제공하는데 사용법은 간단하지만 다양한 기능을 제공한다.
파일을 열때 QIODevice flag를 통해서 다양한 옵션으로 열 수 있는데, QIODevice::Append 플래그를 설정하면 파일의 마지막부터 연결해서 쓰기가 진행된다.
QString filename = "sample.txt"; // 파일 이름을 QString 클래스에 저장
file->setFileName(QApplication::applicationDirPath() + "/" + filename); //프로그램이 실행되는 위치와 파일명을 QFile 객체에 넘겨준다.
QString filename = "sample.txt"; // 파일 이름을 QString 클래스에 저장
file->setFileName(QApplication::applicationDirPath() + "/" + filename); //프로그램이 실행되는 위치와 파일명을 QFile 객체에 넘겨준다.
while(file->atEnd()) //파일의 읽을 위치가 끝인지 확인
str = file->readLine() //파일의 내용을 한 라인씩 읽음
파일이 수정되는 것을 확인하고 처리하는 것을 SIGNAL, SLOT으로 처리했다.[* https://jdh5202.tistory.com/298]
- quadtree_paper_reading . . . . 43 matches
우리 실험의 목적을 위해, 우리는 강도를 무시합니다.
우리의 쿼드 트리 구현은 다음 R3에서 우리는 인덱스 데이터 포인트가 자신의 x 및 y 좌표를 기반으로하는 [2]에 설명 된 방법을.
이것은 우리의 쿼드 트리 구현의 건설을 병렬화의 기본 동기로 사용됩니다.
포인트 클라우드 격자 DEM에 자신의 논문에서 : 확장 접근 Argarwal, ARGE 다나 대형 멀티 기가 바이트의 데이터 세트에 그리드 기반의 디지털 고도 모델의 효율적인 건설 (격자 DEM을)에 대한 세 가지 부분, 확장 성, 순차 알고리즘을 제안한다 [2] .
그들은 쿼드 트리를 사용하여 데이터 세그먼트로 구성된 세 단계 접근 방식도 사용이 쿼드 트리 셋째 보간 한 적합하다고 어떤 방법을 적용 말했다 찾는 이웃을 설명합니다.
Agarwal et al. 쿼드 트리의 증분 및 레벨 별 수준의 구조를 설명하고 하이브리드 방식을 채택한다.
고 말했다 접근 방식에서, 저자는 잎이 포인트 목록을 함유 한 번에 쿼드 트리의 세 가지 수준을 구축 할 수 있습니다.
잎의 이웃을 찾기 위해 저자는 또 일부 공통 모서리 또는 경계 상자의 전체 가장자리가 인접 해 있다고합니다 공유하는 잎 증분 방법을 설명합니다.
저자 계층 접근 방식은 메모리에 트리의 최상위 수준을로드하고 재귀 적으로 증분 방식과 일부 추가 오버 헤드를 사용하여 잎을 처리 포함한다.
데이터 보간 단계의 설명은 원하는 수 뭔가를 남기는하지만, 아가 왈 하였다. 데이터 보간 알고리즘의 무리가 있다는 것을 인정한다.
우리의 작업의 목적을 위해, 우리는 분할 단계와 그 병렬화에 초점을 선택한다.
우리는이 병렬 구축 쿼드 트리뿐만 아니라 인덱싱 및 LIDAR 데이터 세그먼트에 유용하지만, 많은 다른 목적을 봉사하는 표시 되었기 때문에 병렬화 알고리즘의 중요한 부분임을 관찰합니다.
그들의 논문에서, 그들은 볼륨 계층 구조 (BVH)를 경계의 계산을위한 새로운 알고리즘을 제시한다.
그들을 사용할 수 있도록 알고리즘보다 빠른 종종 있기 때문에 BVHs는 계산 기하학과 컴퓨터 그래픽의 많은 분야에 걸쳐 임박한 중요하다.
쿼드 트리의 사용을 통해 공간 분할은 쿼드 트리의 신속한 건설을위한 알고리즘을 설계 할 때 좋은 선택을 만들기 위해 열쇠입니다, 볼륨 hierachies 경계 BVHs의 빠른 구성을 이해하는 간단한 두 가지 차원 아날로그이기 때문입니다.
따라서 본 논문은 우리의 작업과 관련된 몇 가지 중요한 교훈을 보여줍니다.
이 세분화 된 병렬 및 수천 개의 스레드를 동시에 실행할 수 있기 때문에 첫째, CUDA 자신의 알고리즘을 구현하도록 선택합니다.
자신의 구현에서는, 그들은 하나의 독자에 대한 액세스를 등록 할만큼 빠른 공유 메모리 블록을 많이 사용합니다.
이것은 상당한 속도 향상을위한 필수의 사용을 만드는 전역 장치 메모리보다 약 150-200 배 빠릅니다.
둘째, 정렬 중 하나에 볼륨 계층 구조를 경계의 문제를 줄일 선형 경계 볼륨 계층 구조 (LBVH)라고하는 새로운 알고리즘을 구현합니다.
- raspberry_Grafana . . . . 2 matches
TCP/IP 프로토콜 위에서 동작하며, 사물인터넷(임베디드)을 사용하기 위해 개발된 프로토콜 이다. TCP 기반의 프로토콜로서 낮은 전력 낮은 대역폭 낮은 성능의 환경에서도 사용이 가능하다.[* https://gymcoding.github.io/2020/09/22/mqtt-eclipse-mosquitto/]
MQTT는 메시지를 발행하는 발행자(Publisher)와 메시지를 구독하는 구독자(Subscriber) 그리고 이 둘을 중계하는 브로커(Broker)로 구성되며, 메시지는 Topic으로 분류 된다.
- raspberry_Yemigo . . . . 1 match
172.24.10.102 GPS를 기반으로 하는 ntp서버에 연결하는 설정을 하도록 하겠다.
- raspberry_pi_dht22 . . . . 18 matches
ntp를 설치하면 ntpsec이 설치 되는데 아래 과정을 통해서 설치와 설정을 할 수 있다.
온습도 센서 dht22를 사용해서 매초 센서 값을 읽어오는 프로그램을 작성한다.
dht22 센서는 3.3v 전원을 사용하고 gpio를 이용해서 센서값을 읽을 수 있다. 라즈베리파이의 GND와, 3.3v를 연결하고 사용하지 않는 gpio 하나를 연결한다.
보드의 gpio 설정을 확인하는 방법으로는 터미널에서 아래 명령을 입력한다. [* https://www.raspberrypi.com/documentation/computers/raspberry-pi.html]
gpio version 2.5는 라즈베리파이 4를 지원하지 않는다. 업데이트된 버전을 설치해야 한다.
/* 리얼타임 시계로부터 현재 시간을 구한다. */
#define MG_PIN (0) //아날로그 값을 입력받을 핀을 정의
#define BOOL_PIN (2) //디지털값을 입력받을 핀을 정의
//번역된 부분으로 읽는데 잘 파악이 되지는 않네요, 센서값 곡선 그래프에 맞추어 계산을 하기 위한 설정값들이라고 생각하면 될듯합니다.
- raspberry_pi_ntp_server . . . . 28 matches
라즈베리파이를 이용한 GPS기반 NTP 서버를 구축하는 과정을 기록하기 위해서 이 문서를 만든다.
gps 모듈과 라즈베리파이를 물리적으로 연결하기 위해서는 gpio를 이용해야 하는데 아래는 연결을 위한 배선표이다.
GPS 모듈은 3.3v의 전원을 사용한다. 라즈베리파이에 3.3v 전원부와 GND를 연결하고 시리얼통신을 이용하기 위해서 라즈베리파이의 GPIO14,15에 해당하는 UART rx, tx를 교차하여 연결해준다. 마지막으로 PPS는 Pulse per second 신로를 내여주는 선으로 1초에 한번씩 전기적인 신호를 주는 선이다. 이것은 GPIO18 혹은 24번을 이용해서 연결하는데 여기서는 24번을 이용해서 연결하도록 하겠다.
pps-tools는 pps 신호가 잘 들어오고 있는지를 확인하기 위한 툴로 설치가 정상적으로 잘 되어 있고 몇가지 설정만 잘 되어 있다면 별문제 없이 신호가 들어오는 것을 확인할 수 있습니다.
chrony는 ntp 프로토콜과 유사하게 시간을 전송하기 위한 패키지입니다.
pps 신호선을 GPIO 24번에 연결하고 /boot/config.txt 파일에 GPIO24번이 pps로 사용할 것임을 알려줘야 합니다.
이 과정에서 uart 사용에 대한 설정도 미리합니다. gps 설정을 위한 사전 조치
설정이 끝나면 reboot을 통해서 설정을 반영합니다.
gps 모듈과 통신하기 위해서는 uart 설정을 해줘야 합니다. 라즈베리안에서는 설정을 위한 툴을 제공하고 있습니다.
와 같은 과정으로 설정을 해주면 gps 모듈과 시리얼 통신을 할 수 있는 상태가 됩니다.
설정을 완료하고 재부팅을 해서 설정값을 적용시키고 cat /dev/serial0 와 같이 테스트를 해보면 gps 신호가 들어오는 것을 확인할 수 있는데 화면에 아무런 반응이 없다면 접속된 시리얼 포트가 /dev/ttyAMA0 와 같이 다른 이름을 갖고 있는지 확인을 해보아야 합니다.
'''cat /dev/serial0''' 와 같은 명령을 수행하면 화면에 gps 관련 신호가 들어오는 것을 확인할 수 있다.
그리고 gpsd 설정을 아래와 같이 바꾼다.
/etc/chrony/chrony.conf 파일을 수정해서 PPS를 시간의 소스로 사용하도록 수정해야 한다.
- raspberry_pi_pyAudio . . . . 2 matches
마이크 녹음을 하기 위해서는 사용자가 넣어줘야 하는 값이 몇가지 있는데 FORMAT, CHANNELS, RATE는 사용하는 마이크의 제원을 확인해서 넣어줘야 한다. 보통의 경우 FORAMT, CHANNELS는 16bit mono 마이크가 대부분이니 큰 고민이 없는데 sampling rate는 16kHz, 44.1kHz, 48kHz 등 다양하게 지원하기 때문에 해당 sampling rate 찾아야 한다.
- raspberry_pi_sensor . . . . 1 match
BMP280센서는 기온과 기압을 측정할 수 있는 센서로 I2C, SPI 두가지 인터페이스를 제공하고 있다. 라즈베리파이에서는 I2C 인터페이스를 사용해서 연결하였다.
- raspberry_sensor_installation . . . . 2 matches
ntp를 설치하면 ntpsec이 설치 되는데 아래 과정을 통해서 설치와 설정을 할 수 있다. [* https://whansunkim.top/wiki.php/raspberry_pi_ntp_server]
- raspberry_wireguard . . . . 3 matches
설정은 생각보다 조금 복잡할 수 있는데 간단하게 설정 파일을 생성해주는 사이트가 존재한다. [* https://upvpn.app/ko/wireguard-config-generator/]
설정 파일의 위치는 ''/etc/wireguard''에 위치하며 '''wg0.conf''' 파일을 수정해줘야 한다.
클라이언트도 서버와 같이 wireguard를 설치해서 수행한다. 설정 파일은 위에서 생성한 macbook.conf, nims.conf 파일을 wg0.conf로 /etc/wireguard에 저장해서 사용하면 된다.
- raspberrypi4 . . . . 18 matches
'''/etc/nginx/site-available/nextcloud.conf'''를 만들어 넣어주자. 두 가지 설정이 있다. 첫 번째 파일은 ssl 미적용, 두 번째 파일은 ssl을 적용한 파일이다.
netplan을 통해서 Static IP를 설정하는 방법
python을 사용하기 위한 conda 환경 구축을 위해서 miniforge3을 설치하는 방법 아키텍쳐는 aarch64를 선택해서 https://github.com/conda-forge/miniforge/releases 에서 받아서 설치하면 된다.
/var/log/auth.log 를 보면 내가 하지 않은 ssh 접속 시도가 많음을 알 수 있는데 대부분 중국으로 부터 오는 무차별 공격이다.
패스워드를 복잡하게 설정하는 것과 brute-force 공격을 방지하기 위한 ban 프로세스를 도입하자.[* https://geeksvoyage.com/raspberry%20pi4/fail2ban-for-pi4/]
설치는 간단히 apt로 할 수 있다. 설정은 아래와 같이 기본 설정값을 복사해서 사용한다. 이유는 소프트웨어 업데이트시 설정값이 복원 되기 때문이다.
여러가지 설정을 할 수 있지만 우리가 관심 있는 것은 sshd 부분이다. 이부분을 아래와 같이 수정해서 사용한다.
설정하고 나면 fail2ban을 재 시작해준다.
f2b-sshd가 추가된것을 확인 할 수 있다.
/var/log/fail2ban.log 파일에서 로그를 확인해보면 침입으로 ban이 된것을 확인 할 수 있다.
으로 ban을 취소할 수 있다.
라즈베리 파이의 부팅 설정 파일을 수정해서 간단하게 overclock을 수행할 수 있다.
부분을 아래와 같이 수정하면 된다. [* https://www.seeedstudio.com/blog/2020/02/12/how-to-safely-overclock-your-raspberry-pi-4-to-2-147ghz/]
조금더 올려 볼 수는 있겠지만 안정적인 서버 운영을 위해서 여기까지 하도록 하겠다.[* http://egloos.zum.com/voyager/v/7508354]
- recurrent_neural_network . . . . 22 matches
= 읽을꺼리 =
기계학습법이라는 것만 놓고 보면 입력과 그에 해당하는 출력(labels)을 갖는 데이터로 기계(Black Box)를 훈련시켜서 그 밖의 데이터에 적용하겠다는 것이다.
하지만 모든 일이 그렇하듯 아무런 노력 없이 이루워지는 일은 없다. 지금 부터 이 Black Box 안쪽을 들여다 보려고 한다.
개인적으로 CNN은 FIR(Finite impulse response) filter 와 유사하고, RNN은 IIR(Infinite impulse response) filter와 유사하다는 생각을 했다.
각종 변환(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를 공유하는 방식을 취한다.
위 그림은 U, V, W 3개의 Weight를 공유하는 구조를 갖고 있다. \(s_{-1}\)은 보통 0으로 초기값을 설정한다.
그렇기 때문에 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"의 확률까지의 곱이 된다.
그렇다면 언어 모델은 왜 필요할까? 문서에서 문장을 볼 수 있는 확률을 왜 찾고 싶은 것인가?
두가지 측면에서 볼 수 있다. 하나는 만들어진 문장의 점수를 매기는데 사용할 수 있다. 기계 번역 시스템에서 만들어진 문장들에 대해서 가장 높은 확률을 갖는 문장이 가장 자연스러운 문장이고 문법적으로도 가장 완벽한 문장일 수 있다는 것이다.
위의 수식을 보면 각 단어들의 확률은 이전에 나왔던 모든 단어들에 의존하고 있다. 하지만 실제 구현에서는 많은 모델들이 계산량, 메모리 문제 등으로 인해 long-term dependency를 효과적으로 다루지 못해서 긴 시퀀스는 처리하는 것이 힘들다. 이론적으로 RNN 모델은 임의의 길이의 시퀀스를 전부 기억할 수 있지만 실제로는 조금 더 복잡하다.
- resampler_renew . . . . 20 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 . . . . 18 matches
얼마나 잘 두개의 그룹을 판별하는가에 대한 척도로 사용 된다.
예를 들어 질병이 있는 그룹과 정상인 그룹을 어떤 요소를 기준으로 구분한다고 생각해 보자. 그 요소가 얼마나 잘 두 그룹을 판별할 수 있을까?
아래 그림을 보면 두 그룹이 완벽하게 분리되지 않고 겹쳐져 있는 것을 볼 수 있다.
어떤 요소의 값을 기준(criterion value : Rank)으로 정상인 사람과 병에 걸린 사람을 구분할 때 겹쳐진 구간이 있기 때문에 완벽하게 두 그룹을 구분 할 수는 없을 것이다.
criterion value를 기준으로 4개의 영역으로 구분할 수 있는데 그 그룹을 아래와 같이 정의 하자.
'''Sensitivity''' : Rank를 기준으로 판단 했을때 Rank값 이상을 참으로 봤을때 실제 참 값을 갖는 비율. = a / (a+b)
'''Specificity''' : Rank를 기준으로 판단 했을때 Rank값 보다 작은 것들을 거짓으로 판단했을때 실제 거짓인 값의 비율 = d / (c+d)
- rsync_cron_data_backup . . . . 14 matches
#title Rsync와 Cron을 이용한 데이터 백업
rsync는 데용량 데이터를 복사하는데 아주 유용한 유틸이다. 이것과 Cron을 이용해서 주기적으로 데이터를 백업하는 스크립트를 작성해 보려고한다.
--delete 동기화시 소스 파일의 위치에 존재 하지 않는 파일을 삭제한다.
--exclude=patten 해당 패턴을 가진 파일이나 디렉토리를 동기화시 제외한다.
--include=patten 해당 패턴을 가진 파일이나 디렉토리를 동기화시 포함시킨다
rsync –[옵션] [보낼파일] [받을위치]
--daemon옵션을 이용, 서버모드로 작동할 수 있다. xinetd를 이용해서 시스템 서비스로 등록했다.
/etc/xinetd.d/rsync 설정 파일을 만들자.
이렇게 하면 xinetd 데몬에 서비스를 등록하게 되는 것이다. 이렇게 서비스를 등록하고 나서는 데몬을 다시 시작 시켜줘야 한다.
crontab 을 이용해서 반복 작업을 등록할 수 있다.
crontab -l 로 등록된 작업을 확인하고
crontab -e 로 등록된 작업을 수정할 수 있다.
위 설정은 두가지 작업을 반복 수행하게 된다.
- sc12 . . . . 4 matches
2012년도 sc12을 귀국 보고서
* --전력선을 이용한 네트워크를 형성하고 High perfermance grid computing 환경을 만들겠다는 생각으로 추정 됨.--
2.93 ghz 4core cpu가 한 클럭에 4개의 floating point 연산을 수행한다.
- scientist . . . . 2 matches
빛은 파동이다, "파동이기 때문에 매질(에테르)이 있을 것이다"라고 생각했다. 그럼 에테르의 존재에 대한 궁금증이 생겼다. 이를 실험을 통해서 에테르의 존재를 증명하기 위해서 [:Albert_Abraham_Michelson 마에켈슨-몰리]실험이 행해졌다.
- sgg_review . . . . 2 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년에 발표 되었다.
저주파 중력파 검출에 대한 연구는 위에서 소개한 2편의 논문을 토대로 진행하고 있다.
- slack_api_chatbot . . . . 13 matches
* Your Apps 메뉴로 가서 Create New App을 클릭합니다.
* 앱 이름과 개발할 워크스페이스를 선택하고 Create App을 클릭합니다.
* Bot Token Scopes 섹션에서 chat:write와 같은 봇 권한을 추가합니다. 이 권한을 통해 봇이 메시지를 보낼 수 있습니다.
* Install App 버튼을 클릭하여 해당 워크스페이스에 앱을 설치합니다.
* 설치 후, OAuth Access Token을 받을 수 있습니다. 이 토큰은 나중에 Python 프로그램에서 사용됩니다. 이 토큰을 안전하게 보관하세요.
메시지를 보낼 채널 ID를 알아야 합니다. 채널 ID는 슬랙에서 채널을 클릭하고, URL에서 채널 ID를 확인할 수 있습니다. 예시:
파일 업로드: 메시지뿐만 아니라 파일도 업로드할 수 있습니다. 예를 들어, 이미지 파일을 채널에 보내고 싶다면 files_upload 메서드를 사용할 수 있습니다.
Markdown 형식 사용: 슬랙에서는 메시지에 Markdown 형식을 사용할 수 있습니다. 예를 들어, *bold*, _italic_, ~strikethrough~ 같은 형식을 사용하여 메시지를 꾸밀 수 있습니다.
- snucl_install_work . . . . 4 matches
서울대 이재진 교수님 연구실에서 천둥이라는 시스템을 운영하기 위해서 opencl와 MPI를 이용한 SnuCL이라는 플래폼을 만들었다.
이번 문서에서는 SnuCL을 설치하고 사용하는 전 과정을 다루도록 한다.
- softmax_activation_function . . . . 11 matches
대표적인 활성 함수(Activation Function)로는 시그모이드 함수를 꼽을 수 있다.
시그모이드 함수의 미분꼴은 아래와 같이 유도해서 얻을 수 있다.
SoftMax 활성 함수는 마지막 output Node에서 Classification을 하고자 할때 사용된다. 기본적으로 두개 이상의 라벨값을 갖을 때 사용하며 output 노드의 출력값을 더하고 그걸로 출력값을 나눠서 사용함으로 출력값을 확률값으로 해석하기 위해서 사용한다.
Loss Function 으로 [:cross_entropy Cross Entropy]를 사용할 경우 Weight 업데이트를 위한 델타값의 계산이 쉽지 않다. 하지만 활성 함수의 미분값을 같이 계산하게 되면 의외로 계산값이 간단해지는 것을 확인 할 수 있다.
시그모이드의 미분값은 \(\frac{\partial f_i}{\partial x_j} = f_i(1-f_i)\delta_{ij}\)임을 이미 알고 있다.
- ssh_config . . . . 6 matches
리눅스에서 ssh를 사용하다보면 윈도우 텔넷 클라이언트 처럼 설정 값을 저장해서 사용하고 싶을 때가 있다.
이때 사용할 수 있는 방법이 자신의 홈 드렉토리 아래에 있는 .ssh 폴더에 config 파일을 추가 하는 것이다.
인증 방법을 설정하게 되면 password를 넣지 않고 접속이 가능해 진다.
== 공개키 인증을 위한 절차 ==
'''ssh-keygen''' 명령을 통해서 생성할 수 있다.
- stock_study . . . . 12 matches
* 피부 마이크로바이옴(Gut & Skin Microbiome) 솔루션 완성을 위한 기술 특허를 확보
* SK 바이오랜드는 프로바이오틱스를 차세대 먹을거리 사업 중 하나로 정하고 지속적인 연구개발(R&D)강화를 통한 사업 기반 조성에 박차를 가하고 있다.
CNT 양극재에 적용하면 기존 카본블랙보다 1/5 사용으로 부피를 줄일 수 있고, 실리콘 음극재의 부피 팽창으로 구조적 안정성이 떨어지는 것을 막아 주기 위해 CNT 도전재 사용 기능, 상용화한 유일한 업체
2009년에도 에너지 기업 로열 더치 쉘은 약 500억달러 규모의 LNG-FPSO 10척을 발주 했지만 10년 동안 1척(30억 달러) 발주에 그쳤다. 이번에도 100척 발주가 정상적으로 이루워질지 의문이다.
발주가 정상적으로 다 이행되지 않을 가능성이 있고 LNG 시장의 가격하락 등에도 영향을 받는다.
'''BPS''' - 회사의 순 자산을 총 주식수로 나눈 값
* 매출 감소로 적대적 M&A를 시도하려는 해외 투가사가 지분을 매각하고 떠남[* https://www.sisaweek.com/news/articleView.html?idxno=131739]
종자생상 수출, 국내 유통은 농업을 통해서 이루워지기 때문에 안정적인 수입
종자 시장: 농우바이오, 서울바이오, 농경, 부농, 신성미네랄, 참그로 순으로 17% ~ 8.7%까지 비슷한 점유율을 갖고 있음.
* 한방이 있는 종목은 아니다 크게 오리진 않을텐데 신제품 출시에 대한 기대가 있음.
반도체, 핸드폰과 연관이 있는 부품주 코로나에 영향을 받음.
- sublime . . . . 5 matches
멀티 플레폼을 지원하는 Text Editer로 많은 기능을 갖고 있고 무료로 사용할 수 있다.
GoTo Anything win: ctrl+p, mac: cmd+p GoTo Anything을 호출한다. 해당기능은 아래서 살펴볼 것이다.
Command Palette win: ctrl+shift+p, mac: cmd+shift+p Command Palette를 호출한다. 명령어로 기능을 실행할 때.
설치 방법은 console 창을 열고 스크립트를 복사해 넣으면 된다.
- svm . . . . 16 matches
일반적으로 직선을 \(ax +by + c = 0 \)로 표시하는데 이것을 두 벡터의 내적으로 표시하면 \( (a, b) \cdot (x, y) + 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]으로 문제를 정의하면 아래와 같이 정의 할 수 있다.
하지만 ''제약식이 등호가 아닌 부등호인 경우''를 '''inequality constraint problem''' 이라 부르고 KKT condition 이라는 라그랑지 승수법에서 추가된 조건을 써야 한다.
이 예산제약상황을 식으로 나타내면
을 풀면 된다.
각각의 미분에서 \(y = 3\lambda,\ x = 5\lambda,\ 3x+5y = 90\)를 얻을 수 있고 각각을 대입해서 \(\lambda = 3, x = 15, y = 9\)로 극대화 값은 135임을 찾을 수 있다.
- svn_opencl_skel . . . . 3 matches
병렬 프로그램의 한 방법으로 Opencl를 쉽게 사용해 보기 위한 방법을 제공하기 위한 프로젝트
1. 모든 프로그램 유형에 맞는 유연한 프레임을 제공
커널소스의 디버깅을 위한 참조 코드
- svn_sunken . . . . 12 matches
svn 서버와 개발환경을 SUNKEN(143.248.156.63)서버로 옮기면서 바뀐 상황에 대해 설명한다.
svn 체크아웃을 받고 나면 일단 권한 설정을 해준다.( 이유는 모르겠지만, 최초에 소스를 올릴때, 윈도우 삼바로 통한 import로 인하여, 권한 설정이 틀어지는거 같다. )
만약 sudo 명령이 안되면 그 서버에 sudoer가 등록이 안되어 있기 때문에 관리자에게 sudoer권한을 얻어야 한다.( 인터넷검색으로 할수도 있음 )
그리고 빌드 할때 make setup을 해주면,
armapp안에 root폴더가 생기는데( 루트파일시스템으로 사용함), 그것도 svn을 통한 권한설정 오류로 인하여
일단은 777권한을 주면 부팅이 된다.( 추후에 특정 파일이나 특정 쉘스크립트에서 로그인 유저명이나 로그인 권한 설정을 알게되면 해결될거 같다.)
그외에는 sun서버에 있을때랑 별반 다를게 없다.
커널에서 NFS로 파일시스템을 마운트 할 경우, 다음과 같은 메시지가 발생하여 부팅을 실패하는 경우가 많다.
위의 메시지 발생시, 커널의 부트 아규먼트에서 다음의 옵션을 추가해 주면 된다.
- tcp_ip_program . . . . 10 matches
네트워크 프로그램을 하기위한 기본(Base) 지식과 간단한 예제를 담기 위한 페이지.
* domain : 생성할 소켓이 통신을 위해 사용할 프로토콜 체계(Protocol Family)를 설정한다. (IPv4, IPv6, IPx ... etc)
* protocol : peer to peer 에서 사용할 프로토콜을 정한다. (TCP, UDP)
소켓이 사용할 프로토콜을 정의 한다.
||PF_LOCAL ||LOCAL 통신을 위한 프로토콜 ||
||PF_PACKET ||Low level socket을 위한 프로토콜 ||
* 에러나 데이터의 손실이 없이 전송 (전용 연결 통로를 이용해서 데이터를 전송하는 것과 같다. 연결 통로에 문제만 없다면 데이터의 순차적 전송을 보장한다.)
* 전송 순서에 상관 없이 가장 빠른 전송을 지향.
인터넷 프로토콜을 사용하고 소켓 타입을 설정하게 되면 그에 해당하는 프로토콜은 하나씩 밖에 존재하지 않기 때문이다.
- ternsorflow_with_tersorRT . . . . 5 matches
이 문서는 NVIDIA CUDA와 TensorRT를 사용할 수 있도록 소스 컴파일을 진행하는 과정에 대한 문서이다.
해당 버전을 받는다. 예로
여러가지 버전과 설치방법으로 설치가 가능하다 본인의 경우 cuDNN Library for Linux를 받아서 압축을 풀고 CUDA가 설치되어 있는 곳에 복사를 했다.[* https://docs.nvidia.com/deeplearning/sdk/cudnn-install/index.html#installlinux]
1. https://developer.nvidia.com/nvidia-tensorrt-5x-download 에서 해당 리눅스 버전과 CUDA 버전을 확인해서 repo package를 받는다.
Python은 system에 설치된 것을 사용하였다. 보통의 경우 Anaconda로 설치해서 사용하는데 TensorRT가 Anaconda 환경에서 빌드가 안 된다는 이야기가 있다. 확인하지는 못 했음.
- test . . . . 11 matches
WikiPediako:위키위키''''''를 처음 시작하셨다면 '''도움말'''을읽고, 위키위키를 배워봅시다!
얼음 방패 상태라면 얼음 방패를 취소하고, 1.마우스오버 2.현재대상에게 동결을 시전한다.
컨트롤키를 누른 상태라면 주시대상에게 동결을 시전한다.
얼음 방패 상태라면 얼음 방패를 취소하며, 현재 시전중인 주문을 중지하고 1.마우스오버 2.주시대상에게 마법차단을 시전한다.
알트키를 누른 상태라면 현재대상에게 마법차단을 시전한다.
얼음 방패 상태라면 얼음 방패를 취소하며, 1.마우스오버 2.현재대상을 변이한다.
알트키를 누른 상태라면 주시대상을 변이한다.
(변이 종류는 변이 뒤 괄호내용을 변경하여 바꿀 수 있다.)
기존 주시대상을 바꾸지는 않으나, 기존 주시대상이 죽은 상태거나, 우군이거나, 존재하지 않은 경우
현재 변이하고있는 대상을 주시대상으로 설정한다.
- test2 . . . . 297 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의 버전을 파악하려고 할때 사용한다.
gcc의 수행 결과 파일의 이름을 지정하는 옵션이다. 위의 예제를 단순히
-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라는 실행파일이 하는 일을 정리해 보면 다음과 같다.
(1) 사용자에게 옵션과 소스 파일명들의 입력을 받는다.
(3) 사용자의 옵션을 각각의 단계를 맡고 있는 실행파일의 옵션으로 변경한다.
(4) 각각의 단계를 맡고 있는 실행파일을 호출(fork, exec)하여 단계를 수행하도록 한다.
C preprocessing을 우리말로 하면 "C 언어 전처리"라고 할 수 있을 것이다. 모든 C 언어 문법책에서 정도의 차이는 있지만 C preprocessing에 대한 내용을 다루고 있다. C preprocessing에 대한 문법은 C 언어 문법의 한 부분으로 가장 기본이 되는 부분이다. C preprocessing에 관한 문법은 모두 '#'으로 시작된다. '#' 앞에는 어떠한 문자(공백 문자 포함)도 오면 안된다. 하지만 대부분의 compiler가 '#'앞에 공백 문자가 오는 경우에도 처리를 한다.
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 언어 소스 코드가 복잡한 선택적 컴파일을 하고 있을 때, 그 선택적 컴파일이 어떻게 일어나고 있는지 알고 싶은 경우.
cpperr.c파일의 4번째 줄에서 ';'가 나오기 전에 parse error가 났다. 하지만 실제 에러는 #define에 있었으므로 그것을 확인하려면 -E 옵션으로 preprocessing을 하여 살펴 보면 쉽게 알 수 있다.
(*) 참고 : 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문법 보다는 배우기 쉽기 때문이다.
- transmission_daemon . . . . 8 matches
설정 파일은 '''/etc/transmission-daemon/settings.json'''이며 데몬이 돌아가고 있을때는 편집이 안 되기 때문에 설정을 수정하기 전에 데몬을 중지 시켜야 한다.
* "rpc-password": "{543d21048c36a0add7d82410fadc6008248e2b73cBW6uECv", // 비밀번호는 그냥 ''plaintext''로 넣으면 암호화 되기 때문에 설정을 저장하기 전에 비밀번호를 다시 기재해야 한다.
* "rpc-username": "transmission", //웹 접속을 위한 아이디
USER 항목을 변경해준다.
이와 관련해서 transmission-deamon 폴더의 사용권한을 변경한다. 또한 다운로드 폴더 권한도 일치 시켜줘야 한다.
여기까지 진행하면 사용자 폴더 아래에 '''.config/transmission-daemon/setting.json''' 가 생성된다. 설정을 다시해줘야 한다.
- upsampling_implementaion . . . . 8 matches
각기 다른 배율의 Resample을 동시에 수행할 수 있는 스트리밍 방식의 Upsampler를 설계하도록 하자.
위에서 만들어진 싱크함수값을 사용하기 좋게 재구성하는 함수.
opencl 관련 설정과 device와 메모리 설정을 초기화 하는 부분
커널과 메모리가 준비 되면 장치에 계산할 데이터를 전달하고 값을 얻어 오기 위한 함수 스트리밍 방식으로 처리 할 수 있도록 장치와를 커넥션은 유지 됨.
소스, 결과, 싱크값, 싱크 사이즈, 소스 사이즈, 배율을 넘겨 받아서 upsampling을 수행하는 single function.
각각의 배율에 맞는 Sinc 값을 구하는 함수
[:upsampling_sinc 싱크 펑션을 사용한 Upsampling with acoustic wave]
- upsampling_sinc . . . . 2 matches
Sinc function (Rectangular function)을 이용한 Upsampling 방법
1) Fourier 변환은 주기적으로 변하는 파형에서 주기 T 가 무한 대로 커질 경우에 Fourier 급수의 계수를 구하는 연산을 말함
- usb_driver . . . . 40 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를 지원한다.
Isochronous Transfer : 일정한 속도로 일정량의 data를 전송하기를 원하는 경우에 사용한다. 이러한 것으로 Stream이 있으며, reliable한 전송을 보장하지는 않습니다. 주로 Audio나 Video의 data를 전송하는 경우 유용합니다. 우리가 사용하는 웹캠도 이러한 종류의 Data Flow를 사용합니다.
- USB나 혹은 다른 PCI device같은 것을 다루게 될 때, device의 configuration을 알기 위해선 device의 descriptor들을 읽어와야 합니다. 이렇게 읽어온 data를 기초로 어떤 device가 연결되었는지를 알 수 있게 되며, 또한 device로 data를 보내고자 할 때, device의 특성에 맞게 data의 양을 조절해 줄 수도 있게 됩니다.
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를 들 수 있습니다.
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해줄때 호출되어집니다.
- USB Driver 역시 위해서 설명한 구조를 가지고 개발 되어집니다. 물론 USB Driver의경우는 init Function에서 USB Device를 만들어 레지스트 해야한다는 특징을 가지고 있습니다. USB Driver의 구조를 알아보죠
probe는 Device가 연결되었을때 Device를 초기화 해주고 통신을 할수있도록 하부 드라이버에 알려주는 역할을 합니다. disconnect는 probe에 생성된 객체들을 release 해주고 Device가 disconnect 되었다는것을 알려줍니다.
// device extentions을 해제해준다
간단히 설명하면 probe에서는 interrupt 방식으로 URB를 만들어 하부 드라이버로 Submit 해줍니다. URB에는 Device로 부터 Data 통신을 어떻게 할것인가를 결정해주는 정보들을 담고 있습니다. 위의 경우는 Interrupt 방식으로 4byte씩 받아 usb_irq Function으로 Callback 해줄것을 요구하는 URB 입니다.
그럼 받아온 Data를 처리하는 부분을 만들어보죠
usb_irq Function에서는 4Byte를 받아서 프린트 해주는 역할을 합니다 .물론 Interrupt 방식이기때문에 이 Function은 Interrupt Interval에 맞춰서 호출 되어지게 됩니다.
여기까지 간단히 USB Driver의 구조에 대해서 알아 봤습니다. 그럼 이러한 모듈을 어떻게 컴파일 할것인지에 대해서 알아보죠
2.4와 2.6 은 컴파일 방법이 조금 다릅니다. 2.6 커널 부터는 module의 경우 makefile을 통해서만 컴파일이 되는것 같습니다.
2.6의 경우는 컴파일 시에 반드시 makefile을 만들어 주어야만 가능한듯합니다.
다음과 같이 makefile을 만들어 컴파일 하면 잘동작합니다.
맺음말 : paper을 쓰다 한번 날려 먹어 더 좋지 않을 글이 되어 버렸습니다. 또한 많이 내용을 짧은 페이퍼 한장에 담기에는 너무 부족하기만 합니다. 인터넷 상에 좀더 많은 자료를 찾아 공부하시면 쉽게 아실수 있을듯합니다.
- vae_gan . . . . 1 match
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 . . . . 49 matches
Variational Inference를 활용한 딥러닝 연구중에 가장 대표적인 연구라면 VAE를 꼽을 수 있다. VAE는 2013년 Kingma et al.과 Rezende et al.[* Diederik P. Kingma, Max Welling. "Auto-Encoding Variational Bayes", <https://arxiv.org/pdf/1312.6114.pdf>. (1 May 2014)]에 의해 정의되었다.
뉴럴넷 관점에서 VAE는 '''encoder''', '''decoder''' 그리고 '''loss function'''으로 구성되어 있다. 뉴럴넷을 설명하는 일반적인 방법으로 __네트워크 모델__을 '''네트워크 구조'''와 이를 학습하기 위한 '''loss function'''을 어떻게 정의하느냐로 설명한다.
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의 합이 된다.
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을 따른다.
분모 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})}\)
Variational posterior \(q(z|x)\)가 진짜 posterior \(p(z|x)\)를 얼마나 잘 근사하는지 어떻게 알 수 있을까? q로 p를 근사할 때 정보 손실을 측정하는 Kullback-Leibler divergence를 사용한다.
왜 이 값을 바로 계산하는게 불가능한가? 귀찮은 evidence p(x)가 식에 나타나기 때문이다.
이 식을 Kullback-Leibler divergence와 합쳐서 evidence를 다시 쓸 수 있다.
Jensen’s inequality 에 의해, Kullback-Leibler divergence 는 항상 0 보다 크거나 같다. 이는 곧 Kullback-Leibler divergence 를 최소화하는 것이 ELBO 를 최대화하는 것과 동치임을 말한다. 요약하자면 Evidence Lower Bound (ELBO) 가 posterior inference 근사를 가능하게 한다. 우리는 더이상 Kullback-Leibler divergence 를 최소화하기 위해 시간을 쓸 필요가 없다. 대신, 우리는 ELBO 를 최대화하므로써 계산 가능한 동치의 일을 수행한다.
\(\mathcal{L}(\theta, \phi;x)\)을 x의 확률인 evidence의 lower bound라고 해서 줄여서 ELBO로 표현한다.
maximum log-likelihood를 구하기 위한 방법으로 ELBO를 최대화 하는 방법을 사용한다. lower bound를 끓어 올림으로서 자연스럽게 log-likelihood의 값도 상승하기 때문이다.
또 다른 방법으로 위 식을 다시 정리하면 아래와 같은 식을 구할 수 있다.
- vi_사용법 . . . . 1 match
taglist.zip을 .vim 디렉토리로 이동하여 압축 해제
- visual_studio_code . . . . 6 matches
빌드 작업 실행은 <cmd + shift + B>로 실행 시킬 수 있는데 이 때 필요한 파일이 tasks.json 파일이다. 이것은 프로젝트별로 존재해야 하며 기본적인 템플릿을 제공하지만 기본적인 문법을 알아야 사용할 수 있다. 기본적인 문법은 아래와 같지만 추가적인 작업을 정의해서 사용할 수 있다.
* '''command:''' 실행 명령어를 적는 항목, 아규먼트와 분리할 수 있는데 이때는 실행할 명령과 '''args'''로 분리해서 적을 수 있다.
* ''"problemMatcher:''' 속성에을 추가해서 컴파일 과정에서 나오는 에러를 볼 수 있도록 할 수 있다.
debug를 실행하기 위해서는 설정이 필요한데, launch.json 파일을 설정해줘야 한다.
- wave_file_header_format . . . . 6 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 는 기본적으로 비압축 포맷입니다. 무슨말인가 하면, 소리나는 그대로 값들을 저장해둔 파일이라고 생각하시면 됩니다.
- 파일 형식을 나타냅니다.
- 이 값이 16 이라면, 2의 16 승개의 레벨로 순간의 음을 나타내겠다는 것이고요.
아래는 다음을 나타낸 그림입니다.
- weight_training . . . . 4 matches
자동차 조차도 시동을 걸고 어느정도 시간이 지나야 몸이(?) 풀리죠.
웨이트 또한 일정 시간동안 가벼운 스트레칭과 함께 약간의 유산소 운동을 해주시는게 좋아요.
적절한 스트레칭은 헬스 전 근육에 산소를 공급하고 활성화 되기 때문에 부상이나 결림, 담 등을 예방할 수 있습니다.
'''POINT''' : 유산소 운동이나 스트레칭만으로 살을 빼면 요요현상이 쉽게 찾아 온다. 웨이트는 필수! 적은 무게로 반복운동
- wiki_server_immigration . . . . 3 matches
지금 사용하고 있는 위키 서버는 내가 원하는 기능을 충실히 실행하고 있고 나에게 모든 것이 마춰져 있는 상태로 쉽사리 바꿀 수 없음.
1. 백업 된 wikixxxxxx.tar 파일을 /var/www(별도의 다른 폴더를 사용해도 상관 없음, 단 httpd.conf 파일의 수정이 필요함) 아래 압축을 풀어 설치 한다.
- wikibackup . . . . 5 matches
아마존 웹 서비스는 free tier를 제공하여 1년 동안 웹 서비스를 사용할 수 있도록 하고 있다. 1년이 지나면 어찌 할까? free tier로 사용하던 것을 유료 전환하게 되면 한달에 약 1만원 정도의 비용이 발생하게 된다. 개인적 목적으로 사용하기 위해서 한달에 만원의 비용을 지불하는 것이 사정에 따라서 달라지겠지만 1년에 약 12만원 정도의 비용이 발생하니 만만치 않은 비용이다.
그렇기 때문에 최소의 노력으로 새로운 계정으로 넘어가서 새로이 free tier서비스를 사용하는 방법을 알아보자.
아마존 콘솔에서 인스턴스 탭으로 가면 사용 중인 인스턴스를 볼 수 있다. 이 중에서 백업할 인스턴스를 선택하고 이미지 > 이미지 생성을 선택하면 이미지가 생성되고 이미지 탭에서 확인 할 수 있다.
생성된 이미지를 보면 권한을 설정할 수 있는데 이때 프라이빗에 AWS 계정 번호를 넣어주면 그 계정 번호에 해당하는 유저가 이 이미지에 대한 접근 권한이 생긴다. 새롭게 생성된 아마존 계정의 번호를 넣어주고 새 계정에서 기존의 이미지로 인스턴스를 생성해서 사용하면 된다.
- windows10_iis_installation . . . . 11 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에서는 제대로 설치되지 않는 부분이 발생하였는데 그 부분을 해결하고 정상적으로 설치하도록 해결하는 방법을 이 포스팅을 통해 소개하고자 합니다
근데 오류 내용이 조금 웃깁니다. IIS 7또는 그 이상의 버전에서 설치하라고 하네요. 근데, 윈도우10에 설치되어 있는 IIS 버전을 한번 확인을 해볼까요?
IIS의 상단 메뉴중에서 '''도움말 > 인터넷 정보 서비스 정보''' 를 클릭해 보면 아래와 같이 IIS의 버전을 확인할 수 있습니다.
당연이 IIS7보다 훨씬 상위 버전이긴한데 설치가 안되는 이유는 간단합니다. 가장 최근에 나온 버전으로 IIS의 Major 버전 설정이 10으로 되어 있었기 때문에 상대적으로 구 버전인 PHP 관리자가 버전을 인식을 못하고 기타 버전으로 인식을 해버리기 때문에 발생한 문제입니다.
- windows_driver_development_env . . . . 84 matches
지난 컬럼에 이어 이번 컬럼에서는 윈도우 디바이스 드라이버 개발 방법에 관한 내용을 살펴보도록 하겠습니다.
디바이스 드라이버 개발을 처음 시작하시는 분들이 가장 많이 하시는 질문은 “ 디바이스 드라이버를 개발하려면 무엇을 어떻게 공부해야 하나요 ? ” 라는 것이다 .
일반 애플리케이션 프로그램 개발을 시작하는 경우에는 자료도 많고 , 주변에 개발자들도 많아서 공부 방법이나 자료들을 쉽게 접할 수 있는데 , 디바이스 드라이버 분야는 개발자들이 많은 분야도 아니고 , 자료도 쉽게 찾을 수도 없다 보니 입문자들에게는 어디서부터 어떻게 시작해야 할지 막막해 한다 . 간혹, 디바이스 드라이버에 열정이 있으신 분들중에는 홀로 무수한 나날을 디버깅과 테스트를 통해 개발의 고수가 되는 경우도 있다.
하지만 , 일반 개발자들은 아직도 디바이스 드라이버 개발을 위해 어떻게 준비를 해야 할지 어려워하는게 현실이다. 그래서 이런 컬럼 에서는 필자가 그 동안 경험하고 느낀 것을 토대로 초보자들도 쉽게 접근할 수 있는 개발 방법들을 소개하려고 한다 .
우선 , 디바이스 드라이버 개발 방법의 내용을 언급하기 전에 여러분이 한 가지 알아두어야 할 사항이 있다 . 이전 1 부 컬럼 에서도 언급했듯이 디바이스 드라이버와 운영체제는 서로 밀접한 관계를 맺고 있다 . 그래서 이번 컬럼에서 다루는 윈도우 디바이스 드라이버 개발 방법이 다른 운영체제들에도 동일하게 적용되지 않을 수도 있다는 것을 참고해서 글의 내용을 이해했으면 한다 .
1. 무엇을 공부해야 하나 ?
응용프로그램 , 웹 프로그래밍 , 게임 등의 프로그램들처럼 디바이스 드라이버도 소프트웨어의 한 종류로 볼 수 있다 . 그래서 일반적인 대학교의 컴퓨터 학과들에서 배우는 알고리즘 , 운영체제 , 프로그래밍 언어 , 자료구조 , 컴파일러 등등의 다양한 지식들을 기본적으로 알고 있는 것은 디바이스 드라이버를 공부하는데 하는데 많은 도움이 된다 .
운영체제 아키텍처 : 다른 프로그램들도 마찬가지겠지만 , 프로그램이 동작하는 기반이 되는 운영체제를 이해하지 않고서는 제대로 된 프로그램을 개발 할 수가 없다 . 그 중에서도 디바이스 드라이버는 운영체제의 커널에서 동작 하므로, 운영체제 구조 및 개념들 ( 메모리 관리 , 스케줄링 , I/O 요청의 흐름 , 동기화 등등 ) 을 제대로 이해해야 개발하는데 문제가 없게 있게 된다 . 하지만 , 윈도우는 리눅스와 같은 Open Source 운영체제가 아니고, 내부 구조가 블랙박스처럼 베일에 싸여 있다보니, O/S 내부 내용을 공부 하려해도 항상 정확한 자료들을 가지고 아니어서 이해하는데 많은 어려움이 있다. 그래서, 이런 경우엔 직접 디버깅을 통해 알아내야 하는데, 이런 부분은 윈도우 운영체제를 이해하는데 어렵게 하는 부분이 되고 있다.
• 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 에서는 이런 어려움을 해결하기 위해 새로운 드라이버 모델을 계속 발전시키고 , 통합하는 과정을 진행하고 있다 .
VxD ( Virtual Device Driver ) : Windows 95/88/ME 에서 사용되는 드라이버 모델로 디바이스 드라이버를 가상화시킨다는 개념을 적용해 드라이버를 만든다 . 확장자는 vxd 로 만들어진다 .
NT Kernel Mode Driver : Windows NT 용 드라이버를 만들기 위한 드라이버 모델로 드라이버 개발을
WDM ( Windows Driver Model ) : 윈도우 디바이스 드라이버를 어떻게 만들어야 한다는 하나의 스펙이라고 볼 수 있다 . 하나의 드라이버 바이너리 파일을 가지고 다양한 윈도우 에서 사용 할 수 있는 드라이버를 만들기 위한 목적으로 만들어졌으며 , 현재 Windows 98/ME/2000/XP/2003/Vista 에서 사용할 수 있다 . 기본적인 개념은 NT Kernel Mode Driver 구조를 바탕으로 만들어 졌으며 , PnP, Power 관리 , WMI 등을 지원한다 .
WDF ( Windows Driver Foundation ) : Windows Vista 가 출시되면서 만들어진 드라이버모델로 WDM 모델에서 발전된 형태이다 . 윈도우 API 프로그래밍을 WDM 에 비유하면 , MFC 는 WDF 해당한다고 볼 수 있다 . WDF 는 크게 두 가지 종류로 나뉘는데 , KMDF ( Kernel-Mode Driver Framework ) 와 UMDF ( User-Mode Driver Framework ) 가 그에 해당된다 .
NDIS ( Network Driver Interface Specification ) : 윈도우에서 네트워크 관련 드라이버를 개발할 때 사용되는 드라이버 모델로 네트워크 드라이버를 좀 더 모듈화 시켜서 쉽게 만들 수 있는 방법을 제공해준다 .
그럼, 현 시점에서는 이렇게 "다양한 드라이버 모델중에 어떤 모델을 공부해야 하나?" 생각이 들것이다.
필자 생각에는 먼저 WDM 드라이버 모델을 공부하라고 말하고 싶다. 이유는 여러분들이 처음 애플리케이션 만들때를 생각해 보면, 처음엔 쉽게 개발을 하기 위해 라이브러리들이 많이 지원되는 MFC 나 비주얼 베이직, 델파이 등을 이용해 프로그램들을 만들었을 것이다. 하지만 이것의 내부 구조 및 원리들을 이해하기 위해서는 API 를 다시 공부 했어야 했다. 이것은 기본적인 원리를 이해하지 못하고는 발전된 개념들을 이해하기 어렵기 때문이다. 그래서 드라이버 모델에서도 API 와 같은 WDM 를 우선적으로 공부하면 드라이버의 기본적인 개념이나 구조를 이해하는데 많은 도움이 될 것이기 때문이다. 그리고나서, 필요에 따라 WDF 를 공부한다던지, 해당 Device Class에 따른 드라이버 모델들을 공부하는 방법을 권한다.
- windows_git_usage . . . . 3 matches
윈도우즈 환경에서 개발을 하지 않아서 생각보다 불편하네요
windows용 git 클라이언트를 설치 했다면 탐색기에서 오른쪽 클릭을 하면 아래와 같은 메뉴가 생성된 것을 확인 할 수 있다.
- windows_util_acronis_true_image . . . . 2 matches
Acronis True image 2011을 기준으로 설명하도록 하겠다.
각각은 별도의 serial 을 갖는다.
- windows_util_xshell . . . . 2 matches
telnet, serial, ssh 등 을 사용할 때 편하게 쓸 수 있는 유틸중 하나가 xshell이다. 근데 설치 하고 제공 되는 색 구성표가 너무 강해서 눈에 피로감을 많이 주고 잘 보이지 않는다.
- work2012_09_list . . . . 4 matches
상섭의 요청으로 single precision Twiddle vector를 생성하는 프로그램을 작성한다.
test.c 파일을 생성하고 double real image 형식의 txt 파일을 읽어 single로 출력 하도록
fft_out()함수 수정, type 옵션을 추가해 Ieee754 포멧과 자연수 포멧으로 출력할 수 있도록 함.
- work2012_10_list . . . . 2 matches
[:FPGA_PSA_Implementation FFT PSA 알고리즘][[footnote(손재주 박사의 FFT PSA 알고리즘을 FPGA에 상에서 구현한 내용을 기술한 문서)]] 문서 작업 시작
- work2013_10_list . . . . 14 matches
심심해서 strace 툴(프로그램이 사용하는 시스템 콜을 보여준다) 을 써봄
ELF조작(?) 해서 gettimeofday 함수 레이블(??)을 바꿔서 어케하면 될까 생각해봄
설마해서 ltrace 툴을 사용해봄
일단 날짜 지났음 새로사삼! 하는 메세지박스가 나온다음에 좀 자세시 출력 한것을 보니 이름이 수상한 녀석 발견!!
1(TRUE) 이면 정상적으로 처리해 hwp를 띠워준다는 사실을 알아냄.
결론적으로 강제적으로 수정해서 HncGetTrialDays함수가 무조건 1을 리턴하게 고치면 될것 같다.
근데.. 이걸 어셈으로 바꿔주는 툴을 또 찾아야겠네요 후...
무슨무슨 함수는 어디어디부터 시작한다는게 어딘가 적혀있을텐데..
구글링하니깐 ELF정보를 보면 좀 알수 있을거 같기도 하다??
자 이제 리턴을 1을 하는 정적 라이브러리를 만들겠습니다아~
그냥 1을 리턴하는 코드 작성~
쫄을필요 없어요! 우린 저 빨간라인(a함수의 위치) 만 알면 되니까요!!
- work2015_02_list . . . . 2 matches
*. ~/work/OpenANN/benchmarks/iris 소스 실행을 위해서 scikit-learn 설치
1. --kNN을 이용한 분류 (벡터 사이의 거리를 이용한 분류)--
- work2015_03_list . . . . 3 matches
*. ~/work/OpenANN/benchmarks/iris 소스 실행을 위해서 scikit-learn 설치
1. --kNN을 이용한 분류 (벡터 사이의 거리를 이용한 분류)--
*. --~/work/OpenANN/benchmarks/iris 소스 실행을 위해서 scikit-learn 설치--
- work2015_08_list . . . . 4 matches
virtualenv 가상의 파이션 환경을 구축하고 사용할 수 있도록 해주는 유용한 어플이케이션
Theano[[footnote(다차원 배열을 사용한 수학식을 정의, 최적화, 풀이하는 Python 라이브러리)]] 설치
열역학이란 열과 일(에너지와 운동)의 관계를 설명하는 물리학이다. 다수의 입자를 다루기 때문에 대학 학부 수준만 되도 통계를 사용하며, 여기에 원자/양자 개념을 도입하면 통계역학이 되기 때문에 통계역학의 전신이라고도 할 수 있다.
- work2015_11_list . . . . 2 matches
* 기계학습법(Machine Learning) 中 하나로 인공신경망을 사용했었는데 2000년대 들어서 Deep Learning이라는 형태로 진화했고 지금은 머신러닝 분야를 드라이빙하는 큰 화두가 되었다.
* 삼성에서 만들었다는 머신러닝 라이브러리[[footnote(https://github.com/samsung/veles)]] opencl을 사용했다는 것이 눈에 뛰는 점이다.
- work2016_012_list . . . . 4 matches
* [http://hakmalyoung.tistory.com/91 예문을 읽자]
* [http://hakmalyoung.tistory.com/92 인터넷을 활용하자]
* [http://hakmalyoung.tistory.com/163 경험을 쌓자]
* [:what_my_Deep_model_doesnt_work 왜 내 딥러닝 모델은 동작하지 않을까?]
- work2016_01_list . . . . 4 matches
* 250개 feature 데이터 중에서 어느것이 분류 성능에 영향을 주는지 확인 하는 작업을 시작 한다.
* pca.cpp file을 만들어서 진행중.
* 가을 LVC Meeting, Glasgow Scotland at the Glasgow Hilton Hotel. (8월 29일 ~ 9일 1일)
- work2016_02_list . . . . 1 match
* 가을 LVC Meeting, Glasgow Scotland at the Glasgow Hilton Hotel. (8월 29일 ~ 9일 1일)
- work2016_03_list . . . . 1 match
* 가을 LVC Meeting, Glasgow Scotland at the Glasgow Hilton Hotel. (8월 29일 ~ 9일 1일)
- work2016_06_list . . . . 4 matches
* [http://hakmalyoung.tistory.com/91 예문을 읽자]
* [http://hakmalyoung.tistory.com/92 인터넷을 활용하자]
* [http://hakmalyoung.tistory.com/163 경험을 쌓자]
* [:what_my_Deep_model_doesnt_work 왜 내 딥러닝 모델은 동작하지 않을까?]
- work2016_07_list . . . . 4 matches
* [http://hakmalyoung.tistory.com/91 예문을 읽자]
* [http://hakmalyoung.tistory.com/92 인터넷을 활용하자]
* [http://hakmalyoung.tistory.com/163 경험을 쌓자]
* [:what_my_Deep_model_doesnt_work 왜 내 딥러닝 모델은 동작하지 않을까?]
- work2016_08_list . . . . 4 matches
* [http://hakmalyoung.tistory.com/91 예문을 읽자]
* [http://hakmalyoung.tistory.com/92 인터넷을 활용하자]
* [http://hakmalyoung.tistory.com/163 경험을 쌓자]
* [:what_my_Deep_model_doesnt_work 왜 내 딥러닝 모델은 동작하지 않을까?]
- work2016_09_list . . . . 4 matches
* [http://hakmalyoung.tistory.com/91 예문을 읽자]
* [http://hakmalyoung.tistory.com/92 인터넷을 활용하자]
* [http://hakmalyoung.tistory.com/163 경험을 쌓자]
* [:what_my_Deep_model_doesnt_work 왜 내 딥러닝 모델은 동작하지 않을까?]
- work2017_02_list . . . . 4 matches
* [http://hakmalyoung.tistory.com/91 예문을 읽자]
* [http://hakmalyoung.tistory.com/92 인터넷을 활용하자]
* [http://hakmalyoung.tistory.com/163 경험을 쌓자]
* [:what_my_Deep_model_doesnt_work 왜 내 딥러닝 모델은 동작하지 않을까?]
- work2017_03_list . . . . 4 matches
* [http://hakmalyoung.tistory.com/91 예문을 읽자]
* [http://hakmalyoung.tistory.com/92 인터넷을 활용하자]
* [http://hakmalyoung.tistory.com/163 경험을 쌓자]
* [:what_my_Deep_model_doesnt_work 왜 내 딥러닝 모델은 동작하지 않을까?]
- work2018_02_list . . . . 4 matches
* [http://hakmalyoung.tistory.com/91 예문을 읽자]
* [http://hakmalyoung.tistory.com/92 인터넷을 활용하자]
* [http://hakmalyoung.tistory.com/163 경험을 쌓자]
* [:what_my_Deep_model_doesnt_work 왜 내 딥러닝 모델은 동작하지 않을까?]
- work2019_12_list . . . . 4 matches
* [http://hakmalyoung.tistory.com/91 예문을 읽자]
* [http://hakmalyoung.tistory.com/92 인터넷을 활용하자]
* [http://hakmalyoung.tistory.com/163 경험을 쌓자]
* [:what_my_Deep_model_doesnt_work 왜 내 딥러닝 모델은 동작하지 않을까?]
- work2020_01_list . . . . 5 matches
* boost-python[* <http://whansunkim.ml/w2/wiki.php/python_c_c++> boost-python 설치하기] 컴파일시 boost-numpy을 빌드하지 못하는 문제 발생(모든 컴파일러에서 비슷한 증상 보임)
* booststrap.sh을 사용해서 설정파일을 생성하면 ''project-config.jam'' 파일이 생성 되는데 생성된 파일을 열어서 실제 설정값이 잘 들어 갔는지 확인해봐야 한다. 설정값이 정상적이지 못하면 문제가 발생한다.
https://hub.docker.com/에서 필요한 이미지를 검색하고 그 이미지로 부터 필요한 것들을 추가 하는 방식으로 만들어 사용하면 된다.[* <https://sylabs.io/guides/3.5/user-guide/build_a_container.html> Container 빌드하기]
- work2020_02_list . . . . 2 matches
아래와 같이 GPU 이름과 사용할 수 있는 메모리 용량이 보이는 것을 확인 할 수 있다.
* psd를 구하는 방법 fft를 적당한 window를 설정해서 수행하고 평균을 구함. (10초 윈도우를 잡고 fft)
- work2020_03_list . . . . 2 matches
아래와 같이 GPU 이름과 사용할 수 있는 메모리 용량이 보이는 것을 확인 할 수 있다.
* psd를 구하는 방법 fft를 적당한 window를 설정해서 수행하고 평균을 구함. (10초 윈도우를 잡고 fft)
- work2020_04_list . . . . 5 matches
* 타 분야의 연구자에서 본인의 연구 내용을 잘 전달하기 위한 연습으로 활용
* 백그라운드는 보려고 하는, 관심 있는 신호를 제외한 모든 신호를 백그라운드라고 한다. 보려고 하는 신호가 transient하다는 조건에서 모든 신호의 평균에서 얼마나 벗어나 있느냐를 보고 변화가 생김을 찾는 방식에서 가능한 방법이다.
* 신호의 전체적인 통계량이 변했다면 psd를 다시 계산해야 한다. 신호가 전반적으로 변화한 것이 이벤트(관심있는 사건)에 의해서 변화한 것이 아니라 환경이나 조건이 변했을 가능성이 있음.
* 순차적으로 계산 흐름을 정리하고 function으로 분리(1일)
* [:mamory_leak_valgrind 메모리 릭을 점검하는 방법]
- work2020_05_list . . . . 6 matches
* --순차적으로 계산 흐름을 정리하고 function으로 분리(1일)--
* 파일별로 시간 영역 추출하기 --> 시간에 따른 데이터 분류보다 델타파를 이용한 실제 수면 구간 분리가 합당해 보여 프로젝트의 방향을 변경함.
- AMR Linear Interpolation function 구현 ||- 오리지널 함수가 있을 경우 중간값을 계산해서 넣을 수 있는 기능 추가
* [:mamory_leak_valgrind 메모리 릭을 점검하는 방법]
- work2020_06_list . . . . 2 matches
* 파일별로 시간 영역 추출하기 --> 시간에 따른 데이터 분류보다 델타파를 이용한 실제 수면 구간 분리가 합당해 보여 프로젝트의 방향을 변경함.
* dictation.io/, 구글 드라이브 문서 둘다 음성을 텍스트로 작성해줌.
- work2020_07_list . . . . 7 matches
* 파일별로 시간 영역 추출하기 --> 시간에 따른 데이터 분류보다 델타파를 이용한 실제 수면 구간 분리가 합당해 보여 프로젝트의 방향을 변경함.
|| 화 ||- 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 ||
* 대전광역시체육회[* http://www.djsc.or.kr/]에서 꿈꾸는 스포츠교실을 운영함.
- work2020_08_list . . . . 2 matches
* 파일별로 시간 영역 추출하기 --> 시간에 따른 데이터 분류보다 델타파를 이용한 실제 수면 구간 분리가 합당해 보여 프로젝트의 방향을 변경함.
* 대전광역시체육회[* http://www.djsc.or.kr/]에서 꿈꾸는 스포츠교실을 운영함.
- work2020_09_list . . . . 1 match
|| 수 ||- Hawkes Process 네트워크 해석을 위한 예제 코드 작성, x -> y 관계 ||- 3층 서버 하드디스크 추가 후 기존 레이드 속도 저하 문제 제기로 시스템 점검 및 hdparm으로 실제 데이터 전송 속도 확인 작업 수행 ||
- work2020_10_list . . . . 1 match
|| 월 ||- 읽을 논문 정리[[br]]- Networkx 코드 작성 ||- 개소 기념 행사 ||
- work2020_11_list . . . . 1 match
* HydroDynamics 예제로 전환 다차원 데이터 연산을 위한 데이터 타입 선언
- work2021_07_list . . . . 1 match
|| 월 ||- LIGO MOU 갱신을 위한 회의 || ||
- work_mmpc_u_boot . . . . 2 matches
U-Boot를 분석해서 nand에 param을 저장하는 메카니즘을 알아 내고 리눅스 상에서 수정할 수 있도록 해보자
- work_multicast . . . . 12 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는 설치 될 위치를 정의 하는 것이다. 장치를 기준으로 해야 한다. 설치 위치를 기준으로 동작하기 때문에 경로를 잘 못 입력하게 되면 포팅하고 엉뚱한 곳을 참조 할 수 있다. 호스트에 설치하고 타겟으로 복사하는 방법으로 포팅하길 바란다.
.txt 파일들이 ASN1에 맞추어 작성된 MIB 들이다. 이것 들을 참조해서 새로은 mib를 추가해 보자
vs.c, vs.h 파일이 생성 된 것을 확인 할 수 있다.
생성된 파일을 수정해서
agent/mibgroup 폴더에 넣고 아래와 같이 configure를 수행하면 자동으로 Makefile을 업데이트 해준다.
snmpd.conf 파일을 잘 작성해야 snmp가 정상 동작한다.
# 부분만 주석을 달아 놓았다.
# SNMP 보안에 관한 설정을 한다.
# SNMP는 인증과 접근 방침을 정하는 낮은 단계의 보안을 제공한다.
# 정의에 대해서만 설명을 하기로 하겠다.
# 인증, 접근 방침등의 특성을 정의하는 하나의 에이전트와 여러 매니져 사이의
# 또한 community의 이름은 패스워드의 역할을 하므로 매니저로부터의 모든
# 메시지는 이 이름을 포함해야만 한다.
# 각각의 community마다 MIB에 대한 접근을 각각의 다른 형태의 권한으로 제어
# community마다 다른 SNMP MIB 관점을 가질 수 있음)에 의한 방법과 SNMP 접근
# 모드(각 community에 대한 접근 모드로 READ-ONLY나 READ-WRITE 중 한 값을
# community 에 정한 이름을 sec.name으로 맵핑한다.
# sec.name과 아래서 설정하는 그룹, MIB 객체에 대한 제한을 합하여 실질적인
# 접근 권한을 주게 된다.
# community pcharley는 로컬 호스트와 특정 아이피에서만 접근을 할 수 있으며
- ws_discovery . . . . 9 matches
ONVIF 에서는 WS-Discovery (Web Services Dynamic Discovery) 표준을 기반으로 한 장치 검색 (Device Discovery) 웹 서비스를 사용합니다. WS-Discovery 표준의 특정 부분을 확장하거나 제약하여 사용하기 때문에 WS-Discovery 와 완벽하게 호환되지는 않습니다.
NVC 는 장치 검색을 통해 사용 가능한 NVT 를 검색합니다. NVT (''Network Video Transmitter'') 는 WS-Discovery 의 Target Service 역할에 해당하고, NVC (''Network Video Client'') 는 WS-Discovery 의 Client 역할에 해당합니다. 장치 검색에서는 Ws-Discovery 의 DP (Discover Proxy) 를 확장하여 보다 복합한 네트워크 상황도 처리할 수 있습니다. WS-Discovery 와는 달리 NVC/NVT 는 DP 역할은 하지 않습니다. endpoint reference 에 URN:UUID 를 사용합니다.
* Discoverable – 기본 모드로 일반적인 Target Service 처럼 동작합니다. 네트워크에 참여하거나 메타 데이터 변경 시 메시지를 보내며, Probe 와 Resolve 메시지를 Listen 하고, 그에 대한 응답을 보냅니다.
* HELLO : 단방향 메시지로, Target Service 가 네트워크에 참여하거나 메타 데이터를 변경했을 경우에 보낸다.
* Probe : Client 가 Type 과 Scope 에 해당하는 Target Service 를 찾을 때 사용한다.
* Resolve : Client 가 이름으로 Target Service 를 찾을 때 사용한다.
장치 검색에서는 보두 복잡한 네트워크 환경에서도 동작할 수 있도록 하기 위해 WS-Discovery 의 Discovery Proxy(DP) 를 확장하여 사용합니다. WS-Discovery 에서 NVC 와 NVT 가 같은 네트워크 도메인에 존재하지 않으면, NVC가 멀티 캐스트 Probe 메시지를 통해 NVT 를 찾을 수 없습니다. 장치 검색의 DP 는 다음과 같은 네트워크 상황에서도 검색을 지원합니다.
- wskim . . . . 4 matches
'''좀 더 나은 삶을 위해'''
1. 여행 통장을 따로 만들자
1. 가족을 위한 요리를 하자(특별하면서 즐거운 시간)
1. 차에 메모할 수 있는 노트와 팬을 두자 ||
- wskim-자기소개 . . . . 40 matches
맞벌이를 하시는 부모님 때문에 유년시절을 시골 할아버지 댁에서 보냈습니다. 농사일을 하시는 조부모님은 바쁜 농사일에도 무척이나 절 귀여워 해주셨습니다. 집 앞 큰 나무에 그네도 만들어 주셨고 자연에서 얻을 수 있는 많은 것들을 알려 주셨습니다. 지금 생각해 보면 도시 아이들 보다 더 많은 것을 자연에서 얻으면서 풍족하게 유년시절을 보냈습니다. 시골 할아버지 댁에서 즐거운 유년시절을 보내고 초등학교를 입학하기 위해서 부모님이 계신 천안으로 오게 되었습니다. 저희 부모님은 자유방임의 교육철학으로 저에게 공부를 강요하시지 않으셨으며 제가 하고자 하는 것을 적극 지지해 주셨습니다. 우리 아들을 믿는다는 말씀과 김박사라는 호칭으로 모든 것을 대신 하셨던 것 같습니다. 김박사는 제가 어릴 적 저희 집에서 불리던 호칭입니다. 왜 그렇게 불려주셨는지는 모르지만 저희 집안에서는 저는 김박사였습니다.
시골에서의 유년시절과 자유로운 분위기의 집안 분위기 때문인지 저는 자유로운 사고와 풍부한 상상력을 갖고 있습니다. 저의 자유로운 사고는 인간관계에 있어서도 남을 이해하고 좋은 관계를 유지 하는데 많은 장점으로 작용 합니다. 하지만 저의 엉뚱한 상상력은 때로는 다른 사람으로 하여금 저를 이상한 사람처럼 보이게 할 때도 있습니다. 엉뚱하고 재미 있는 사람, 하지만 선하고 친절한 사람으로 저를 만드는 요소 입니다.
또한, 저는 호기심이 많고 무언가 만드는 것을 좋아합니다. 초등학교 3학년 때 처음 컴퓨터를 접하게 되면서 컴퓨터에 대한 호기심을 갖게 되었습니다. 1년쯤 컴퓨터 학원을 다니면서 학원에서 배울 수 있는 모든 과정을 마스터 했습니다. 제가 만든 보안 프로그램을 갖고 중고등부를 대상으로 한 컴퓨터 경진 대회에 참가하기도 했습니다.
저는 주워진 환경과 일을 즐기면서 하려고 합니다. 나로 하려금 주변이 즐거워 지고 개선 되는 것에 즐거움과 성취감을 느낍니다. 대학교 2학년을 마치고 호주로 워킹홀리데이 비자를 받아서 여행을 떠났습니다. 비행기표와 현금 70만원을 들고 떠난 여행이라서 여행이 풍족할 수 없었습니다. 그 때문에 흔희 말하는 관광이라기 보다는 일과 여행을 병행할수 밖에 없었습니다. 한식당에서 웨이터로도 일을 하고 공장에서 책도 만들어 보고 각종 농장에서 일도 해보면서 호주 반바퀴를 돌았습니다. 힘들고 고된 순간도 있었지만 많은 외국인 친구들을 만나고 대화 하고 일을 하면서 언제나 에너지 넘치는 한국 사람으로 불렸습니다.
대학을 진학하면서 어릴적부터 다니던 성당에서 교리 교사로 3년간 일을 하게 되었습니다. 교리 교사는 주말에 성당에서 아이들 미사 지도와 교리공부를 도와 주는 일을 하고 여름방학이 되면 아이들을 인솔해서 여름신앙 캠프를 떠나게 됩니다. 여름신앙 캠프는 2박3일에서 3박4일 일정으로 이루워 지게 되는데 초등부와 중고등부로 나뉘어 진행합니다. 모든 일정과 프로그램의 작성뿐만 아니라 아이들 인솔까지 모두 교사의 책임이기 때문에 많은 준비와 책임감이 필요한 일 입니다. 3년 동안 교리 교사로서 아이들 교리를 가르치고 캠프를 준비하면서 많은 인원을 인솔하고 프로그램을 진행할 수 있는 기술을 배울 수 있었습니다.
10년후의 나의 모습은 지금과 같은 엔지니어로 일을 하고 있을 것을 기대하고 그렇게 하려고 합니다. 나이에 무관하게 왕성한 연구활동을 할 수 있었으면 합니다. 도퇴되지 않고 시대를 리딩할 수 있는 룰을 만들어 가는 힘이 있는 사람으로 성정해 있기를 원합니다. 그러기 위해서 지금은 낮은 자세로 아래로 위로 많은 것을 배우고 수용하는 자세로 모든 업무에 임하겠습니다.
(앞으로의 회사생활과 개인생활에 대한 자신의 모습을 설계하여 기술하시오)
- wskim_atrix_customrom . . . . 6 matches
모토로라 홈피에서 받을 수 있음.
공장 초기화랑은 다른 것으로 휴대폰의 정보를 지우는 것을 말한다.
루팅은 root 권한을 얻는 과정을 말한다. root권한을 얻으면 시스템 설정이라든지 제조사에서 넣은 각정 어플들을 제거할 수 있다.
- wskim_banghee_daily . . . . 1 match
1. 서래마을 야마짱 (4시 이후 오픈)
- wskim_banghee_sick . . . . 21 matches
특히 평소보다 심한 생리통은 20대 여성에게 많이 생기는 '''자궁내막증의 전조증상'''일 수 있다. 생리와 관련된 증상에 따라 각각 어떤 질환을 의심할 수 있는지에 대해 알아보자.
'''참을 수 없는 생리통, 뾰족한 수는 없을까?'''
한 통계에 따르면 우리나라 여성 중 75% 정도가 생리통을 겪으며, 그 가운데 20%가량은 일상생활이 힘들 정도의 심한 생리통을 앓고 있다고 한다. 여자이기에 어쩔 수 없는 숙명으로 받아들이고 그냥 넘기기엔 생리의 고통이 너무 크다. 생리통의 다양한 증상에 따른 치료법과 극복법을 알아보자
여생의 생리 상태는 전신 건강을 가늠하는 지표다. 여성미한의원 조선화 원장은 "기혼 여성이 갑자기 생리통이 생기고 생리양이 많아지는 경우가 있는데, 자국근종이나 자국내막증 등 자국내질활을 의심할 수 있다. 특히 자국내막증환자의 30%~40%는 불임으로 진행될 수 있어 조기에 발견해 치료하는 것이 중요하다. 미혼여성의 경우 생리에 문제가 있고 통증이 있다면 자국 정밀 검사를 한 뒤 적절한 치료를 해야 한다"고 말했다.
생리통을 호소하는 환자 대부분이 ''원발성 생리통''이다. 어떤 특별한 진환에 의해 나타나는 통증이 아니므로 심각하게 걱정할 필요는 없다.
하지만 틍증이 심하면 이야기는 달라진다. 무조건 참기만 한다고 해결되는 것은 아니다. 생리시 우리 몸ㅁ에서는 생리혈이 잘 배출될 수 있게 '프로스타글라딘'이라는 유사 호르몬이 분비된다. 배란 직후에 분비되는 이 호르몬은 자국근육을 강하게 수축시킨다. 이때 생리혈을 배출하기 위한 근육수축운동이 너무 강하다보니 심한 통증이 발생하는데, 이게 바로 생리통이다.
생리통은 아랫배가 묵직한 느낌이거나 약간의 통증을 동반한다. 심한 사람은 출산때와 유사한 통증을 겪고, 허리와 골반의 뻐근한 통증, 오심(신물이 올라오는 현상)과 구토, 실신을 하는 이들도 있다. 함기 힘든 정도의 생리통에 시달리고 있다면 진통제보다는 자궁 수축을 유발하는 물질의 생성을 억제하는 약물치료를 받는다. 생리시 2~3일 정도 '''비스테로이드성 소염 진통제'''를 복용하는 치료로 3~6개월 정도면 효과가 나타난다.
평소 생리통이 없다가 갑자기 생긴 생리통, 혹은 참기 어려운 통증이 계속 된다면 자궁 질환에 의한 ''속발성 생리통''일 수 있다. 이 경우에는 원인 치료가 필요하다. 일반적으로 성인이 된 이후 한번도 빠짐 없이 생리통을 겪고 그때마다 심한 통증에 시달린다면 '''자국내막증'''을, 생리통이 있으면서 과다월경이 반복되면 자궁근종을 의심해본다. 생리통이 심하다면 진통제로 매달 그냥 넘기기보다는 한 번쯤 산부인과 검진을 받아 본다. 특히 자국내막증과 같은 질환을 방치하면 불임으로 이어질 수 있으니 특별한 관심이 필요하다.
- wskim_house . . . . 3 matches
건물과 수영장이 붙어 있어서 좀더 아늑하고 신비한 공간을 연출해주고 있다.
수영장과 거실을 연결하는 통로도 인상적이다.
수영장의 벽 일부를 유리벽으로 처리해서 색다른 즐거움을 주고 있다.
- wskim_recipe_soy_sauce . . . . 16 matches
꼬리찜에 들어가는 맛 간장을 만들어 보자
맛간장을 만들때 가장 먼저 만들어야 하는것이 야채 졸인물이랍니다.
맛간장을 만들때, 가장 귀찮은 작업이지만 한꺼번에 많이 만들어 냉동했다가 그때그때 꺼내쓰면,
양파 100g,생강 10g,마늘 15g,통후추 1/2T을 사진과 같이 썰어 준비합니다
냄비에 위의 재료와 물 1C을 넣고 끓기시작하면 약불로 줄여 물이 1/2C이 될때까지 졸여줍니다
냄비에 간장 1리터,흰설탕 500g,야채졸인물 1/2C을 넣고 끓입니다
냄비의 재료가 부글부글 끓으면 청주 (정종) 1/2C,미림 3/4C을 넣어주세요
'''Tip''': 저는 정종대신 화이트와인을 썼는데요
다른요리에도 정종대신 화이트와인을 쓰는데 큰무리는 없는듯 하더라구요.
정종,미림이 끓으면 불을끄고 냄비에 넣고 뚜껑덮어 12시간 놔둡니다
오늘 본 사진은 2배 양을 만든것입니다.
한번 만들때 귀찮치만 일단 만들면, 두고두고 잘먹는 맛간장을
생각보다 간단한걸 알 수 있을꺼예요
앞으로 맛간장을 이용한 음식을 많이 올리려고하니
맛간장으로 맛을낸 - 닭볶음탕
- wskim_recipe_꼬리찜 . . . . 21 matches
에서 소개 하고 있는 꼬리찜 만드는 법을 정리한다.
한국 정육점에서 산 꼬리 1.3Kg가 한국돈으로 약 20000원 정도하니 먹을 만 하지요 ? ^^
꼬리는 찬물에 1시간 정도 담궈서 핏물을 뺍니다
냄비에 물을 넉넉히 붓고 팔팔 끓으면 핏물뺀 꼬리를 넣고
이 과정을 해줘야 불순물들이 많이 제거가 된답니다
물을 넉넉히 붓고
육수에 생긴 기름을 제거 합니다
이런 과정을 거치지 않고 그냥 꼬리찜이나 갈비찜을 하게되면
기름이 둥둥 뜬 느끼~한 꼬리찜을 먹게되니
나중에 국물이 없을때까지 졸일꺼기 때문에
20분 정도 팔팔 끒으면 맛간장 10T을 넣어줍니다
보통 고기 100g당 맛간장 1T을 넣어주면 되는데
꼬리는 유난히 뻐가 크기때문에 꼬리의 무게보다 적은 양을 넣어주는게 좋아요
맛을 봤을때 싱거워야해요
그래야 국물이 다 졸았을때 맛이 있거든요
국물이 거의 다 졸았을때 싱거우면
그때 맛간장을 더 넣어도 늦지 않답니다 ^^
고기가 어느 정도 끓을동안
저는 아이들이 익은 당근을 잘 안먹어서 안넣고
- wskim_trainning_eat . . . . 10 matches
1. 운동 중엔 음식물을 먹지 않는다.
(음식물을 소화 시키기 위해서 에너지를 소모하기 때문에 운동에 필요한 에너지를 빼앗기게 된다.)
1. 운동 후 클리코겐을 보충하기 위해서는 [:wskim_trainning_eat#s-5.1 글리세믹 수치¹]가 높은 바나나, 딸기, 사과, 연두부, 두유, 달걀 반숙 등을 먹는게 좋다.
1. 수분 보충을 위해서 농도가 진하지 않은 꿀물, 주스등을 마시는 것이 좋다.
글리세믹 지수(혈당 지수)는 포도당(100)을 기준으로 했을 때 상대적으로 에너지화 되는 정도를 나타낸 것이다.
* {{{{color: rgb(255, 1, 1); font-size: 13px;} 폭발적이고 지속적인 운동을 위해서 GI가 높은 음식과 낮은 음식을 썩어 먹는다! }}}
- wskim_경력 . . . . 20 matches
* 개발 방법 : UML을 도입하여 Top-Down 방식의 순차 적인 개발
본 과제의 목표는 기존 WiMAX나 통신 프로토콜이 SoC로 개발 되고 있는 것에 반해 RF를 제외한 모든 기능 블럭을 Software로 개발함으로 유지보수와 확장이 용이한 솔루션을 제공하는 것을 과제의 목표로 합니다.
개발 과정은 UML을 도입하여 RA(Require Analysis), SA(System Architecture), SD(System Development) 3단계로 이루워지는 개발 절차를 거쳐 개발 되었습니다.
* '''RA 단계'''는 요구사항을 분석하는 단계로 IEEE 802.16e( WiMAC 표준) 표준을 분석하여 개발 scope를 결정하고 System Feature를 정의 하는 단계 입니다.
* '''SA 단계'''는 RA 과정에서 결정된 System Feature와 요구 사항을 만족하기 위한 시스템을 설계하는 단계 입니다. 설계 단계에서는 Target Platform과 OS를 결정하고 전체 시스템의 뼈대와 외형을 결정하게 됩니다. 이 과정에서 많은 것들이 결정 되게 되는데 앞으로 진행할 SD 과정에서 혐업을 위한 coding scheme과 버전 관리 방법등을 결정하게 됩니다.
* '''SD 단계'''는 SA 단계에서 도출 된 System을 실제 구현 하는 단계 입니다. 앞서 거친 RA와 SA과정에 충실했다면 단순 코드 작업에 해당 하는 단계입니다. 하지만 요구사항이 추가 되거나 구조설계의 문제가 발생한다면 이전 단계로 Rollback하게 됩니다.
이 과제는 다른 과제와 다르게 UML과 체계화된 개발과정을 엄격하게 지키면서 개발을 진행했던 과제로 실제 코딩보다는 많은 회의와 설전이 오고 갔던 것이 기억에 많이 남습니다.
외부 업체에서 하드웨어 설계 및 보드 제작 후 하드웨어 검증 및 드라이버 작업과 어플리케이션을 구현하는 과제 입니다.
Network을 통해 비디오 오디오 스트리밍이 가능한 카메라 솔루션 개발 및 카메라를 제어하기 위한 Windows Application 개발(CMS)
외부 업체에서 하드웨어 설계 및 보드 제작 후 하드웨어 검증 및 드라이버 작업과 어플리케이션을 구현하는 과제 입니다.
Linux 기반으로 작업 했으며, UBL, U-Boot 포팅과 Linux kernel과 filesystem을 구성하여 구동하게 했습니다.
* RTSP 스트리밍을 위한 media server 구성
- wskim_국화차 . . . . 21 matches
약은 그것을 필요로 하는 사람에겐 약이지만 그렇지 않은 사람에겐 독이 될 수도 있습니다(물론 독성의 차이는 있습니다).
그래서 한의학에서는 다른 장부를 보호하는 다른 약재를 같이 처방하여 약재의 작용을 조절합니다.
약재를 충분히 이해하고 있는 한의사의 처방에 의하여 약을 복용하시는것이 안전한 이유입니다.
없는지 생각해 볼 필요가 있을것 같습니다.
국화는 차가운성질을 가지고 있으며 풍열을 없애주고, 간의 양기가 상승하는것을 내려 평안하게 하고,간의 열을 내려주며,
눈을 밝게하고, 열을 내리고 해독하는 작용이 있습니다.
일반적으로 백국화는 간에 주로 작용하는데 간기상승을 억제하며 눈을 밝게 하는 작용이 있어 간기상승으로 인한 어지럼증
이나 눈이 빨갛게 충열되고 안구통증이 있을때(즉,고혈압과 같은 증상.실제로 백국화는 고혈압과 동맥경화에 효과가 좋음)
사용되어지고, 황국화는 풍열을 없애주는 작용이 있어 풍열감기나 온병초기에 사용됩니다. 들국화는 다른국화보다 차가운
성질이 제일 강하여 열을 내리고 독을 풀어주는 작용이 있어 부스럼,종기등에 사용됩니다.
위에서와 같이 국화는 솟구쳐 오르는 기를 내려주고, 차가운 성질이 있어 열을 내리는 작용을 주로 하게됩니다.
발란스가 장애를 받을 것입니다.
배속이 차가워서 따뜻한것을 주로 찾는 사람들이나 손발이 차가운 사람 등은 잘 마시지 않습니다.
평소 국화차를 드실때에는 백국화를 이용하시는것이 좋고, 풍열감기나 편도선염,몸에 종기등이 났을때와 같이 청열해독이
- wskim_살다보면만나지는인연 . . . . 4 matches
한번을 보면 다 알아버리는 그 사람의 속마음과
보듬어 주기엔 서로가 상처받을 것 같고
그런 하나 하나에 마음을 둬야 하는 사람
그렇게 닮아버린 사람을 살다가
- wskim_업적 . . . . 2 matches
1. 한국정보과학회 2006 가을 학술발표논문집 제33권 제2호(D), 2006. 10
1. 김환선; 이병주; 이승형; 최웅철; 전광수, 2006, “Ad hoc 네트워크에서 TDMA의 전송성능 향상을 위한 타임슬롯의 동적 할당”, 한국정보과학회 재33권 2호, pp228~231
- wskim_여행정보_태국 . . . . 3 matches
방콕에서 BTS 일일권(120바트)을 끊을지 그냥 다닐지 애매할 때 한 번 보세요 : )
보통 장기체류가 아닌 여행자라면 1회권(Single Journey Ticket)을 이용하게 된다.
- zeroconfig . . . . 1 match
Zeroconf 는 네트워크 스스로가 설정을 할 수 있도록 해주는 프로토콜과 툴들의 모음이다.
- 김환선 . . . . 51 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 학교를 열기도 했습니다.
* 김환선, 이병주, 이승형, 최웅철, 전광수, “Ad hoc 네트워크에서 TDMA의 전송성능 향상을 위한 타임슬롯의 동적 할당”, 한국정보과학회 재33권 2호, pp228~231 2006년 10월
- 리눅스드라이버 . . . . 12 matches
리눅스 드라이버를 만들어 추가하고 컴파일 하는 방법에 대한 설명을 한다.
드라이버는 작성하고 그것을 커널과 함께 컴파일 하기 위해서는 몇 가지 과정이 필요하다.
Makefile의 작성은 계층적인 구성을 갖는다. 각 드렉토리마다 하나의 Makefile과 Kconfig 파일을 작성한다. 만약에 서브 드렉토리가 있다면 드렉토리에 대한 설정을 현 드렉토리에서 처리하지 않고 서브 드렉토리에서 처리 할 수 있도록 설정해 준다.
위 예제처럼 서브 드렉토리가 somthing, anything, wskim 이렇게 3개가 있다고 했을때 처리 방법이다.
''설제 컴파일 될 오브젝트가 같은 드렉토리에 있을때는 오브젝트를 넣어준다.''
{{{{color: rgb(255, 1, 1); font-size: 13px; font-weight: bold;}플렛폼에 따라 각기 다른 디렉토리에 있는 Kconfig 파일을 참조하게 되는데 arm 플렛폼을 사용할 경우 /arch/arm/Kconfig 의 내용을 참조한다.}}}
* module_init() 매크로는 모듈 목적 코드에 모듈 초기화 함수가 있는 곳을 알려주는 특별한 섹션 정보를 첨부한다. 이 정의가 없으면 커널은 초기화 함수를 결코 호출하지 않는다.
__exit 수정자는 모듈 제거용으로만 코드를 사용하라는 표시이다. 컴파일러는 코드를 특수 ELF 섹션에 둔다. 모듈을 커널 내부에 들어가도록 직접 빌드했거나 커널 설정에서 모듈 제거를 허용하지 않은 경우 제거 함수는 버려진다.
- 리눅스의구조 . . . . 65 matches
다음은 리눅스 커널 2.6에서 지원하는 (x86을 제외한) 임베디드 프로세서 아키텍처들이다.
HAL은 다음과 같은 하드웨어 요소들을 지원한다.
리눅스의 메모리 관리자는 하드웨어 메모리 자원에 대한 접근을 제어하는 책임을 맡고 있다.
리눅스 스케줄러는 멀티태스킹을 지원하며 실시간 스케줄링 정책을 지원하기 위해 계속 발전되고 있다.
* '''사용자 프로세서''': 각각의 사용자 프로세서는 가상 메모리 기능으로 인해 자신만의 주소 공간을 갖는다. 이들은 인터럽트, 예외, 시스템 콜을 통해 커널 모드로 진입할 수 있다. ''프로세스가 커널 모드로 진입하면, 원래와는 다른 스택을 이용한다는 것에 주의하자.'' 이것을 커널 스택이라 하며, 각 프로세서는 자신만의 독자적인 커널 스택을 갖고 있다.
* '''사용자 쓰레드''': 쓰레드는 하나의 사용자 프로세스로 매핑된 또 다른 실행 개체이다. 사용자 공간의 쓰레드는 동일한 텍스트, 데이터, 힙 영역을 공유한다. 또한 열려 있는 파일 목록, 시그널 처리 함수 등의 자원은 공유되지만 스택 영역은 별도로 존재한다.
리눅스에서는 다양한 종류의 파일 시스템들이 VFS(Virtual File System)라는 계층을 통해 관리 된다. VFS는 시스템상의 다양한 장치들에 저장된 데이터를 일관적인 형식으로 바라볼 수 있도록 해 준다.
이것은 특별히 파일 시스템을 필요로 하지 않는 실시간 운영체제와 구분되는 특징이다.
모든 리눅스 시스템은 루트 파일 시스템과 함께, 임베디드 시스템을 위한 플래시나 ROM기반의 늑수 파일 시스템을 지원한다. 또한 호스트상의 파일 시스템을 임베디드 시스템 Target에 마운트 할 수 있는 NFS(Network File System)와 임베디드 시스템에서 유용하게 사용되는 메모리 기반의 파일 시스템에 대한 지원도 포함 된다.
리눅스의 IO서브시스템은 시스템상에 존재하는 장치들에 대해 단순하고 통합적인 인터페이스를 제공한다. IO 서브시스템은 다음과 같은 장치들을 지원한다.
* 순차적인 접근이 필요한 장치들을 지원하는 문자 장치(Character device)
* 임의적인 접근이 가능한 장치들을 지원하는 블록 장치(Block device). 블록 장치는 파일 시스템을 구현하는 기본이 된다.
* 여러 링크 계층 장치들을 지원하는 네트워크 장치(Network device)
리눅스의 가장 큰 장점 중의 하나는 다양한 프로토콜을 지원하는 강력한 네트워킹 기능이다.
리눅스의 IPC(Inter-Process Communication, 프로세스 간 통신)는 (비동기 통신 방식인) 시그널과 파이프, 소켓은 물론 공유 메모리, 메시지 큐, 세마포어와 같은 System V의 IPC 메커니즘을 포함한다.
리눅스의 사용자 공간은 다음과 같은 개념들을 기본으로 한다.
* '''가상 메모리''': 프로세서별로 각각의 주소공간을 갖도록 해준다. 가상 메모리는 공유 메모리와 같은 고급 기능들을 이용할 수 있도록 한다. 각 프로세스는 가상 메모리상에 자신만의 고유한 메모리 맵을 가지며, 이는 커널의 메모리 맵과는 완전히 별개의 것이다.
* '''시스템 콜''':커널로 진입할 수 있는 지점으로 이를 통해 커널은 응용 프로그램을 대신해 운영체제의 서비스를 제공한다.
응용 프로그램에서 호출 되는 모든 시스템 콜을 알려주는 툴 strace를 사용하면
응용 프로그램에서 호출하는 시스템 콜을 볼 수 있다.
- 바이넥스 . . . . 11 matches
{{{[헬스코리아뉴스 / 곽은영 기자]}}} 바이넥스는 바이오 의약품 위탁개발·생산(CDMO) 전문기업으로 알려져 있다. 국내 바이오 벤처 중 바이넥스를 거쳐가지 않는 곳이 거의 없을 정도다.
국내에서 처음으로 민간 바이오 CDMO 사업을 시작한 바이넥스는 1957년 부산에 세워진 순천당제약사에 그 뿌리를 두고 있다. 60여년의 세월 동안 두 차례 주인이 바뀌는 등 변화의 폭이 컸던 제약회사다.
설립 초기만 하더라도 제네릭(복제약) 판매에 주력하던 이 회사가 처음 변화를 맞이한 것은 1985년 이백천 전 회장이 회사를 인수하면서다. 이 회장은 회사를 법인으로 전환하면서 세포치료제 전문기업으로 키우기 위해 노력한 것으로 전해진다. 이 회장은 2000년 기업이미지 제고를 위해 사명을 지금의 바이넥스로 바꾸고 이듬해 코스닥 상장까지 밀고 나가면서 제2의 도약을 선언했다.
바이넥스는 이후 세균정장제 ‘비스칸’을 출시하고 국내 최초로 세포치료제에 대한 임상시험 승인을 획득하는 등 활발한 연구개발 활동을 이어나갔다. 2007년에는 정부로부터 5년간 100억원을 지원받을 수 있는 바이오 의약품 개발지원 프로그램인 ‘바이오스타 프로젝트’ 기업에 선정되기도 했다. 이밖에 국내 최초로 면역세포 보관은행인 ‘애니셀뱅크(Anycell Bank)’ 설립, ‘천연물 연구소’ 설립 등 바이오 신약 분야에 발빠르게 진출했다.
세포치료제 및 바이오 의약품 개발을 통해 20년 넘게 달려오던 바이넥스는 2000년대 들어 새로운 주인을 만나면서 또 한 번의 변화를 맞이한다.
- 세마포어 . . . . 3 matches
1. down_trylock() : 세마포어를 얻지 못하는 경우 0이 아닌 값을 바로 리턴한다. 세마포어를 반환하는 경우 up()을 호출하면 된다.
return -ERESTARTSYS; /* 시그널을 받았지만 세마포어를 얻지 못함 */
- 임차권등기 . . . . 1 match
과제물건 등을 입력하면
- 크로마서브샘플링 . . . . 14 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을 가리킨다.
'''루미넌스'''(''luminance'')라는 용어와 기호 Y는 기호 Y'를 가진''' 루마'''로 (잘못) 불린다. 영상 공학의 루마 (Y')는 색의 과학의 루미넌스 (Y)에서 비롯한 것(CIE에서 정의)임을 잊지 마라. 루마는 감마 보정의 RGB 컴포넌트 합으로 형성된다. 루미넌스는 선형(linear, tristimulus) RGB 콤퍼넌트의 합으로 형성된다.
현실적으로 CIE 기호 Y는 루마로 잘못 불린다. 1993년에 SMPTE는 이 두 용어를 명확하게 구분해 둔 Engineering Guideline EG 28을 채용하였다. 주된 기호 '는 감마 보정을 가리키는 데 사용된다.
- 회의록 . . . . 5 matches
- 기본적으로 서울시 출연금으로 운영되며, 외부 수탁사업을 지행하는데 이 역시도 서울시 수탁사업이 많음.
- 수시연구 사업을 경우 주로 1년 단위로 진행되고,
- 서울시 정책에 반영될 수 있는 결과 도출을 목표로 함.
- 생활환경, 데이터기반 지표, 북잡계 연구 가능해 보임, 진행 연구는 동력학 및 3차원 수치해석을 이용한 수자원 연구??
1. 서울, 인천, 경기를 중심으로 자연, 사회현상 빅데이터 수집 예정 수집된 데이터를 기반으로 미래 예측을 하려고 함. (서울기술연구원)
- 20100222 . . . . 3 matches
프로젝트는 정수연씨 폴더에 있는 것을 복사하여 사용한다.
1. 자신의 드렉토리에서 빌드하기 위해서는 Rules.make file을 수정해야 한다.
}}} HOME을 소스파일의 루트로 설정하고 기타 경로를 자신의 환경에 맞게 수정한다.
- 20100223 . . . . 9 matches
* IRIS_REF에 '0'을 인가하던지 단절 시켜야 iris를 제어할 수 있음.
* IRIS_PWM과 IRIS_O의 값에 의해서 iris를 제어하게 되는데 이 둘은 PWM2,3으로 PINMUX 세팅을 해줘야 함.
회로에서 의도한 출력을 만들기 위해서는 각 핀의 설정을 해야줘야 한다.
* GIO81, GIO82, GIO90에 해당하는 설정은 '''PINMUX1 0x01c4 0004'''을 수정해야 한다.
* GIO81을 PWM3으로 설정하기 위해서는 PINMUX1 19-18bit가 3이여야 한다.
* GIO90을 PWM2로 설정하기 위해서는 PINMUX1 5-4bit가 2이여야 한다.
* GIO82에 '0'을 출력하기 위해서는 DIR45 레지스터의 18번 bit를 0으로 설정하고 CLR_DATA45 레지스터의 18번 bit에 1을 넣어 클리어 해줘야 한다.
Found 501 matching pages out of 774 total pages
You can also click here to search title.