CNN

[CNN]1. MNIST

낑낑이 2025. 1. 16. 16:23

MNIST 데이터셋은 머신 러닝 및 딥러닝 분야에서 가장 널리 사용되는 데이터셋 중 하나로, 숫자 필기체 인식(Handwritten Digit Recognition) 문제를 해결하기 위해 설계되었습니다. 이 글에서는 MNIST 데이터셋의 특징과 이를 하드웨어 관점에서 설계하는 데 필요한 요소들을 상세히 다뤄보겠습니다.

MNIST 데이터셋의 기본 정보

  • 구성:
    • 10개의 클래스: 숫자 '0'부터 '9'까지.
    • 각 데이터는 28x28 크기의 그레이스케일 이미지로 이루어져 있으며, 픽셀 값은 0에서 255 사이입니다.
    • 총 70,000개의 이미지로 구성되어 있습니다:
      • 훈련 데이터: 60,000개
      • 테스트 데이터: 10,000개
  • 입력 데이터 크기:
    • 한 이미지는 28x28 = 784개의 픽셀로 구성됩니다.
    • 각 픽셀은 8비트(1바이트)로 표현 가능하므로, 한 이미지를 저장하려면 약 784바이트의 메모리가 필요합니다.

 

  • 입력 이미지가 28×2828 \times 28 크기의 특징 맵으로 시작합니다.
  • Conv0를 거치면서 16개의 출력 채널을 생성합니다.
  • Conv1을 거치면서 더 깊은 특징을 추출하여 32개의 출력 채널을 생성합니다.
  • Fully Connected Layer에서 추출된 특징을 분류하여 최종적으로 숫자 클래스를 예측합니다.

이후 최종적으로 10개의 Class에 대해 Class 예측을하게됩니다. 위와같은경우는 0을 Input Image로 넣었으니 0이 분류되겠죠

설계한 모듈은 이와같습니다

벌써 저도 막막한데요 이걸 어떻게 설명해야하나..

하나하나 설명해보도록 하겠습니다 

기존 내부 모듈은 다 기본적으로 설명한거같으니 

FIFO:https://kth181399.tistory.com/5

 

[AXI]2.FIFO

1. FIFO란FIFO란 (First Input First Output)의 의미입니다Queue와 비슷한 개념인데  이와같이 먼저들어온 Data가 먼저 나간다는 뜻을 의미합니다Data가 들어오는걸 EnqueueData가 나가는걸 Dequeue라고 합니다  

kth181399.tistory.com

Systolic Array,Channel Array:https://kth181399.tistory.com/12

 

[CNN]Convolution Control

Convolution은 Control 신호에 따라 움직이게된다Systolic array는 하나의 Channel에 대한 연산을 거치게된다이와같이 구성되어 이전에도 설명한이 모식도를 따라 움직이게된다PE에는 각 Weight가 들어가있

kth181399.tistory.com

에서 한번 설명을 보고, 사실 안봐도될거같다

기초적인 내용이기도 하고 여기서 다시 설명하면 되니...

여기서 분석해보면 Test_bench에 Slave가 하나 붙어있도록 된다

왜냐하면 Verilog를 실행시킬때, 컴퓨터에 Mem file을 받아서 코드를 실행시키게되는데, 그 Mem File은 컴퓨터 내부에 있는것이다. 따라서 컴퓨터 내부에서 Data를 Slave에 인가하여 Vivado에서 실행 가능하게 해야되므로 AXI module이 구성되어있는것이다.

1.AXI_SLAVE

AXI slave를 보게되면

이와같이 코드가 되어있다 

첫째로 Weight를 왜 저렇게 선언해야되는지 알아보자

Weight는 총 3개의 파일이 필요하다. 

1. Conv0 Weight 2.Conv1 Weight 3. FC layer Weight

이렇게 필요하게된다

MNIST는 28*28=784의 Pixel값이 Input featuremap data로 들어오게된다

Conv 0 Weight는 3*3kernel의 16개의 channel을 가지고 있으므로 parameter는3*3*16=144개가 필요하게된다

근데 axi_araddr는 hex값으로 보게되면 

이와같이 *4의 Hex 값이 들어가있는것을 볼수있다. 그 이유는 메모리파일을 보게되면

이렇게 144번까지의 Index가 있는것을 볼 수 있다. 총 8개의 Hexdecimal이 들어간것을 볼수있는데.

16진수는 0~F까지 나타낼수있으므로 한글자에 4bit를 나타낸다

여기서 한 Index에 8개의 Hexdecimal이 들어가있으므로 8*4=32Bit가 필요하게된다. 이는 32Bit=4Byte가 되므로

parameter의 144의 index의 *4를 하면 576이 되는데, 이는 한 인덱스당 4Byte의 데이터 단위로 읽어주기 위해

Address를 Hex값으로 표현시 0000부터 0240까지 선언을해주고,axi_rdata에 Weight를 가져오게되는것이다

여기서 axi_rdata는 Weight0의 index별로 접근하기 위해 /4를 해주는것이다. 즉 

이렇게 되어있는 구조라고 이해하면 편하다.

따라서 기존에 컴퓨터에 갖고있는 mem파일을 읽어 Conv Layer를 거쳐 결과를 가져오겠다는것이다

Img역시 28*28의 Input Image를 갖고있는다고했는데

이와같이 되므로 주소값을 설정해주면된다

Waveform을 보게되면 이처럼 Handshake가 일어났을때 Data가 잘 인가되는것을 볼 수 있습니다

한 포스팅에 하나의 모듈씩 설명하도록 하겠습니다. 오늘은 기초적인 AXI module의 사용과 주소 설정에 대해서 알아보고 다음에는 InBuff&Conv에 대해서 알아보겠습니다

 

■ AXI SLAVE

□ Cntrl

□ Conv0_InBuff 

□ Conv0_Layer

□ Conv0_Post_Conv_Top

□ Conv1_InBuff 

□ Conv1_Layer

□ Conv1_Post_Conv_Top

□ FC_Layer

 

'CNN' 카테고리의 다른 글

[CNN]3. MINST Conv0_Input Buffer  (0) 2025.01.16
[CNN]2. MNIST Ctrl  (0) 2025.01.16
[CNN]Convolution Control  (1) 2025.01.16
[CNN] Padding  (1) 2025.01.14
[CNN] CNN in Verilog 1  (0) 2025.01.13