CNN (VGGNet) #1

2025. 4. 1. 22:45·Bootcamp_zerobase/Tensorflow

2025.03.31

 

Part.11 텐서플로

Chapter 04. Modeling

  • 01_CNN(VGGNet)
  • 02_CNN(VGGNet) 구현

 

CNN (VGGNet)

 

지금까지 정리

 

 

딥러닝 프레임워크는 위 4가지를 중심적으로 봐야 한다. 특히 최적화는 미분값을 기준으로 오차를 뒤로 전파함으로써 진행하기 때문에 해당 개념을 이해하는 것도 중요하다.

 

 

아래에는 딥러닝 프레임워크를 활용해서 프로젝트를 수행하기 위한 4가지 단계이다.

 

 

다만, 모델링을 하는 방법은 직접 layer를 구성해서 모델을 구성하는 방법이나, 이미 학습되어 있는(pretrained) 모델과 파라미터를 불러오는 방법 등을 이용할 수 있다. 또는 모델을 불러오되, 마지막 layer는 다시 학습시켜서 일부만 사용하는 방법도 존재한다. (이미 과거자료에 기재되어 있음)

 

 

 

CNN (Convolutional Neural Network ; VGG19)

모델을 정의하는 (만드는) 방법

1. Sequential 사용하기 (이전 글에서 진행했던 방식)

2. Fuctional API model

3. Sub Class Model

 

 

CNN에 대한 내용은 앞서 나왔기 때문에 아래의 페이지를 참고하면 복습할 수 있다.

 

https://velog.io/@ho3068/Mask-man-Classification-1

 

Mask man Classification #1

20250106 Chapter 03. Mask man classification 16. dive to CNN 17. Mask man1 18. Mask man2 19. Mask man3

velog.io

https://velog.io/@ho3068/Basic-of-Deep-learning-4

 

Basic of Deep learning #4

2024.12.22 1. CNN : Convolution 레이어, 필터 관련 내용

velog.io

 

 

 

 

 

CNN에 대해 간단하게 보면, 여러 Level의 Filter를 이용해서 자동으로 특징을 추출한다. Level이 High로 갈수록 더 정교한 특징을 추출한다.

 

 

 

 

 

 

실습 (VGGNet 구현)

 

VGGNet은 2014년 GoogLeNet (LeNet)에 밀려 2위를 하기 전까지 1위를 하였다. 간단한 구조와 이해와 변형이 쉽다는 장점이 있어 많이 응용되는 모델이다.

 

데이터 불러오기

 

Convolution Layer는 주로 이미지 데이터 처리를 위해 사용되기 때문에, 데이터의 채널을 하나 추가해줘야 연산이 작동한다.

 

즉 (60000, 28, 28) shape 데이터는 → (60000, 28, 28, 1) 또는 (60000, 28, 28, 3)으로 변경해야 한다.

여기서 끝에 1과 3의 차이는 RGB에 대한 차이인데, 1은 GrayScale 즉 흑백인 경우 1을 적용하며, 컬러이미지인 경우 3을 적용한다.

이는 데이터의 형태과 동일한데, 컬러 이미지는 마지막 채널에 R, G, B에 대한 픽셀값이 각각 존재하기 때문에 마지막 채널이 3이다.

 

Pytorch에서는 위 제일 마지막 채널이 제일 앞에 위치하는 차이만 있다.

 

 

class를 이용해서 데이터 전처리 묶음진행
class DataLoader():

    def __init__(self):
        (self.train_X, self.train_y), (self.test_X, self.test_y) = tf.keras.datasets.mnist.load_data()

    def scale(self, x):
        return (x / 255.0).astype(np.float32)
    
    def preprocessing_dataset(self, dataset):
        feature, label = dataset

        #scale
        scaled_x = np.array([self.scale(x) for x in feature])

        # Expanded (채널추가, 차원추가)
        expanded_x = scaled_x[:, :, :, np.newaxis]

        # label_Encoding
        ohe_y = np.array([tf.keras.utils.to_categorical(y, num_classes=10) for y in label])

        return expanded_x, ohe_y

    def get_train_dataset(self):
        return self.preprocessing_dataset((self.train_X, self.train_y))

    def get_test_dataset(self):
        return self.preprocessing_dataset((self.test_X, self.test_y))

 

 

## 데이터 가져오기

mnist_loader = DataLoader()

train_X, train_y = mnist_loader.get_train_dataset()
test_X, test_y = mnist_loader.get_test_dataset()

print(train_X.shape)
print(train_y.shape)
print(test_X.shape)
print(test_y.shape)

===========================================
>>
(60000, 28, 28, 1)
(60000, 10)
(10000, 28, 28, 1)
(10000, 10)

 

원하는 대로 차원(채널)이 추가된 상태로 데이터가 불러와진 것을 알 수 있다.

 

 

 

 

VGGNet에서 사용하는 Layer

tf.keras.layers.Conv2D
tf.keras.layers.Activation
tf.keras.layers.MaxPool2D
tf.keras.layers.Flatten
tf.keras.layers.Dense

 

 

Conv2D layer

 

  • Filters : Layer에서 사용할 Filter (Weights)의 갯수
  • Kernel_size : Filter(weights)의 사이즈. 통상 3X3
  • strides : 몇 개의 Pixel을 Skip하면서 훑어지나 갈 것인지 (출력 피쳐맵의 사이즈에 영향을 줌)
  • padding : zero padding을 만들 것인지. VALID는 padding이 없고 SAME은 Padding이 있음 (출력 피쳐맵의 사이즈에 영향을 줌) → 경계 부분에 데이터(0)를 임의로 추가해서 출력크기가 작아지지 않도록 유지할 때 사용
  • Activation : Activation Function을 지정

 

아래와 같이 Conv2D Layer에 대해 설정지정할 수 있다.

tf.keras.layers.Conv2D(filters=64, kernel_size=3, strides=1, padding='same', activation='relu')

 

 

 

 

MaxPool2D

 

  • pool_size : Pooling window 크기
  • strides : 몇 개의 Pixel을 스킵하면서 훑어지나 갈 것인지
  • padding : zero padding을 만들 것인지
tf.keras.layers.MaxPool2D(pool_size=(2,2), strides=1, padding='same' )

 

 

 

 

Flatten

 

행렬을 1차원 벡터값으로 쭉 펼치는 것

 

 

 

 

 

Dense

 

  • units : 노드 갯수
  • activation : 활성화 함수
  • use_bias : bias를 사용할 것인지
  • kernel_initializer : 최초 가중치를 어떻게 세팅할 것인지
  • bias_initializer : 최초 bias를 어떻게 세팅할 것인

 

Layer를 이용한 모델 구현 (Sequential 방식)

 

관련 패키지를 미리 불러놓으면 간편하게 호출할 수 있다.

from tensorflow.keras.layers import Dense, Conv2D, Flatten, MaxPool2D

 

 

모델 레이어 구성 진행

## layer 추가

model.add(
    Conv2D(filters=32, kernel_size=(3,3), padding='same', activation='relu', 
           input_shape=(28, 28, 1))
    )
model.add(Conv2D(filters=32, kernel_size=(3,3), padding='same', activation='relu'))
model.add(MaxPool2D(pool_size=(2,2), strides=2))
model.add(Conv2D(filters=64, kernel_size=(3,3), padding='same', activation='relu'))
model.add(Conv2D(filters=64, kernel_size=(3,3), padding='same', activation='relu'))
model.add(MaxPool2D(pool_size=(2,2), strides=2))
model.add(Flatten())
model.add(Dense(units=128, activation='relu'))
model.add(Dense(units=64, activation='relu'))
model.add(Dense(units=10, activation='softmax'))
model.summary()

==============================================================================================
Model: "sequential_1"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 conv2d_4 (Conv2D)           (None, 28, 28, 32)        320       
                                                                 
 conv2d_5 (Conv2D)           (None, 28, 28, 32)        9248      
                                                                 
 max_pooling2d_2 (MaxPooling  (None, 14, 14, 32)       0         
 2D)                                                             
                                                                 
 conv2d_6 (Conv2D)           (None, 14, 14, 64)        18496     
                                                                 
 conv2d_7 (Conv2D)           (None, 14, 14, 64)        36928     
                                                                 
 max_pooling2d_3 (MaxPooling  (None, 7, 7, 64)         0         
 2D)                                                             
                                                                 
 flatten_1 (Flatten)         (None, 3136)              0         
                                                                 
 dense_3 (Dense)             (None, 128)               401536    
                                                                 
 dense_4 (Dense)             (None, 64)                8256      
                                                                 
 dense_5 (Dense)             (None, 10)                650       
                                                                 
=================================================================
Total params: 475,434
Trainable params: 475,434
Non-trainable params: 0
_________________________________________________________________
_________________________________________________________________

 

 

 

구성된 모델을 학습시켜 본다.

## 학습

lr = 0.03
opt = tf.keras.optimizers.Adam(lr)
loss = tf.keras.losses.categorical_crossentropy

model.compile(optimizer=opt, loss=loss, metrics=['accuracy'])
hist = model.fit(train_X, train_y, epochs=10, batch_size=256, validation_data=(test_X, test_y))

===============================================================================================
Epoch 10/10
235/235 [==============================] - 2s 11ms/step - loss: 2.3026 - accuracy: 0.1086 
                                         - val_loss: 2.3019 - val_accuracy: 0.1135

 

강의에서는 epoch를 2번정도만 해서 학습을 진행했고, 나는 10번으로 진행했지만.. 성능이 많이 좋지 않다, 그래서 30번으로 수정해서 진행하였다.

 

그럼에도 불구하고 지표개선이 이루어지지 않아서, learning rate를 0.001로 변경하고 (adam의 기본 학습률) batch_size를 128로 변경하였다.

 

 

Callback 되는 history를 보면, validation 관련된 지표도 기록되어 있는 것을 볼 수 있다.

hist.history.keys()
>> dict_keys(['loss', 'accuracy', 'val_loss', 'val_accuracy'])

 

그래프를 통해서 Loss와 Accuracy를 확인해 보면 아래와 같다.

validation 관련 지표가 조금 들쑥날쑥한 것을 알 수 있지만. 기본적으로 accuracy가 90% 이상 나오기 때문에 어느 정도 학습이 된 것을 알 수 있다.

 

 

'Bootcamp_zerobase > Tensorflow' 카테고리의 다른 글

SubClass 모델링 : SubClass 및 모델구현  (0) 2025.04.07
Functional Modeling : Functional API 및 간단한 ResNet 구현  (0) 2025.04.03
Tensorflow #3 : 딥러닝의 흐름, 간단한 Model 학습  (1) 2025.03.31
Tensorflow #2 : 선형회귀 및 Perceptron  (0) 2025.03.27
Tensorflow #1 : 텐서플로우 기본개념  (1) 2025.03.27
'Bootcamp_zerobase/Tensorflow' 카테고리의 다른 글
  • SubClass 모델링 : SubClass 및 모델구현
  • Functional Modeling : Functional API 및 간단한 ResNet 구현
  • Tensorflow #3 : 딥러닝의 흐름, 간단한 Model 학습
  • Tensorflow #2 : 선형회귀 및 Perceptron
Loft_mind
Loft_mind
건축 전공자의 전공 갈아타기
  • Loft_mind
    오늘의 설계
    Loft_mind
  • 공지사항

    • 분류 전체보기 (38)
      • Bootcamp_zerobase (37)
        • Pytorch (12)
        • Image Augmentation (2)
        • YOLO & RNN (4)
        • Git & GitHub (2)
        • Tensorflow (11)
        • OpenCV (6)
      • Architecture (0)
  • 블로그 메뉴

    • 홈
    • 태그
  • 태그

    컴퓨터 비전
    deeplearning
    opencv
    역전파
    mnist
    VGGNET
    autoencoders
    git
    CNN
    ResNet
    subclass
    YOLO
    RE
    tensorflow
    image augmentation
    github
    zerobase
    정규표현식
    pytorch
    제로베이스
    bash
    ComputerVision
    rnn
    PIL
  • hELLO· Designed By정상우.v4.10.3
Loft_mind
CNN (VGGNet) #1
상단으로

티스토리툴바