라벨이 Tensorflow인 게시물 표시

인공지능에 관한 생각

인공지능에 관한 지극히 개인적인 생각 ​ 원래는 Tensorflow Generator까지 글을 쓴 다음에 이 글을 적으려고 했습니다. 하지만, 요즘 새로 배우는 것들이 많아 언제 글을 작성할지 알 수 없어서 먼저 이 글을 작성하고자 합니다. ​ 제가 인공지능을 많이 공부한 것은 아니지만, 지금의 인공지능은 사실 인공지능이라고 보기도 어려운 수준입니다. 그저 성능 좋은 분류기일 뿐입니다. 새로운 기술이 등장하지 않는 이상, 더 이상 인공지능 분야의 발전은 없을 것으로 보입니다. ​ 아래는 제가 생각하는 현재 인공지능이라 불리는 성능 좋은 분류기의 문제점입니다. ​ 첫째, 추가로 학습할 수 없습니다. 지금의 인공지능은 성능이 좋지 않으면 지금까지 학습한 것들을 모두 날려버리고 새로 학습을 시킵니다. 이게 무슨 말 같지도 않은 일인지 모르겠습니다. 인간은 어제의 것을 이어서 나날이 배워나갑니다. 학습을 잘 못하는 인간이 있더라도 뇌를 비워버리는 행위는 하지 않습니다. 인간은 학습을 잘 못하더라도 계속 학습을 통해 발전하는 모습을 볼 수 있습니다. 현재의 인공지능은 어떠한 가요? 그저 모델 싸움입니다. 누가 더 좋은 모델을 만들었는가가 다입니다. 또 학습은 어떻습니까? 한 번 학습하면 새로운 정보를 학습할 수 없습니다. transfer나 fine tuning 등의 기술로 이전의 파라미터를 이어서 학습하더라도 개, 고양이를 10,000 장 학습한 곳에 transfer나 fine tuning으로 병아리 데이터 1 개를 학습하더라도 병아리를 찾지 못하는 바보 같은 인공지능이 됩니다. ​ 둘째, 스스로 학습을 하지 않습니다. 스스로 학습을 할 수 있다는 말은 궁금해한다는 뜻입니다. 인공지능은 어떠한 것도 궁금해하지 않습니다. 그저 자기가 알고 있는 것에서 답을 찾으려고 합니다. 개와 고양이를 학습하면 모른다는 말은 할 수 없습니다. 모른다는 말을 할 수 있어야 그것을 새로 배우고 발전해나갈 수 있을 텐데, 지금의 인공지능은 다람쥐를 넣어도 개, 고양이 답밖에 할 수 없습니다...

Tensorflow 시작하기 12 (성능 향상-히든 레이어)

이미지
사용 버전: Python 3.7.6, Tensorflow 2.1.0 ​ 기획: MNIST 데이터 셋을 이용하여, 손글씨 숫자를 맞추는 AI(인공지능) 만들기 ​ 이번 시간에는 간단한 방법으로 성능을 향상시키는 방법에 대해서 알아보겠습니다. ​ 아래는 성능 향상 전 그래프입니다. ​ ​ 숨겨진 층(Hidden layer)를 추가하겠습니다. ​ ​ Dropout이라는 기능도 사용해 줍시다. 학습 데이터 일부분을 누락시켜 학습을 시킵니다. ​ ​ 재생산성을 위해 인자를 고정해 줍시다. BatchNormalization도 해줍시다. ​ ​ 아무리 해도 성능이 좋아질 기미가 안 보이네요. 아무래도 데이터 전처리가 이상한가 봅니다. 전처리를 10에서 100으로 변경해 줍니다. 아무래도 잡음까지 같이 숫자로 인식되나 봅니다. ​ ​ seed를 아무리 고정해도 값이 동일하게 안 나오네요.... 아무튼 운이 좋게 5 개나 맞는 경우가 생겼습니다. 사실 검정 바탕 7과 9는 맞출 수가 없습니다. 학습 데이터에는 저런 검은색 바탕을 가진 데이터는 없었거든요. 일부러 한 번 넣어봤습니다. ​ ​ 처음의 2와 3은 당연히 맞출 줄 알았습니다. 그런데 생각만큼 잘 안되네요. 이렇게 성능 향상을 시켜보았습니다. ​ 전처리의 중요성을 다시 한번 알게 되었고, hidden layer의 효과 역시 한 번에 알 수 있었습니다. ​ 이제 만든 모델을 저장하는 방법에 대해서 알아보겠습니다. ​ 끝. ​ 코드: https://github.com/shwoghk14/mnist_tensorflow 카테고리: Tensorflow, BlackSmith

Tensorflow 시작하기 11 (성능 향상-셔플 사용)

이미지
사용 버전: Python 3.7.6, Tensorflow 2.1.0 ​ 기획: MNIST 데이터 셋을 이용하여, 손글씨 숫자를 맞추는 AI(인공지능) 만들기 ​ 이번 시간에는 간단한 방법으로 성능을 향상시키는 방법을 알아보겠습니다. ​ 아래는 성능 향상 전 그래프입니다. ​ ​ 셔플(Shuffle)을 적용해 보겠습니다. shuffle method를 사용합니다. 괄호 안에 숫자는 전체 데이터보다 큰 숫자를 적어줘야 합니다. ​ ​ ​ batch 256 ​ ​ batch 128 ​ ​ batch 1024 ​ ​ batch 32 ​ 별 효과를 못 얻었네요. ​ 계속 진행해보겠습니다. ​ ​ 끝. ​ 코드: https://github.com/shwoghk14/mnist_tensorflow 카테고리: Tensorflow, BlackSmith

Tensorflow 시작하기 10 (성능 향상-배치 사용)

이미지
사용 버전: Python 3.7.6, Tensorflow 2.1.0 ​ 기획: MNIST 데이터 셋을 이용하여, 손글씨 숫자를 맞추는 AI(인공지능) 만들기 ​ 이번 시간에는 간단한 방법으로 성능을 향상시키는 방법을 알아보겠습니다. ​ 아래는 성능 향상하기 전 그래프입니다. ​ ​ 아래는 시작하기 9 그래프입니다. ​ ​ 배치(Batch)를 적용해보겠습니다. 배치를 적용하기 전, tensorflow dataset으로 만들어줍시다. ​ tensorflow dataset으로 만드는 이유는 Batch를 쉽게 사용하기 위해서입니다. ​ batch 크기는 보통 2의 배수로 많이 사용합니다. 2, 4, 8, 16, 32, ... ​ batch는 아래와 같이 사용합니다. ​ ​ batch size 32 ​ ​ ​ batch size 128 ​ ​ batch size 256 ​ ​ batch size 512 ​ ​ 별로 성능이 나아지지 않았네요. ​ 계속 성능 향상을 향해 가보겠습니다. ​ 끝. ​ 코드: https://github.com/shwoghk14/mnist_tensorflow 카테고리: Tensorflow, BlackSmith

Tensorflow 시작하기 9 (성능 향상-학습 반복량 증가)

이미지
사용 버전: Python 3.7.6, Tensorflow 2.1.0 ​ 기획: MNIST 데이터 셋을 이용하여, 손글씨 숫자를 맞추는 AI(인공지능) 만들기 ​ 이번 시간에는 간단한 방법으로 성능을 향상시키는 방법에 대해서 알아보겠습니다. ​ 아래는 성능 향상하기 전 그래프입니다. ​ ​ 학습 반복량(epoch)을 조절해보겠습니다. ​ epoch를 5에서 23으로 증가했습니다. 맞던 3 도 안 맞게 되었습니다. ​epoch를 50으로 증가해보겠습니다. 3과 5를 맞췄네요. 조금 괜찮아졌네요. 한 번 200 번 반복해보겠습니다. 3과 5의 확률이 더 높아졌네요. 만약 학습 데이터의 loss, accuracy가 test의 loss, accuracy와 차이가 많이 난다면, 과적합(overfitting)을 의심해봐야 합니다. ​ 계속 성능 향상을 진행하겠습니다. ​ 끝. ​ 코드: https://github.com/shwoghk14/mnist_tensorflow 카테고리: Tensorflow, BlackSmith

Tensorflow 시작하기 8 (성능 향상-학습 데이터 증가)

이미지
사용 버전: Python 3.7.6, Tensorflow 2.1.0 ​ 기획: MNIST 데이터 셋을 이용하여, 손글씨 숫자를 맞추는 AI(인공지능) 만들기 ​ 이번 시간에는 간단한 방법으로 성능을 향상시키는 방법을 알아보겠습니다. 그전에 몇 프로의 순위로 뽑힌 건지 확인해 봅시다. ​ 함수를 만듭니다. ​ ​ 그래프를 그려줍니다. ​ ​ 실행해 줍니다. 예측한 것은 검은색, 정답은 빨간색 그래프입니다. 그리고 그림 밑의 빨간색 주석이 달린 것이 예측과 정답이 맞는 그림입니다. ​ ​ 이제, 우리는 여기에 약간의 코드를 수정하여 성능을 향상시켜보겠습니다. 요즘은 random forest나 ensemble 기법을 많이 사용하는 것 같습니다. 저는 아직 공부를 못해서 기초적인 기법에 대해서 다루겠습니다. ​ 성능을 향상시키는 방법으로는 크게 5 가지 정도가 있습니다. 1. 학습 데이터양을 늘린다. 2. 학습 반복량을 증가한다. 3. 배치를 사용한다. 4. 셔플을 사용한다. 5. 히든 레이어를 추가한다. ​ ​ 학습 데이터의 양, 학습 반복량, 배치, 셔플, 히든 레이어 추가에 대해서 다루겠습니다. ​ - 학습 데이터의 양이 늘어나면, 학습을 하는데 좀 더 많은 경우를 볼 수 있어서 성능이 향상됩니다. - 학습 반복량(epoch)을 증가해 주면 학습을 반복적으로 하게 되어, 성능이 좋아집니다. 하지만, 너무 오래 반복하게 되면, 본 것만 맞추게 되어 성능이 떨어집니다. - 배치(batch)를 사용하면, 전체 데이터를 가지고 학습을 진행하는 것이 아니라, 정해진 크기들끼리의 기울기 값을 사용하여, 전체 기울기를 찾아가게 됩니다. - 셔플(shuffle)을 사용하게 되면, 학습 데이터 순서에 인공지능이 최적화되는 것을 방지해 줍니다. - 히든 레이어를 추가하게 되면, 성능이 향상될 수 있습니다. 다만, 너무 많은 층을 사용하면, 오히려 성능이 저하됩니다. ​ ​ 학습 데이터의 양을 늘려보겠습니다. 현재 새로운 데이터를 만드는 것은 시...

Tensorflow 시작하기 7 (Predict)

이미지
사용 버전: Python 3.7.6, Tensorflow 2.1.0 ​ 기획: MNIST 데이터 셋을 이용하여, 손글씨 숫자를 맞추는 AI(인공지능) 만들기 ​ 이번 시간에는 실제 데이터를 우리가 만들어서 예측을 하는지 확인해 보겠습니다. test 데이터도 일종에 정형화된 상태기 때문에 실제 우리가 직접 만드는 데이터와 차이가 있을 수 있습니다. 실제 테스트를 해봅시다. ​ 데이터를 먼저 만듭시다. 서로 다른 크기와 색깔의 데이터를 만들었습니다. ​ 불러와 봅시다. mnist_util.py에 해당 함수를 추가합니다. opencv를 이용하여, 이미지를 읽습니다. 우리가 사용한 실제 이미지와 크기를 맞춰주어야 인공지능 모델에 들어가집니다. 회색조 이미지로 읽어들여, 전처리, 크기 조절을 해줍니다. ​ ​ 실제 데이터로 진행합니다. 실제 데이터의 경우, 이미지가 축소되면서 생략되는 부분이 생기는 바람에 0의 경우 데이터가 많이 훼손되었네요. 아무리 그렇다고 해도, 정확도가 상당히 떨어집니다. ​ 다음 시간에는 정확도를 높이는 방법에 대해서 알아보겠습니다. ​ 끝. ​ 코드: https://github.com/shwoghk14/mnist_tensorflow 카테고리: Tensorflow, BlackSmith

Tensorflow 시작하기 6 (Training)

이미지
사용 버전: Python 3.7.6, Tensorflow 2.1.0 ​ 기획: MNIST 데이터 셋을 이용하여, 손글씨 숫자를 맞추는 AI(인공지능) 만들기 ​ 이번 시간에는 훈련(Training)에 대해서 알아보겠습니다. ​ 우리는 지금 층을 만들었습니다. 한 번 제대로 작동하는지 확인해볼까요? 만든 모델에 test image 5 개를 넣습니다. 맞는 게 한 개뿐인 정말 형편없는 인공지능이 완성되었군요. ​ ​ 우리의 인공지능 모델은 아직 학습이 되지 않았습니다. 학습을 시켜 봅시다. ​ model compile을 설정합니다. SparseCategoricalCrossentropy는 여러 가지 항목 중에 하나를 선택할 때 사용하는 함수입니다.(소수점 없이 정확히 하나만 선택될 때) ​ ​ 그리고 fit을 이용하여, 모델을 학습시킵니다. epochs는 총 학습 횟수를 나타냅니다. verbose는 학습 진행도를 보여줍니다. (0: 없음, 1: 진행바 2: 간략 진행바) 학습이 완료됩니다. ​ ​ test 데이터로 확인을 진행합니다. evaluate를 사용합니다. 92%의 정확도를 보이는군요. ​ 확인해 봅시다. 왼쪽 숫자가 정답, 아래쪽 숫자가 인공지능이 예측한 답입니다. 거의 비슷하지 않나요? ​ ​ 끝. ​ 코드: https://github.com/shwoghk14/mnist_tensorflow 카테고리: Tensorflow, BlackSmith