[Deep Learning 5] 파이썬을_활용한_딥러닝_이론_및_실습_중급편_CNN_실습_2
Convolution Nueral Network 실습-2
- Dataset: CIFAR 10
- 학습 내용:
- 데이터 로딩 및 전처리
- 인공지능 모델을 만드는 3가지 방법
- Pooling Layer 생성 실습
1. 데이터 로딩 및 전처리
import tensorflow as tf
from tensorflow.keras import datasets, layers, models
import matplotlib.pyplot as plt
#datasets.cifar10.load_data() 함수는 CIFAR-10 데이터셋을 로드
(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
# 이 라인은 train_images와 test_images에 저장된 모든 이미지 픽셀 값을 0과 1 사이의 값으로 정규화
#이미지의 픽셀 값은 일반적으로 0부터 255까지의 정수로 표현
train_images, test_images = train_images / 255.0, test_images / 255.0
Downloading data from https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz
170500096/170498071 [==============================] - 3s 0us/step
Verify Data
# 이 배열은 CIFAR-10 데이터셋의 10개 클래스 각각에 해당하는 문자열 이름을 저장
class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer',
'dog', 'frog', 'horse', 'ship', 'truck']
# for 반복문을 사용하여 25개의 이미지를 시각화
plt.figure(figsize=(10,10))
#for 반복문을 사용하여 25개의 이미지를 시각화
for i in range(25):
plt.subplot(5,5,i+1)
#plt.xticks([])와 plt.yticks([]) 함수는 각 서브플롯의 x축 및 y축 틱(눈금)을 제거
plt.xticks([])
plt.yticks([])
plt.grid(False)
# plt.imshow 함수는 특정 이미지(train_images[i])를 서브플롯에 표시
plt.imshow(train_images[i], cmap=plt.cm.binary)
# plt.xlabel 함수는 서브플롯 아래에 이미지의 클래스 이름을 레이블로 추가
plt.xlabel(class_names[train_labels[i][0]])
plt.show()

-> CIFAR-10 데이터셋의 이미지들을 시각화하고, 각 이미지에 해당하는 클래스 이름을 확인
2. 인공지능 모델을 만드는 3가지 방법
(1) Functional API 활용
import tensorflow as tf
inputs = tf.keras.Input(shape=(32, 32, 3)) # 32x32x3 (RGB)
x = tf.keras.layers.Flatten(inputs) # Flatten layer
x = tf.keras.layers.Dense(4, activation=tf.nn.relu)(x)
outputs = tf.keras.layers.Dense(10, activation=tf.nn.softmax)(x)
model = tf.keras.Model(inputs=inputs, outputs=outputs)
(2) Model class 상속
import tensorflow as tf
class MyModel(tf.keras.Model):
def __init__(self):
super(MyModel, self).__init__()
self.dense1 = tf.keras.layers.Dense(4, activation=tf.nn.relu)
self.dense2 = tf.keras.layers.Dense(5, activation=tf.nn.softmax)
def call(self, inputs):
x = self.dense1(inputs)
return self.dense2(x)
model = MyModel()
(3) Sequential Fuction 활용
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(8, input_shape=(16,)))
model.add(tf.keras.layers.Dense(4))
3. Pooling Layer 생성 실습
tf.keras.layers.MaxPool2D(
pool_size=(2, 2), strides=None, padding='valid', data_format=None,
**kwargs
)
(1) Functional API 활용
Model 생성
#Input 함수는 모델의 입력을 정의합니다. 여기서 shape=(32, 32, 3)는 모델이 받아들이는 입력의 형태를 지정
inputs = tf.keras.layers.Input(shape=(32, 32, 3))
#Conv2D는 2D 컨볼루션 레이어를 추가합니다. 여기서 filters=32는 32개의 필터(또는 커널)을 사용하겠다는 것을 의미합니다.
# kernel_size=(3,3)는 각 필터의 크기가 3x3이라는 것을 의미
x = tf.keras.layers.Conv2D(filters=32, kernel_size=(3,3), strides=(1, 1), padding='valid', activation='relu')(inputs)
# MaxPool2D는 맥스 풀링 레이어를 추가
x = tf.keras.layers.MaxPool2D(
pool_size=(2, 2),
strides=(2, 2),
padding='valid')(x)
#두 번째 Conv2D 레이어는 더 많은 필터(64개)를 사용하여 입력 데이터의 더 복잡한 특성을 추출
x = tf.keras.layers.Conv2D(filters=64, kernel_size=(3,3), strides=(1, 1), padding='valid', activation='relu')(x)
#두 번째 MaxPool2D 레이어는 다시 한번 특성 맵의 크기를 줄인다.
x = tf.keras.layers.MaxPool2D(
pool_size=(2, 2),
strides=(2, 2),
padding='valid')(x)
#Flatten 레이어는 이전 레이어의 출력을 평탄화한다. 즉, 2D 특성 맵을 1D 벡터로 변환하여 완전 연결 레이어(Dense 레이어)에 입력할 수 있도록 한다
x = tf.keras.layers.Flatten()(x)
#Dense 레이어는 모델의 출력 레이어로, 10개의 뉴런을 가집니다(10개의 클래스에 해당)
outputs = tf.keras.layers.Dense(10, activation=tf.nn.softmax)(x)
# tf.keras.Model을 사용하여 입력 레이어와 출력 레이어를 연결
model_by_func = tf.keras.Model(inputs=inputs, outputs=outputs, name='model_by_func_pool')
-> TensorFlow와 Keras를 사용하여 간단한 컨볼루션 신경망(Convolutional Neural Network, CNN) 모델을 함수형 API를 통해 정의
1.tf.keras.layers를 통해 모델이 받아들이는 입력 형태를 지정한다 여기서는 모델이 32x32 픽셀 크기의 이미지를 입력으로 받아들일 것으로 예상하여 지정한다. 3은 채널의 수를 나타낸다
2.Conv2D 의 2D 컨볼루션 레이어를 추가한다 Conv2D 의 2D 컨볼루션 레이어는 이미지와 같은 2차원 데이터를 처리하는데 사용된다. 이 'Conv2D는 컨볼루셔널 신경망(CNN)의 핵심 구성요소중 하나이다.
3.tf.keras.layers.MaxPool2D 를 입력하여 맥스 풀링 레이어를 추가한다. 입력 특성 맵에서 주요 특성을 강조하고 차원을 축소하기 위해 사용된다
4.두번째 2D 컨볼루션 레이어를 추가
5.두번째 MaxPool2D 레이어 추가 여기서 컨볼로수녀 레이어 와 맥스 풀링 레이어를 교차하여 사용하는것은 모델의 성능을 최적화하고 학습과정을 효율적으로 만드는데 있다. 교차하여 사용함으로써, 모델은 더 작고 관리하기 쉬운 특성 맵에서 복잡한 특성을 효율적으로 학습할 수 있다
6.Flatten 레이어로 이전 레이어 출력을 평탄화한다. 완전 레이어에 입력할수있도록 한다
7.Dense 레이어는 모델의 출력 레이어, 10개의 뉴런을 가진다.
8.tf.keras.Model 을 사용하여입력 레이어와 출력 레이어를 연결
모델 Compile: Optimizer, loss, metrics 모두 여기서 선언
model_by_func.compile(
#optimizer='adam'은 모델의 학습에 사용될 최적화 알고리즘으로 Adam을 지정
optimizer='adam',
#손실 함수 설정
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
#평가 지표 설정
metrics=['accuracy']
)
-> 컨볼루셔널 신경망 모델을 컴파일하는 과정
컴파일을 설정하는 단계로 학습에 사용할 최적화 알고리즘과 손실함수 평가지표를 설정한다
Model 요약
model_by_func.summary()
Model: "model_by_func_pool"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_4 (InputLayer) [(None, 32, 32, 3)] 0
_________________________________________________________________
conv2d_3 (Conv2D) (None, 30, 30, 32) 896
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 15, 15, 32) 0
_________________________________________________________________
conv2d_4 (Conv2D) (None, 13, 13, 64) 18496
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 6, 6, 64) 0
_________________________________________________________________
flatten_1 (Flatten) (None, 2304) 0
_________________________________________________________________
dense_1 (Dense) (None, 10) 23050
=================================================================
Total params: 42,442
Trainable params: 42,442
Non-trainable params: 0
_________________________________________________________________
모델 요약
Layer : InputLayer : 모델의 입력 레이어이다 이미지의 형태는 높이 32 너비 32 그리고 3개의 채널로 구성된다
Layer (type): Conv2D : 첫번째 컨볼루션 레이어이다. 32개의 필터와 33 크기의 커널을 사용한다. 출력형태는 3030 크기에 32개의 필터로 구성되었다. 레이어의 파라미터수는 896개이다.
MaxPooling2D Layer (type): MaxPooling2D : 첫번째 맥스 풀링 레이어이다. 2*2 크기의 풀링 윈도우를 사용하여 특성맵의 크기를 절반으로 줄인다
그다음 2층을 쌓는다
Flatten layer:'Flatten' 평탄화 레이어는 이전 레이어의 출력을 1D 벡터로 변환한다 . 이는 완전연결 레이어로 의 입력을 가능하게 한다.
Dense layer : dense : 최종완전 연결레이어이다. 10개의 출력 뉴런을 가지며, 각 뉴런은 cifar-10 데이터셋의 10개 클래스 중하나에 해당한다
학습
epochs, validation data set 등 설정
history = model_by_func.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels))
Epoch 1/10
1563/1563 [==============================] - 38s 3ms/step - loss: 2.1227 - accuracy: 0.3293 - val_loss: 1.9995 - val_accuracy: 0.4587
Epoch 2/10
1563/1563 [==============================] - 5s 3ms/step - loss: 1.9699 - accuracy: 0.4900 - val_loss: 1.9314 - val_accuracy: 0.5269
Epoch 3/10
1563/1563 [==============================] - 5s 3ms/step - loss: 1.9194 - accuracy: 0.5423 - val_loss: 1.8983 - val_accuracy: 0.5607
Epoch 4/10
1563/1563 [==============================] - 5s 3ms/step - loss: 1.8822 - accuracy: 0.5796 - val_loss: 1.8811 - val_accuracy: 0.5792
Epoch 5/10
1563/1563 [==============================] - 5s 3ms/step - loss: 1.8501 - accuracy: 0.6126 - val_loss: 1.8568 - val_accuracy: 0.6043
Epoch 6/10
1563/1563 [==============================] - 5s 3ms/step - loss: 1.8341 - accuracy: 0.6291 - val_loss: 1.8392 - val_accuracy: 0.6207
Epoch 7/10
1563/1563 [==============================] - 5s 3ms/step - loss: 1.8145 - accuracy: 0.6481 - val_loss: 1.8417 - val_accuracy: 0.6182
Epoch 8/10
1563/1563 [==============================] - 5s 3ms/step - loss: 1.8003 - accuracy: 0.6623 - val_loss: 1.8371 - val_accuracy: 0.6239
Epoch 9/10
1563/1563 [==============================] - 5s 3ms/step - loss: 1.7897 - accuracy: 0.6731 - val_loss: 1.8286 - val_accuracy: 0.6314
Epoch 10/10
1563/1563 [==============================] - 5s 3ms/step - loss: 1.7785 - accuracy: 0.6852 - val_loss: 1.8241 - val_accuracy: 0.6353
-> 정의된 모델 model_by_func을 CIFAR-10 데이터셋에 대해 학습시키는 과정
train_images : 학습용 이미지 데이터셋
train_labels : 학습용 데이터셋 레이블 각 이미지에 대한 정답 정보를 포함
epoches=10 : 에포크의 수를 지정한다. 에포크는 전체 학습 데이터셋이 모델을 통해 학습되는 회수를 의미한다
validation_data=(test_images,test_labels): 검증 데이터셋 지정. 이 데이터셋은 각 에포크가 끝날때마다 모델의 성능을 평가하는데 사용.
평가(Evaluation)
plt.plot(history.history['accuracy'], label='accuracy')
plt.plot(history.history['val_accuracy'], label = 'val_accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.ylim([0.5, 1])
plt.legend(loc='lower right')
test_loss, test_acc = model_by_func.evaluate(test_images, test_labels, verbose=2)
313/313 - 1s - loss: 1.8241 - accuracy: 0.6353
