복습하기 위해 학부 수업 내용을 필기한 내용입니다.
이해를 제대로 하지 못하고 정리한 경우 틀린 내용이 있을 수 있습니다.
그러한 부분에 대해서는 알려주시면 정말 감사하겠습니다.
사람의 지능 행위와 지능 에이전트
- 사람은 주위를 센싱 → 인식 → 적절한 행위를 통해 환경과 상효작용
- 인공지능 제품도 비슷한 과정을 수행해야 쓸모가 있다.
▶7.1 지능 에이전트 시나리오
일상생활에서 특정한 일을 대행해 주는 사람을 에이전트라 부른다.
- ex) 여행 에이전트는 여행 일정을 짜고 교통편과 숙소를 예약해 주는 사람
컴퓨터에서 사람 일을 대신하는 소프트웨어를 에이전트라 부른다.
7.1.1 지능 에이전트란
지식 에이전트
- 로봇은 에이전트. 환경, 지식 베이스가 명확히 구분된다.
- 로봇 몸과 소프트웨어가 에이전트, 카메리 등이 센서, 로봇 팔이 행위
지식 베이스
- 지식 표현을 위한 프레임, 의미망, 온톨로지, 규칙 기반 방법으로 구축된다.
7.1.2 라이프 사이클
지능 에이전트의 라이프 사이클
단계 1 : 문제 정의
- 비즈니스 정의한다. (음식 인식 앱의 경우, 음식의 범위, 계층 구조 등을 결정)
- 데이터 수집한다. (현장을 대변하는 다양한 음식 영상 수집, 데이터가 가장 중요한 산출물)
단계 2 : 모델 제작
- 컨볼루션 신경망, 순환 신경망, 강화 학습 등에서 어떤 것을 사용할지 결정한다.
- 모델의 구조 설계, 모델 학습, 성능 평가를 수행한다. (교차 검증을 사용하여 성능 평가 신뢰도를 확보)
단계 3 : 디프로이
- 자체 서버 사용 또는 클라우드를 구매해 사용한다.
- 현대에는 주로 웹 또는 앱 인터페이스를 사용한다.
세 단계는 순환
- 운영 환경이나 사용자의 요구사항이 바뀌므로 꾸준히 업그레이드 필요하다.
- ex) 한식으로 국한했는데 세계 음식으로 업그레이드
▶7.2 지능 에이전트 만들기
7.2.1 영상 바구니 담기
영상 바구니 담기 시나리오
- 영상을 분류하고 분류 결과에 따라 해당 폴더에 영상을 저장하는 서비스
- 구글 포토와 비슷하다.
모델을 학습하고 저장하기
- CIFAR-10으로 컨볼루션 신경망을 학습한다.
import numpy as np
import tensorflow as tf
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D,MaxPooling2D,Flatten,Dense,Dropout
from tensorflow.keras.optimizers import Adam
# CIFAR-10 데이터셋을 읽고 신경망에 입력할 형태로 변환
(x_train,y_train),(x_test,y_test)=cifar10.load_data()
x_train=x_train.astype(np.float32)/255.0
x_test=x_test.astype(np.float32)/255.0
y_train=tf.keras.utils.to_categorical(y_train,10)
y_test=tf.keras.utils.to_categorical(y_test,10)
# 신경망 모델 설계
cnn=Sequential()
cnn.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3)))
cnn.add(Conv2D(32,(3,3),activation='relu'))
cnn.add(MaxPooling2D(pool_size=(2,2)))
cnn.add(Dropout(0.25))
cnn.add(Conv2D(64,(3,3),activation='relu'))
cnn.add(Conv2D(64,(3,3),activation='relu'))
cnn.add(MaxPooling2D(pool_size=(2,2)))
cnn.add(Dropout(0.25))
cnn.add(Flatten())
cnn.add(Dense(512,activation='relu'))
cnn.add(Dropout(0.5))
cnn.add(Dense(10,activation='softmax'))
# 신경망 모델 학습
cnn.compile(loss='categorical_crossentropy',optimizer=Adam(),metrics=['accuracy'])
hist=cnn.fit(x_train,y_train,batch_size=128,epochs=100,validation_data=(x_test,y_test),verbose=2)
# 신경망 모델 정확률 평가
res=cnn.evaluate(x_test,y_test,verbose=0)
print("정확률은",res[1]*100)
import matplotlib.pyplot as plt
# 정확률 그래프
plt.plot(hist.history['accuracy'])
plt.plot(hist.history['val_accuracy'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train','Validation'], loc='best')
plt.grid()
plt.show()
# 손실 함수 그래프
plt.plot(hist.history['loss'])
plt.plot(hist.history['val_loss'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train','Validation'],loc='best')
plt.grid()
plt.show()
cnn.save("my_cnn_For_deploy.h5")
deploy 할 때 충분한 계산 자원을 사용해 학습하는데, 이 과정을 모방하기 위해 epochs를 늘려서 학습한다. (hist)
cnn.save는 deploy에 쓰기 위해 학습된 모델을 저장한다.
영상을 인식하고 부류 확률을 막대로 그린다.
- 테스트 영상에 대해 인식한 결과를 보여주는 인터페이스 제작한다.
- 여기서는 새로 획득한 영상을 폴더에 담아두고 인식하는 원시적인 인터페이스 제작한다.
- 작업 폴더 아래에 test_images라는 폴더를 만들고 수집한 영상 저장한다. (아래 사진)
# 폴더에 담겨 있는 영상을 인식
import numpy as np
import tensorflow as tf
from PIL import Image
import os
# 학습된 모델 불러오기
cnn = tf.keras.models.load_model("my_cnn_for_deploy.h5")
class_names = ['airplane','automobile','bird',
'cat','deer','dog','flog',
'horse','ship','truck']
x_test = []
for filename in os.listdir("./tst_images"):
if 'jpg' not in filename:
continue
img = Image.open("./test_images/" + filename)
x = np.asarray(img.resize([32, 32])) // 255.0
x_test.append(x)
x_test = np.asarray(x_test)
pred = cnn.predict(x_test)
import matplotlib.pyplot as plt
n = len(x_test)
plt.figure(Figsize=(18, 4))
for i in range(n):
plt.subplot(2, n, i + 1)
plt.imshow(x_test[i])
plt.xticks([])
plt.yticks([])
plt.subplot(2, n, n + i + 1)
if i == 0:
plt.barh(class_names, pred[i])
else:
plt.barh(['a', 'A','b','c','d','D','f','h', 's', 't'], pred[i])
plt.xticks([])
# 영상 바구니 담기 - 부류에 따라 영상을 폴더에 담기
import numpy as np
import tensorflow as tf
from PIL import Image
import os
# 학습된 모델 불러오기
cnn = tf.keras.models.load_model("my_cnn_for_deploy.h5")
class_names = ['airplane','automobile','bird',
'cat','deer','dog','flog',
'horse','ship','truck']
x_test = []
img_orig = []
fname = []
for filename in os.listdir("./tst_images"):
if 'jpg' not in filename:
continue
img = Image.open("./test_images/" + filename)
img_orig.append(img)
fname.append(filename)
x = np.asarray(img.resize([32, 32])) // 255.0
x_test.append(x)
x_test = np.asarray(x_test)
pred = cnn.predict(x_test)
os.chdir('./test_images')
if not os.path.isdir('class_buckets'):
os.mkdir('class_buckets')
os.chdir('class_buckets')
for i in range(len(class_names)):
if not os.path.isdir(class_names[i]):
os.mkdir(class_names[i])
for i in range(len(x_test)):
folder_name = class_names[np.argmax(pred[i])]
os.chdir(folder_name)
img_orig[i].save(fname[i])
os.chdir('..')
기능 확장하기
- 위 코드는 구글 포토의 원시버전이다.
- 구글 포토는 촬영 장소와 사물에 따라 영상을 구분 등의 기능이 있다.
- 콜라주 또는 애니메이션 기능 등을 제공한다.
-위 코드의 확장
- CIFAR-10보다 큰 ImageNet 데이터 셋으로 학습한다.
- 장소나 사물에 따라 분류하는 기능을 추가한다.
- 웹 또는 앱 인터페이스를 부착한다.
- 반려견과 함께 있는 사진만 골라주는 기능 등을 추기해 경쟁력을 갖춘다.
'컴퓨터공학 > 인공지능' 카테고리의 다른 글
[인공지능] 8장. 시계열 데이터와 순환 신경망1 (1) | 2023.05.09 |
---|---|
[인공지능] 7장. 지능 에이전트2 (0) | 2023.05.08 |
[인공지능] 6장. 컨볼루션 신경망과 컴퓨터 비전4 (1) | 2023.05.07 |
[인공지능] 1, 2장. 인공지능 (1, 2장 볼만한 내용) (0) | 2023.04.16 |
[인공지능] 6장. 컨볼루션 신경망과 컴퓨터 비전3 (0) | 2023.04.15 |