관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

딥러닝 비전 2 - 딥러닝 소프트웨어 맛보기 본문

인공지능/컴퓨터 비전

딥러닝 비전 2 - 딥러닝 소프트웨어 맛보기

huenuri 2024. 11. 12. 22:37

이 학습이 오늘의 마지막 공부가 될 것 같다. 조금 전에 감정적으로 매우 힘들고 화가 나는 일이 있었지만 그래도 공부의 자리에 나아가기로 했다.

 

기계학습을 구현하려면 적절한 소프트웨어 도구가 필요하다. 파이썬은 기계학습을 지원하는 sklearn 라이브러리를 제공하는데, sklearn은 그림 7-2에 있는 비신경망 모델과 얕은 신경망까지만 지원한다. 딥러닝을 구현하는데 가장 널리 쓰이는 도구는 텐서플로와 파이토치다.


 

 

텐서플로 소개

텐서플로 자체는 프로그래밍이 까다로운 단점이 있다. 이런 단점을 극복하기 위해 프랑쇼와 솔레는 텐서플로 위에서 돌아가는 케라스 라이브러리를 제작해 공개하였다. 대부분 케라스 명령어로 딥러닝을 개발하는데 둘이 한 몸이므로 보통 텐서플로 프로그래밍을 한다고 말한다. 

텐서플로를 사용하려면 pip install tensorflow 명령어로 설치해야 한다.

 

 

데이터와 텐서

딥러닝을 실습하려면 데이터셋을 준비해야 한다. 그림 7-4의 1단계에 해당하는 일인데 다행히 텐서플로에는 다양한 데이터셋이 제공된다. 텐서플로 첫 프로그래밍으로 데이터셋 확인을 하기로 한다. 다음 프로그램을 통해 텐서플로가 제공하는 데이터셋의 사용법을 익힐 수 있다.

 

데이터셋 목록

텐서플로 사이트

 

TensorFlow Datasets

TensorFlow와 함께 사용할 준비가 된 데이터 세트 모음입니다.

www.tensorflow.org

 

 

 

케라스 사이트

 

Keras documentation: Datasets

Datasets The keras.datasets module provide a few toy datasets (already-vectorized, in Numpy format) that can be used for debugging a model or creating simple code examples. If you are looking for larger & more useful ready-to-use datasets, take a look at T

keras.io


 

 

 

 

텐서플로로 데이터 확인하기

 

 

이 코드는 MNIST와 CIFAR-10이라는 두 가지 대표적인 이미지 데이터셋을 불러와 각 데이터셋에서 첫 10개의 이미지를 시각화하는 예제이다.

 

1. 필요한 라이브러리 임포트

import tensorflow.keras.datasets as ds  # Keras에서 데이터셋 로드
import matplotlib.pyplot as plt  # 이미지 시각화를 위한 라이브러리
  • tensorflow.keras.datasets 모듈에서 MNIST와 CIFAR-10 데이터셋을 불러오기 위해 ds라는 이름으로 가져왔다.
  • matplotlib.pyplot은 이미지를 시각화하기 위해 사용하는 라이브러리이다.

 

2. MNIST 데이터셋 불러오기

(x_train, y_train), (x_test, y_test) = ds.mnist.load_data()
print(x_train.shape, y_train.shape, x_test.shape, y_test.shape)
  • ds.mnist.load_data() 함수를 사용해 MNIST 데이터셋을 불러왔다.
  • x_train과 y_train은 학습 데이터와 라벨을, x_test와 y_test는 테스트 데이터와 라벨을 나타낸다.
  • MNIST 데이터셋의 이미지 크기는 28x28이고, 흑백(그레이스케일) 이미지로 구성되어 있다.

 

3. MNIST 이미지 시각화

plt.figure(figsize=(24, 3))  # 그림 크기 설정
plt.suptitle('MNIST', fontsize=30)  # MNIST 제목 설정
  • plt.figure를 사용해 그림 크기를 가로 24인치, 세로 3인치로 설정하고, plt.suptitle로 큰 제목을 설정했다.
for i in range(10):
    plt.subplot(1, 10, i + 1)
    plt.imshow(x_train[i], cmap='gray')
    plt.xticks([])  # x축 눈금 제거
    plt.yticks([])  # y축 눈금 제거
    plt.title(str(y_train[i]), fontsize=30)​
  • for 반복문을 사용하여 첫 10개의 학습 이미지와 라벨을 보여준다.
  • plt.subplot(1, 10, i + 1)은 1행 10열의 서브플롯에서 순서대로 각 이미지에 위치를 지정한다.
  • plt.imshow(x_train[i], cmap='gray')로 그레이스케일 이미지를 출력한다.
  • plt.xticks([])와 plt.yticks([])는 축의 눈금을 제거해 깔끔한 이미지를 보여준다.
  • plt.title을 통해 각 이미지 위에 해당 라벨(숫자)을 표시하였다.

 

4. CIFAR-10 데이터셋 불러오기

(x_train, y_train), (x_test, y_test) = ds.cifar10.load_data()
print(x_train.shape, y_train.shape, x_test.shape, y_test.shape)
  • ds.cifar10.load_data() 함수를 사용해 CIFAR-10 데이터셋을 불러왔다.
  • x_train과 y_train은 학습 데이터와 라벨을, x_test와 y_test는 테스트 데이터와 라벨을 나타낸다.
  • CIFAR-10 데이터셋의 이미지 크기는 32x32이고, 컬러(RGB) 이미지로 구성되어 있다.

 

5. CIFAR-10 클래스 이름 정의

class_names = ['airplane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
  • CIFAR-10 데이터셋의 각 클래스 이름을 정의하여 class_names 리스트에 저장했다.
  • 이 리스트는 이미지 라벨이 숫자로 되어 있기 때문에 이를 문자로 매핑하기 위해 사용된다.

 

6. CIFAR-10 이미지 시각화

plt.figure(figsize=(24, 3))  # 그림 크기 설정
plt.suptitle('CIFAR-10', fontsize=30)  # CIFAR-10 제목 설정
  • plt.figure를 사용해 그림 크기를 설정하고, plt.suptitle로 큰 제목을 설정하였다.
for i in range(10):
    plt.subplot(1, 10, i + 1)
    plt.imshow(x_train[i])
    plt.xticks([])  # x축 눈금 제거
    plt.yticks([])  # y축 눈금 제거
    plt.title(class_names[y_train[i, 0]], fontsize=30)​
  • for 반복문을 사용하여 CIFAR-10의 첫 10개 학습 이미지를 보여준다.
  • plt.subplot을 통해 각 이미지를 위한 서브플롯을 생성하고, plt.imshow로 이미지를 출력한다.
  • plt.title을 통해 각 이미지 위에 해당 클래스 이름을 표시하였다.

이 코드로 MNIST와 CIFAR-10의 데이터 구조를 확인하고, 샘플 이미지를 시각적으로 확인할 수 있다.


 

 

 

코드 실행 결과

 

 

 

 

 

 

 

 

실행 결과를 보면 x_train은 50000 x 32 x 32 x 3 모양임을 알 수 있다. 32 x 32 x 3 맵이 50,000장 쌓여 있는 4차원 구조이다. 딥러닝에서는 다차원 배열을 텐서라 부른다. MNIST의 x_train은 60000 x 28 x 28의 3차원 텐서이고, y_train은 50000 크기의 1차원 텐서다.

 


 

 

 

학습을 마치고

오늘 저녁에는 공부를 도저히 진행할 수 없을만큼 힘든 날이었지만 그래도 내가 해야 할 일을 기억하며 임한다는 것이 스스로도 참 대견스럽다. 이제 공부하는 건 별로 어렵지 않다. 그보다는 인간들이 나를 참 힘들게 한다. 세상에는 왜 이렇게 비상식적이고 이상한 사람들이 많은지 모르겠다.

난 사람들이 감추고 싶어하는 뒷모습을 많이 보게 된다. 그런 것들을 마주하면 많이 힘들지만 이것이 나의 피할 수 없는 숙명인지도 모르겠다. 

 

내게 함부로 하고 상처를 준 사람들.. 내가 얼마나 크게 될 사람인지 모른 채 현재의 모습으로 판단하며 깔아뭉개고 짓밟은 사람들.. 난 반드시 그 이상으로 되갚기로 오늘도 깊이 뼈에 사무치도록 다짐의 다짐을 했다.

인사교에서도 이런 이상한 사람들을 얼마나 많이 만났는지 모른다. 담임 선생이라는 사람도 그 사람들 중 한 명이다. 게임 개발 학원에서도 GCC에서 만난 사람들도 온통 이런 사람들 천지였다.

전에 벨로그를 몇 달 썼었는데 그때 썼던 많은 일기들을 모두 삭제했다. 개발일지만 티스토리에 옮겨놓았는데 요즘은 학습일지에 간간히 일기를 써넣는 편이다.

 

오늘은 그냥 일기를 쓰고 싶은 날이었다. 너무나 힘들어서 펑펑 울었고 지금도 눈물이 마르지 않는다. 난 오늘을 반드시 기억할 것이다. 그리고 내게 아무리 잘해주고 개인적인 친분이 있어도 난 공과 사를 철저히 구별하여 정의롭지 못하고 비굴한 사람들은 반드시 응징할 것이다.