달력

11

« 2018/11 »

  •  
  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  •  

이미지에서 텍스트를 추출하는 인공지능 웹페이지 소개입니다.


http://ml.marasong.net:10080/marasong/ocr/




이미지를 올리면 텍스트를 추출해 줍니다.


가끔 핸드폰 이미지가 안올라가는 경우가 있는데, 원인은 못찾았습니다.


구글 비전 Google.vision 을 사용했습니다.


Posted by 멋지다마라송

[정리] 모두를 위한 딥러닝 07 - 실전 연습 및 팁  by 김성훈 


강의 웹사이트 : http://hunkim.github.io/ml/

Lec = 강의 / Lab = 실습


러닝 레이트 learning rate 가 너무 크면 아래 그림과 같이 예측값이 아래로 수렴하는게 아니고,

밖으로 나가버리는 경우가 생깁니다.

 


반대로 러닝 레이트 learning rate 가 너무 작으면 좋은 예측을 못하거나 시간이 너무 오래 걸립니다. 


그리고, 2차 함수를 3차원처럼 등고선으로 나타낼 수도 있습니다.

만약 x1, x2 두 값이 입력값인데, 차이가 너무 크다면 납작한 원이 될 수 있습니다.

이렇게 되면 데이터를 함수에 넣기 전에 먼저 적절한 처리를 해야 합니다.


이렇게 넓은 범위를 포함하고 있는 입력값이 있다면 이를 적절한 범위로 만드는 선 작업이 필요합니다.

그걸 프리 프로세싱. 노말라이제이션. 정규화 라고 부릅니다.


정규화를 위한 많은 알고리즘이 있지만 유명한 스탠다디제이션은 아래와 같습니다.

코드를 보니 파이썬으로 구현할때에는 좀 쉬워 보입니다.


다음에는 오버피팅이라는걸 살펴보겠습니다.

빨간 네모가 예측해야 하는 값이라면 이게 - 마이너스일까 + 플러스일까 쉽지 않습니다.

왼쪽 그래프로 본다면 - 마이너스가 되지만 (적절한 학습), 오른쪽 그래프로 보면 + 플러스가 됩니다.

- 마이너스가 맞는 값인데, 너무 정확하게 학습하면 + 플러스로 잘못 예측하게 됩니다.

이걸 오버피팅이라고 합니다. 

경계선을 그을때 너무 구부리지 말아야 합니다.

어떻게 이렇게 할 수 있을까요?

많은 트레이닝 셋이 필요합니다. 데이터가 많아야 합니다.

너무 큰 값, 동떨어진 값, 특정값은 줄여야 합니다.

일반화를 시켜야 합니다.


이를 파이썬으로 구현하면 아주 쉽습니다.

square 함수를 사용하면 됩니다.


그래서 트레이닝 세트가 (기반 데이터가) 많으면 일부를 따로 뺍니다.

따로 남겨둔 데이터는 트레이닝을 하지 않고 모의 테스트를 진행합니다.






Posted by 멋지다마라송

[정리] 모두를 위한 딥러닝 08 - 딥러닝 개념  by 김성훈 


강의 웹사이트 : http://hunkim.github.io/ml/

Lec = 강의 / Lab = 실습


사람의 뇌를 연구해보니 작은 뉴런들이 신호를 주고 받는걸로 밝혀졌는데,
이 뉴런 하나는 아주 단순한 신호를 전달하지만, 이게 합해지면서 바로 생각이라는게 만들어진다는 것이었습니다.

"이를 기계에도 적용해서 학습시키면 좋은 결과가 나오지 않을까" 라는 생각에서 CNN (Convolutional Neural Networks) 이 생겨났습니다.


그리고, 리니어 리그레션만으로는 XOR 를 풀 수 없습니다.


이런 문제를 Convolutional Neural Networks (CNN) 기법으로 풀 수 있습니다.


MNIST = 글자 이미지를 분석해서 어떤 글자인지 맞추는 학습인데, 지금은 거의 99% 정확도에 도달하고 있습니다.

(99% 정확도는 아마 영어만 인거 같습니다.)




Posted by 멋지다마라송

[정리] 모두를 위한 딥러닝 06 - Softmax Regression (Multinomial Logistic Regression)  by 김성훈 


강의 웹사이트 : http://hunkim.github.io/ml/

Lec = 강의 / Lab = 실습


결과값이 A, B, C 중에 하나인 경우, 지금까지 알아본 내용(리니어 리그리션)으로는 불가능합니다.

시그모이드 개념과 비슷하긴 하지만, 이 함수는 둘 중 하나로 수렴하기 때문에,

결과가 3개 넘을때에는 이중에서 하나로 수렴할 수 있는 방법이 없습니다.


A, B, C 가 나올 확률을 구해서 가장 높은거 하나만 1, 나머지는 0 으로 만들면 됩니다.

A, B, C 가 나올 확률의 합은 1 이 됩니다. 

입력 X, 결과 Y 모두 행렬을 이용하는데, 이 개념이 소프트맥스 softmax 입니다.

이를 위해 로그함수를 두번 사용하면 가능하며, 더 발전된 원핫 인코딩 One-Hot 함수를 사용하면 좋습니다.




실제 소스 코드는 아래와 같습니다.




x_data = [[1, 2, 1, 1], [2, 1, 3, 2], [3, 1, 3, 4], [4, 1, 5, 5], [1, 7, 5, 5],

                                                       [1, 2, 5, 6], [1, 6, 6, 6], [1, 7, 7, 7]]

y_data = [[0, 0, 1], [0, 0, 1], [0, 0, 1], [0, 1, 0], [0, 1, 0], [0, 1, 0], [1, 0, 0], [1, 0, 0]]


X = tf.placeholder("float", [None, 4])

Y = tf.placeholder("float", [None, 3])

nb_classes = 3


W = tf.Variable(tf.random_normal([4, nb_classes]), name='weight')

b = tf.Variable(tf.random_normal([nb_classes]), name='bias')


# tf.nn.softmax computes softmax activations

# softmax = exp(logits) / reduce_sum(exp(logits), dim)

hypothesis = tf.nn.softmax(tf.matmul(X, W) + b)


# Cross entropy cost/loss

cost = tf.reduce_mean(-tf.reduce_sum(Y * tf.log(hypothesis), axis=1))

optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(cost)


# Launch graph

with tf.Session() as sess:

  sess.run(tf.global_variables_initializer())


  for step in range(2001):

      sess.run(optimizer, feed_dict={X: x_data, Y: y_data})

      if step % 200 == 0:

          print(step, sess.run(cost, feed_dict={X: x_data, Y: y_data}))


-----------------------------------------------------------------------------

파일에서 불러와서 원핫 인코딩을 사용하는 샘플

# Predicting animal type based on various features

xy = np.loadtxt('data-04-zoo.csv', delimiter=',', dtype=np.float32)

x_data = xy[:, 0:-1]

y_data = xy[:, [-1]]


nb_classes = 7  # 0 ~ 6


X = tf.placeholder(tf.float32, [None, 16])

Y = tf.placeholder(tf.int32, [None, 1])  # 0 ~ 6


Y_one_hot = tf.one_hot(Y, nb_classes)  # one hot

Y_one_hot = tf.reshape(Y_one_hot, [-1, nb_classes])


W = tf.Variable(tf.random_normal([16, nb_classes]), name='weight')

b = tf.Variable(tf.random_normal([nb_classes]), name='bias')


# tf.nn.softmax computes softmax activations

# softmax = exp(logits) / reduce_sum(exp(logits), dim)

logits = tf.matmul(X, W) + b

hypothesis = tf.nn.softmax(logits)


# Cross entropy cost/loss

cost_i = tf.nn.softmax_cross_entropy_with_logits(logits=logits,

                                               labels=Y_one_hot)

cost = tf.reduce_mean(cost_i)

optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(cost)

cost = tf.reduce_mean(cost_i)

optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(cost)


prediction = tf.argmax(hypothesis, 1)

correct_prediction = tf.equal(prediction, tf.argmax(Y_one_hot, 1))

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

# Launch graph

with tf.Session() as sess:

  sess.run(tf.global_variables_initializer())


  for step in range(2000):

      sess.run(optimizer, feed_dict={X: x_data, Y: y_data})

      if step % 100 == 0:

          loss, acc = sess.run([cost, accuracy], feed_dict={

                               X: x_data, Y: y_data})

          print("Step: {:5}\tLoss: {:.3f}\tAcc: {:.2%}".format(

              step, loss, acc))


  # Let's see if we can predict

  pred = sess.run(prediction, feed_dict={X: x_data})

  # y_data: (N,1) = flatten => (N, ) matches pred.shape

  for p, y in zip(pred, y_data.flatten()):

      print("[{}] Prediction: {} True Y: {}".format(p == int(y), p, int(y)))



소스코드 다운로드 : https://github.com/hunkim/DeepLearningZeroToAll



Posted by 멋지다마라송

케라스 Keras 모델 저장, 재사용 


원본 : https://tykimos.github.io/2017/06/10/Model_Save_Load/ 에 있는 강좌를 정리했습니다.

위 링크는 김태영님의 케라스 강의 사이트입니다.


딥러닝 Deep Learning 케라스 Keras 에서 아래와 같은 방법으로 모델을 재사용할 수 있습니다.


load_model 로 위 스크린샷처럼 모델을 저장하도록 지정하고, 처음 실행하면

처음부터 loss 로스 1.15 에서 시작. 최종 acc 정확도는 0.906 (90.6%)

90.6% 로 학습된 결과가 mnist_mlp_model.h5 라는 파일로 저장됩니다.


모델 구조 확인하기. 뭐 이건 그냥 참고용으로 보여주기에요.


load_model 로 아까 저장했던 mnist_mlp_model.h5 모델파일을 불러와서 학습하고 평가후 저장합니다.

이렇게 실행하면 처음부터 loss 로스 0.32 에서 시작. 최종 acc 정확도는 0.92 (92%) 가 됩니다.


위 스크린샷에서 In [3] 이 셀만 계속 실행해보면 정확도가 계속 올라가는걸 볼 수 있습니다.

모델을 재사용한다는 이야기입니다. 이제 저 모델 파일만 있다면 colab (https://colab.research.google.com/) 등 어디에서나 학습된 모델을 다시 사용할 수 있습니다.


이렇게 만들어진 모델을 다른곳에서 재사용 하려면 소스가 있는 곳과 동일한 폴더에 복사해둔 다음,

아래와 같이 불러와서 사용하면 됩니다.


소스는 아래 첨부파일을 참조하여 주세요 ~


모델 저장 소스코드 : 주피터 노트북 Jupyter Notebook

Model.Save.ipynb


모델 재사용 소스코드 : 주피터 노트북 Jupyter Notebook

Model.ReUse.ipynb


Posted by 멋지다마라송


티스토리 툴바