본문 바로가기

인텔 AI 교육

인텔 AI 교육 - Module-11(인공 신경망 예제)

(해당 자료들은 인텔 AI for Future Workforce내용을 학습하고 가공한 내용입니다.)

 

< Module - 11 >

#인공 신경망

1. 인공 신경망

  인간의 뇌에서 영감을 얻은 방식으로 두뇌와 유사하게끔 상호 계층 구조로 연결된 노드를 사용하는 방법이다.

기본적으로 '입력 - 은닉(히든) - 출력' 계층으로 이루어져 있으며 3가지 층으로 이루어져 있다면 얕은 신경망, 더 많은 은닉 계층이 있다면 깊은 신경망으로 부른다.

2. 구조

단층 신경망 입력층 - 출력층
다층 신경망 얕은 신경망 입력층 - 은닉층 - 출력층
심층 신경망 입력층 - 다수의 은닉층 - 출력층

위키피디아 그림 참조

 

 

#이미지 이상도 탐지(균열 탐지)

1. 문제

  균열을 이미지로 불러와 균열이 있는지 없는지 판단하려 한다.

 

2. 라이브러리

>>> import numpy as np 
>>> import pandas as pd
>>> import scipy as sp
>>> import matplotlib.pyplot as plt

>>> import tensorflow as tf
>>> from tensorflow.keras.applications import vgg16
>>> from tensorflow.keras.preprocessing.image import load_img, img_to_array, array_to_img, ImageDataGenerator
>>> from tensorflow.keras.models import *
>>> from tensorflow.keras.layers import *
>>> from tensorflow.keras import optimizers
>>> from tensorflow.keras.utils import *

>>> from PIL import Image
>>> import requests
>>> from io import BytesIO
>>> import os
>>> import random
>>> >>> import pickle
>>> import tqdm
>>> import itertools

>>> import torch
>>> import torchvision
>>> from torchvision import datasets, models, transforms
>>> import matplotlib.pyplot as plt
>>> import torch.nn as nn


>>> from sklearn.model_selection import train_test_split
>>> from sklearn.metrics import classification_report, accuracy_score, confusion_matrix

 

3. 파일 불러오기 및 정리

# 훈련 및 테스트 데이터 디렉토리 정의
>>> train_dir = '[Dataset]Module11TrainQualityAssuranceSystem/'
>>> test_dir = '[Dataset]Module11TestQualityAssuranceSystem/'

# 클래스는 이러한 이름을 가진 각 디렉토리의 폴더를 말한다.
>>> classes = ['cracked','uncracked']

# 우리의 인공 신경망은 특정 크기 224X224 이미지를 처리
# 따라서 우리는 먼저 이미지 크기를 변환해야 한다.
>>> data_transform = transforms.Compose([transforms.RandomResizedCrop(224),
>>>                                       transforms.ToTensor()])

>>> train_data = datasets.ImageFolder(train_dir, transform=data_transform)

 

4. 데이터 확인

# 매개변수 정의
>>> batch_size = 32
>>> num_workers=0

>>> train_loader = torch.utils.data.DataLoader(train_data, batch_size=batch_size, 
>>>                                            num_workers=num_workers, shuffle=True)
                                           
# 일부 이미지를 표시
>>> dataiter = iter(train_loader)
>>> images, labels = dataiter.next()
>>> images = images.numpy() # 표시를 위해 이미지를 numpy로 변환

# 해당 라벨과 함께 배치 이미지를 시각화
>>> fig = plt.figure(figsize=(25, 4))
>>> for idx in np.arange(20):
>>>     ax = fig.add_subplot(2, 20/2, idx+1, xticks=[], yticks=[])
>>>     plt.imshow(np.transpose(images[idx], (1, 2, 0)))
>>>     ax.set_title(classes[labels[idx]])

 

5. [참고] 모델 구조 출력

# 모델을 초기화
>>> vgg16 = models.vgg16(pretrained=True)

# 모델 구조 출력
>>> print(vgg16)

 

6. 훈련 준비 과정

# VGG 모델에는 컨볼루션 레이어, 최대 풀링 레이어 및 고밀도 레이어와 같은 다양한 레이어가 있다.

# 모든 "특징" 레이어에 대한 훈련 동결
>>> for param in vgg16.features.parameters():
>>>     param.requires_grad = False

>>> n_inputs = vgg16.classifier[6].in_features
>>> last_layer = nn.Linear(n_inputs, len(classes))
>>> vgg16.classifier[6] = last_layer

import torch.optim as optim

# 손실 함수 지정(범주형 교차 엔트로피)
>>> criterion = nn.CrossEntropyLoss()

# optimizer는 stochastic gradient descent로 지정
# 학습률(learning rate) = 0.001
>>> optimizer = optim.SGD(vgg16.classifier.parameters(), lr=0.001)

 

7. 모델 훈련

>>> n_epochs = 30
>>> larr = []
>>> for epoch in range(1, n_epochs+1):

    # 훈련 및 검증 손실 추적
>>>     train_loss = 0.0
    
    ###################
>>>     # train the model #
    ###################
    # 기본적으로 모델은 훈련으로 설정
>>>     for batch_i, (data, target) in enumerate(train_loader):
        # CUDA를 사용할 수 있는 경우 텐서를 GPU로 이동
>>>         optimizer.zero_grad()
        # 순방향 전달: 입력을 모델에 전달하여 예측된 출력을 계산
>>>         output = vgg16(data)
        # 배치 손실을 계산
>>>         loss = criterion(output, target)
        # 역방향 패스: 모델 매개변수에 대한 손실 기울기 계산
>>>         loss.backward()
        # 단일 최적화 단계 수행(매개변수 업데이트)
>>>         optimizer.step()
        # 훈련 손실 업데이트 
>>>         train_loss += loss.item()
        
>>>         if epoch % 5 == 0:    # 지정된 수의 미니 배치마다 훈련 손실 출력
>>>             print('Epoch %d, Batch %d loss: %.16f' %
>>>                   (epoch, batch_i + 1, train_loss / 32))
>>>             larr.append(train_loss / 32)
>>>             train_loss = 0.0

 

8. 손실 시각화(그래프)

>>> plt.plot(larr)

 

 

참고 자료

https://aws.amazon.com/ko/what-is/neural-network/

http://ai4school.org/?page_id=3670