GPT-J-6B 모델 corlab 에서 사용해 보기 (corlab pro 필요)

GPT-J-6B 모델을 무료로 사용하기 위해서는 Hugging Face의 Transformers 라이브러리를 사용하면 됩니다. 아래는 Transformers 라이브러리를 사용하여 GPT-J-6B 모델을 로드하고 예측하는 예제 코드입니다.

from transformers import GPTJForCausalLM, GPT2Tokenizer

# GPT-J-6B 모델과 토크나이저 로드
tokenizer = GPT2Tokenizer.from_pretrained("EleutherAI/gpt-j-6B")
model = GPTJForCausalLM.from_pretrained("EleutherAI/gpt-j-6B")

# 입력 문장
input_text = "Hello, how are you?"

# 토큰화
input_ids = tokenizer.encode(input_text, return_tensors="pt")

# GPT-J-6B 모델에 입력하여 예측
output = model.generate(input_ids, max_length=50, do_sample=True)

# 디코딩하여 출력
generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
print(generated_text)

위 코드에서 GPTJForCausalLM은 GPT-J-6B 모델 클래스를, GPT2Tokenizer는 GPT-J-6B 모델에 맞는 토크나이저를 의미합니다. 이 코드를 실행하면 “Hello, how are you? I’m doing well, thank you for asking.”와 같은 문장이 출력됩니다.

이 코드를 사용하기 위해서는 transformers 라이브러리가 설치되어 있어야 합니다. pip install transformers 명령어를 사용하여 라이브러리를 설치할 수 있습니다.

corlab에서는 다음과 같이 하시면 됩니다.

 

!pip install transformers

 

앞서 말씀드린것 처럼 자원을 많이 사용하므로 Colab Pro 를 사용하셔야 합니다.

git

 

고성능 딥러닝 프레임워크 JAX (Corlab)

JAX (Just After eXecution;실행직후)
JAX 라이브러리는 TensorFlow와 유사한 기능을 가지고 있으며, 특히 자동 미분과 XLA(accelerated linear algebra) 및 JIT(just-in-time) 컴파일 기능을 강조합니다. 이러한 기능은 머신러닝 알고리즘을 더욱 효율적으로 구현하고 최적화하는 데 도움이 됩니다.

JAX 라이브러리가 “Just After eXecution”의 약자로 실행직후 라는 이름을 가지게 된것은,  NumPy, SciPy, PyTorch 등과 같은 수치 연산 라이브러리와 같이 계산 그래프를 구성하고 실행하기 직전까지 모든 것이 동적으로 결정되는 동적 계산 그래프 (dynamic computation graph) 라이브러리이기 때문입니다. 이러한 동적 계산 그래프 방식은 머신러닝 프레임워크에서 일반적으로 사용되는 정적 계산 그래프와 대조적입니다. JAX는 JIT(Just-In-Time) 컴파일러와 함께 사용되어 동적 계산 그래프를 효율적으로 컴파일하여 실행 시간을 최적화합니다. 따라서 “Just After eXecution”이라는 이름이 지어진 것입니다.

JAX는 pip로 설치할 수 있으며, 아래 명령어를 사용하여 설치할 수 있습니다.

pip install jax jaxlib

다만, JAX는 GPU를 사용하기 때문에 GPU가 없는 경우 CPU 버전으로 설치해야 합니다. GPU가 없는 경우 아래 명령어를 사용하여 설치할 수 있습니다.

pip install jax jaxlib==0.1.70+cpu -f https://storage.googleapis.com/jax-releases/jax_releases.html

 

아래는 JAX를 사용하여 간단한 선형 회귀 모델을 구현하는 예시입니다.GPU 가 없는 컴퓨터를 사용하시는 분을 위해 구글 colab에서 실행 가능하도록 작성되었습니다.

실행하기

 import jax.numpy as jnp
from jax import grad

# 선형회귀 모델 함수
def linear_regression(X, w):
    return jnp.dot(X, w.T)

# 평균제곱오차 손실 함수
def mse_loss(y_true, y_pred):
    return jnp.mean((y_true - y_pred) ** 2)

# 경사하강법 함수
def gradient_descent(w, X, y, learning_rate):
    grad_func = grad(mse_loss)
    grad_w = grad_func(y, linear_regression(X, w))
    return w - learning_rate * grad_w

# 입력과 출력 정의
X = jnp.array([[1., 1.], [2., 2.], [3., 3.], [4., 4.]])
y = jnp.array([[2.], [4.], [6.], [8.]])

# 가중치 초기값 설정
w = jnp.array([[1., 1.]])

# 학습
for epoch in range(10):
    # 예측 계산
    y_pred = linear_regression(X, w)

    # 손실 계산
    loss = mse_loss(y, y_pred)
    print(f"에포크 {epoch}\n가중치: {w}\n손실: {loss}\n예측결과: {y_pred}")

    # 경사하강법을 사용하여 가중치 갱신
    w = gradient_descent(w, X, y, 0.1)

git

JAX가 tensorflow 보다  쌘놈인가?

 

JAX (Just After eXecution) 는 기계 학습 라이브러리로, Google에서 개발했습니다. TensorFlow와 마찬가지로 JAX도 딥 러닝 모델을 만들고 훈련시키는 데 사용됩니다. 그러나 TensorFlow와 JAX 사이에는 몇 가지 차이점이 있습니다.

첫째, JAX는 미분 가능한 함수만 허용합니다. 이는 딥 러닝 모델을 구축하는 데 도움이 됩니다. 미분 가능한 함수는 모든 미분 가능한 지점에서 기울기를 가지기 때문입니다. JAX는 이러한 함수만 지원하므로 모델에서 발생할 수 있는 다양한 오류를 방지할 수 있습니다.

둘째, JAX는 함수를 컴파일하고 JIT(Just-in-time) 컴파일러로 컴파일합니다. 이는 계산 속도를 빠르게 만들어줍니다. TensorFlow와 같은 라이브러리는 모델을 그래프로 변환한 다음 실행합니다. 반면 JAX는 모델을 즉시 컴파일하고 실행합니다.

셋째, JAX는 TensorFlow와 비교해 더 깔끔한 구문을 제공합니다. TensorFlow는 상태 변수와 그래프를 별도로 추적해야 하지만 JAX는 함수형 프로그래밍을 사용하여 코드를 작성하므로 보다 간결합니다.

JAX와 TensorFlow는 모두 딥러닝 라이브러리이지만, 각각의 장단점이 있습니다. 따라서 뛰어난 것은 사용하는 목적과 상황에 따라 다릅니다.

JAX는 JAX를 이용한 코드는 다른 프레임워크와 달리 일부 또는 전체가 컴파일됩니다. 이는 빠른 속도와 함께 간소화된 코드를 제공합니다. 또한 JAX는 XLA 컴파일러를 사용하므로, TPU에서 더 빠르게 실행할 수 있습니다.

반면, TensorFlow는 이미 매우 널리 사용되고 있으며, TensorFlow 기반의 라이브러리 및 프레임워크가 많이 개발되어 있습니다. TensorFlow는 또한 다양한 하드웨어를 지원하며, 자체적으로 GPU를 활용하여 연산을 가속화할 수 있습니다.

따라서 뛰어난 것은 사용하는 목적과 상황에 따라 다르므로, 적절한 상황에서 적합한 도구를 선택하는 것이 중요합니다.

다음은 위에 JAX로 작성된 선형 회귀 모델 코드를 TensorFlow로 변환한 예시입니다.
JAX는 TensorFlow와 비슷한 API를 가지고 있기 때문에 코드 변환이 그리 어렵지 않습니다. 그러나 두 라이브러리의 내부 구현 방식이 다르기 때문에 성능 차이가 있을 수 있습니다. 또한 TensorFlow는 GPU를 이용한 병렬 처리에 대한 지원이 더욱 뛰어나기 때문에 대규모 데이터에 대한 학습 속도에서 우위를 보입니다.

import tensorflow as tf
import numpy as np

# 입력과 출력 정의
X = np.array([[1., 1.], [2., 2.], [3., 3.], [4., 4.]])
y = np.array([[2.], [4.], [6.], [8.]])

# 가중치 초기값 설정
w = tf.Variable(np.array([[1., 1.]]))

# 선형 회귀 모델 함수
def linear_regression(X, w):
    return tf.matmul(X, tf.transpose(w))

# 평균제곱오차 손실 함수
def mse_loss(y_true, y_pred):
    return tf.reduce_mean(tf.square(y_true - y_pred))

# 경사하강법 함수
def gradient_descent(w, X, y, learning_rate):
    with tf.GradientTape() as tape:
        y_pred = linear_regression(X, w)
        loss = mse_loss(y, y_pred)
    grads = tape.gradient(loss, w)
    w.assign_sub(learning_rate * grads)
    return w

# 학습
for epoch in range(10):
    # 예측 계산
    y_pred = linear_regression(X, w)

    # 손실 계산
    loss = mse_loss(y, y_pred)
    print(f"에포크 {epoch}\n가중치: {w}\n손실: {loss}\n예측결과: {y_pred.numpy()}")

    # 경사하강법을 사용하여 가중치 갱신
    w = gradient_descent(w, X, y, 0.1)

 

아래는 jax로 작성된 코드를 tensorflow도 사용하지 말고, python으로 코딩한 예시입니다. 속도 측면에서는 jax나 tensorflow보다 느릴 수 있습니다.

 

import numpy as np

# 선형회귀 모델 함수
def linear_regression(X, w):
    return np.dot(X, w.T)

# 평균제곱오차 손실 함수
def mse_loss(y_true, y_pred):
    return np.mean((y_true - y_pred) ** 2)

# 경사하강법 함수
def gradient_descent(w, X, y, learning_rate):
    def mse_grad(y, y_pred):
        return -2 * np.mean((y - y_pred) * X, axis=0)
    
    grad_w = mse_grad(y, linear_regression(X, w))
    return w - learning_rate * grad_w

# 입력과 출력 정의
X = np.array([[1., 1.], [2., 2.], [3., 3.], [4., 4.]])
y = np.array([[2.], [4.], [6.], [8.]])

# 가중치 초기값 설정
w = np.array([[1., 1.]])

# 학습
for epoch in range(10):
    # 예측 계산
    y_pred = linear_regression(X, w)

    # 손실 계산
    loss = mse_loss(y, y_pred)
    print(f"에포크 {epoch}\n가중치: {w}\n손실: {loss}\n예측결과: {y_pred}")

    # 경사하강법을 사용하여 가중치 갱신
    w = gradient_descent(w, X, y, 0.1)

JAX의 자동 미분 기능

JAX는 자동 미분 기능을 내장하고 있기 때문에 딥러닝 모델의 학습에 필요한 그래디언트 계산을 자동으로 수행할 수 있습니다.딥러닝에서 모델 학습은 주로 그래디언트 기반 최적화 알고리즘을 사용하여 이루어집니다. 그래디언트 기반 최적화 알고리즘은 손실 함수의 그래디언트를 계산하여 모델 파라미터를 업데이트하는 방식으로 작동합니다. 따라서 자동 미분 기능이 없으면 그래디언트를 직접 계산해야 하는 번거로움이 있습니다.

JAX는 그래디언트 자동 계산 기능을 제공함으로써 이러한 번거로움을 줄여줍니다. 이를 통해 개발자는 모델 학습에 집중할 수 있습니다.

예를 들어, 다음과 같은 간단한 신경망 모델이 있다고 가정해봅시다.

실행#JAX의 자동 미분 기능

import jax.numpy as jnp
from jax import grad

def loss_fn(params, x, y_true):
    y_pred = jnp.dot(x, params)
    loss = jnp.mean((y_pred - y_true) ** 2)
    return loss

params = jnp.array([0.5, -0.2, 1.0])
x = jnp.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
y_true = jnp.array([10, 20, 30])

grad_loss_fn = grad(loss_fn)

grad_params = grad_loss_fn(params, x, y_true)

print(grad_params)

위 코드에서는 간단한 3개의 입력값과 1개의 출력값을 가지는 선형 회귀 모델을 정의하였습니다. 이 모델의 손실 함수(loss function)는 평균 제곱 오차(Mean Squared Error)를 사용하였습니다. 그리고 이 손실 함수의 그래디언트(gradient)를 자동으로 계산하기 위해 JAX의 grad 함수를 이용하였습니다.

grad 함수는 함수의 인수로 전달된 함수의 그래디언트를 계산하여 반환하는 함수입니다. grad 함수가 반환한 그래디언트 값은 params에 대한 손실 함수의 편미분값이므로, 이 값은 params를 어떻게 업데이트해야 하는지 알려주는 방향성을 가집니다. 따라서 이 값을 이용하여 모델의 가중치(weight)를 업데이트하면 됩니다.

위 코드를 실행하면, grad_params의 값으로[-128.40001, -154.40001, -180.40001] 이 출력됩니다. 이 값은 입력값 x가 [1.0, 2.0, 3.0]일 때, 손실 함수를 x의 각 요소에 대해서 미분한 그래디언트 벡터를 의미합니다.

GPT-J-6B : OpenAI가 공개한 GPT-3와 유사한 소스 코드 공개된 대형 언어 모델

GPT-J-6B는 OpenAI가 공개한 GPT-3와 유사한 대형 언어 모델로, 6억 개의 파라미터로 이루어져 있습니다. GPT-J-6B는 OpenAI GPT-3와 같은 능력을 갖춘 모델로, 다양한 자연어 처리 태스크를 수행할 수 있습니다. GPT-J-6B는 JAX와 함께 공개되어 있으며, GPU를 이용하여 대규모 데이터 세트에서 훈련되었습니다.

JAX는 구글에서 개발한 머신러닝 프레임워크로, 자동 미분과 GPU 가속화를 지원하여 고성능의 머신러닝 연산을 가능하게 합니다. GPT-J-6B는 JAX 프레임워크를 사용하여 훈련되었기 때문에, 해당 모델을 사용하기 위해서는 JAX 라이브러리가 필요합니다.

GPT-J-6B를 사용하기 위해서는 직접 다운로드해서 사용하는 것이 아니라, Hugging Face나 OpenAI와 같은 API를 통해 사용하는 것이 일반적입니다.
또한 구글의 Corlab도 이용가능합니다.(Pro 버전으로 업그레이드 필요)
그러나 여기서는 직접 다운로드해서 본인의 컴퓨터를 사용해 작동시키고 싶으신 분을 위한 안내입니다.

작업 환경 구성(윈도우의 경우)

GPT-J-6B 모델을 사용하기 위해서는 다음과 같은 라이브러리, 프레임워크, 컴퓨팅 자원이 필요합니다.

  1. Python 3.x 버전
    • GPT-J-6B는 Python 3.x 버전에서 작동합니다.
  2. JAX 라이브러리
    • GPT-J-6B는 JAX 프레임워크와 함께 제공됩니다.
    • JAX는 NumPy와 호환되며, 자동 미분과 XLA(accelerated Linear Algebra) JIT 컴파일 기능을 제공합니다.
    • JAX는 pip 패키지 매니저를 통해 설치할 수 있습니다. (ex. pip install jax)
  3. CUDA Toolkit 및 cuDNN
    • GPT-J-6B 모델은 GPU를 사용하여 작동합니다.
    • 따라서 NVIDIA GPU가 필요하며, NVIDIA GPU에 대한 CUDA Toolkit과 cuDNN이 설치되어 있어야 합니다.
    • CUDA Toolkit은 NVIDIA 개발자 사이트에서 다운로드 받을 수 있습니다.
  4. Hugging Face Transformers 라이브러리
    • GPT-J-6B 모델의 편의성을 위해 Hugging Face에서 제공하는 Transformers 라이브러리를 사용할 수 있습니다.
    • Transformers는 pip 패키지 매니저를 통해 설치할 수 있습니다. (ex. pip install transformers)

따라서, Windows에서 GPT-J-6B 모델을 사용하기 위해서는 다음과 같은 작업을 수행해야 합니다.

  1. Python 3.x 버전 설치
  2. JAX 라이브러리 설치
  3. CUDA Toolkit 및 cuDNN 설치
  4. Hugging Face Transformers 라이브러리 설치

앞서 말씀드린것 처럼 , GPT-J-6B 모델은 GPU를 사용하여 작동하기 때문에, GPU가 없는 PC에서는 작동하지 않습니다. 따라서, NVIDIA GPU를 장착한 PC가 필요합니다.

다운로드

GPT-J-6B 모델의 소스 코드는 공개되어 있습니다. 해당 모델의 소스 코드는 GitHub에서 확인할 수 있습니다..

https://github.com/kingoflolz/mesh-transformer-jax

 

OpenAI GPT API와의 차이

 

OpenAI GPT API는 클라우드 기반의 인공지능 API로, OpenAI에서 운영하고 있습니다. 사용자는 API를 호출하여 GPT 모델을 사용할 수 있으며, 인터넷에 연결되어 있어야 합니다. 반면에 GPT-J-6B는 다운로드해서 사용하는 오픈소스 모델로, 로컬 환경에서 동작합니다. 따라서 인터넷 연결이 필요하지 않습니다. 또한 GPT-J-6B는 OpenAI에서 운영하는 API와는 달리, 상업적 사용에 대한 라이선스 문제가 있을 수 있습니다. 따라서 상업적 용도로 사용하기 전에 관련 법규 및 라이선스를 확인하는 것이 좋습니다.

 

챗gpt api 를 이용해서 인공지능 바이올린 레슨 – 바이올린 교육용 gpt를 만드는 과정

chatGPT API는 텍스트를 입력받아 대화를 생성하는 모델입니다. 이를 교육에 활용할 수 있습니다. 아직 남들이 시도하지 않은 영역을 찾는다면 어떨까요? 예를 들어 바이올린 레슨은 음악적, 기술적 문제 해결을 위해 코칭과 피드백등의 고도의 인간의 상호작용이 필요한 영역입니다. 이 영역을 인공지능으로 도전하는 과정 안내입니다.

시작하기 전 데이터 준비 사항과 배경 지식 

  1. 데이터 수집: ChatGPT API는 대규모 데이터 세트를 필요로 하므로, 바이올린 레슨을 위한 GPT를 만들기 위해서는 바이올린 교본(특히 시노자키 바이올린 교본, 메뉴힌 등 대가의 텍스트가 많은 바이올린 학습서) 등의 대량의 바이올린 관련 데이터를 수집해야 합니다. 이를 위해서는 데이터 수집에 필요한 시간과 노력이 필요합니다.
  2. ChatGPT API를 사용하여 바이올린 레슨을 위한 GPT를 만들 때, 텍스트 분석 기술을 사용하여 데이터를 처리해야 합니다. 이를 위해서는 자연어 처리(NLP) 기술을 이해하고, 적용할 수 있어야 합니다. 또 ChatGPT API를 사용하여 모델을 학습하는 경우, 학습에 사용되는 하드웨어 및 시간에 제한이 있을 수 있습니다. 이를 극복하기 위해서는 대규모 데이터 세트를 작은 배치로 나누어 학습하는 등의 방법을 사용하여 모델 학습을 최적화해야 합니다. 또한  ChatGPT API를 사용하여 모델을 평가할 때, 모델의 성능을 측정하는 데 사용되는 메트릭과 평가 방법에 대한 이해가 필요합니다. 이를 위해서는 모델 성능 평가에 대한 전문적인 지식과 경험이 필요할 수 있습니다.
    만약 인공지능이나 머신러닝에 대한 경험이  없으시다면 샵투스쿨의 왕초보! 텐서플로우 2.0 머신러닝 기초 강좌를 수강하신다면 (무료 강좌임) 전체 적인 머신러닝에 대한 기술적 이해력을 가질 수 있습니다.

챗GPT API를 이용한 작업 과정

  1. chatGPT API 등록: OpenAI의 chatGPT API를 사용하려면 먼저 API를 등록해야합니다. API를 등록하려면 OpenAI 웹 사이트에서 등록 프로세스를 따르고, 필요한 인증서 및 API 키를 받아야합니다. 일부 유료 서비스는 있지만, 계정 등록과 API key 생성은 무료입니다. 하지만 일부 제한 사항이 존재하며, 이를 해결하기 위해서는 유료 등급으로 업그레이드해야 합니다. 따라서, 계정 등록과 API key 생성은 무료이지만 더 많은 기능을 사용하려면 업그레이드가 필요합니다.API 등록을 위해 다음 단계를 따르세요.
    1. OpenAI 사이트에 로그인합니다. OpenAI 계정이 없는 경우, 계정을 생성해야 합니다. OpenAI의 공식 웹사이트 주소는 https://openai.com/ 입니다.
    2. 계정 로그인 후 OpenAI 대시보드로 이동합니다.
    3. 대시보드에서 API 탭을 선택합니다.
    4. API 탭에서 “Create API Key” 버튼을 클릭합니다.
    5. API 키를 생성하기 위해 지침을 따릅니다. 생성 시, 이메일 인증이 필요할 수 있습니다.
    6. API 키 생성이 완료되면, API 콘솔에서 API를 호출할 수 있는 정보를 볼 수 있습니다.

    이제 API 등록이 완료되었으므로, API를 사용하기 위해 필요한 인증 정보를 사용하여 코드를 작성할 수 있습니다.

  2. 데이터 수집: 바이올린 교육용 GPT를 만들기 위해 많은 양의 데이터가 필요합니다. 이 데이터는 바이올린 교육용 책, 레슨 내용, 연주에 대한 내용 등을 포함할 수 있습니다.바이올린 교육용 GPT를 만들기 위해 필요한 데이터는 텍스트 데이터입니다. 따라서 아래 화면 캡처를 참고하세요. Build an application에서 “Text completion” 옵션을 선택해야 합니다. 연주 동영상이나 소리를 이용한 데이터는 OpenAI API로는 처리할 수 없으며, 오직 텍스트 데이터만 가능합니다.
    OpenAI의 GPT-3 API는 일반적으로 텍스트 형태로 입력된 데이터를 처리합니다. 따라서, 바이올린 교본의 경우에는 텍스트 형태로 변환한 후에 API에 입력해야 합니다. 만약 PDF 스캔 파일을 사용하고자 한다면, 먼저 PDF를 텍스트로 변환하는 작업이 필요합니다. 이 작업은 OCR (Optical Character Recognition) 프로그램을 사용하여 수행할 수 있습니다.일반적으로 사용되는 OCR 프로그램으로는 Adobe Acrobat, ABBYY FineReader, Readiris, Tesseract 등이 있습니다. 이 중 Tesseract는 오픈소스 기반으로 무료로 사용할 수 있는 OCR 엔진으로, 다양한 언어를 지원하고 있습니다. 다만, OCR 프로그램은 인식률이 100%가 되지 않을 수 있으므로, 인식률을 높이기 위해 여러 프로그램을 조합하여 사용하거나, 수동으로 수정하는 작업이 필요할 수 있습니다.
    OpenAI의 GPT-3는 이미지 생성 및 처리와 같은 기능도 제공하지만, 그림에 대한 입력은 아직 지원하지 않습니다. 따라서 GPT-3 API를 사용하여 바이올린 교육용 GPT 모델을 구축하는 경우, 이미지를 텍스트로 변환한 후 모델에 입력해야 합니다.
    일반적으로 이미지를 텍스트로 변환한다는 것은 이미지에 포함된 텍스트를 인식하고, 그것을 컴퓨터가 이해할 수 있는 문자로 변환하는 것을 의미합니다. 따라서 이미지에 포함된 텍스트를 추출하고, 그것을 활용하는 것이 가능합니다. 하지만 이미지 자체를 설명하는 것은 어려울 수 있습니다.GPT 모델은 주로 텍스트 데이터를 기반으로 학습하기 때문에, 연주 동영상이나 음원을 직접 입력하는 것은 어렵습니다. 하지만, 이러한 비디오나 오디오 자료를 텍스트로 변환한 뒤에 모델에 학습시키는 방법이 있습니다. 이를 위해 자동 음성인식 (Automatic Speech Recognition, ASR) 기술이나 영상에서의 문자 인식 (Optical Character Recognition, OCR) 기술 등을 사용하여 비디오나 오디오에서 텍스트 데이터를 추출하는 과정이 필요합니다. 추출된 텍스트 데이터를 GPT 모델에 학습시켜 음악이나 연주에 대한 텍스트 데이터를 생성하고, 이를 이용하여 교육할 수 있습니다.하지만, 이러한 방법으로 생성된 텍스트 데이터는 모델이 학습한 데이터의 정확도와 완전히 일치하지는 않을 수 있으며, 일부 정보의 손실이 발생할 수도 있습니다. 또한, 음악이나 연주와 같은 비디오나 오디오 자료를 텍스트로 변환하는 과정에서 인식 오류가 발생할 수 있으므로, 이러한 방법으로 생성된 데이터를 사용할 때에는 주의가 필요합니다.

    시노자키 바이올린 교본 pdf 스캔의 예
  3.  데이터 정제: 데이터를 수집하면 다음 단계는 데이터를 정제하는 것입니다. 이 단계에서는 데이터를 노이즈에서 필터링하고 정규화하여 분석 가능한 형식으로 변환해야합니다.예를 들어 시노자키 교본 2권(개정판) 10페이지의 맨 상단의 text인 “매일 여러 번 반복해서 연습하십시오” 라는 문장을 정제하는 과정은 다음과 같습니다.
    1. 불필요한 정보 필터링: OCR을 통해 추출한 텍스트 데이터에서 필요하지 않은 정보(예: 이미지 캡션, 페이지 번호 등)를 필터링합니다.
    2. 텍스트 정규화: 추출한 텍스트 데이터를 정규화하여 데이터를 분석 가능한 형식으로 변환합니다. 이 단계에서는 스테밍(stemming), 불용어(stopwords) 제거, 대소문자 통일 등의 과정을 거쳐 정규화된 텍스트 데이터를 생성합니다.스테밍(stemming)은 단어의 어간(stem)을 추출하는 과정입니다. 즉, 같은 의미를 가지지만 다른 형태로 표현된 단어들을 같은 형태로 통일하여 분석을 용이하게 합니다. 예를 들어, “walking”, “walks”, “walked”와 같은 단어들은 모두 “walk”의 어간(stem)을 갖고 있으므로, 스테밍을 통해 모두 “walk”로 변환할 수 있습니다.불용어(stopwords)는 분석에 있어서 의미가 없거나 빈번하게 등장하여 분석에 방해가 되는 단어들을 말합니다. 예를 들어, 영어에서는 “the”, “a”, “an”, “in”, “at”과 같은 단어들이 불용어에 해당합니다. 이러한 불용어들은 분석에서 제거함으로써, 더 의미 있는 단어들에 집중할 수 있습니다.따라서, 예를 들어 “매일 여러 번 반복해서 연습하십시오”라는 문장에서 스테밍을 수행하면 “반복”, “연습”과 같은 어간(stem)들만 추출할 수 있습니다. 불용어 제거를 수행하면 “매일”, “여러”, “번”, “해서”, “하십시오”와 같은 불용어들은 제거되어 “반복”, “연습”만 남게 됩니다.
      따라서, “매일 여러 번 반복해서 연습하십시오”와 같은 텍스트 데이터를 분석 가능한 형식으로 변환하려면 OCR을 통해 추출한 텍스트 데이터를 필터링하고, 정규화하며, 이를 바탕으로 텍스트 분석을 수행해야 합니다.
    3. 텍스트 분석: 생성된 정규화된 텍스트 데이터를 바탕으로 텍스트 분석을 수행합니다. 이 단계에서는 텍스트 데이터를 어떻게 활용할 것인지에 따라서 다양한 방법으로 분석이 가능합니다. 예를 들어, 자연어 처리(NLP) 기술을 활용하여 텍스트 데이터의 감성 분석, 주제 분류, 문서 요약 등의 작업을 수행할 수 있습니다.
      예를 들어 텍스트 분석에서 “반복”과 “연습”은 중요한 단어로 간주될 수 있습니다. 이러한 단어들은 주제 분류 작업에서 해당 문서가 음악 교육에 관한 것임을 나타내는 중요한 단서가 될 수 있습니다. 또한, 감성 분석에서는 이러한 단어들이 긍정적인 의미를 지닐 수 있습니다. 예를 들어 “반복”이라는 단어는 어떤 기술을 반복적으로 연습함으로써 성취감을 느끼는 것과 같이 긍정적인 의미를 지닐 수 있습니다. 따라서 이러한 단어들을 활용하여 텍스트 분석을 수행할 수 있습니다.반복 연습에 대한 감성 분석 예시로는, “반복적인 연습은 지루하고 지치지만, 도전적인 과제를 해결하고 나면 성취감과 자신감을 얻게 된다” 라는 문장을 예로 들 수 있습니다. 이 문장에서 “반복적인 연습”이라는 키워드는 부정적인 감성을 나타낼 수 있지만, 이후의 문장에서 긍정적인 감성으로 전환이 되기 때문에 전체적으로는 긍정적인 감성을 나타냅니다.주제 분류 예시로는, “반복적인 연습의 중요성”이라는 주제로 분류한다면, 문장 속에서 “반복”, “연습”과 같은 키워드를 추출해 이를 중심으로 분석을 진행할 수 있습니다.문서 요약 예시로는, “반복적인 연습의 효과”라는 주제로 요약을 한다면, 이 문장에서 “반복적인 연습은 지루하고 지치지만, 도전적인 과제를 해결하고 나면 성취감과 자신감을 얻게 된다”라는 구절을 요약할 수 있습니다. 이를 요약하면 “반복적인 연습을 통해 성취감과 자신감을 얻을 수 있다”와 같이 요약할 수 있습니다.

     

  4. 모델 학습: 모델 학습 단계에서는 GPT 모델을 데이터에 적합하도록 조정합니다. 이 단계에서는 OpenAI의 chatGPT API를 사용하여 모델을 훈련하고, 훈련 세트에서 성능을 최적화하고, 과적합을 방지하는 하이퍼파라미터를 조정합니다.
    모델 학습 단계에서는 훈련 데이터셋에 적합하도록 모델의 파라미터를 조정하여 성능을 최적화하고, 과적합을 방지합니다. 예를 들어, 입력으로 받은 텍스트 데이터에서 모델이 언어의 문맥과 관련된 규칙과 패턴을 학습할 수 있도록 하이퍼파라미터를 조정합니다. 예를 들어, GPT 모델의 layer 개수, 학습률(learning rate), 배치 크기(batch size), 에포크 수(epoch) 등을 조정하여 최적의 하이퍼파라미터를 찾습니다.과적합(overfitting)은 모델이 훈련 데이터셋에 대해서는 높은 정확도를 보이지만, 새로운 데이터에 대해서는 일반화(generalization) 능력이 떨어지는 문제를 말합니다. 예를 들어, 모델이 학습 데이터셋에서 우리가 정제한 키워드  “반복”과 “연습”을 잘 예측하지만, 새로운 데이터에서는 예측 성능이 낮아질 수 있습니다. 이를 방지하기 위해 모델의 복잡도를 줄이는 방법, 데이터셋을 다양하게 확보하는 방법 등이 있습니다.
  5. 모델 테스트: 모델 학습이 완료되면 테스트 세트에서 모델의 정확성을 테스트합니다. 이 단계에서는 모델의 성능이 만족스러운지 확인하고, 추가 조정이 필요한 경우 모델을 다시 훈련할 수 있습니다.
    chatGPT API는 텍스트를 입력받아 대화를 생성하는 모델입니다. 따라서 chatGPT API를 사용하여 모델 테스트를 수행하려면, 테스트 세트에서 추출한 텍스트 데이터를 입력으로 제공하고, 생성된 대화 결과를 평가하여 모델의 정확성을 확인할 수 있습니다.예를 들어, 테스트 세트에서 추출한 다양한 주제의 질문을 chatGPT API에 입력하고, 생성된 대화 결과가 원하는 대답과 일치하는지 확인할 수 있습니다. 또한, 생성된 대화 결과의 자연스러움과 일관성을 평가하여 모델의 성능을 확인할 수 있습니다.
  6. 모델 배포: 모델을 배포하기 전에 API의 사용 조건에 따라 라이선스 및 사용 권한을 검토해야합니다. 모델을 배포하기 전에 웹 서버와 같은 호스팅 서비스를 설정해야합니다.
    OpenAI의 GPT API를 사용하기 위해서는 API Key를 발급받아야 하며, 발급받은 Key를 사용하여 API를 호출하는 것으로 사용 권한을 확인합니다.웹 서버는 다양한 호스팅 서비스에서 가능합니다. 일반적으로 흔한 Linux 호스팅 역시 가능합니다.OpenAI의 GPT API의 가격은 시간당 요금으로 책정됩니다. 2023년 2월 기준으로, GPT-3 API의 경우 초당 4센트에서 16센트 사이의 가격이 적용되며, 사용량에 따라 다른 요금제가 존재합니다. 따라서 월 10만건의 질문을 한다면 대략 4,000에서 16,000 달러 사이의 비용이 들 것으로 예상됩니다.

    OpenAI의 GPT API는 REST API로 제공되며, 따라서 프론트엔드 및 백엔드 어떤 플랫폼에서든 API를 호출하여 사용할 수 있습니다. WordPress나 Django 등 다양한 플랫폼에서 API를 사용할 수 있습니다.
    예를 Django REST framework를 사용하여 OpenAI의 GPT API를 호출할 수 있습니다. Django REST framework은 Python으로 작성된 웹 프레임워크이며 RESTful API를 구축하는 데 사용됩니다. OpenAI의 GPT API는 HTTP 요청을 통해 호출되므로 Django REST framework의 HTTP 요청 기능을 사용하여 GPT API와 상호 작용할 수 있습니다.

    Django REST framework을 사용하면 API 엔드 포인트를 정의하고 해당 엔드 포인트에서 GPT API에 대한 요청을 보내는 데 필요한 모든 기능을 제공할 수 있습니다. 이를 통해 Django 애플리케이션에서 OpenAI의 GPT API와 상호 작용하는 데 필요한 모든 기능을 구현할 수 있습니다. 이와 관련된 샵투스쿨의 강좌로는 1시간만에 장고 플러터 연동 모바일 앱 만들기 – 장고 DRF(Django Rest Framework)와 모바일 앱 연동이 있으며 여러분은 첫번째 섹션의 장고측 서버작업 부분을 보시면 api 연동에 대한 이해력을 가지게 됩니다.

  7. API 사용: 모델이 배포되면 바이올린 교육용 GPT를 사용할 수 있습니다. 이를 위해서는 API를 호출하고 모델의 입력 데이터를 전달해야합니다. API는 모델을 실행하고 적절한 출력을 반환합니다.
    웹 뿐만 아니라 OpenAI API를 이용해서 ChatGPT 서비스를 모바일 앱에서도 사용할 수 있습니다. OpenAI는 REST API를 제공하므로, 대부분의 클라이언트 라이브러리나 SDK를 사용하여 API를 호출할 수 있습니다. 예를 들어, Flutter 애플리케이션에서는 http 패키지를 사용하여 OpenAI API를 호출할 수 있습니다. 이를 통해 모바일 앱에서도 ChatGPT 서비스를 구현할 수 있습니다. 다만, API 사용량 제한과 관련한 가격 정책을 고려하여 개발 및 서비스를 진행해야 합니다.

 

이와 같은 단계를 따라서 바이올린 교육용 GPT를 만들 수 있습니다.

 

 

 

 

keras의 내장된 datasets

Keras는 딥 러닝 모델을 개발할 때 데이터셋을 준비하는 것이 매우 중요하다는 것을 인식하고 있습니다. 따라서 Keras는 기본적으로 사용자들이 쉽게 활용할 수 있는 몇 가지 대표적인 데이터셋을 내장하고 있습니다.

이러한 내장된 데이터셋은 딥 러닝 알고리즘 개발 및 테스트를 위해 사용될 수 있습니다. 또한 이러한 데이터셋을 사용하면 실제 문제와 비교적 유사한 가상 문제를 다룰 수 있으므로 딥 러닝 모델의 효과적인 훈련 및 성능 향상을 위한 기반을 제공합니다.

내장된 데이터셋을 활용하면 데이터 수집, 전처리 및 로딩 등의 불필요한 작업을 줄일 수 있으며, 쉽게 사용 가능한 예제 데이터를 통해 새로운 딥 러닝 모델 개발에 대한 진입 장벽을 낮출 수 있습니다. 이는 개발자들이 더 높은 수준의 추상화를 통해 딥 러닝 모델을 구축할 수 있도록 하여 생산성을 높이고 딥 러닝 기술의 보급과 발전을 촉진하는 데 기여합니다.

 

Keras는 다음과 같은 다양한 내장 데이터셋을 제공합니다.

  1. CIFAR10과 CIFAR100: 10개 또는 100개의 클래스로 구성된 32×32 크기의 컬러 이미지 데이터셋입니다. (https://www.cs.toronto.edu/~kriz/cifar.html)
  2. MNIST: 10개의 클래스로 구성된 28×28 흑백 손글씨 이미지 데이터셋입니다. (http://yann.lecun.com/exdb/mnist/)
  3. Fashion-MNIST: 10개의 클래스로 구성된 28×28 흑백 의류 이미지 데이터셋입니다. (https://github.com/zalandoresearch/fashion-mnist)
  4. IMDB: 영화 리뷰의 텍스트 데이터셋으로 긍정적인 리뷰와 부정적인 리뷰를 구분하는 이진 분류 문제입니다. (https://ai.stanford.edu/~amaas/data/sentiment/)
  5. Reuters: 뉴스 기사의 텍스트 데이터셋으로 46개의 클래스로 구성된 다중 분류 문제입니다. (https://archive.ics.uci.edu/ml/datasets/reuters-21578+text+categorization+collection)
  6. Boston Housing: 보스턴의 주택 가격과 주택 가격에 영향을 미치는 여러 가지 요소들의 데이터셋입니다. (https://archive.ics.uci.edu/ml/datasets/Housing)
  7. MNIST Fashion: 패션 이미지를 10개의 클래스로 분류하는 데이터셋입니다. (https://github.com/zalandoresearch/fashion-mnist)

이 외에도 Keras는 다양한 외부 데이터셋을 불러오고 활용할 수 있도록 API를 제공합니다.

인공지능과 보안

인공지능은 보안 분야에서도 다양하게 활용됩니다. 이를테면 다음과 같은 보안 기술들이 있습니다:

  1. 악성 코드 탐지: 인공지능 기반의 악성 코드 탐지 기술은 컴퓨터 바이러스, 웜, 트로이 목마 등의 악성 코드를 탐지하고 차단합니다. 기존의 시그니처 기반 방식과는 달리, 머신러닝 알고리즘을 이용해 새로운 악성 코드를 탐지하고 차단할 수 있습니다.
  2. 스팸 필터링: 스팸 필터링은 이메일이나 메시지 등에서 스팸으로 분류되는 내용을 차단하는 기술입니다. 인공지능을 활용하면, 머신러닝 알고리즘을 이용해 스팸 메시지의 패턴을 학습하고, 새로운 스팸 메시지를 탐지하여 차단할 수 있습니다.
  3. 침입 탐지: 침입 탐지 시스템은 네트워크 상에서의 침입 시도를 탐지하고 차단합니다. 인공지능을 활용하면, 머신러닝 알고리즘을 이용해 네트워크 트래픽의 패턴을 분석하여 침입 시도를 탐지하고 차단할 수 있습니다.
  4. 사용자 인증: 사용자 인증 기술은 사용자가 자신이 주장하는 대로 실제로 그 사용자인지 확인하는 과정입니다. 인공지능을 활용하면, 얼굴 인식, 음성 인식, 지문 인식 등 다양한 인증 방식을 더욱 정확하게 수행할 수 있습니다.
  5. 보안 위협 예측: 인공지능을 활용하면, 보안 위협을 예측할 수 있습니다. 머신러닝 알고리즘을 이용해 과거의 보안 위협 패턴을 분석하고, 새로운 보안 위협을 예측할 수 있습니다. 이를테면, 악성 코드의 출현 빈도, 해킹 시도의 패턴 등을 분석하여 보안 위협을 예측할 수 있습니다.
  6. 전자상거래 보안: 인공지능을 활용하면 사기성 주문 판별에 유용한 도구로 사용할 수 있습니다.

머신러닝 모바일 앱 5종 따라 만들기 – Firebase ML Kit 과 Flutter, TensorFlow Lite 이용

강좌 소개 머신러닝(Machine Learning) 으로 모바일 앱을 만들어 보아요! 이 강좌에서는 플러터(Flutter) ,텐서플로우 LT(TensorFlow Lite) ,파이어 베이스 ML (Firebase ML Kit) 을 이용해 여러분 모바일 앱에 머신러닝을 구현해 봅니다.

예술가를 위한 머신러닝 – 음악가, 작가, 화가를 위한 딥러닝 1. 시리즈 개요와 AI 음악 🎵

[샵투월드 AI 연구소] 예술가를 위한 머신러닝 – 음악가, 작가, 화가를 위한 딥러닝

1. 시리즈 개요와 AI 음악

시작하면서.

AI는 예술가들의 창조성의 새로운 도구가 될 것입니다.

마치 19세기 전까지 화가들은 블루 색상 안료를 비싸고 귀한 청금석을 이용해야만 하다가 19세기 화학적 안료의 발명으로 누구나 사용할 수 있게 되었듯이,

또 전기의 발명으로 비디오 아트 , 디지털 아트 등의 범위가 넓어진 것처럼, 또  음악에선 레코딩 등 그 지평이 넓어진것 처럼 인공지능은 예술가들의 활동 범위를 넓히게 될 것입니다.

여러분은 저와 함께 딥러닝의 힘을 즐겨보도록 하겠습니다.

푸른색 안료의 사용을 위해 화가분께서 그 화학식을 이해할 필요 없듯이 여기서는 단순히 구글 콜랩을 이용해 여러분의 예술의 영역의 표현도구로 사용하는 데 촛점을 두고 진행하겠습니다. 여러분은 일부 매개 변수와, 값 및 소스를 변경하면서 , AI의 무한한 가능성을 즐기게 됩니다.

이 연재물은 음악가, 작가, 화가분들이 머신러닝의 직접적인 이해 없이도 접근할 수 있는 도구 제공의 목적으로 시작되었습니다.

만약 이런 도구 사용방법이 아닌 근본적인 머신러닝의 기초 부터 배우시고 싶으신 분은 샵투의 “왕초보 머신러닝 강좌“를 참고 하세요. 무료 입니다. 또한 머신러닝을 실제

적용하길 원하시는 분은 머신러닝 데이터 사이언스 웹앱 제작을 참고하세요.

작품 제목: 재벌된 꿈 꾼 후에 , 작가 : 인공지능 , 모델: 에이미

우리는 이 연재물에서 위와 같은 작업을 하게 됩니다. 위의 작품은

우리 인간이 연속된 패턴을 발견하는 뇌 신경의 속성을 적용하여 만들어진 작품으로

연재를 통해 살펴보는 내용 중 하나입니다. 여러분은 이런 패턴 구조 적용 방식을 머신러닝 알고리즘에 대한 이해 없이 사용할 수 있게 됩니다.

예술가들이 기술이 아닌 작품 자체에만 신경쓰면 되는 것이 이 연재의 목적입니다.

 

그럼 먼저 이번 시간에는 음악을 한번 AI로 접근해 보겠습니다.

 

 

Magenta: 마젠타: 변압기와 음악

마젠타(Magenta)는 구글의 오픈소스 프로젝트로서, 인공지능을 이용한 음악 창작을 지원하는 라이브러리와 툴킷입니다. Magenta를 사용하여 MIDI 파일 생성하는 코드는 다음과 같습니다.

# 필요한 라이브러리 설치
!pip install magenta

# Magenta에서 제공하는 예제 코드 사용
import magenta
from magenta.models.melody_rnn import melody_rnn_sequence_generator
from magenta.models.shared import sequence_generator_bundle
from magenta.protobuf import generator_pb2
from magenta.protobuf import music_pb2


# 모델 경로와 설정
BUNDLE_NAME = 'attention_rnn'
MODEL_NAME = 'attention_rnn'
BUNDLE_PATH = sequence_generator_bundle.read_bundle_file(f'./{BUNDLE_NAME}.mag')
CONFIG = BUNDLE_PATH.generator_details

# Sequence Generator 초기화
generator = melody_rnn_sequence_generator.MelodyRnnSequenceGenerator(
    model=sequence_generator_bundle.read_bundle_file(f'./{MODEL_NAME}.mag'),
    details=config.details,
    steps_per_quarter=config.steps_per_quarter,
    checkpoint=None)

# Sequence Generation을 위한 설정
generate_section = music_pb2.NoteSequence()
generate_section.ticks_per_quarter = 220
generate_section.tempos.add().qpm = 120

# 생성할 음악 정보 입력
generator_options = generator_pb2.GeneratorOptions()
generator_options.args['temperature'].float_value = 1.0
generator_options.generate_sections.add(start_time=0, end_time=30)

# 음악 생성
sequence = generator.generate(generate_section, generator_options)

이 코드는 Magenta에서 제공하는 예제 코드를 기반으로 하며, MelodyRNN 모델을 사용하여 MIDI 파일을 생성합니다. 코드 실행 전에 Magenta 라이브러리를 설치해야 합니다. MIDI 파일을 생성하면, 다양한 프로그램을 사용하여 연주하거나 WAV 파일로 변환할 수 있습니다.

 

 

마젠타 홈페이지

https://magenta.tensorflow.org/

 

여러분은 아래의 “실습해 보기” 링크를 통해 간단하게 실행해 볼 수 있습니다.

다만 구글 콜랩을 한번도 안해 보신 분이면 먼저 딱 4분 15초만 시간을 내 주셔서

다음의 동영상 강좌를 봐 주시고 시작하세요.  또는 이미 하실 줄 아시는 분은 아래의 실습해 보기로 바로 가 주시기 바랍니다.

 

실습해 보기

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

나머지 부분은 기본적으로 동일하게 사용하고 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
   프로젝트 구현 사이트 보기 : 머신러닝 이용 뇌종양 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