반응형
1. CNN - MNIST
[코드]
import numpy as np
from keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)
print(x_train[0])
print(y_train[0])
import matplotlib.pyplot as plt
plt.imshow(x_train[0], 'gray')
plt.show()
[출력]
2. CNN - Fashion MNIST
[코드]
import numpy as np
from keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)
print(x_train[0])
print(y_train[0])
import matplotlib.pyplot as plt
plt.imshow(x_train[0], 'gray')
plt.show()
[출력]
3. CNN - cifar10
[코드]
import numpy as np
from keras.datasets import cifar10
(x_train, y_train), (x_test, y_test)=cifar10.load_data()
class_names= ['airplane', 'automobile', ' bird', 'cat', 'deer', 'dog', 'frog',
'horse', 'ship', 'truck']
import matplotlib.pyplot as plt
plt.figure(figsize=(10,10))
for i in range(25):
plt.subplot(5, 5, i+1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(x_train[i], cmap=plt.cm.binary)
plt.xlabel(class_names[(y_train[i][0])])
plt.show()
[출력]
4. CNN - cifar100
[코드]
import numpy as np
from keras.datasets import cifar100
(x_train, y_train), (x_test, y_test)=cifar100.load_data()
class_names = ['apple', 'aquarium_fish', 'baby', 'bear', 'beaver', 'bed', 'bee', 'beetle',
'bicycle', 'bottle', 'bowl', 'boy', 'bridge', 'bus', 'butterfly', 'camel',
'can', 'castle', 'caterpillar', 'cattle', 'chair', 'chimpanzee', 'clock',
'cloud', 'cockroach', 'couch', 'crab', 'crocodile', 'cup', 'dinosaur',
'dolphin', 'elephant', 'flatfish', 'forest', 'fox', 'girl', 'hamster',
'house', 'kangaroo', 'computer_keyboard', 'lamp', 'lawn_mower', 'leopard', 'lion',
'lizard', 'lobster', 'man', 'maple_tree', 'motorcycle', 'mountain', 'mouse',
'mushroom', 'oak_tree', 'orange', 'orchid', 'otter', 'palm_tree', 'pear',
'pickup_truck', 'pine_tree', 'plain', 'plate', 'poppy', 'porcupine',
'possum', 'rabbit', 'raccoon', 'ray', 'road', 'rocket', 'rose',
'sea', 'seal', 'shark', 'shrew', 'skunk', 'skyscraper', 'snail', 'snake',
'spider', 'squirrel', 'streetcar', 'sunflower', 'sweet_pepper', 'table',
'tank', 'telephone', 'television', 'tiger', 'tractor', 'train', 'trout',
'tulip', 'turtle', 'wardrobe', 'whale', 'willow_tree', 'wolf', 'woman',
'worm']
import matplotlib.pyplot as plt
plt.figure(figsize=(10,10))
for i in range(100):
plt.subplot(10, 10, i+1)
plt.subplots_adjust(
wspace=0.5, hspace=0.5
)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(x_train[i], cmap=plt.cm.binary)
plt.xlabel(class_names[(y_train[i][0])])
plt.show()
[출력]
5. CNN acc vs CNN_MaxPooling,Dropout acc
5-1. CNN acc
[코드]
import numpy as np
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Flatten, Conv2D
#1. 데이터
datasets = mnist
(x_train, y_train),(x_test, y_test) = datasets.load_data()
#print(datasets.load_data())
# 정규화 => 0~1 사이로 숫자 변환
x_train, x_test = x_train/255.0, x_test/255.0
print(x_train.shape, y_train.shape)
# 합성곱 (CNN) 레이어에서는 차원수를 맞춰주어야한다.
x_train = x_train.reshape(60000, 28, 28, 1)
x_test = x_test.reshape(10000, 28, 28, 1)
#2. 모델구성
model = Sequential()
model.add(Conv2D(filters=32, kernel_size=(4,4), #입력층
input_shape =(28,28,1)))
model.add(Conv2D(64, (3,3), activation='relu')) # cnn 은닉층은 relu 성능이 좋음
model.add(Flatten())
model.add(Dense(256)) # %x_train.shap
model.add(Dense(128, activation='relu')) # cnn 은닉층은 relu 성능이 좋음
model.add(Dense(10, activation='softmax')) # 0~9까지 분류해야하는 다중분류이므로.
#3. 컴파일, 훈련
model.compile(loss='sparse_categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=10, batch_size=256)
#4. 평가, 예측
loss ,acc = model.evaluate(x_test, y_test)
print('loss : ', loss)
print('acc : ', acc)
[출력]
5-2. CNN_MaxPooling, Dropout acc
[설명]
■ 입력층:
model.add(Conv2D(filters=64, kernel_size=(3,3), padding='same', activation='relu', input_shape=(32,32,3)))
이 부분은 2차원 합성곱 계층을 생성하는 것으로, 첫 입력층이며, 32x32 크기의 RGB(채널이 3인)
이미지를 입력 받음
여기서 filters=64는 64개의 필터를 사용하여 합성곱 연산을 수행하며, kernel_size=(3,3)은 각 필터의 크기가 3x3임을 나타냄. padding='same'은 입력 이미지 주변에 0으로 패딩을 추가하여 출력 이미지의 크기를 입력 이미지와
동일하게 유지. activation='relu'는 활성화 함수로 ReLU(Rectified Linear Unit)를 사용함.
■ 은닉층:
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'))
이 부분은 모델의 은닉층을 구성하고. MaxPooling2D는 특성 맵의 크기를 줄이는 데 사용되며, 이는 연산량을 줄이고, 과적합을 방지하는 효과를 가짐
Dropout은 무작위로 노드를 제거하여 과적합을 방지하는 기법.
Flatten은 2차원 특성맵을 1차원으로 변환하여 Dense층에서 처리할 수 있게 함
Dense는 전결합층으로, 각각의 뉴런이 이전 계층의 모든 뉴런과 연결되어 있음.
여기서 가중치는 학습을 통해 결정되며, 더 높은 정확도를 얻으려면 이러한 가중치를 최적화하는 것이 중요
■ 출력층:
model.add(Dense(100, activation = 'softmax'))
이 부분은 모델의 출력층을 구성합니다. Dense 계층은 각 클래스에 대한 확률을 출력하며,
이는 'softmax' 활성화 함수를 통해 각 확률의 합이 1이 되도록 만듬.
여기서 100은 출력 클래스의 수를 나타냄
[코드]
import numpy as np
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Flatten, Conv2D, MaxPooling2D, Dropout
#1. 데이터
datasets = mnist
(x_train, y_train),(x_test, y_test) = datasets.load_data()
#print(datasets.load_data())
# 정규화 => 0~1 사이로 숫자 변환
x_train, x_test = x_train/255.0, x_test/255.0
print(x_train.shape, y_train.shape)
# 합성곱 (CNN) 레이어에서는 차원수를 맞춰주어야한다.
x_train = x_train.reshape(60000, 28, 28, 1)
x_test = x_test.reshape(10000, 28, 28, 1)
# 2.모델구성
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'))
#3. 컴파일, 훈련
model.compile(loss='sparse_categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=10, batch_size=256)
#4. 평가, 예측
loss ,acc = model.evaluate(x_test, y_test)
print('loss : ', loss)
print('acc (Dropout & Maxpooling): ', acc)
[출력]
MaxPooling과 Dropout 을 통해 acc를 개선시켰음을 확인할 수 있다.
6. Pandas & HeatMap (matplotlib + seaborn)
[출력]
[설명]
Pandas의 corr() 함수를 활용하여 변수들 간의 상관계수를 계산하고,
Seaborn이나 Matplotlib을 이용하여 상관계수 히트맵을 시각화함으로써 변수들 간의 관계를 파악.
상관계수는 -1부터 1까지의 범위를 갖으며, 1에 가까울수록 양의 상관관계를 의미하며, -1에 가까울수록 음의 상관관계를 의미.
상관계수 히트맵은 밝은 색으로 표현되며, 밝을수록 상관계수가 높은 변수들을 나타냄.
이를 통해 관계가 강한 변수들을 시각적으로 확인할 수 있음
또한, 상관관계가 높은 변수들을 선택하여 모델에 적용함으로써 변수 선택을 수행함.
다중공선성 문제를 회피하기 위해 상관관계가 높은 변수들 중 하나를 선택하거나, 변수 축소 기법(예: 주성분 분석)을 사용하여 변수의 수를 줄이는 것도 가능
요약하면, 상관계수를 계산하고 상관계수 히트맵을 통해 변수들 간의 관계를 시각화하며, 상관관계가 높은 변수들을 선택하여 모델에 활용함으로써 성능을 향상시킬 수 있으며,
이를 통해 변수들 간의 관련성을 파악하고 모델의 복잡성을 줄이는 데 도움을 줌
[코드]
import numpy as np
import pandas as pd
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score
#상관계수 히트맵
import matplotlib.pyplot as plt
import seaborn as sns
# 데이터
path = './'
datasets = pd.read_csv(path + 'Boston_house.csv')
print(datasets.columns)
print(datasets.head(7))
[출력]
[코드]
x = datasets[['AGE', 'B', 'RM', 'CRIM', 'DIS', 'INDUS', 'LSTAT', 'NOX', 'PTRATIO',
'RAD', 'ZN', 'TAX', 'CHAS']] # datasets 의 columns
y = datasets[['Target']]
print(x.shape) # (506, 13)
print(y.shape) # (506, 1)
x_train, x_test, y_train, y_test = train_test_split(
x, y, test_size = 0.2, shuffle=True, random_state=77
)
print(x_train.shape, y_train.shape) # (404, 13) (404, 1)
print(x_test.shape, y_test.shape) # (102, 13) (102, 1)
sns.set(font_scale = 1.2)
sns.set(rc = {'figure.figsize':(9, 6)})
sns.heatmap(data=datasets.corr(),
square = True,
annot = True,
cbar = True
)
plt.show()
반응형