[0627] CNN 구조 복습
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을 사용을 함...
+ 연결이 많아서....
--> 중간에 적당학게 연결을 짜르는 Dropout!!!!!
참고) 최종적인 FeatureMap을 분류DNN구조와 연겨을 할 때...
FullConnection을 주로 활용을 함...
Fashion-MNIST Set을 바탕으로 DNN구조 열심히 했음...
===> 설계 방식을 CNN 구조로 도입을 하자!!!
(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)
)
# 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장에 대해서 처리!!!!!! n장에 대해서 일괄 처리는 코드가 TF가 알아서 함..... ==> 1장에 대해서 잘 코드화!!!!!!
train_X.shape
(60000, 28, 28)
train_X[0].shape # 2d
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를 사용해서 코드화 가능!!
# 목적 : 모델의 구조도에 맞춰서 데이터셋을 변형
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)
## 가장 간단한 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
<keras.src.engine.sequential.Sequential at 0x78557cfa2410>
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)
_________________________________________________________________
# 1번 conv의 파라미터의 수
(3*3 + 1) * 16
# 2번 conv의 파라미터의 수
( 3*3 *16 + 1)*32