(해당 자료들은 인텔 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
'인텔 AI 교육' 카테고리의 다른 글
인텔 AI 교육 - Module-12(시각화 정리) (0) | 2023.07.26 |
---|---|
인텔 AI 교육 - Module-12(Tableau Public, 활용 예제1) (0) | 2023.07.26 |
인텔 AI 교육 - Module - 11(랜덤 포레스트 예제) (0) | 2023.07.25 |
인텔 AI 교육 - Module-11(K-평균 예제) (0) | 2023.07.25 |
인텔 AI 교육 - Module-11(KNN미결) (0) | 2023.07.25 |