convolve 연산까지
오늘의 구현된 기능들
오늘 구현한 부분은 다음과 같습니다.
- 레이어 별로 보여주기
- 업 샘플링(=확대 기능): 이 기능은 단순히 이미지를 확대하는 기능입니다. 이미지가 커짐에 따라서, 주변 점들을 참조해서 채워 넣지는 않고, 기본 색인 검정색으로 채워넣었습니다.
- 이미지 상하반전: 499(width)x375(height)x3(channels)의 이미지를 대략 천 번 정도 상하반전 시키는데, 2.3초 정도 걸렸습니다. 한 번 정도 뒤집는데, 2.3 milliseconds가 소요됩니다.
- 랜덤 색상을 가진 이미지 생성: 위의 이미지에서 처럼, 3x3 랜덤이미지라고 하면, 위와 같은 랜덤 색상을 부여해서 이미지를 생성합니다.
오늘 잡은 버그들
오늘 잡은 버그는 다음과 같습니다.
- 딥카피 문제: Image 클래스의 show 함수에서, 이미지를 보여주려면 1) 원본 이미지를 카피 후, 2) normalize 해서 보여줘야 합니다. 이 과정에서 deep copy가 이루어지지 않아서 여러 번 연산 하는 경우 문제가 있었습니다. 이것을 Image 클래스의 복사생성자에서 deep copy를 하도록 변경했습니다.
1 2 3 4 |
|
1 2 3 4 5 6 7 |
|
생각할 거리들
- memcpy를 할 때, data의 사이즈를 고려할 것
- 위의
memcpy(_data, p._data, (long long)_h * _w * _c * sizeof(double));
이 코드에서,sizeof(double)
을 쓰지 않아서, 화면이 화면이 나왔습니다. 꼭 width, height, channels, 데이터 타입의 사이즈 를 고려해서 메모리 복사를 하는 것이 좋습니다.
- 위의
-
depth vs channel: depth라고 하는 표현들이 코드에 한 번씩 나오는데, 이는 사실 color depth를 나타낸 것입니다. color depth는 컬러를 표현 하는데, 몇 비트를 사용해서 표현할 것일 지에 대한 것입니다.
- 예를 들어서, 0~255 사이의 정수값을 이용해서 표현하는 것이면, 이는 8비트를 사용하는 것입니다.따라서 depth는 8입니다. 채널(=레이어)은 rgb, bgr, cmyk 처럼 어떻게 색을 분리해서 표현할 지에 대한 것입니다.
-
integer overflow
- 오늘 버그를 고치면서 integer overflow 때문에
(long long)_h * _w * _c
처럼 (long long)으로 타입 캐스팅을 했습니다. 또한, day01에서도 같은 고민을 했었습니다. 오늘 생각 해보니, unsigned int형식은 32비트를 사용할 수 있고, 이것은 536MB만큼을 표현할 수 있는데, 이미지의 크기는 일반적으로 500MB를 넘기가 힘드니까 예외값이 들어오지 않도록 처리하는 것이 좀 더 낫지 않나 하는 생각이 들었습니다.
- 오늘 버그를 고치면서 integer overflow 때문에
code history
darknet의 First Commit을 C++로 변환하는 작업 중(50%)입니다.
tests.c 파일에서 8개의 함수 중에서 4개의 함수를 앞으로 더 구현해야 합니다.
1 2 3 4 5 6 7 8 |
|
convolve => convolutional_layer => backpropagate => network 순으로 작업할 생각입니다.