달력

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://www.itbiznews.com/news/articleView.html?idxno=8430


2018년 02월 기사인데요, '구글 리서치 그룹(Research at Google)' 에서 지난해 12월27일 '적대적인 스티커(Adversarial Patch)' 라는 논문으로 통해 증명했다고 합니다.


아래 이미지에서 빨간색 원으로 표시된 이미지인데요.


바나나로 인식해야 하지만, 토스터로 인식하는 문제입니다.

그냥 사진만 한장 옆에 있을 뿐인데, 토스터 99%, 바나나 1% 로 인식하는군요.


'화이트박스 앙상블(White box Ensemble)' 기술을 통해 생성됐으며 5개의 이미지 인식 알고리즘(Five ImageNet Models: inceptionv3, resnet50, xception, VGG16, VGG19)을 무력화시켰다고 합니다.


그래서 부랴부랴 돌려보니 (아래 모델은 2018년 06월 ~ 07월쯤 다운받은 엔진입니다) 지금은 효과가 없네요..

무력화 패치는 아예 인식을 못하고, 손까지 인식합니다.


혹시 다른 사진을 분석해봤는데요,


역시 지금은 아무런 효과가 없네요.


6개월 사이에 많은 발전이 있어서 다행입니다만,

이런 방해 이미지 역시 계속 발전할테니 걱정도 됩니다...




Posted by 멋지다마라송

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


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 멋지다마라송


티스토리 툴바