카테고리 없음

[0627] CNN 구조 복습

standingR 2024. 6. 27. 18:18

 

 

CNN 구조(if channel = 3) 

3차원 이미지를 대상으로 CNN구조를 만들 때!!!! --> 집중의 대상은 2차원 사이즈 중심!!!

   ( 뒤에 있는 채널에 대한 것들은 생략!!!!!--> 니가 알아서 연결)

==> 필터의 수와 연동이 되니까...코드가 알아서 해주라!!!

 

1) Conv2D 레이어에 대한 세팅!!(채널은 신경 안 쓰겠다!!!)

각 구조별 설명 

- kernel_size : 필터에 대한 2차원 사이즈(어느 사이즈로 스캔할지)

                3*3, 5*5, 7*7 etc 특징들을 추출..,

                ==> Output인 Feature Map의 사이즈에 연동!!!

- filters : 몇 개의 필터를 사용할지.....

            <==> Feature Map을 몇 장 만들어 낼지!!!!!!!

                 output인 Feature Map의 Channel의 수!!!

- stride  : 가로 step, 세로 step

            얼마나 자세하게 스캐닝을 할지/말지..

            ==> Feature Map의 Size에 연관!!!!

- padding : 테두리에 대한 처리( 사이즈 보전을 할지 말지..)

            valid : 그냥 테두리 없이 스캐닝하자

            same  : 니가 내가 지정한 kernel_size에 맞춰서

                    입력과 동일한 Feature Map이 나오도록

                     테두리 처리를 해주라!!!

+++ ActivationFunction : 초기 버전들은 AF을 사용X

                         VGG 모델 전후로 AF 사용을 ...

 

conv1 = tf.keras.layers.Conv2D(
# 우리가 신경쓸 부분은 오로지 2D만 신경씀!!!!
# 나머지 : channel은 코드가 알아서 해주라!!!!
kernel_size = (5,5),
filters = 4,
strides = (2,2),
padding = "same",
# ++ 최근에는 AF
# activation="relu"
)

 

# Pooling Layer
# --> Feature Map의 결과들을 대표화를 하는 과정!!!!!
# ( 일반적으로 사이즈들을 줄이는 것을 선호!!!!!)
# - pool_size : 처리가 되는 단위 : 대표화의 단위( 2,2)
# - strides : 옵션도 같이 활용....
pool1 = tf.keras.layers.MaxPool2D(
pool_size = (2,2),
strides = (2,2)
)

 

+ 연결이 많아서....

--> 중간에 적당학게 연결을 짜르는 Dropout!!!!!

참고) 최종적인 FeatureMap을 분류DNN구조와 연겨을 할 때...

      FullConnection 주로 활용을 ...

 

Fashion-MNIST Set을 바탕으로 DNN구조 열심히 했음...

===> 설계 방식을 CNN 구조로 도입을 하자!!!

 

fashion_mnist = tf.keras.datasets.fashion_mnist
(train_X, train_y),(test_X, test_y) = fashion_mnist.load_data()
print(train_X.shape)
print(train_y.shape)
print(test_X.shape)
print(test_y.shape)

(60000, 28, 28)

(60000,)

(10000, 28, 28)

(10000,)

 

import tensorflow as tf


# conv1 layer
covn1 = tf.keras.layers.Conv2D(

    kernel_size = (5,5),
    filters = 4,
    strides = (2,2),
    padding = "same",

)

# pooling Layer
pool1 = tf.keras.layers.MaxPool2D(
    pool_size = (2,2),
    strides = (2,2)
)
In [3]:
# fashion mnist set
fashion_mnist = tf.keras.datasets.fashion_mnist
(train_X, train_y),(test_X, test_y) = fashion_mnist.load_data()
print(train_X.shape)
print(train_y.shape)
print(test_X.shape)
print(test_y.shape)
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz
29515/29515 [==============================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz
26421880/26421880 [==============================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz
5148/5148 [==============================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz
4422102/4422102 [==============================] - 0s 0us/step
(60000, 28, 28)
(60000,)
(10000, 28, 28)
(10000,)

입력에 대한 데이터 처리

  1. 입력에 대한 데이터 처리!!!!!!! ===> 1장에 대해서 처리!!!!!! n장에 대해서 일괄 처리는 코드가 TF가 알아서 함..... ==> 1장에 대해서 잘 코드화!!!!!!
In [4]:
train_X.shape
Out[4]:
(60000, 28, 28)
In [5]:
train_X[0].shape # 2d
Out[5]:

Conv2D를 사용하려고 함!!!! ==> 1장에 대한 데이터는 3D로 들어가야 함!!!! (채널은 내가 신경 안 쓰고 하기 위해서..) ==> 데이터의 모양을 변경을 해야함!!!!(차원/모양) 지금 데이터 1장 : 28 X 28 [ 2D ] 지금 데이터셋 : 6000, 28X28 [ 3D] --- 원하는 입력 데이터 1장 : 28 X 28 X 1 [3D] 원하는 입력 데이터 셋 : 60000, 28, 28, 1 [4D] ===> 이런 식으로 입력 데이터셋을 변경을 해야 그 뒤로 내가 신경쓸 일이 없어요!!!미리 세팅을 함!!!! (주의!!!!) 채널에 대한 정보는 주로 뒤로 세팅!!!! (28,28,1, 60000), (60000,1,28,28) ===> (데이터수, 가로,세로,채널) (60000, 28, 28, 1) 위와 같이 셋이 구성이 되어야....Conv2D를 사용해서 코드화 가능!!

 

전처리 : 내가 편하게 채널은 신경안쓰고 하기 위해서

 

Conv2D를 사용하려고 함!!!!
==> 1장에 대한 데이터는 3D로 들어가야 함!!!! (채널은 내가 신경 안 쓰고 하기 위해서..)

==> 데이터의 모양을 변경을 해야함!!!!(차원/모양)

 

지금 데이터 1장 : 28 X 28 [ 2D ] 지금 데이터셋 : 6000, 28X28 [ 3D] --- 원하는 입력 데이터 1장 : 28 X 28 X 1 [3D]


원하는 입력 데이터 셋 : 60000, 28, 28, 1 [4D]
===> 이런 식으로 입력 데이터셋을 변경을 해야 그 뒤로 내가 신경쓸 일이 없어요!!!미리 세팅을 함!!!!

 

(주의!!!!) 채널에 대한 정보는 주로 뒤로 세팅!!!!
(28,28,1, 60000), (60000,1,28,28) ===> (데이터수, 가로,세로,채널)
(60000, 28, 28, 1) 위와 같이 셋이 구성이 되어야....Conv2D를 사용해서 코드화 가능!!

In [6]:
# 목적 : 모델의 구조도에 맞춰서 데이터셋을 변형
print(train_X.shape)
print(train_X[0].shape)
train_X = train_X.reshape(-1, 28, 28, 1) # 3d --> 4d
test_X = test_X.reshape(-1, 28,28,1)
print(train_X.shape)
print(train_X[0].shape)
(60000, 28, 28)
(28, 28)
(60000, 28, 28, 1)
(28, 28, 1)
In [9]:
## 가장 간단한 CNN 구조 모델
model = tf.keras.Sequential([

    tf.keras.layers.Conv2D( input_shape=(28,28,1), kernel_size= (3,3), filters =16),

    tf.keras.layers.Conv2D(kernel_size=(3,3), filters =32),

    tf.keras.layers.Conv2D(kernel_size=(3,3), filters =64),
# ===> 이미지가 가진 특징을 가장 잘 뽑아냈다고 가정!!


# 분류를 위한 DNN 구조
# 특징을 쭉 ~ 1D를 차원을 변경하는 Flatten!!!
    tf.keras.layers.Flatten(),
    # 일반적 분류를 위한 레이어 추가
    # 노드 수, AF, 몇 개 레잉를 쌓을 지 HP(하파미)
    tf.keras.layers.Dense( units = 128, activation="relu"),
    # 더 분류 네크워크를 설계를 추가 할 수 있음!!

    # step3 출력용
    tf.keras.layers.Dense(units = 10, activation="softmax")
])
model
Out[9]:
<keras.src.engine.sequential.Sequential at 0x78557cfa2410>
In [10]:
model.summary()
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 conv2d_5 (Conv2D)           (None, 26, 26, 16)        160       
                                                                 
 conv2d_6 (Conv2D)           (None, 24, 24, 32)        4640      
                                                                 
 conv2d_7 (Conv2D)           (None, 22, 22, 64)        18496     
                                                                 
 flatten_1 (Flatten)         (None, 30976)             0         
                                                                 
 dense (Dense)               (None, 128)               3965056   
                                                                 
 dense_1 (Dense)             (None, 10)                1290      
                                                                 
=================================================================
Total params: 3989642 (15.22 MB)
Trainable params: 3989642 (15.22 MB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________
In [ ]:
# 1번 conv의 파라미터의 수
(3*3 + 1) * 16
In [ ]:
# 2번 conv의 파라미터의 수
( 3*3 *16 + 1)*32