서론

본격적으로 구현해보자.

이게 제대로 작동하리라는 기대는 없다.

어딘가 잘못된 부분이 있을 것이라는 기대가 크다.

구현 - 전처리

워크플로 순서를 생각해보면… 일단 전처리를 해야 한다.

0~255 사이의 값을 0~1 사이의 float값으로 바꿔주자.

솔직히 말이 복잡하지 실제로는 그냥 255로 나눠주기만 하면 된다. 간단하게 해결.

구현 - 모델

대충 두 층 정도 쌓아서 그 뒤에 Dense 하나정도 두면 되려나?

생각해보니까 필요한 요소를 하나 빼트렸다. Flatten 함수/레이어다. 만들어주자.

편의상으로 numpy.ravel을 사용하자.

그리고 나니까 Flatten Layer 그 자체의 코드는 좀 극단적으로… 단순하다.

class FlattenLayer(Layer):
    def __init__(self, name:str="Flatten"):
        self.name = name

    def apply(self, x:Tensor) -> Tensor:
        return np.ravel(x)

다른 중요한 처리는 다른 부분에서 다 하기 때문에 좀 많이 단순해질 수 있는 것 같다.

Convolution - 더 생각해야할 것

으음… 이미지 하나짜리 Convolution은 저번에 마무리지었는데, 생각해보니까 이미지 여러개의 Convolution을 처리해줘야한다.

일단 지금 만들어둔 인덱스를 모두 마이너스 인덱스로 대체하고 잘 굴러가길 빌어보자.

라고 하려고 했는데 너무 인덱스를 여기저기 많이 쑤셔넣어뒀다. 이대로는 잘 안굴러갈 것이다.

일단… 임시방편으로 Convolution 레이어에 for문을 넣어주자. 느려도 일단 돌아갈 것이다.

아니 생각해보니까 이것도 잘 안될 것 같다.

그래서 결국엔 마이너스 인덱스와 코드 수정, 그 외의 이것 저것 개판을 욱여넣어서 어떻게든 돌아가게 해뒀다.

Ravel의 구현…

내 맘대로 바꿔줘도 어딘가 고장나진 않겠지?

전체를 Flatten해주는 대신, 한 차원 아래를 flatten해서 2차원으로 돌려주자.

원래 이런 식으로 하면 안된다. My god.

일단 여기까지 하고 다음에 뭔가 잘못된 부분을 수정해보자. 아마 엄청 많을꺼다. 잘못된 부분.