머신러닝 이용 뇌종양 MRI 사진 판독 웹 앱 서비스 만들기

프로젝트 구현 사이트 보기 : 머신러닝 이용 뇌종양 MRI 사진 판독 서비스

 

여기서는  Streamlit 을 사용한 웹 앱으로 서비스를 만들어 봅니다.
이미지 분류는 이미지 파일의 내용을 기반으로 미리 정의 된 특정 클래스에 이미지를 할당 할 수있는 컴퓨터 시각인식 모델 알고리즘 입니다.
이를 통해 우리가 서비스할 프로그램이 이미지 데이터에 대한 분류 및 정렬 작업을 수행 할 수 있도록하는 데 사용됩니다.
여기서 사용할 분류기는 Google Teachable Machine을 이용해 사전 훈련된 모델을 이용할 것이며 Python을 사용합니다.

이 강좌는 다음의 사전 지식을 기반으로 진행합니다.

  1.  app.py라는 파일을 만듭니다. 웹 페이지에 콘텐츠를 표시하는 Streamlit 코드를 포함하는 파일입니다.

 

 

import streamlit as st
from PIL import Image

st.set_option('deprecation.showfileUploaderEncoding', False) # deprecation 표시 안함 
st.title("머신러닝 이용 뇌종양 MRI 사진 판독 서비스")
st.markdown("""
뇌종양 MRI 사진을 분류합니다. 
이 서비스는 의사들의 뇌 MRI 사진 판독의 도우미일 뿐입니다. 
정확한 최종 진단 결과는 반드시 전문 담당 의사의 확인과 승인을 거치십시요.""")

image2 = Image.open('brain.jpg')
st.image(image2, caption='shop2world.com 뇌종양 MRI 판독 서비스',use_column_width=True)

 

2.이미지 분류 모델 만들기

https://teachablemachine.withgoogle.com/train

구글 Teachable Machine을 사용해 여러분은 이미지뿐 아니라 , 오디오 또는 포즈 프로젝트를 만들 수 있습니다. 이 경우 이미지 분류 프로젝트로서 Image Project를 선택합니다.

데이터셋

훈련을 위해서는 데이터가 필요합니다. 여기서는 Kaggle의 뇌종양 검출 데이터 셋을 다운로드 받아 압축을 푸세요.

https://www.kaggle.com/navoneel/brain-mri-images-for-brain-tumor-detection

(캐글에서 다운로드 안될 경우 여기서도 다운로드 가능합니다.)

이미지 분류 페이지에서 종양이 있는 뇌와 없는 뇌를 구분하는 클래스를 만들어 라벨링 작업을 하고, 해당 클래스에 이미지를 업로드하고 학습을 시킵니다.
그리고 완료되면 훈련된 파일(확장자가 .h5 인 가중치 파일)을 다운로드 해, 이것을 이용해 서비스를 제공합니다.

동영상의 설명을 보면서 함께 해 봅니다.

 

3그리고 Export에 보면 다음과 같이 적용 예 소스가 있습니다.
우리는 이것을 기반으로 streamlit에서 아래 소스의 model 부분과 image 부분을 분리해 처리하도록 만들겠습니다.

model = tensorflow.keras.models.load_model('keras_model.h5')

image = Image.open('test_photo.jpg')

import tensorflow.keras
from PIL import Image, ImageOps
import numpy as np

# Disable scientific notation for clarity
np.set_printoptions(suppress=True)

# Load the model
model = tensorflow.keras.models.load_model('keras_model.h5')

# Create the array of the right shape to feed into the keras model
# The 'length' or number of images you can put into the array is
# determined by the first position in the shape tuple, in this case 1.
data = np.ndarray(shape=(1, 224, 224, 3), dtype=np.float32)

# Replace this with the path to your image
image = Image.open('test_photo.jpg')

#resize the image to a 224x224 with the same strategy as in TM2:
#resizing the image to be at least 224x224 and then cropping from the center
size = (224, 224)
image = ImageOps.fit(image, size, Image.ANTIALIAS)

#turn the image into a numpy array
image_array = np.asarray(image)

# display the resized image
image.show()

# Normalize the image
normalized_image_array = (image_array.astype(np.float32) / 127.0) - 1

# Load the image into the array
data[0] = normalized_image_array

# run the inference
prediction = model.predict(data)
print(prediction)

나머지 부분은 기본적으로 동일하게 사용하고 app.py가있는 동일한 폴더에서 img_classification.py라는 파일을 만들고 다음과 같이 해 줍니다.

 

 

import keras
from PIL import Image, ImageOps
import numpy as np


def mri_machine_classification(img, weights_file):
    # 모델로드
    model = keras.models.load_model(weights_file)

    # keras 모델에 공급할 올바른 모양의 배열을 만듭니다.
    data = np.ndarray(shape=(1, 224, 224, 3), dtype=np.float32)
    image = img
    #이미지 크기 조정
    #resize the image to a 224x224 with the same strategy as in TM2:
    #resizing the image to be at least 224x224 and then cropping from the center
    size = (224, 224)
    image = ImageOps.fit(image, size, Image.ANTIALIAS)

    #이미지를 numpy 배열로 바꿈.
    image_array = np.asarray(image)
    # 이미지 정규화
    normalized_image_array = (image_array.astype(np.float32) / 127.0) - 1

    # 이미지를 배열에로드
    data[0] = normalized_image_array

    # 예측 시작 
    prediction = model.predict(data)
    return np.argmax(prediction) # 가장 높은 확률의 반환 위치

그리고 app.py 에서는 이미지를 업로드 하고, .h5 모델을 불러와 주는 부분을 추가합니다.



st.text("***이미지 분류를 위해 뇌 MRI 이미지를 업로드 해 주세요***")
#Streamlit 파일 처리 및 결과
#https://stackoverflow.com/questions/50906123/nameerror-name-image-is-not-defined/50906222
from PIL import Image, ImageOps

from img_classification import mri_machine_classification
uploaded_file = st.file_uploader("뇌 MRI 사진을 업로드 해 주세요.", type=['jpeg', 'png', 'jpg', 'webp'])
if uploaded_file is not None:
        image = Image.open(uploaded_file)
        st.image(image, caption='Uploaded MRI.', use_column_width=True)
        st.write("")
        st.write("처리중입니다...")
        label = mri_machine_classification(image, 'keras_model.h5')
        if label == 0:
            st.write("***결과 : MRI 스캔에는 뇌종양이 있습니다***")
        else:
            st.write("***결과 : MRI 스캔은 건강합니다***")


app.py의 전체 소스코드는 다음과 같습니다.

import streamlit as st
from PIL import Image

st.set_option('deprecation.showfileUploaderEncoding', False) # deprecation 표시 안함 
st.title("머신러닝 이용 뇌종양 MRI 사진 판독 서비스")
st.markdown("""
뇌종양 MRI 사진을 분류합니다. 
이 서비스는 의사들의 뇌 MRI 사진 판독의 도우미일 뿐입니다. 
정확한 최종 진단 결과는 반드시 전문 담당 의사의 확인과 승인을 거치십시요.""")

image2 = Image.open('brain.jpg')
st.image(image2, caption='shop2world.com 뇌종양 MRI 판독 서비스',use_column_width=True)


st.text("***이미지 분류를 위해 뇌 MRI 이미지를 업로드 해 주세요***")
#Streamlit 파일 처리 및 결과
from PIL import Image, ImageOps

from img_classification import mri_machine_classification
uploaded_file = st.file_uploader("뇌 MRI 사진을 업로드 해 주세요.", type=['jpeg', 'png', 'jpg', 'webp'])
if uploaded_file is not None:
        image = Image.open(uploaded_file)
        st.image(image, caption='Uploaded MRI.', use_column_width=True)
        st.write("")
        st.write("처리중입니다...")
        label = mri_machine_classification(image, 'keras_model.h5')
        if label == 0:
            st.write("***결과 : MRI 스캔에는 뇌종양이 있습니다***")
        else:
            st.write("***결과 : MRI 스캔은 건강합니다***")

그리고 이제 heroku 서버에 업로드 해서 적용 합니다.

다음의 세가지 파일을 만듭니다.

setup.sh

mkdir -p ~/.streamlit/

echo “\
[server]\n\
headless = true\n\
enableCORS=false\n\
port = $PORT\n\
” > ~/.streamlit/config.toml

 

Procfile

web: sh setup.sh && streamlit run app.py

requirements.txt

numpy
streamlit
pillow
keras
tensorflow

이제 모든 파일이 준비되어 하드디스크에서 업로드 할때 먼저 깃 리파지토리 초기화를 합니다.

git init

 

그리고 다음의 절차를 거쳐서 업로드 합니다.

heroku login
heroku create
git add .
git commit -m “Some message”
git push heroku master

 

만약 업데이트만 해줄 때는 다음과 같이 합니다. (// 뒤는 주석 설명이므로 타이핑 할 필요 없습니다.)

git add . // 변경사항 add
git commit -m “sopt 최고” // 스테이징
git push heroku master // 업데이트

최종 결과

https://shop2titanic.herokuapp.com/

전체 소스 코드
https://ai.shop2world.net/data/mri_brain.zip

결론

머신러닝을 의료 서비스 분야에 적용하거나 우리 삶에 필요한 도움이 되도록 할때
일반인이 쉽게 적근할 수 있는 웹 앱 서비스로 구현하는 것은 필수 입니다.

관련 해당 서비스를 만들어 보았습니다.

머신러닝 프로젝트 개발 문의
– 세계최고의 머신러닝 두뇌가 포진한 몬트리올에서
여러분 상상을 초월한  미래형 프로젝트 진행이 가능합니다.
문의 이메일
info@shop2world.com

 

 

2 -2 순한맛! 파이썬 머신러닝 강좌 – 부동산 가격(월세) 예측 (Featured 사이킷런(Scikit-learn))

이번 강좌에서는 다중선형회귀(Multiple Linear Regression) 모델을 이용해서 월세(렌트비)를 예측합니다. 지난 시간에 배운 단순 선형회귀 모델 (y = m*X + b)와 달리 월세에 영향을 주는 것은 방의 갯수, 평수, 지하철 역과 거리 등의 여러 요인이 있습니다. 이런 다양한 주어진 데이터 x 를 통해 월세 y를 예측하려면 여러 개의 변수 x를 포함해야 하기 때문에 다중 선형회귀라(Multiple Linear Regression)고 하는 것입니다. 여기서는 pandas를 통해 주어진 데이터를 불러와서 사이킷런(Scikit-learn)에서 train_test_split을 통해 데이터 세트를 분리, 훈련, 테스트를 하고 선형 회귀 모델을 생성해서 테스트데이터를 넣어 예측 값(월세)을 생성합니다. 그리고 나서 그래프를 통해 상관 관계를 살펴봅니다. (예. 평수와 월세의 관계, 건물 년식과 월세와의 관계 등) 또 마지막으로 모델의 정확도를 score 함수로 평가합니다. 이 형태를 통해 데이터를 구하여 여러분이 예측하고 싶은 것들에 다양하게 활용 할 수 있습니다.

재생목록
소스코드
Data Set

누구나 이용할 수 있는 COVID-19 공개 연구 데이터 세트 (CORD-19)

코로나 바이러스 관련 전 세계인 모두가 싸우고 있습니다.

관련 어제 현지 월요일 (3월 16일)자로 학계, 머신러닝 관련, 또는 일반 개발자, 심지어 인문  사회 분야 관련 모든 분들이 코로나 바이러스(COVID-19) 연구를 위해 사용할 수 있는 공신력 있는 구조화된 데이터 세트가 발표되었습니다.

COVID-19 공개 연구 데이터 세트 (CORD-19 ;COVID-19 Open Research Dataset) 라는 것으로 코로나 바이러스와 그와 유사한 사스 등에 관한 24,000 개 이상의 학술 기사를 연구에 사용할 수 있도록 데이터 마이닝과 텍스트 마이닝에 적합하게 구성한 것으로 , 현재까지 나온 가장 광범위한 컴퓨터 판독 가능 코로나 바이러스 문헌 모음입니다.

https://pages.semanticscholar.org/coronavirus-research

이 데이터 구조화는 미 백악관의 주도로 다음의 연구소들이 참여했습니다. *1

이 데이터 셋을 이용하여 여러분도 캐글(kaggle)에서 여러분의 통찰력 있는 기여를 할 수 있습니다. 캐글은 데이터 관련 해결 과제를 제시하면 전 세계 인 누구나 해결 모델을 등록할 수 있는 데이터셋 분석 플랫폼입니다.

캐글의 COVID-19와 관련된 데이터 셋 분석 모델 질문은 다음의 링크에 있습니다.

https://www.kaggle.com/allen-institute-for-ai/CORD-19-research-challenge

질문들은 바이러스의 배양, 치료, 증상 및 예방과 관련된 것으로 세계 보건기구 (WHO)와 기타 주요 전문 기관이 협력하여 개발되었습니다. *2

Kaggle의 질문들은 다음과 같습니다.

– 전염, 배양 및 환경 안정성에 대해 알려진 것은 무엇입니까?
– COVID-19 위험 요소에 대해 무엇을 알고 있습니까?
-바이러스 유전학, 기원 및 진화에 대해 무엇을 알고 있습니까?
– 윤리 및 사회 과학 고려 사항에 대해 발표된 내용은 무엇입니까?
– 비 제약적 중재에 대해 무엇을 알고 있습니까?
– 백신과 치료법에 대해 무엇을 알고 있습니까?
– 진단 및 감시에 대해 무엇을 알고 있습니까?
– 의료에 관한 내용은 무엇입니까?
– 정보 공유 및 부문 간 협력에 관한 내용은 무엇입니까?

이런 질문에 누구나 참여할 수 있고, 참가자들은 이 문제들에 대해 다음과 같이 풉니다.

예를 들어 ” Does latitude impact the spread of COVID-19 (위도가 코로나 바이러스 전파에 영향을 미치는지에 대해)”라는 질문입니다.

https://www.kaggle.com/paultimothymooney/does-latitude-impact-the-spread-of-covid-19

그리고 참가자는 주어진 데이터 셋을 통한 분석을 통해 다음과 같이 관계가 있다는 연구결과를 도출합니다.

결론 : abs (30)와 abs (45) 사이에 감염률과 사망률이 가장 높은 위도 범위가있는 것으로 보입니다. 이는 전 세계 데이터에서 가장 분명하지만 모든 미국 주에 대해 분류 된 데이터에서도 지원됩니다. (Conclusion: There appears to be a range of latitudes between abs(30) and abs(45) that have the highest infection rates and mortality rates. This is most obvious in the global data but is also supported by the data that is broken down for every USA state.)

 

연구자가 코로나 바이러스 같은 위기에 어떻게 기여 할 수 있을까를 생각할때, 이미 기존의 연구를 이해 할 수 있는 핵심 데이터가 , 특히 머신러닝을 이용해 처리가 가능하게 가공된 데이터가 없으면 시간이 많이 걸립니다. 자료를 모으는 것도 그렇고, 자료를 컴퓨터로 분석할 수 있도록 가공하는 작업도 보통 일이 아니죠. 따라서 공신력 있는 연구기관들이 모여 만든 이 데이터 셋은 전 세계 연구자들에게 유용한 도움이 될 것입니다. 부디  전 세계의 많은 분들이 참여하여 코로나19를 이길 수 있게 되는데 힘이 되길 바랍니다.

 

 

*1.  Allen Institute for AI, Microsoft Research, National Institute of Medicine (NLM)  Chan Zuckerberg Initiative, Georgetown University’s Center for Security and Emerging Technology, Microsoft Research , National Library of Medicine (NLM) ,National Institutes of Health (NIH).

*2.National Academies of Sciences, Engineering, and Medicine’s Standing Committee on Emerging Infectious Diseases , 21st Century Health Threats.

딥러닝을 이용한 머신러닝 코로나 바이러스 치료약 탐지 (렘데시비르)

코로나 바이러스 관련 약을 찾기 위해 인공지능을 이용하는 소스코드로서 깃허브에 공개된 것입니다. 코로나바이러스 치료에 적절한 분자구조를 찾아 기존 승인된 약에서 스크리닝 해본 결과 에볼라 치료제 렘데시비르(remdesivir)가 선택되었는데, 실제로 이 약은 현재 임상 실험에 들어간 약입니다. 누구나 사용할 수 있는 소스 코드며 재사용성과 가독성이 좋으므로 코로나바이러스를 이길 수 있는데 우리 모두 힘을 합치자는 차원에서 소개해 드립니다. https://github.com/mattroconnor/deep_learning_coronavirus_cure

 

Last update on:
Total
Confirmed

Suspicious

Deaths

Recovered

Today
Confirmed Incr

Suspicious Incr

Deaths Incr

Recovered Incr

In Mainland China, Hongkong, Taiwan.

Data source: China National Health Commission

AI를 이용한 코로나 바이러스 잠재적 치료법 연구 관련 최근 몇개월간 연구 자료들

인공지능을 이용하면 우리가 기존의 연구 방법으로 많은 시간을 사용해야만  얻을 수 있는 잠재적인 새로운 치료법을 보다 신속하게 파악할 수 있어 과학자들이 질병과 증상, 약물 및 그 효과, 치료법 발견에 도움이 될 수 있습니다.

머신러닝을 적극활용해서 이 재난을 빨리 극복하길 바랍니다.

관련 최근 몇개월간 인공지능을 이용한 코로나 바이러스 관련 최근 몇개월간 공개된 연구 자료들입니다.

 

  • ‘고해상도 컴퓨터 단층 촬영에서 2019 새로운 코로나 바이러스 폐렴을 탐지하기위한 딥 러닝 기반 모델 : 전향 적 연구(Deep learning-based model for detecting 2019 novel coronavirus pneumonia on high-resolution computed tomography: a prospective study)’

논문:

https://www.medrxiv.org/content/10.1101/2020.02.25.20021568v2

 

  •  ‘약물 타깃 상호작용 딥러닝 모델을 통해 중국 우한의 신종 코로나바이러스 (2019-nCoV)에 작용할 수 있는 시판되는 항바이러스제 예측(Predicting commercially available antiviral drugs that may act on the novel coronavirus (2019-nCoV), Wuhan, China through a drug-target interaction deep learning model)’

논문:

https://www.biorxiv.org/content/10.1101/2020.01.31.929547v1

 

  • ‘ 2019-nCoV의 새로운 약물 후보 물질을 만들기 위해 머신러닝 기술을 사용 하는 방법(Machine intelligence design of 2019-nCoV drugs)’

논문:

https://www.biorxiv.org/content/10.1101/2020.01.30.927889v1.full.pdf

  • ‘리니어폴드: 5 ‘에서 3’까지의 동적 프로그래밍 및 빔 검색으로 선형 시간 근사 RNA 폴딩(LinearFold: linear-time approximate RNA folding by 5’-to-3’ dynamic programming and beam search)’

논문:

https://arxiv.org/pdf/2001.04020.pdf

RNA 예측 알고리즘 ‘리니어폴드(LinearFold)’ 다운로드

https://github.com/LinearFold/LinearFold

신기술을 활용한 미래 음악 사업 아이디어

  1. AI DJ: 고객의 취향과 분위기에 따라 음악을 추천하고, 자동으로 믹싱하는 AI DJ 서비스를 제공하는 것입니다. 이를 위해서는 고객의 취향과 분위기를 분석하는 AI 알고리즘이 필요합니다.
  2. VR 콘서트: 가상 현실(Virtual Reality) 기술을 활용하여 고객이 원하는 장소에서 콘서트를 즐길 수 있는 서비스를 제공하는 것입니다. 이를 위해서는 VR 기술과 라이브 스트리밍 기술이 필요합니다.
  3. 인공지능 작곡: 인공지능 알고리즘을 활용하여 자동으로 음악을 작곡하는 서비스를 제공하는 것입니다. 이를 위해서는 고객의 취향을 학습하고, 그에 따라 자동으로 음악을 작곡하는 AI 알고리즘이 필요합니다.
  4. 음악 추천: 고객의 취향과 선호를 기반으로 음악을 추천하는 서비스를 제공하는 것입니다. 이를 위해서는 고객의 데이터를 수집하고, 분석하는 AI 알고리즘이 필요합니다.
  5. 음악 분석: 고객이 제공하는 음악을 분석하여, 고객에게 맞는 음악을 추천하는 서비스를 제공하는 것입니다. 이를 위해서는 음악 데이터를 분석하는 AI 알고리즘이 필요합니다.
  6. 음악 교육: 인공지능 알고리즘을 활용하여 음악 교육 서비스를 제공하는 것입니다. 이를 위해서는 인공지능이 음악을 분석하고, 고객의 연주를 평가하는 AI 알고리즘이 필요합니다.
  7. 음악 생성: 고객이 직접 음악을 생성할 수 있는 서비스를 제공하는 것입니다. 이를 위해서는 인공지능 알고리즘을 활용하여 고객이 생성한 음악을 평가하고, 보완하는 AI 알고리즘이 필요합니다.

Cost 함수 크로스 앤트로피 (Cross -Entropy)

크로스 엔트로피(Cross-Entropy)는 머신러닝에서 분류 문제를 해결하기 위해 주로 사용되는 손실 함수입니다. 이를 예를 들어 남녀 관계로 설명해보겠습니다.

예를 들어, 남녀 구분 문제에서는 머신러닝 모델이 주어진 입력 데이터(성별, 나이, 키 등)를 바탕으로 해당 데이터가 남자일 확률과 여자일 확률을 예측합니다. 이 때, 크로스 엔트로피는 모델이 예측한 확률 분포와 실제 레이블 분포 간의 차이를 계산하는 손실 함수입니다.

만약, 모델이 특정 입력 데이터를 바탕으로 해당 데이터가 남자일 확률을 0.7, 여자일 확률을 0.3으로 예측했다고 가정해봅시다. 그리고 실제로 해당 데이터가 남자인 경우를 1로, 여자인 경우를 0으로 나타낸다면, 실제 레이블 분포는 1과 0이 됩니다.

이 경우, 크로스 엔트로피 손실 함수는 다음과 같이 계산됩니다.

import numpy as np

# 모델이 예측한 확률 분포
y_pred = np.array([0.7, 0.3])

# 실제 레이블 분포
y_true = np.array([1, 0])

# 크로스 엔트로피 손실 함수 계산
loss = -np.sum(y_true * np.log(y_pred))
print(loss) # 0.35667494393873245

실행하기

따라서, 위의 경우 모델이 예측한 확률 분포와 실제 레이블 분포 간의 차이를 나타내는 크로스 엔트로피 손실 함수의 값은 약 0.357이 됩니다. 이 값은 모델의 예측이 실제와 얼마나 차이가 나는지를 나타내며, 이 값을 최소화하는 것이 모델을 학습시키는 목표가 됩니다.

 

 

One Hot Encoding

활률값으로 나온 벡터를 0,1로 표현해 주는 원핫 엔코딩에 대한 설명입니다.

확률값으로 나온 벡터를 0과 1로 표현하는 원핫 인코딩은 범주형 데이터를 다룰 때 사용하는 인코딩 방법 중 하나입니다. 각 범주(category)마다 새로운 이진 벡터를 만들어 해당 범주에 해당하는 인덱스는 1로, 그 외에는 모두 0으로 만들어주는 방식입니다.

예를 들어, 색깔을 범주형 변수로 가정하고, “빨강”, “녹색”, “파랑” 세 가지의 색깔이 있다고 합시다. 이를 원핫 인코딩을 사용하여 0과 1로 표현하면 아래와 같습니다.

색깔 빨강 녹색 파랑
빨강 1 0 0
녹색 0 1 0
파랑 0 0 1

위와 같이 범주의 개수만큼의 차원을 가진 이진 벡터를 만들어 각 범주에 해당하는 인덱스는 1로, 그 외에는 모두 0으로 만들어줍니다.

corlab에서 실행 가능한 코드는 다음과 같습니다.

#One Hot Encoding

import numpy as np

# 범주형 변수의 값
colors = ['빨강', '녹색', '파랑', '파랑', '빨강', '초록']

# 중복 제거한 범주 목록
categories = list(set(colors))

# 범주 수 만큼의 차원을 가진 이진 벡터 생성
one_hot = np.zeros((len(colors), len(categories)))

# 해당 범주의 인덱스에만 1 할당
for i, color in enumerate(colors):
    j = categories.index(color)
    one_hot[i, j] = 1

print(one_hot)

위 코드를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.

[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]
 [0. 0. 1.]
 [1. 0. 0.]
 [0. 1. 0.]]

위 출력 결과에서 각 행이 원핫 인코딩된 범주를 나타냅니다. 첫 번째 행은 “빨강”을 나타내며, 이에 해당하는 첫 번째 열만 1이고 나머지는 모두 0입니다.

아직 이해가 안되시나요?

다시 쉽게 설명해 보겠습니다.

One Hot Encoding은 범주형 데이터를 수치형 데이터로 변환하는 방법 중 하나입니다. 이 방법은 각 범주마다 하나의 이진 변수를 만들어 해당 범주에 속하면 1, 속하지 않으면 0으로 표시하는 방식입니다.

예를 들어, 성별을 나타내는 범주형 데이터가 있다고 가정해보겠습니다. 이 데이터는 “남성”과 “여성” 두 가지 범주로 구성되어 있습니다. One Hot Encoding을 적용하면 “남성” 범주에 해당하는 변수와 “여성” 범주에 해당하는 변수를 각각 만들어 해당하는 범주에는 1, 해당하지 않는 범주에는 0으로 표시합니다.

이러한 방식은 범주형 데이터를 수치형 데이터로 변환하기 때문에 다양한 머신러닝 알고리즘에서 적용할 수 있습니다. 또한 이진 변수로 표현되기 때문에 데이터의 차원이 매우 커질 수 있습니다. 그러나 이러한 차원의 증가는 일반적으로 희소 행렬(sparse matrix) 문제를 야기할 수 있습니다. 따라서 One Hot Encoding을 적용할 때는 주의해야 합니다.

예를 들어, “남성”과 “여성” 외에도 다양한 범주가 있는 경우, 모든 범주에 대한 이진 변수를 만들어 차원을 크게 늘리는 것은 비효율적일 수 있습니다. 이 경우에는 다른 인코딩 방법을 고려해야 합니다.

 

인공지능 작가 만들기

텐서플로우는 구글이 개발한 딥러닝 프레임워크로, 인공지능 모델을 쉽게 구현할 수 있도록 해줍니다. 이 예시 프로그램은 텐서플로우를 이용하여 인공지능 작가를 만드는 방법을 보여줍니다.
텐서플로우를 이용하여 LSTM(Long Short-Term Memory) 모델을 학습시켜 텍스트를 생성하는 예시 프로그램입니다. 이 예시 프로그램은 셰익스피어의 작품을 학습하여 새로운 텍스트를 생성합니다.

import tensorflow as tf
import numpy as np
import os
import time

# 데이터 로드
path_to_file = tf.keras.utils.get_file('shakespeare.txt', 'https://storage.googleapis.com/download.tensorflow.org/data/shakespeare.txt')
text = open(path_to_file, 'rb').read().decode(encoding='utf-8')

# 고유한 문자 수 계산
vocab = sorted(set(text))
vocab_size = len(vocab)

# 문자에서 숫자로 매핑
char_to_idx = {u:i for i, u in enumerate(vocab)}
idx_to_char = np.array(vocab)

text_as_int = np.array([char_to_idx[c] for c in text])

# 학습 데이터 생성
seq_length = 100
examples_per_epoch = len(text)//(seq_length+1)

char_dataset = tf.data.Dataset.from_tensor_slices(text_as_int)

sequences = char_dataset.batch(seq_length+1, drop_remainder=True)

def split_input_target(chunk):
    input_text = chunk[:-1]
    target_text = chunk[1:]
    return input_text, target_text

dataset = sequences.map(split_input_target)

BATCH_SIZE = 64
BUFFER_SIZE = 10000

dataset = dataset.shuffle(BUFFER_SIZE).batch(BATCH_SIZE, drop_remainder=True)

# 모델 생성
embedding_dim = 256
rnn_units = 1024

def build_model(vocab_size, embedding_dim, rnn_units, batch_size):
    model = tf.keras.Sequential([
        tf.keras.layers.Embedding(vocab_size, embedding_dim, batch_input_shape=[batch_size, None]),
        tf.keras.layers.LSTM(rnn_units, return_sequences=True, stateful=True, recurrent_initializer='glorot_uniform'),
        tf.keras.layers.Dense(vocab_size)
    ])
    return model

model = build_model(vocab_size, embedding_dim, rnn_units, BATCH_SIZE)

# 모델 컴파일
model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True))

# 체크포인트 콜백 설정
checkpoint_dir = './training_checkpoints'
checkpoint_prefix = os.path.join(checkpoint_dir, "ckpt_{epoch}")

checkpoint_callback=tf.keras.callbacks.ModelCheckpoint(
    filepath=checkpoint_prefix,
    save_weights_only=True)

# 모델 학습
EPOCHS = 30

history = model.fit(dataset, epochs=EPOCHS, callbacks=[checkpoint_callback])

# 체크포인트로부터 가중치 복원
model = build_model(vocab_size, embedding_dim, rnn_units, batch_size=1)

model.load_weights(tf.train.latest_checkpoint(checkpoint_dir))

model.build(tf.TensorShape([1, None]))

# 텍스트 생성
def generate_text(model, start_string):
    num_generate = 1000

    input_eval = [char_to_idx[s] for s in start_string]
    input_eval = tf.expand_dims(input_eval, 0)

    text_generated = []
    temperature = 1.0

    model.reset_states()
    for i in range(num_generate):
        predictions = model(input_eval)
        predictions = tf.squeeze(predictions, 0)

        predictions = predictions / temperature
        predicted_id = tf.random.categorical(predictions, num_samples=1)[-1,0].numpy()

        input_eval = tf.expand_dims([predicted_id], 0)

        text_generated.append(idx_to_char[predicted_id])

    return (start_string + ''.join(text_generated))

먼저, 예시로 사용될 텍스트 데이터를 불러옵니다. 이번 예시에서는 ‘The Complete Works of William Shakespeare’이라는 셰익스피어의 작품 모음집을 사용합니다.

다음으로, 데이터 전처리를 수행합니다. 이 과정에서는 텍스트 데이터를 문자 단위로 분리하고, 각 문자를 숫자로 인코딩합니다. 이렇게 처리된 데이터는 모델이 학습할 수 있는 형태로 변환됩니다.

학습을 위한 모델은 LSTM(Long Short-Term Memory)을 사용합니다. LSTM은 순환 신경망(RNN)의 일종으로, 텍스트 데이터와 같은 시퀀스 데이터를 다룰 때 효과적입니다.

모델이 학습된 후, 생성된 텍스트를 만들어내는 함수를 정의합니다. 이 함수는 모델과 시작 문자열을 인자로 받아서, 시작 문자열을 기반으로 새로운 텍스트를 생성합니다.