데이터 분석 기초

딥러닝 실습 (CNN)

세용용용용 2023. 10. 8. 20:27

알츠하이머 이미지 예측

데이터 : https://www.kaggle.com/datasets/sachinkumar413/alzheimer-mri-dataset

 

Alzheimer MRI Preprocessed Dataset

Preprocessed Alzheimer Disease MRI (Magnetic Resonance Imaging)

www.kaggle.com

from tensorflow.keras.callbacks import ModelCheckpoint,EarlyStopping
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.utils import to_categorical
import numpy as np
import os
from tensorflow.keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
from PIL import Image


# image 데이터 위치 설정 (위치 확인)
data_src="/content/drive/MyDrive/Colab Notebooks/Dataset/"

# 'Mild_Demented', 'Moderate_Demented', 'Non_Demented', 'Very_Mild_Demented' 별 데이터 추출
data=[]
y=[]
for d in os.listdir(data_src):
  for file in os.listdir(data_src+d):
    data.append(Image.open(data_src+d+'/'+file))
    y.append(d)


# array로 변환한 img 데이터를 X에 할당
X=[]
for i in data:
  X.append(np.array(i))
X = np.array(X)
X.shape


y_num=[]
for cat in y:
    if cat=="Non_Demented":
        y_num.append(0)
    elif cat=="Very_Mild_Demented":
        y_num.append(1)
    elif cat=="Mild_Demented":
        y_num.append(2)
    else:
        y_num.append(3)

y=to_categorical(y_num)

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3, random_state=22)
X_train = X_train.reshape(X_train.shape[0], 128, 128, 1).astype('float32') / 255
X_test = X_test.reshape(X_test.shape[0], 128, 128, 1).astype('float32') / 255

from tensorflow.keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
# Dropout 레이어는 과적합을 방지하기 위해 사용됩니다. 
# 특정 비율의 입력 뉴런을 무작위로 비활성화시켜 학습 중에 일종의 "드롭아웃" 효과를 만듬

# Flatten 레이어는 다차원 배열을 1차원 배열로 변환

# Conv2D 레이어는 2D 컨볼루션 연산을 수행합니다. 
# 이미지에서 특징을 추출하기 위해 사용되며, 커널(필터)을 이미지 위를 슬라이딩하면서 연산을 수행

# MaxPooling2D 레이어는 최대 풀링 연산을 수행하여 이미지의 크기를 줄입니다. 
# 이미지를 격자로 나눈 각 영역에서 최댓값을 선택하여 해당 영역의 중요한 특징을 유지하면서 이미지 크기를 감소

model = Sequential()

model.add(Conv2D(32, kernel_size=(3,3), input_shape=(128,128,1), activation='relu'))
model.add(Conv2D(64, (3,3), activation='relu'))

model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Flatten())

model.add(Dense(256,  activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(4, activation='softmax'))

# 모델의 실행 옵션을 설정
model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

# 모델 최적화를 위한 설정
early_stopping_callback = EarlyStopping(monitor='val_loss', patience = 5)

# 모델 실행
history = model.fit(X_train, y_train, validation_split=0.25, epochs=40, batch_size=128, verbose=1, callbacks=[early_stopping_callback])

 

성능평가

# X_test 데이터를 사용하여 예측
test_pred = model.predict(X_test)

# 예측 결과를 원-핫 인코딩에서 클래스 인덱스로 변환
test_pred = np.argmax(test_pred, axis=1)

# 원래 레이블 데이터의 클래스 인덱스로 변환
y_test = np.argmax(y_test, axis=1)

# 정확도 계산
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y_test, test_pred)
print(f'정확도: {accuracy:.2f}')

 

 

 

손글씨 이미지 예측

1. 데이터 불러오기

# 데이터 불러오기
from tensorflow.keras.datasets import mnist
(X_train,y_train), (X_test, y_test) = mnist.load_data()
X_train.shape

 

2. 데이터 형태 변경

# 데이터 형태 변경
X_train = X_train.reshape(X_train.shape[0], 28, 28).astype('float32') / 255
X_test = X_test.reshape(X_test.shape[0], 28, 28).astype('float32') / 255
X_train[0][7]

 

 

from tensorflow.keras.utils import to_categorical
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)

 

3. 모델 생성 및 실행

from tensorflow.keras.callbacks import ModelCheckpoint,EarlyStopping
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D

model = Sequential()

model.add(Conv2D(32, kernel_size=(3,3), input_shape=(28,28,1), activation='relu'))
model.add(Conv2D(64, (3,3), activation='relu'))

model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Flatten())

model.add(Dense(256,  activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))

# 모델의 실행 옵션을 설정
model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

# 모델 최적화를 위한 설정
early_stopping_callback = EarlyStopping(monitor='val_loss', patience = 5)

# 모델 실행
history = model.fit(X_train, y_train, validation_split=0.25, epochs=40, batch_size=128, verbose=1, callbacks=[early_stopping_callback])

 

 

4. test데이터 예측후 성능평가

# X_test 데이터를 사용하여 예측
test_pred = model.predict(X_test)

# 예측 결과를 원-핫 인코딩에서 클래스 인덱스로 변환
test_pred = np.argmax(test_pred, axis=1)

# 원래 레이블 데이터의 클래스 인덱스로 변환
y_test = np.argmax(y_test, axis=1)

# 정확도 계산
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y_test, test_pred)
print(f'정확도: {accuracy:.2f}')