Python/인공지능

AI ( CNN/ Convolutional Layer/ stride/ pooling layer/ Mnist/ cifar/pandas)

아리빠 2023. 5. 11. 10:42

●회귀분석과 분류분석 정리


●CNN(합성곱 신경망)

이미지 분석에서 완전연결신경망의 문제점

-데이터 형상의 무시

-변수의 개수

-네트워크의 크기

-학습시간의 문제

 

이미지 데이터의 경우 3차원(세로, 가로, 채널)의 형상을 가지며, 공간적 구조(spatial structure)를 지닌다

ex) 공간적으로 가까운 픽셀은 값이 비슷하거나, RGB의 각 채널은 서로 밀접하게 관련 있다

 

●합성곱층(Convolutional Layer, Conv Layer)

− 이미지 데이터는 일반적으로 채널, 세로, 가로 이렇게 3차원으로 구성된 데이터

− 합성곱에서는 3차원 데이터(1, 28, 28)를 입력하고 3차원의 데이터로 출력하므로 형상을 유지 가능

− CNN에서는 이러한 입출력 데이터를 특징맵(Feautre Map)이라고 함

− 합성곱층 뉴런의 수용영역(receptive field)안에 있는 픽셀 에만 연결

− 앞의 합성곱층에서는 저수준 특성에 집중하고, 그 다음 합성 곱층에서는 고수준 특성으로 조합

 

●필터

- 필터가 합성곱층에서의 가중치 파라미터(W)에 해당

- 학습단계에서 적절한 필터를 찾도록 학습

- 입력데이터에 필터를 적용하여 필터와 유사한 이미지의 영역을 강조하는 특성맵(feature map)을 출력 하여 다음 층(layer)으로 전달

 

●패딩(Padding)

- 데이터의 크기는 Conv Layer를 지날 때 마다 작아짐

- 가장자리 정보가 사라지는 문제 발생

- 합성곱 연산을 수행하기 전, 입력데이터 주변을 특정값 으로 채워 늘리는 것

- 주로 zero-padding을 사용함

 

●스트라이드(stride)

- 필터가 이동할 간격

- 출력 데이터의 크기를 조절하기 위해 사용

- 보통 1과 같이 작은 값이 더 잘 작동됨

 

●3차원 데이터의 합성곱

 

풀링층(Pooling layer)

- 그림의 사이즈를 점진적으로 줄이는 법 Max-Pooling, Average Pooling

- Max-Pooling : 해당영역에서 최대값을 찾는 방법

- Average Pooling : 해당영역에서 평균값을 계산하는 방법

위의 이미지는 2 x 2 filter로 2 stride를 적용하여 4x4 이미지를 2x2이미지로 변환한 예제

 

●CNN모델 및 코드

from keras.models import Sequential 
from keras. layers import Dense, Conv2D, Flatten
model = Sequential ()
# model.add(Dense(units-10, input_shape-(3, )))
model.add(Conv2D (f11ters=10, kernel_size=(3, 3), # kernal_stze는 이미지를 자르는 규격을 의미
            input_shape=(8, 8, 1)))
# (rows, raws, Channels)의 형태 p channels의 1은 흑백, 3은 칼라
model.add(Conv2D(7, (2, 2), activation='relu')) # model. add (Flatten ()) model. add (Dense (32, activation-'relu*)) model. add (Dense (10, activation-'softmax*))
model.add(Flatten())
model.add(Dense(32, activation='relu'))
model.add(Dense(10, activation='softmax'))
model = Sequential()
model.add(Conv2D(filters=32, kernel_size=(4,4),
                 activation='relu',
                 input_shape = (28,28,1)))

model.add(MaxPooling2D(2,2))
model.add(Conv2D(64, (3,3), activation='relu'))
model.add(MaxPooling2D(2,2))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(256))
model.add(Dense(128, activation='relu'))
model.add(Dense(10, activation='softmax'))

 

 


●Mnist

- 이미지는 0∼255 사이의 값을 갖는 28x28 크기의 NumPy array

- 이미지는 디지털화된 형태의 픽셀(pixel)들 로 구성됨.

- 각 픽셀은 0에서 255 사이의 값을 가질 수 있는데, 이는 색상의 강도(intensity)를 나타 냄 - 0 이 가장 어두운 색이며, 숫자가 높을 수록 밝은 색


●fashion_mnist


●cifar10

it's 개구리


●cifar100

 


●mnist02_imshow


●fashion_mnist02


●cifar10_imshow02

 


●CNN/cifar100_imshow02


●tf01_cnn_mnist

정확도 높여주기 작업

->


●cnn_fashionMnist

import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Flatten, Conv2D
from keras.datasets import fashion_mnist

#1. 데이터
(x_train, y_train), (x_test, y_test)= fashion_mnist.load_data()

#print(x_train.shape, y_train.shape) #(60000, 28, 28) (60000,)
#print(x_test.shape, y_test.shape)   #(10000, 28, 28) (10000,)


# 정규화
x_train, x_test = x_train/255.0, x_test/255.0

# reshape
x_train = x_train.reshape(60000, 28, 28, 1)
x_test = x_test.reshape(10000, 28, 28, 1)


#[실습]

model=Sequential()
model.add(Conv2D(filters=32, kernel_size=(3,3), input_shape=(28,28,1)))
model.add(Conv2D(64, (3,3), activation='relu'))
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dense(128,activation='relu'))
model.add(Dense(10, activation='softmax'))

#컴파일, 훈련
model.compile(loss='sparse_categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
model.fit(x_train, y_train, epochs=10, batch_size=256)


●maxpooling (maxpooling, dropout 추가)

import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Flatten, Conv2D, MaxPooling2D,Dropout
from keras.datasets import fashion_mnist

#1. 데이터
(x_train, y_train), (x_test, y_test)= fashion_mnist.load_data()

#print(x_train.shape, y_train.shape) #(60000, 28, 28) (60000,)
#print(x_test.shape, y_test.shape)   #(10000, 28, 28) (10000,)


# 정규화
x_train, x_test = x_train/255.0, x_test/255.0

# reshape
x_train = x_train.reshape(60000, 28, 28, 1)
x_test = x_test.reshape(10000, 28, 28, 1)


#[실습]

model=Sequential()
model.add(Conv2D(filters=32, kernel_size=(4,4), activation='relu', input_shape=(28,28,1)))     
model.add(MaxPooling2D(2,2))
model.add(Conv2D(64, (3,3), activation='relu'))
model.add(MaxPooling2D(2,2))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dense(128,activation='relu'))
model.add(Dense(10, activation='softmax'))

#컴파일, 훈련
model.compile(loss='sparse_categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
model.fit(x_train, y_train, epochs=10, batch_size=256)


●cifar10_maxpooling

 


●cifar100 maxpooling

import ssl
ssl._create_default_https_context = ssl._create_unverified_context
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Flatten, Conv2D, MaxPooling2D, Dropout
from keras.datasets import cifar100
import time

#1 데이터

(x_train, y_train), (x_test,y_test) = cifar100.load_data()

#print(x_train.shape, y_train.shape)
#print(x_test.shape, y_test.shape)

#정규화
x_train = x_train/255.0
x_test=x_test/255.0

#2 모델구성
model=Sequential()
model.add(Conv2D(filters=64, kernel_size=(3,3),
                 padding='same',
                 activation='relu',
                 input_shape=(32,32,3)))
model.add(MaxPooling2D(2,2))
model.add(Dropout(0.25))
model.add(Conv2D(128,(3,3), padding='same', activation='relu'))
model.add(MaxPooling2D(2,2))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dense(128, activation='relu'))
model.add(Dense(100, activation='softmax'))

#컴파일, 훈련

model.compile(loss='sparse_categorical_crossentropy',
              optimizer='adam',
              metrics='accuracy')

start_time=time.time()
model.fit(x_train, y_train, epochs=10, batch_size=256)
end_time= time.time()-start_time

#평가 예측
loss, acc= model.evaluate(x_test,y_test)
print('걸린시간: ' , end_time)
print('loss: ', loss)
print('acc: ',acc)


▶너무 높은 loss와 부정확도 때문에 코드를 좀 더 정확하게 나오게 해보려고 고쳐보았다

단, 시간이 너무 오래걸려 동일 조건에서  cifar100 -> cifar10로 바꾼채로 진행해 보았다

목표: acc 7.7 이상

 

1. dropout: 0.25 -> 0.2

2. dropout: 0.4 -> 0.2

3. epochs: 30

4 batch_size=256

결과

#loss: 1.3285537958145142

#acc: 0.7423999905586243

#걸린시간: 1084.8667232990265

▶정확도가 조금 향상되었지만, 여전히 목표치엔 미달


1. dropout: 0.2 -> 0.3

2. dropout: 0.2 -> 0.6

3. epochs: 30

4 batch_size=256

결과

# loss: 0.9203954339027405

#acc: 0.7566999793052673

#걸린시간: 1080.484658241272

▶MaxPooling 아래의 dropout 크기 증가가 정확도와 연관이 있는거같다 , 조금 더 나아진 정확도


1. dropout: 0.3 -> 0.2

2. dropout: 0.6 -> 0.7

3. epochs: 50

4 batch_size=256

결과

# loss: 0.958968460559845

#acc: 0.7612000107765198

#걸린시간: 2033.3856253623962

▶epochs의 증가, MaxPooling 위의 dropout 크기감소, MaxPooling 아래의 dropout 증가가 모두 영향을 끼친거같다 조금 더 성능 향상을 이뤘다, 다음 실행에선 batch_size를 줄여 정확도를 더 높여봐야겠다


★성공 (#acc: 0.7836999893188477)

1 dropout: 0.20 -> 0.1

2 dropout: 0.7 -> 0.8

3 epochs: 50

4 batch_size: 256 -> 128

mport numpy as np
from keras.models import Sequential
from keras.layers import Dense, Flatten, Conv2D, MaxPooling2D, Dropout
from keras.datasets import cifar10
import time

#1 데이터

(x_train, y_train), (x_test,y_test) = cifar10.load_data()

#print(x_train.shape, y_train.shape)
#print(x_test.shape, y_test.shape)

#정규화
x_train = x_train/255.0
x_test=x_test/255.0

#2 모델구성
model=Sequential()
model.add(Conv2D(filters=64, kernel_size=(3,3),
                 padding='same',
                 activation='relu',
                 input_shape=(32,32,3)))
model.add(MaxPooling2D(2,2))
model.add(Dropout(0.10)) #0.25 -> 0.1
model.add(Conv2D(128,(3,3), padding='same', activation='relu'))
model.add(MaxPooling2D(2,2))
model.add(Dropout(0.80)) #0.2 -> 0.8
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dense(128, activation='relu'))
model.add(Dense(10, activation='softmax'))

#컴파일, 훈련

model.compile(loss='sparse_categorical_crossentropy',
              optimizer='adam',
              metrics='accuracy')

start_time=time.time()
model.fit(x_train, y_train, epochs=50, batch_size=128)
end_time= time.time()-start_time

#평가 예측
loss, acc= model.evaluate(x_test,y_test)
print('걸린시간: ' , end_time)
print('loss: ', loss)
print('acc: ',acc)

결과

# loss: 0.6487119197845459

#acc: 0.7836999893188477

#걸린시간: 1889.9429523944855

 

▶목표 달성

epochs의 증가, MaxPooling 위의 dropout 크기감소, MaxPooling 아래의 dropout 증가. batch_size 감소가 모두 영향을 끼친거같다 


●pandas


●pandas_boston data