블로그 이미지
자신의 단점을 메꾸는 것을 단(鍛)이라 하고 자신의 강점을 갈고 닦는 것을 련(鍊)이라 하여, 두가지를 합친 것을 단련이라고 부른다. 붕대마음

카테고리

전체목록 (663)
참고사이트 (8)
Goal (4)
Travel (10)
My Life (102)
Game (35)
Game Review (7)
Game Plan (0)
Books (5)
English (1)
Optimizing (12)
Study (217)
유용한 것들_etc (44)
유용한 것들_func (20)
Unity (48)
Unreal (87)
작업장 (54)
RenderMonkey (6)
정리요망 (1)
따라잡기 시리즈 (0)
링크용 (0)
Total338,297
Today6
Yesterday63

책 제목 : 파이썬 날코딩으로 알고 짜는 딥러닝

저자 : 윤덕호

출판년도 : 2019.07.15



프로그래머라는 직업으로 일하다 보니 기술의 유행에 대해서도 어느정도 민감하다.

기술의 영역이 무척 넓긴 하지만 그럼에도 책으로, 지인으로부터, 또는 구직사이트로부터

요즘 많이 듣게되는 단어가 인공지능, 딥러닝, 데이터 사이언티스트, 신경망, 빅데이터, 파이썬이다.

관련 서적들이 줄줄이 나오고 있는 이 시점에 딥러닝에 대해 한번은 공부해봐야 할 과제였고

이를 위해 이 책을 선택하였다.

이 책의 목표는 딥러닝 알고리즘의 원리를 이해하고 이를 파이썬으로 구현하는데 있다.

파이썬 문법을 따로 다루지는 않는다.


책의 목차는 아래 "목차열기"를 참조.


책의 내용...

책의 내용은 크게 5파트로 나누어져 있다.

첫번째 파트는 딥러닝을 간단히 맛볼 수 있도록 간단한 신경망 구조인 단층 퍼셉트론 구조를 다룬다.

전복 고리 수 추정 신경망 예제로 회귀분석 문제를, 펄서 여부 판정 신경망 예제로 이진 판단 문제를,

그리고 철판의 불량 상태 분류 신경망 예제를 통해 선택 분류 문제를 다룬다.


두번째 파트는 다층 퍼셉트론 구조를 다루면서 객체지향 모델 구조와 복합 출력의 처리방법에 대한

내용들이 주를 이룬다.

객체지향 구조로 프로그램을 재구성 하면서 꽃 이미지 분류 신경망 예제를 소개하고,

오피스 31 이미지의 다차우너 분류 예제를 사용해 복합 출력을 다룬다.


세번째 파트는 합성곱 신경망과 정규화 기법, 거대 심층 구조를 살펴보면서 은닉 계층 구성에

이용되는 12가지 계층의 기능과 구현 방법을 살펴본다.


네번째 파트는 순환 신경망시간 축을 갖는 시계열 데이터 처리에 특화된 순환 신경망을 이용해 다양한

종류의 데이터를 다루는 과정을 살펴본다.


다섯번째 파트는 고급 응용파트로 세가지 딥러닝 응용구조를 소개한다.


실제로 내용을 진행하면서 기존의 내용을 재활용 하거나 확장하는 부분이 많다.

아래의 표를 보면 잘 정리되어 있다.

이 그림 하나가 책을 읽으면서, 읽고 나서도 많은 개념 정리를 도와 주었다.

어떤 알고리즘, 이론이 어떤식으로 이어지는지를 알려준다.


책을 읽으면서...

우선 이 책은 특정 기술에 대한 입문서라고 하기에는 난이도가 있다.

사실 인공지능, 딥러닝등의 학문이 기본적으로 허들이 높다.

기반 지식이 많이 필요하기 때문이다.

이 책 또한 독자가 프로그래밍 지식, 알고리즘 지식, 기본 아키텍쳐 지식을 베이스로 하고 있다고 

생각하고 책의 내용으 풀어 나간다.

책의 내용은 무척 체계적이고 깔끔하다.

여러가지 예제를 통해 딥러닝에 대한 기본 알고리즘 부터 응용 내용까지 체계적으로 

배울 수 있도록 배려하였다.

기존에 존재하는 플랫폼이나 라이브러리가 아닌 이론을 정확히 알고

코드로 직접 구현을 한다.

공부는 어렵게 해야 하고 깊이있게 해야 한다.

그래야 기본을 닦고 응용을 할 수 있다.

앞으로도 이정도의 깊이있는 책이 많이 나와 현업자들의 갈망을 많이 채워줬으면 좋겠다.

그런 의미에서 딥러닝을 체계적으로 깊이있게 배우고자 하는 이에게 이 책을 추천한다.

이 책에 대한 자세한 내용은 한빛출판네트워크에서 확인해 볼 수 있다.



Posted by 붕대마음

책 제목 : 게임으로 익히는 코딩 알고리즘

저자 : 김영기

출판년도 : 2019.05.06


게임개발자라는 직업을 가지기 위해, 그리고 게임개발자가 되서도 몇몇권의 

알고리즘 책을 읽은 기억이 있다.

소설방식의 알고리즘 책 부터 하드커버의 흉기같은 알고리즘 바이블.

알고리즘이나 자료구조론을 공부하는건 참 힘들기도 하고 어떤 경우에는 희열감도 있다.

기본적으로 알고리즘은 어렵다.

알고리즘은 결국 어떤 문제를 해결하기 위한 방법및 과정이고 좀 더 좋은 방법을 찾기위해

열심히 고민해야하기 때문에 복잡하다.

그렇기 때문에 더 좋은 방법을 생각해내거나 풀어냈을 경우 보람과 성취감이 있다.

이 책 또한 알고리즘이라는 쉽지않은 학문을 쉽게 배우는 것이 목표다.


책의 목차는 아래 "목차열기"를 참조.


책의 내용...

책의 내용은 크게 3가지로 나뉜다.

첫 파트는 알고리즘과 코딩에 대해 쉽게 접근할 수 있도록 쉬운내용을 먼저 소개한다.

거의 프로그래밍 언어의 기본 문법위주의 내용이다.

두번째 파트는 큐, 스택, 해시, 그래프같은 자료구조에 대한 내용이 주를 이룬다.

실제적으로 자료구조론과 알고리즘은 서로 밀접한 관계를 가진다.

세번째 파트는 재귀, 탐색, 길찾기, 동적프로그래밍등 여러 프로그래밍 알고리즘에 대해 학습한다.

결국은 접근, 활용, 응용처럼 처음에는 쉬운난이도에서 고난이도로 간다.


첫파트에서는 알고리즘에 대한 간단한 소개와 이 알고리즘을 배우기 위한 수단에 대해 설명한다.

바로 코딩게임이란 것을 수단으로 알고리즘을 학습한다.

알고리즘을 공부하는 수단이 게임이라는 것이 정말 참신하다.

첫번쨰 파트는 전반적으로 간단한 내용을 다루었다.

그래서 난이도는 Easy이다.


두번째 파트에서는 자료구조에 대해 다룬다.

자료구조는 프로그래밍에서 데이터를 구조적으로 표현하는 방법에 대한 내용이라 

처음 보는 사람에게는 생소한 내용이 많다.

큐와 스택, 해시맵, 이진탐색등 듣기만 해도 어려운 내용들이 많다.

이 파트에서는 이 자료구조를 이용해서 코딩게임을 할 수 있다.


세번째 파트에서는 알고리즘을 활용해서 좀 더 어려운 문제에 도전해 보는 파트다.

최단경로, 원형와 같은 문제에 대해 고민하고 해결한다.

그리고 뒤에 부록으로 실려있는 개발자들의 인터뷰 내용도 꽤나 재미있다.

현 개발자들의 노하우와 마인드, 철학 등을 엿볼 수 있다.

읽어보면 많은 도움이 된다.




책을 읽으면서...

많은 기술서, 학습서를 읽어왔지만 이 책만큼 공부를 재미로 매칭시킨 예는 보지 못했다.

알고리즘도, 자료구조론, 프로그래밍 모두 재미있게 공부하기는 힘든 영역이다.

많은 입문서들이 좀 더 쉽게, 체계적으로 배울수 있도록 배려 했다면 이 책은 쉽게 접근해서

재미있게 배우도록 배려했으며 이를 위해 코딩게임이라는 기존 플랫폼을 잘 활용했다.

책의 구성도 무척 편하게 되어 있다.

각 챕터의 첫 페이지에서 이 챕터는 어떤 내용이 나올 것 인지를 알 수 있고,

각 챕터내 일관된 구성으로 책을 체계적으로 편하게 학습할 수 있도록 한다.

문제설명 - 푸는방법 - 필요한 알고리즘 - 코드에 대한 이해도와 같은 형식으로 구성되어 있다.

만약 처음 알고리즘 및 자료구조론 책을 봐야하거나 코딩게임에 대해 입문하려 할 경우 

이 책은 충분히 만족할 만한 내용을 담고있다.


이 책에 대한 자세한 내용은 한빛출판네트워크에서 확인해 볼 수 있다.


참고 링크

- 코딩게임

- 책 소개

 

Posted by 붕대마음

Clipmaps

Study/Graphics / 2019.06.15 14:55

원문 : Clipmaps

원문을 보시길 적극 추천.



요약

클립맵은 지형에 매우 높은 해상도의 텍스쳐를 매핑할수 있게 하는 SGI 워크스테이션에서 처음 구현된 기능이다.

원본 SGI 구현은 매우 전문적인 맞춤형 하드웨어가 필요했다.

NVIDIA GeForce 8800의 고급기능은 현재  소비자의 하드웨어를 사용하여 같은 알고리즘을 허용한다.

비록 현재 API들과 GeForce 8800가 8192 크기의 텍스쳐를 직접적으로 지원할 지라도, 

이 크기가 비행 시뮬레이션같은 넓은 경치를 말할때는 충분하지 않을지도 모른다.

전체 경치에 하나의 텍스쳐를 사용하는 이 아이디어는 전체 경관 텍스쳐를 한번에 디자일 할 수 있을 뿐 아니라

파라미터화 시키는 것도 간단하다.

큰 텍스쳐는 몇개의 텍스쳐를 사용하여 블렌딩 하는 기존 방식에 비해 큰 이점을 가진다.

이는 텍스쳐를 원하는 만큼 복잡하게 디자인 할 수 있다는 것이다.

디자이너가 하나의 전체 맵을 만들었으므로 그걸 그대로 사용할 수 있다.


클립맵은 원근투영이기 때문에 텍스쳐 밉맵 피라미드 내의 상대적으로 작은 영역만

모든 프레임에서 엑세스 한다는 사실을 이용한다.

따라서 우리는 뷰어를 여기저기 이동할 때 이러한 "hot"영역을 관리하고 

비디오 메모리에서 업데이트 해야 한다.

DX10 해결책은 이러한 영역들을 텍스쳐 배열에 저장하는 것이다.

픽셀셰이더에서 인덱싱 할 수 있다면 DX10에서 클립맵 알고리즘을 간단히 구현할 수 있다.


클립맵은 작동 방식

클립맵은 모든 단일 프레임에서 텍스쳐링에 필요한 모든 정보를 가지고 있는

밉맵피라미드의 부분 표현이라고 정의할 수 있다. 

소스텍스쳐로부터 어떤 데이터가 사용될것인지 어떻게 결정할까?

답은 밉맵 샘플 선택 전략에 있다.

텍스쳐링을 하는 동안 픽셀의 영역에 텍셀을 1대1 매핑하여 사용할 수 있게 하는 것이 가장 이상적인 방법이다.

이것이 현재 화면 해상도를 기반으로 밉맵레벨에서 클립 사이즈를 정의하는 방법이다.

밉맵 피라미드의 가장 낮은 레벨은 항상 비디오 메모리에 적재되고 고정적으로 사용된다.

다른 모든 밉레벨은 모든 프레임에서 실제 데이터를 저장하기 위해 동적으로 업데이트 되는 클립맵 스택을 형성한다.

가장 일반적인 경우 스택의 내용은 스택의 크기와 뷰어의 위치에 따라 정의할 수 있다.


그림설명 : 

  위 그림은 클립맵을 그림으로 표시한 것이다.

  파란색 밉 레벨들은 전체 월드에 매핑되는 데이터를 표시한다.

  녹색 지역은 동적으로 로드되는 하위(sub)지역이다.


기본 아이디어는 하나의 2D 텍스쳐 배열에 클립맵 스택을 저장하는 것이다.

텍스쳐 배열은 DX10에서 추가된 기능이다.

밉맵 피라미드의 나머지 부분은 밉과 함께 기존방식의 2D텍스쳐로 구현된다.

하위 리소스 메소드 복사/업데이트를 사용하여 동적으로 스택을 갱신할 수 있다.

때로는 시스템 메모리에서 필요한 모든 데이터를 가지고 있을수 없는 경우도 있다.

그러므로 디스크에서 필요한 모든 데이터를 효율적으로 스트리밍 하기 위한 추가 메커니즘이 필요하다.


데이터 표현

클립맵 스택은 2D텍스쳐 배열에 저장된다.

이 배열은 클립맵의 동적인 부분을 이루고, 각 프레임에서 모든 밉레벨의 실제데이터를 포함해야 한다.

원본 밉 레벨마다 별도의 레이어가 있으므로, 밉이 없는 텍스쳐를 만들어야 한다.

나머지 이미지 부분은 기존의 일반적인 2D 텍스쳐로 저장할 수 있다.


DX10 API를 사용하여, 아래와 같이 리소스를 만든다.

(Clipmap 스택 텍스쳐의 경우 ArraySize 요소를 사용해 레이어 수를 지정해줘야 한다.)


D3D10_TEXTURE2D_DESC texDesc;

ZeroMemory( &texDesc, sizeof(texDesc) );


texDesc.ArraySize = 1;

texDesc.Usage = D3D10_USAGE_DEFAULT;

texDesc.BindFlags = D3D10_BIND_SHADER_RESOURCE;

texDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;

texDesc.Width = g_PyramidTextureWidth;

texDesc.Height = g_PyramidTextureHeight;

texDesc.MipLevels = g_SourceImageMipsNum - g_StackDepth;

texDesc.SampleDesc.Count = 1;


pd3dDevice->CreateTexture2D(&texDesc, NULL, &g_pPyramidTexture);


texDesc.ArraySize = g_StackDepth;

texDesc.Width = g_ClipmapStackSize;

texDesc.Height = g_ClipmapStackSize;

texDesc.MipLevels = 1;


pd3dDevice->CreateTexture2D(&texDesc, NULL, &g_pStackTexture); 

각주 : 피라미드용 텍스쳐하나와 스택용 텍스쳐 하나필요.

피라미드용 텍스쳐에는 원본 이미지의 밉레벨에서 동적으로 사용될 스택을 뺀 만큼의 밉이 필요.



정보 갱신 전략

지형을 이리저리 이동하면서, 새로운 클립 중심 위치에 맞게 스택의 정보를 갱신해줄 필요가 있다.

대부분의 경우에는 클립맵 스택(동적으로 바뀌는 부분)의 각 레이어에 있는 비교적 작은 부분의 데이터를 바꿔줘야 한다.

스택안에서 큰 데이터 교체가 일어나는 것을 방지하기 위해, toroidal addressing라고 알려진 특정 기술을 사용한다.

Toroidal addressing은 이미지의 위쪽 새 데이터가 아래에 로드되고, 오른쪾의 새 데이터가 왼쪽에 로드된다.

이 개념의 접근방식은 중첩된 영역에 대한 변경을 필요로 하지 않기 때문에 아래의 경우 무척 효율적이다.


그림 2. 스택의 단일레이어에 대한 두가지 업데이트 단계


대부분의 어플리케이션에서는 가로와 세로 부분을 개별적으로 업데이트 하여

L자 모양 대신 간단한 직사각형 영역을 만들 수 있으므로 이 프로세스가 더 간단해 질 수 있다.


클립맵 텍스쳐 주소

모든 작업은 픽셀 셰이더에서 처리한다.

우선 가져올(fetch) 밉레벨을 결정할 필요가 있다.

이를 위해 ddx와 ddy명령어를 사용하여 화면공간에서의 쿼드 크기를 찾는다.

float2 dx = ddx(input.texCoord * textureSize.x);

float2 dy = ddy(input.texCoord * textureSize.y);

float d = max(sqrt(dot(dx.x, dx.x) + dot(dx.y, dx.y)), sqrt(dot(dy.x, dy.x) + dot(dy.y, dy.y));


이제 쉽게 접합한 밉레벨을 계산할 수 있다.

float mipLevel = log2(d);

밉레벨을 부동소수점(float)으로 계산하고 소수부분을 사용하여 삼선형(trilinear) 필터링을 수행한다.

클립맵 텍스쳐 어드레싱은 간단하다.

필요한건 밉레벨을 기반으로 입력 텍스쳐 좌표를 스케일하는 것이다.

원본 이미지 크기를 클립맵 스택 크기로 나눠서 배율 인수를 계산한다.

float2 clipTexCoord = (input.texCoord) / pow(2, iMipLevel);

clipTexCoord.x *= scaleFactor.x + 0.5f;

clipTexCoord.y *= scaleFactor.y + 0.5f;

float4 color = StackTexture.Sample(stackSampler, float3(clipTexCoord, iMipLevel));

스택 샘플러의 경우 toroidal 어드레싱을 구현하기 위해 어드레싱모드를 "wrap"모드로 지정해야한다.



Reference Link

- D3D10_TEXTURE2D_DESC msdn

- Clip Mapping

'Study > Graphics' 카테고리의 다른 글

Clipmaps  (0) 2019.06.15
early z  (0) 2018.08.29
hlod  (0) 2018.07.20
What is Texture  (0) 2018.03.10
texture format  (0) 2018.02.21
shader에서 채널값이 모자를 때...  (0) 2018.02.13
Posted by 붕대마음

최근에 달린 댓글

최근에 받은 트랙백

글 보관함