레이블이 machine learning인 게시물을 표시합니다. 모든 게시물 표시
레이블이 machine learning인 게시물을 표시합니다. 모든 게시물 표시

2026년 3월 2일 월요일

인공지능 학습에 필수인 데이터 분할(data splitting)

 보통은 입력(X)와 출력(y)의 쌍을 y값을 기준으로 랜덤하게 7:3 혹은 8:2로 학습용과 테스트용으로 분류한다.

통상적으로 sklearn 패키지에 있는 train_test_split() 함수를 사용하여 전체 데이터에서 학습용과 테스용 데이터의 인덱스를 얻어온다.

물론 위와 같은 방식으로 간편하게 사용하기 좋지만, 데이터의 분포가 정규분포인 경우 특정 영역에서 샘플링이 몰리는 현상은 여전하다.

그래서 계층적 샘플링(stratified sampling)을 사용하여 각 계층내에서 램덤하게 샘플링하여

위와 같이 분포가 많거나 적거나 상관없이 골고루 영역에서 램덤하게 샘플링 할 수 있다.

우선 pandas의 cut() 함수를 이용하여 데이터를 구간에 따라 라벨을 부여하고 bar 그래프를 그려본다.


import pandas as pd

import numpy as np

from matplotlib.pyplot import plt


...

data_dict['y_labels'] = pd.cut(data_dict['y'], bins=[0.0, 1.5, 3.0, 4.5, 6.0, np.inf], labels=[1, 2, 3, 4, 5])

data_dict['y_labels'].value_counts().sort_index().plot.bar(rot=0, grid=True)

plt.xlabel('categories')

plt.ylabel('counts')

plt.show()

...


그리고 train_test_split() 함수의 stratify 매개변수를 사용하여 계층적 샘플링을 수행할 수 있다.


strat_train_set, strat_test_set = train_test_split(

data_dict, test_size=0.2, stratify=data_dict['y_labels'], random_state=42

)


앞으로 계층적 샘플링을 사용하자.

2026년 1월 16일 금요일

인공지능에서 정규화(Normalizing)와 표준화(Standardizing)

 "Normalizing" a vector most often means dividing by a norm of the vector,
for example, to make the Euclidean length of the vector equal to one. In the NN literature, "normalizing" also often refers to rescaling by the minimum and range of the vector, to make all the elements lie between 0 and 1. 

- 정규화(Normalizing) : 데이터 혹은 벡터를 정규화 한다는 것은 벡터의 크기로 벡터를 나누어 크기(Euclidean Length)가 1이 되도록 하는 것이다. 인공지능 영역에서는 정규화 과정을 종종 모든 데이터가 0과 1 사이의 크기를 갖도록 재조정(rescaling)하는 것으로 사용된다.

"Standardizing" a vector most often means subtracting a measure of location and dividing by a measure of scale. For example, if the vector contains random values with a Gaussian distribution, you might subtract the mean and divide by the standard deviation, thereby obtaining a "standard normal" random variable with mean 0 and standard deviation 1. 

 - 표준화(Standardizing - 이거 뭐라읽어야 하나 스탠다디자이징??): 모든 벡터의 평균값을 빼고, 측정된 표준편차로 나누는 작업. 예를 들어 Gaussian 분포(distribution)을 갖는 랜덤 값을 갖는 벡터를 평균이 0이되고 표준 편차가 1이 되는 "standard normal" 랜덤 변수로 만다는 작업을 잃컫는다.

 그럼 뭘써야 하나 그때 그때 다르다. 어쨌든 써야지 만족할 만한 성능을 기대할 수 있다.

Multilayer Perceptron(흔히들 말하는 클래식 인공지능, 다층 fully-connected layer로 구성된 NN)의 경우 입력값이 0과 1 사이어야 한다. 하지만, 사실 어떠한 요구조건은 아니지만 데이터의 평균값이 0이면 좋다. 그래서 데이터가 0과 1사이의 값이 되게만 만드는 행위는 좋은 선택이 아니다.  

 그래서 학습과정 중 최적화 단계의 수치해석적 향상을 위해선 Stadardizing을 입력과 결과값 모두에 적용하는 것이 좋아 보인다. 

참고 자료:

http://www.faqs.org/faqs/ai-faq/neural-nets/part2/

 

이 시점에서 지능이란?

 뭐 지능이란? 이라고 고차원적이고 철학적인 질문이 될 수 있는데 아시다시피 그냥 뉴론의 네트워크 구조 Neural Network임이 생물학적이든 전기공학적이든 기본 토대인 것 같다. 

그래서 지능은 Neural Network 구조 이고 지금으로썬 Biological Neural Network와 Artificial Neural Network가 존재 하고 있고 Biological Neural Network의 존폐가 아주 위태로운 상황이다.

결론은 

Biological Neural Network는 인간꺼. 

Artificial Neural Network는 기계꺼 실제론 Nvidia의 그래픽 카드 꺼.

참고자료:

Archive-name: ai-faq/neural-nets/part1
Last-modified: 2002-05-17
URL: ftp://ftp.sas.com/pub/neural/FAQ.html
Maintainer: saswss@unx.sas.com (Warren S. Sarle)

2026년 1월 14일 수요일

무심코 근 20년간 써왔던 회귀분석 Regression의 정체 드디어 밣혀져.

 선형대수를 배우면서 회귀분석이라고 배우진 않았지만, 같은 작업을 하면서 근 20년간 회귀분석을 해온 듯 싶다. 나중에는 회귀분석이라는 용어로 regression이라는 것을 알았고 classification의 반대 급부에 있는 것이라 머릿 속에 자리 잡았지 용어와 기능이 서로 맞지 않는 것에 대해서 의문시 하지 않았다. 

 "값추정", "값맞추기"가 회귀분석이라고 하는 것의 정확한 용어가 되어야 알맞을 것 같은데 "회귀본능"으로 알고 있는 회귀+분석이라니.

 그 정체를 책을 보다가 알아 버렸다. 

"이 이상한 이름은 프랜시스 골턴(Francis Galton)이 키가 큰 사람의 자녀가 부모보다 작은 경향이 있다는 사실을 연구하면서 소개한 통계한 용어입니다. 부모보다 자녀가 더 작기 때문에 이를 평균으로 회귀한다고 불렀습니다. 그 후 프랜시스가 두 변수 사이의 상관관계를 분석하기 위해 사용한 방법에 이 이름을 붙였습니다."

 - 핸즈온 머신러닝(오렐리앙 제롱 지음, 박혜선 옮김)


regression 

미국∙영국 [ rɪˈɡreʃn ]미국식 [ rɪˈɡreʃn ]

명사 퇴행, 퇴보; 회귀

- 네이버 사전


자매품으로 "리즈시절"이라는 용어도 있다. 

https://www.goal.com/kr/%EB%89%B4%EC%8A%A4/a/q5yd8j6s5qab14dhdu92ozksl


2026년 1월 4일 일요일

[책] Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow

 3판까지 나온 상태인 것 같다. 가격이 제법 나가서 사서 살펴보진 못했다. (원서는 10만원 선이고, 번역서는 5만원 선으로 검색된다.) 둘다 사서보기 부담 스럽다. 강의에 써보고 싶은데 접근하기가 쉽지 않다.

이론적으로 매몰되지 않고 그렇다고 따라 하기 식으로 매뉴얼 처럼되어 있는 책도 아닌 그 사이 어딘가에 있는 책같다. 들여다 봐야 할 것 도 많고 할일도 많은데 선 듯 움직여 지지 않는다. 그래서 되세김하기 위해 여기에 기록으로 남겨 볼때 마다 기억나게 남겨둔다. 

2025년 10월 29일 수요일

2025-10-29 현시점에서 개인 개발자를 위한 가장 현실적인 인공지능 학습을 위한 GPU workstation

 GPU - Nvidia RTX 4090(24GB) : 학습데이터 메인메모리에서 GPU로 옮기다가 에러나가 싫으면 24GB는 되어야 한다고 생각한다.

CPU - 사실 별로 중요하지 않다. 이왕이면 AMD로

RAM - 뭐가 되었든 최소 64GB 이상 데이터를 그래프화 하거나 저장하거나 할때 말도 않되는 메모리 사용량에 프로그램이 멈추는 경험을 하기 싫다면 많을 수록 좋다.

메인보드 - 당장 GPU를 하나밖에 달 수 없는 주머니 사정을 어쩔 수 없더라도 누가 알겠는가 어쩌다 돈이 떨어져서 GPU를 하나 더 달 수 있는 상황이 발생할지도 그러니까 그러니 GPU를 어러게 달 수 있는 메인보드를 선택하자 당장은 어쩔 수 없이 하나만 달아서 쓰더라도.

 파워서플라이 - 850W 이상 끝.

Keras 정확히는 Tensorflow의 메모리 부족 문제 해결책

 처음에는 학습데이터의 양이 메인 메모리의 한계를 넘어가면서 메모리를 증설했고 그 다음에는 학습데이터를 GPU에 옮기는 과정에서 GPU 메모리가 부족하여 batch_size를 줄여도 보았으나 다음과 같은 에러 메시지는 해결되지 않았다. 

" InternalError: Failed copying input tensor from /job:localhost/replica:0/task:0/device:CPU:0 to /job:localhost/replica:0/task:0/device:GPU:0 in order to run _EagerConst: Dst tensor is not initialized."

 확실하진 않지만 위와 같은 메시지 였던것 같다. CPU에서 다루던 데이터를 GPU로 옮기다가 사고가 나는 것 같다. 이치상으로 보면 batch_size를 줄이면 해결되어야 하는데 해결되지 않았고 어디서 다음과 같은 DataGenerator로 조금씩 데이터를 흘려 주면 된다고 했는데 나한테는 전혀 효과가 없었다.


class DataGenerator(Sequence):
  def __init__(self, x_set, y_set, batch_size):
    self.x, self.y = x_set, y_set
    self.batch_size = batch_size

  def __len__(self):
    return int(np.ceil(len(self.x) / float(self.batch_size)))

  def __getitem__(self, idx):
    if idx == self.__len__() - 1:
      batch_x = self.x[idx * self.batch_size : ]
      batch_y = self.y[idx * self.batch_size : ]
    else:
      batch_x = self.x[idx * self.batch_size : (idx+1) * self.batch_size]
      batch_y = self.y[idx * self.batch_size : (idx+1) * self.batch_size]
    return batch_x, batch_y

train_gen = DataGenerator( X_train_split,  y_train_split,  batch_size)
test_gen = DataGenerator(X_val_split, y_val_split, batch_size)

history = self.model.fit(
 train_gen,
 validation_data=test_gen,
 epochs=epochs,
 callbacks=callbacks,
 verbose=1

 정확히 문제가 되는 지점이 학습 완료 후 평가하는 과정에서 사단이 나서 굉장히 열받는 상황이었다. 며칠을 걸려서 학습을 완료했는데 왜 평가할때 프로그램이 사망하냐구.

 아무튼 좀 더 구글링을 해서 찾은 해결책은 학습기간 동안 최적의 모델을 파일형태로 저장하도록 하고 기존 모델을 제거해서 메모리 문제를 제거하는 방법을 시도해 보았다. 그리고 최적의 모델은 다시 파일에서 로딩하는 방식으로... 하지만 다음 명령어는 효과가 없었다.

del model

 뭔가 cuda와 cuDNN 그리고 tensorflow의 backend 사이에 꼬여 있는 부분이 있는 것 같다. 여러 차례의 시도를 하여 각 tensorflow의 backend의 각세션을 학습 완료 후 재 초기화 하고 "del model"을  수행한다. 그리고 garbage collect을 통해 안쓰는 데이터를 메모리에서 해제한다. 그 결과 평가 단계로 수훨하게 넘어 갈 수 있었다. 그 기록을 여기에 남겨 둔다.

 ... 학습 완료 후...

    # reset Keras Session
    sess = tf.compat.v1.keras.backend.get_session()
    tf.compat.v1.keras.backend.clear_session()
    sess.close()
    sess = tf.compat.v1.keras.backend.get_session()
    del self.model  # this is from global space - change this as you need
    # use the same config as you used to create the session
    config = tf.compat.v1.ConfigProto()
    config.gpu_options.per_process_gpu_memory_fraction = 1
    config.gpu_options.visible_device_list = "0"
    tf.compat.v1.keras.backend.set_session(tf.compat.v1.Session(config=config))

    import gc

    gc.collect()

... 저장된 파일에서 self.model을 다시 로드한다...

2022년 7월 27일 수요일

인공지능+영상처리+OceanOptics USB2000+Flir Camera 를 위한 시스템 설정

# 작업 시스템

윈도우즈 11, 64bits

# 설치 소프트웨어

## Python 3.8.xx

64bit 버전으로 설치하고, 현 시점에 최신 버전은 3.10이지만, 인공지능을 위한 tensorflow가 지원하는 최신 버전인 3.9.13버전이고 Spinnaker라는 Camera 소프트웨어는 3.8.xx버전을 지원한다.

### pip(Python Install Package) 설치

설치하고 가장 먼저해야할 작은 pip(Python Install Package)를 업그레이드 하는 것이다.

PS D:\python -m pip install --upgrade pip

그럼 tensorflow를 설치할 수 있는 환경이 조성되었다.

### tensorflow 와 tensorflow-cpu 설치 

PS D:\python -m pip install tensorflow

설치된 tensorflow를 확인해보자.

PS D:\> python

Python 3.9.13 (tags/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)] on win32

Type "help", "copyright", "credits" or "license" for more information.

>>> import tensorflow as tf

2022-07-27 11:53:34.911913: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'cudart64_110.dll'; dlerror: cudart64_110.dll not found

2022-07-27 11:53:34.912570: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.

>>> quit()

CUDA 런타임 라이브러리가 없다고 에러를 발생시킨다. 그래서 cpu전용 구동할 수 있는 tensorflow-cpu를 추가 설치한다.

PS D:\> python -m pip install tensorflow-cpu

다시, 설치된 tensorflow의 버전을 확인해 보자.

PS D:\> python

Python 3.9.13 (tags/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)] on win32

Type "help", "copyright", "credits" or "license" for more information.

>>> import tensorflow as tf

>>> tf.__version__

'2.9.1'

>>> quit()

### PySide6 설치

PS D:\> python -m pip install PySide6

설치된 버전 확인한다.

PS D:\> python

Python 3.9.13 (tags/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)] on win32

Type "help", "copyright", "credits" or "license" for more information.

>>> import PySide6

>>> PySide6.__version__

'6.3.1'

>>> quit()

### OpenCV 설치

PS D:\> python -m pip install opencv-python

설치된 버전 확인한다.

PS D:\> python

Python 3.9.13 (tags/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)] on win32

Type "help", "copyright", "credits" or "license" for more information.

>>> import cv2

>>> cv2.__version__

'4.6.0'

>>> quit()

## Visual Studio Code 설치

아래의 사이트를 방문해서 해당 시스템에 알맞은 설치파일을 다운로드 받는다.

https://code.visualstudio.com/download

설치 후 PySide6 예제를 코딩하고 실행해 본다.


## FLIR 카메라를 위한 환경 설정

과거의 Point Gray사의 카메라를 사용하기 위해서 현재는 FLIR로 합병된 Spinnaker SDK를 설치해야한다.

SpinnakerSDK_FULL_2.7.0.128.x64.exe 파일을 다운로드하고 설치한다.

그리고,  Python 에서 카메라를 운용하기 위해서 spinnaker_python-2.7.0.128-cp38-cp38-win_amd64.zip 파일도 다운로드하고, 다음의 명령어로 설치한다.

PS D:\> python -m pip install .\spinnaker_python-2.7.0.128-cp38-cp38-win_amd64.whl

그리고 설치확인한다.


import os
import PySpin
import sys

if __name__ == '__main__':
    # Retrieve singleton reference to system object
    system = PySpin.System.GetInstance()

    # Get current library version
    version = system.GetLibraryVersion()
    print('Library version: %d.%d.%d.%d' % (version.major, version.minor, version.type, version.build))

    # Retrieve list of cameras from the system
    cam_list = system.GetCameras()

    num_cameras = cam_list.GetSize()

    print('Number of cameras detected: %d' % num_cameras)


## Ocean Optics의 USB 4000을 위한 환경 설정

사전설치 사항으로 SpectraSuite가 설치되어 WinUSB 드라이버가 작동하고 있어야 한다.

그렇지 않다면, libusb-win32를 설치하고 수작업으로 드라이버를 설정하고 설치해야 한다.

아직은 seabreeze가 libusb-1.0을 지원하고 있지는 않는 것 같아. 위의 방법이 유일한 것 같다.

그럼 python에서 usb4000을 운용할 seabreeze를 설치한다.

PS D:\> python -m pip install seabreeze

설치된 버전을 확인한다.

PS D:\> python

Python 3.9.13 (tags/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)] on win32

Type "help", "copyright", "credits" or "license" for more information.

>>> import seabreeze

>>> seabreeze.use('cseabreeze')

>>> from seabreeze.spectrometers import list_devices, Spectrometer

>>>  devices = list_devices()

  File "<stdin>", line 1

    devices = list_devices()

IndentationError: unexpected indent

>>> devices = list_devices()

>>> devices

[<SeaBreezeDevice USB4000:USB4U30285>]

설치는 잘 된 것 같다. 



2021년 1월 2일 토요일

VGG16 for 1D regression

 1. Build Model


2. Prepare the data using scaler

3. Do Training

4. Result