Quiet Time

■ 3장 목차
  1. 활성화 함수 (active function)
     - 계단함수 
     - 시그모이드 함수
     - Relu 함수
     
  1. 행렬의 내적 문제
  2. 신경망을 파이썬으로 구현 
  3. 손글씨 인식 신경망을 구현 (순전파)

■ 퍼셉트론과 신경망의 차이점? 

퍼셉트론? 원하는 결과를 출력하도록 가중치의 값을 적절히 정하는 작업을 
         사람이 수동으로 해야한다. 
 - 신경망? 가중치 매개변수의 적절한 값ㅇ르 기계가 데이터로 부터 자동으로 학습해서 알아냄

■ 편향을 명시한 퍼셉트론 (p65)

단층 퍼셉트론 : 계단 함수          (선형함수)  --->  0 또는 1 의 값을 출력

다층 퍼셉트론 : 시그모이드 or Relu  (비선형 함수) --> 0 ~ 1 사이의 실수 
                                                  예 : 0.731, 0.880




def step_function(x):
y = x > 0
return y.astype(np.int)

x_data = np.array([-1,0,1])

print(step_function(x_data))

문제36. 위의 step_function 함수를 이용해서 계단함수 그래프를 그리시오 

def step_function(x):
    y = x > 0
    return y.astype(np.int)
x = np.arange(-5.0,5.0,0.1)
y = step_function(x)
plt.plot(x,y)
plt.show()

문제37 위의 step_function 함수를 이용해서 계단함수 그래프를 반대로 그리시오 

def step_function(x):
    y = x > 0
    return -y.astype(np.int)
x = np.arange(-5.0,5.0,0.1)
y = step_function(x)
plt.plot(x,y)
plt.show()

문제38. (점심시간 문제 ) 


x0, x1, x2 = -100
w0, w1, w2 = .3.4.1
일 때 ㄱ

를 코드로 나타내 보아라 !

x = np.array([x0,x1,x2])
w = np.array([w0,w1,w2])
a = np.sum(x*w)
def step(x):
    y = x > 0
    return y.astype(np.int)

print(step(a))

■ 시그모이드 함수 
계단함수 (단층 퍼셉트론) vs 시그모이드 함수(다층 퍼셉트론) 

이 둘의 차이점과 공통점? 

     차이점 ? 계단함수는 숫자 1과 0만 출력한느데
             시그모이드 함수는 0과 1사이의 실수를 출력한다.

     f(가중의 합)  =  0.8834

     공통점 ? 둘다 0과 1사이의 데이터만 출력하는것이 공통점이다.
                              1  
     시그모이드 함수식 =   -------------
                         1 + exp(-x)
                              ↓
                              e(자연상수)^-x

     h(1,0) = 0.731 , h(2.0) = 0.880

문제39. 진짜로 시그 모이드 함수를 생성해보자

def sigmoid(x):
     return 1 / (1+np.exp(-x))

x = np.array([1.0,2.0])
print(sigmoid(x))

문제40. 시그모이드 함수를 그래프로 그리시오 !


def sigmoid(x):
     return 1 / (1+np.exp(-x))
x = np.arange(-8.0,8.0,0.1)
y = sigmoid(-x)

plt.plot(x,y)
plt.show()


문제41. 시그모이드 반대록 ㄱㄱ 
 

def sigmoid(x):
     return 1 / (1+np.exp(x))
x = np.arange(-8.0,8.0,0.1)
y = sigmoid(x)

plt.plot(x,y)
plt.show()



둘다 나타내봐라 계단이랑 시그모이드 

def sigmoid(x):
return 1 / (1 + np.exp(-x))

def sigmoid(x):
return 1/(1+np.exp(-x))

plt.figure(figsize=(6,4))
x1 = np.arange(-6.0,6.0,0.1)
y1 = step_function(x1)
plt.plot(x1,y1,linestyle='--')
y = sigmoid(x1)
plt.plot(x1, y)
plt.show()


■ ReLu 함수 (Rectified Linear Unit) 
              정류된

ReLu는 입력이 0을 넘으면 그 입력을 그대로 출력하고
0 이하이면 0을 출력하는 함수 
         x (x > 0) 
h(x) = [
         0 (x<= 0)

학습이 잘 되어서 현업에서 주로 사용하는 함수 

문제43. ReLu 함수를 생성하시오 !

def relu(x):
     return np.maximum(0,x)

print (relu(-2))

print (relu(0.3))

문제44.  Relu 함수를 그래프로 그리시오 

def relu(x): 
    return np.maximum(0, x)

x = np.arange(-15.0,15.0,0.1)
y= relu(x)
plt.figure(figsize=(10,10))
plt.plot(x,y)
plt.show()




 ■ 3.2 행렬의 내적 (p77 다차원 배열계산)

문제45. 아래의 행렬 곱 (행렬내적) 을 파이썬으로 구현하시오 ! 
  1  2  3       5  6
[         ] * [ 7  8 ] = ?
  4  5  6       9 10

     2 x 3  * 3 x 2 = 2 x 2



a=np.array([[1,2,3],[4,5,6]])
b=np.array([[5,6],[7,8],[9,10]])
print(np.dot(a,b))

[[ 46  52]
 [109 124]]

문제46. 아래의 행렬곱을 파이썬으로 구현하시오! 
  5  6       1
( 7  8 ) * (   ) = ?
  9  10      2


a=np.array([[5,6],[7,8],[9,10]])
b=np.array([[1],[2]])

print(np.dot(a,b))

[[17]
 [23]
 [29]]

■ 신경망 내적 
문제47. 아래 그림을 numpy 로 구현하시오 


x = np.array([1,2])
y = np.array([[1,3,5],[2,4,6]])
b = np.array([7,8,9])
print(np.dot(x,y)+b)

문제48. 위의 문제에서 구한 입력신호의 가중의 합인 y 값이 
       활성함수인 sigmoid 함수를 통과하면 어떤 값으로 출력되는지
       z 값을 확인하시오. 

x = np.array([1,2])
y = np.array([[1,3,5],[2,4,6]])
b = np.array([7,8,9])
print(np.dot(x,y)+b)

문제49. 아래의 신경망 그림을 파이썬으로 구현하시오 



import numpy as np

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

x = np.array([4.5, 6.2])

w = np.array([[0.1, 0.3], [0.2, 0.4]])
b = np.array([0.7, 0.8])

l1 = sigmoid(np.dot(x, w)+b)

w = np.array([[0.5, 0.7], [0.6, 0.8]])
l2 = sigmoid(np.dot(l1, w)+b)

w = np.array([[0.1, 0.3], [0.2, 0.4]])
l3 = np.dot(l1, w)+b

print(l3)

 [ 0.98967405  1.47095426]

■ 출력층에서 사용하는 활성화 함수

  1. 분류 : 소프트 맥스 함수 ( 0 ~ 1 사이의 숫자로 출력되는 함수 )
   1.2                       0.46
 [ 0.9 ] ---> 소프트맥스 --->[ 0.34 ]
   0.4                       0.20

p96. 
                      y0 = 0(확률 = 0.2 : 20%)
필기체 2 ---> 신경망    y1 = 1(확률 = 0.1 : 10%)
                      y2  =2(확률 = 0.46 : 46%)  
                         :
                      y9 = 9(확률 = 0.01 : 1 %)
                                                                  

  2.회귀 : 항등함수 ( 입력값을 그대로 출력하는 함수 ) 

문제50. 소프트맥스 함수를 파이썬으로 구현하시오 ! 
def softmax(a):
    c = np.max(a)
    exp_a = np.exp(a - c)
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a

    return y


[ 0.01821127  0.24519181  0.73659691]  <- 확률 벡터


" 인공 신경망의 출력값으로 확률 벡터를 얻고 싶을때 사용한다."

문제51. 입력값을 그대로 출력하는 항등 함수를 파이썬으로 구현하시오 

def identity_function(x):
     return x

문제52. 책 88 페이지에 나오는 3층 신경망을 파이썬으로 구현하시오 !
     (오늘의 마지막 문제) 


import numpy as np

def sigmoid(x):
   return 1 / (1 + np.exp(-x))
x= np.array([1.0, .5])
W1 = np.array([[.1, .3, .5], [.2, .4, .6]])
W2 = np.array([[.1, .4],[.2, .5] ,[.3, .6]])
W3 = np.array([[.1, .3],[.2,.4]])
b1 = np.array([.1,.2,.3])
b2 = np.array([.1,.2])
b3= np.array([.1,.2])

l1 = sigmoid(np.dot(x,W1)+b1)
print(l1)

l2 = sigmoid(np.dot(l1,W2)+b2)
print(l2)

l3 = np.dot(l2,W3)+b3
print(l3)


test

import numpy as np
import matplotlib.pyplot as plt
# A = np.array([[1,1,-1],[4,0,2],[1,0,0]])
# B = np.array([[2,-1],[3,-2],[0,1]])
#
# print(np.dot(A,B))
#
# A = np.matrix([[1,1,-1],[4,0,2],[1,0,0]])
# B = np.matrix([[2,-1],[3,-2],[0,1]])
#
# print(A*B)

def softmax(a):
    c = np.max(a)
    exp_a = np.exp(a - c)
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a

    return y

x0, x1, x2 = .2, .7, .9
w11, w12, w13 = 2, 4, 3
w21, w22, w23 = 2, 3, 5
w31, w32, w33 = 2, 4, 4
b1, b2, b3 = -3, 4, 9
x = np.array([x0,x1,x2])
w1 = np.array([[w11, w21, w31],[w12, w22, w32],[w13, w23, w33]])
b = np.array([b1,b2,b3])

result = softmax(np.dot(x,w1)+b)
print(result)
x = np.arange(-1.,1.,0.001)
plt.plot(x , result[1])
plt.show()






■ 3장 목차
  1. 활성화 함수 (active function)
     - 계단함수 
     - 시그모이드 함수
     - Relu 함수
     
  1. 행렬의 내적 문제
  2. 신경망을 파이썬으로 구현 
  3. 손글씨 인식 신경망을 구현 (순전파)

■ 출력층의 활성화 함수 2가지 ? 

  1. 분류 : 소프트 맥스 함수
 
     질문 예: 데이터가 어느 클래스에 속하는지 확인
          (사진속 인물의 성별 분류)  
  2.회귀 : 항등 함수

     질문 예 : 입력 데이터에서 연속적인 수치를 예측하는 문제
               ( 사진 속 인물의 몸무게를 예측하는 문제) 

 " 소프트 맥스 함수는 a의 원소의 대소 관계가 y의 원소의 
   대소 관계로 그대로 이어지기 때문에 출력이 가장 큰 뉴런의 위치는 변하지 않는다.
   결과적으로 지수 함수 계산에 드는 자원 낭비를 줄이고자 출력층의 소프트 맥스 함수는
   생략하는 것이 일반적이다. "

            학습 ----------------------> 추론(테스트) --> 해야할 진짜 일 
             ↓                              ↓
    소프트 맥스 함수 사용 o           소프트 맥스 함수 사용 x

■ 손글씨 숫자 인식 (p 96)

 - mnist ? 손글씨 숫자 이미지 집합 데이터 셋

  0 ~ 9 까지의 숫자 이미지로 구성되어있고
  훈련 이미지가 60000 장, 시험 이미지가 10000 장이 준비됨 


 - 28 x 28 크기의 회색조 이미지 (총 784개의 픽셀)

 - 각 픽셀은 0 ~ 255 까지의 값을 취한다. 숫자가 커질수록 픽셀이 진해짐
 - 각 이미지에는 숫자 7,2,1 과 같은 이미지가 레이블되어 있다. 


 
  

# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 부모 디렉터리의 파일을 가져올 수 있도록 설정
import numpy as np
from mnist import load_mnist
from PIL import Image

def img_show(img):
    pil_img = Image.fromarray(np.uint8(img))
    pil_img.show()

                    테스트데이터, 테스트데이터라벨
                        ↓        ↓
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)
  ↑          ↑
 훈련 데이터, 훈련데이터 라벨

# 설명 : flatten = True 라는 것은 립력이미지를 평탄하게 1차원 배열로 변환하라
# normalize : 입력 이미지의 픽셀 값을 0 ~ 1 사이로 할지 아니면 원래 값인 0 ~ 255 로 할지 
               결정하는 함수

# 0 ~ 255 범위의 각 픽셀의 값을 0.0 ~ 1.0 사이 범위로 변환능ㄹ 하는데 이렇게 특정 범위로 
#     변환 처리하는 것을 ?

#     "정규화"  라고 한다 

#신경망의 입력 데이터에 특정 변환을 가하는 것을 
#     "전처리" 라고 한다.


img = x_train[0]
label = t_train[0]
print(label)  # 5

print(img.shape)  # (784,)
img = img.reshape(28, 28)  # 형상을 원래 이미지의 크기로 변형
print(img.shape)  # (28, 28)

img_show(img)


문제53. x_train 의 0 번째 요소의 필기체 숫자를 5였다. 그렇다면 x_train 의 1번재 요소의 필기체 숫자는 무엇인지 확인하시오 
7

  • mnist파라미터 설명
      a. flatten
         i. true : 입력이미지를 평탄하게 1차원 배열로 변환하는 것 (학습시킬때는 변환해야함)
         ii. false : 입력이미지를 평탄하게 1차원 배열로 변환하지 않는것 (이미지를 표시해야 함)
      b. normalize
         i. true : 픽셀의 값을 0~1 사이로 변환한다. (전처리 작업)
         ii. false : 픽셀의 값을 0~255 사이로 그대로 둔다.
      c. one_hot_label
         § 0~9의 숫자가 라벨로 저장되어 있음 [0,0,0,0,0,0,0,1,0,0] --> 7을 의미한다.
         i. true : 원-핫 인코딩 (one-hot encoding) 형태로 저장한다.
false : 레이블을 원-핫 인코딩 형태로 저장안한다.


# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 부모 디렉터리의 파일을 가져올 수 있도록 설정
import numpy as np
import pickle
# (p98) mmist 데이터셋을 읽어올 때 인터넷이 연결되어 있는 상태에서 가져와야하는데 이때 시간이 걸린다.
# 가져온 이미지를 로컬에 저장할 때 pickle 파일로 생성이 되고 로컬에 저장되어 있으면 순식간에 읽을 수 있기 때문에 임포트 해야함
from dataset.mnist import load_mnist
from common.functions import sigmoid, softmax

def get_data():
    (x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=False)
    #(학습데이터, 학습라벨), (테스트데이터, 테스트라벨)
    # 60000장              , 10000장
    return x_test, t_test
    #테스트 데이터만 return. 학습할 필요 x
    #훈련시킬려는 목적 x

def init_network():
    with open("C:\\sample_weight.pkl", 'rb') as f:
        # (훈련되어있는 매개변수, 가중치) 가지고 추론
        network = pickle.load(f)
    return network
# sample_weight.pkl 파일안에 학습된 가중치, 바이어스가 다 계산되어서 들어있음

# 신경망 어떻게 구현해서 학습한것인지 확인(추정)

# 이 최종결과가 sample어쩌구 저 파일에 있다
# 그니까 여기 안엔 학습코드 x. 학습된거 가지고 추론하는거임

def predict(network, x):
    W1, W2, W3 = network['W1'], network['W2'], network['W3']
    b1, b2, b3 = network['b1'], network['b2'], network['b3']

    a1 = np.dot(x, W1) + b1
    z1 = sigmoid(a1)
    a2 = np.dot(z1, W2) + b2
    z2 = sigmoid(a2)
    a3 = np.dot(z2, W3) + b3
    y = softmax(a3)

    return y
# [0.05, 0.05, 0.7, 0.01 ...]
# 2

## 2가 맞는지 확인
x, t = get_data()
# 테스트 데이터(x), 테스트 라벨(t)
# t에는 숫자가 들어있을 것(원핫인코딩x)
network = init_network()
##파이썬 함수의 4가지 특징
#1. 변수에 할당할 수 있다
#2. 다른 함수 내에서 정의될 수 있다
#3. 함수의 매개변수로 함수가 전달될 수 있다
#4. 함수의 반환값이 될 수 있다

accuracy_cnt = 0   #정확도를 출력해주기 위한 변수
for i in range(len(x)):
    y = predict(network, x[i])
# x 784개...
# y가 [0.05, 0.05, 0.7, 0.01 ..]
    p= np.argmax(y) # 확률이 가장 높은 원소의 인덱스를 얻는다. #2
    if p == t[i]:                                # t: 타겟(숫자있음.. 원핫인코딩안했으니깐...)
        accuracy_cnt += 1

print("Accuracy:" + str(float(accuracy_cnt) / len(x)))


문제56. 위의 코드를 수정해서 






■ 배치처리 (p102) 

이미지를 한장씩 처리하는게 아니라 여러장르 한번에 처리 

이미지를 한장씩 처리함


이미지는 50페이지씩 처리함 

추론(테스트)를 배치 단위로 진행하면 결과를 훨씬 빠르게 얻을 수 있다.

  • 배치로 돌리는 코드를 이해하기 위한 사전 파이썬 코드의 이해 

     list( range(0, 10) ) <--- 이 결과를 프린트하면 ?

     [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

문제57. [0, 3, 6, 9]로 결과를 출력하려면 ? 

print(list(range(0,10,3)))

문제58. 아래의 리스트를 만들고 
[0, 3, 6, 9] 이중의 최대 값을 출력하라 인덱스도
x= list(range(0,10,3))
print(max(x))
print(x.index(max(x)))

문제59. numpy를 이용해서 아래의 리스트에 최대값의 인덱스를 출력하시오 !
import numpy as np
xlist(range(0,10,3))
print(np.argmax(x))

문제60. 아래의 행렬 배열을 생성하고 각 행의 최대값을 갖는 인덱스가
출력되게 하시오 


     0.1  0.8  0.1     1
     0.3  0.1  0.6     2     
     0.2  0.5  0.3     1
     0.8  0.1  0.1     0

import numpy as np

a = np.array([[ 0.1,  0.8 , 0.1  ],
   [  0.3 , 0.1 , 0.6   ],
   [ 0.2  ,0.5,  0.3   ],
   [ 0.8,  0.1 , 0.1   ]  ])
for i in range(len(a)):
    print(np.argmax(a[i]))

for i in range(a.shape[0]):
     print(np.argmax(a[i])

print(np.argmax(a, axis = 1))
     axis = 0 : 열
     axis = 1 : 행
print(a.shape[0])
for i in range(a.shape[0]):
print(np.argmax(a[i]))

print(np.argmax(a, axis = 0))
[3 0 1]

문제61. 아래의 2개의 리스트를 만들고 서로 같은 자리에 같은 숫자가 몇개가 있는지 출력하시오 ! 

[2,1,3,5,1,4,2,1,1,0]

[2,1,3,4,5,4,2,1,1,2]
결과 : 7 


a = [2,1,3,5,1,4,2,1,1,0]
j = 0
b= [2,1,3,4,5,4,2,1,1,2]
for i inrange(len(a)):
     
     if (a[i] == b[i]):
          j+=1
print(j)


a = [2,1,3,5,1,4,2,1,1,0]

b= [2,1,3,4,5,4,2,1,1,2]
a= np.array(a)
b= np.array(b)
print(np.sum(a==b))

문제62. 아래의 리스트를 x라는 변수에 담고 앞에 5개의 숫자만 출력하시오 
[1,2,3,4,5,6,7,8,9,10]

결과 :  [1,2,3,4,5]

답 :
a=[1,2,3,4,5,6,7,8,9,10]

print(a[0:5]

문제63. 100장의 이미지를 한번에 입력츠엥 넣어서 정확도를
        추론하는 신경망 코드를 수행하시오 !

# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 부모 디렉터리의 파일을 가져올 수 있도록
import numpy as np
import pickle
from dataset.mnist import load_mnist
from common.functions import sigmoid, softmax

def get_data():
    (x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=False)
    return x_test, t_test

def init_network():
    with open("sample_weight.pkl", 'rb') as f:
        network = pickle.load(f)
    return network

def predict(network, x):
    w1, w2, w3 = network['W1'], network['W2'], network['W3']
    b1, b2, b3 = network['b1'], network['b2'], network['b3']

    a1 = np.dot(x, w1) + b1
    z1 = sigmoid(a1)
    a2 = np.dot(z1, w2) + b2
    z2 = sigmoid(a2)
    a3 = np.dot(z2, w3) + b3
    y = softmax(a3)

    return y

x, t = get_data()
network = init_network()

batch_size = 1 # 배치 크기
accuracy_cnt = 0

for i in range(0, len(x), batch_size):
    x_batch = x[i:i+batch_size]
    y_batch = predict(network, x_batch)
    p = np.argmax(y_batch, axis=1)
    accuracy_cnt += np.sum(p == t[i:i+batch_size])

print("Accuracy:" + str(float(accuracy_cnt) / len(x)))

문제64. batch_size를 1로 했을 때와 batch_size를 100으로 했을 떄
     수행속도의 차이가 있는지 확인하시오 ! (정확도와 수행속도) 

100개씩
0.046002864837646484
Accuracy:0.9352

1개씩
0.7430424690246582
Accuracy:0.9352

문제65. 훈련 데이터 (6만개)로 batch_size 1 로 했을 때와 
        batch_size 100으로 했을때의 정확도와 수행속도차이를 비교하시오 (오늘의 마지막 문제 )

100 개씩 
0.239013671875
Accuracy:0.9357666666666666

1개씩
4.204240560531616
Accuracy:0.9357666666666666


4장을 미리 읽으세요
























 


 

 

'딥러닝' 카테고리의 다른 글

딥러닝 5장 .  (0) 2017.07.26
딥러닝 4장. 신경망 학습  (0) 2017.07.26
딥러닝 2장. 퍼셉트론  (0) 2017.07.26
딥러닝 1장. Numpy, matplotlib 사용법  (0) 2017.07.26


- 머신러닝과 딥러닝의 차이점은? 
     붓꽃의 종을 구별하는 임무가 있다고 했을때 머신러닝은
     사람이 붓꽃의 특성을 정의하고 데이터 세트를 만들고나서
     컴퓨터가 데이터 세트를 기반으로 붓꽃을 구별하는 판별식을 결정하는 방법


머신러닝





딥러닝


 딥러닝은 알고리즘에 의해 컴퓨터가 붓꽃의 사진을 보고 스스로 특성을 찾아내고 판별해 내는 방법이다. 



■ 복습 
  1. 머신러닝과 딥러닝의 차이? 
     딥러닝은 알고리즘에 의해 컴퓨터가 붓꽃의 사진을 보고 스스로 특성을 찾아내고 판별해내는 방법

     '깊은 학습'
     
     신경망츠잉 여러개이기 때무넹
  1. 신경망을 구현하기 위한 라이브러리 2개? 
     - numpy 
     - matplotlib

■ 2장. 퍼셉트론 (Perceptron) 

     머신러닝의 한 부류인 딥러닝(이미지를 기계가 직접 인식해서 학습) 
                         ↓
         퍼센트론 ---> 신경망

결론은 ? 분류를 하겟다.

신경망을 통해서 구현하고자 하는 목표는 ? 분류 
     
           - 붓꽃 사진을 보고 종을 분류
           - 고양이 사진, 개 사진 분류 

퍼셉트론도 분류인데 숫자 0과 1을 분류한다. 


     

1943년에 미국의 신경외과 의사인 워렌 맥컬록에 의해 발다닝 되었고

1957년에 프랑크 로젠 블라트가 퍼센트론 알고리즘을 고안했다

사람의 뇌의 동자긍ㄹ 전기 스위치의 on/off로 흉내 낼 수 있다는 이론을 
증명하였다.

간단히 말하면 인간의 신경세포 한를 흉대는 냈는데

고등하굑 생물시간에 배운  3가지 용어 ?

  1. 자극(stinulus)
  2. 반응(response)
  3. 역치(threshold)

 "특정 자극이 있다면 그 자극이 어느 역치 이상이여야만 세포가 반응한다."

예 : 짜게 먹는 사람은 자기가 평소에 먹는 만큼 음식이 짜지 않으면 싱겁다고 느낀다.
    ( 역치 이하의 자극은 무시) 
 
      싱겁게 먹는 사람이 짜게 먹기 시작해서 오랜 시간이 지나면 
      예전에 먹던 싱거운 음식에 만족하지 못한다( 역치가 올라감)

1969년 : 퍼센터론은 단순 선형분류기에 불과하다
          왜냐면? xor분류도 못한다고 단정을 지음 

          인공지능의 침체기 (인공지능의 빙하기)

1970년 중반 : 중요한 논문이 하나 발표 : 역전파 알고리즘  (다층 퍼센트론) 

     당시의 컴퓨터 연산으로는 이 이론을 구현하기가 어려웠음 


1986년 : 은닉층을 갖는 다층 퍼센트론 + 오류 역전파 학습 알고리즘 구현 되기 시작함 

          ↓
        오늘날


입력 신호               가중치         출력신호

입력신호의 연결강도가 가중치인데 가중치의 갑싱 클수록 강한 신호이다

입력신호가 뉴런에 보내질때는 각각의 고유하 가중치가 곱해진다.

w1 * x1 + w2 * x2 <= 임계값(θ) ---> 0 (신호가 안 흐른다)
w1 * x1 + w2 * x2 > 임계값(θ) ---> 1 (신호가 흐른다)

뉴런에서 보내온 신호의 총합이 정해진 한계(임계값)을 넘어설때만 1을 출력한다.

퍼셉트론은 n 개의 이진수가 하나의 뉴런을 통과해서 가중의 합이 0 보다 크면 활성화되는
가장 간단한 신경망이다. 

퍼셉트론을 학습시키는 방법은 간단한데, 보통 목표치를 정해주고 
현재 계산한 값이 목표치와 다른면 그 만큼의 오차를 다시 퍼센트론에 
반영해서 오차를 줄여나가는 방법 
















문제27. 아래의 식을 파이썬으로 구현하시오 ! 

 x1  w1
     ↘
         ?
     ↗
 x2  w2

x1 * w1 + x2 * w2 = ?

x1 : 0 
x2 : 1
w1 : 0.5
w2 : 0.5

(0 1) * (0.5 0.5)

input=np.array([0,1])
weight=np.array([0.5, 0.5])
np.sum(input*weight)

문제28. 위의 식에 책 52쪽에 나오는 편향을 더해서 완성한 아래의 식을 
       파이썬으로 구현하시오 !
       
       b + w1*x1 + w2*x2 

b(편향) = -0.7

x1 : 0 
x2 : 1
w1 : 0.5
w2 : 0.5


input=np.array([0,1])
weight=np.array([0.50.5])
b=0.7
print(np.sum(input*weight) + b)


문제29. AND게이트를 파이썬으로 구현하시오 

def AND(x1, x2):
     return x1&x2

def AND(x1, x2):
     w1, w2, theta = 0.5, 0.5, 0.7
     tmp = x1*w1 + x2*w2
     if tmp <= theta :
          return 0 
     elif tmp > theta:
          return 1

■ 편향까지 포함해서 AND 게이트를 구현

 "가중치는 입력신호가 결과에 주는 영향력(중요도)를 조절하는 
  매개변수이고 편향은 뉴런이 얼마나 쉽게 활성화(결과로 1을 출력) 
  하느냐를 조정하는 매개변수이다. "

  예를들어 b 가 -0.1 이면 각 입력신호에 가중치를 곱한 값들의 합이 0.1 을
  초과할 때만 뉴런이 활성화 된다.

  만약 편향이 -20 이면 입력신호에 가중치를 곱한 ㅎ바이 20을 넘지 않으면 뉴런은 활성화
  되지 않는다. 

문제30. 문제29번의 편향을 포함해서 AND 게이트 함수를 구현하시오 !

가중치 : 0.5, 0.5
편 향 : -0.7



def AND(x1, x2):
     w1, w2, theta = 0.5, 0.5, -0.7
     tmp = x1*w1 + x2*w2
     if tmp <= theta :
          return 0 
     elif tmp > theta:
          return 1

  1. 다층 퍼셉트론 
          -XOR 게이트 구현

AND  X1  X2  Y
      0   0  0 
      0   1  0 
      1   0  0
      1   1  1

OR   X1  X2  Y
      0   0  0
      0   1  1 
      1   0  1 
      1   1  1

NAND  X1  X2  Y
       0   0  1
       0   1  1 
       1   0  1
       1   1  1

xor 는 eXclusive OR 라는 뜻으로 둘중에 하나만 1일때 1 이 된다.

XOR    x1   x2   y
            0     0   0
            0     1   1
            1     0   1
            1     1   1

"이 처럼 층이 여러개인 퍼셉트론을 다층 퍼셉트론이라고 한다."

문제31. AND 함수를 이용해서 NAND함수를 만드시오 

def AND(x1, x2):
    x = np.array([x1,x2])
    w = np.array([0.5,0.5])
    b = -0.7
    tmp = np.sum(w*x) + b
    if tmp <= 0:
        return 0
    elif tmp > 0:
        return 1

def NAND(x1, x2):
    x = np.array([x1,x2])
    w = np.array([-0.5,-0.5])
    b = 0.7
    tmp = np.sum(w*x) + b
    if tmp <= 0:
        return 0
    elif tmp > 0:
        return 1
문제32. OR 함수를 파이썬으로 구현하시오 

def OR(x1, x2):
    x = np.array([x1, x2])
    w = np.array([0.50.5])
    b = -0.3
    tmp = np.sum(w * x) + b
    if tmp <= 0:
        return 0
    elif tmp > 0:
        return 1

문제33. XOR 함수를 파이썬으로 구현하시오 !

print(XOR(1,0))


def XOR(x1, x2):
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(s1, s2)
    return y

print(XOR(0,0))
print(XOR(0,1))
print(XOR(1,0))
print(XOR(1,1))

#

























 









































 

'딥러닝' 카테고리의 다른 글

딥러닝 5장 .  (0) 2017.07.26
딥러닝 4장. 신경망 학습  (0) 2017.07.26
딥러닝 3장. 신경망  (0) 2017.07.26
딥러닝 1장. Numpy, matplotlib 사용법  (0) 2017.07.26

■딥러닝
■일정 7월 18일

6월 22일 ~ 7월 13일 (3주) : R 수업 - 매일 쪽지시험 2개
7월 13일 ~ 8월  3일  (3주) : 딥러닝 - 개념을 잡는 문제
8월  3일  ~ 8월 23일 (3주) : 텐써플로우 + 개인 프로젝트 (포트폴리오)

신경망에 대해서 얘기 해보세요 

시그모이드 함수가 뭔가요 

그게 왜 필요한가요 ? 


거기에 대한 대답을 할 줄 알아야 한다

코딩만 하다보면 대답을 잘 모해 

밑 바닥 부터 시작하는 딥러닝 책이 총7 챕터 까지 잇다

총 7장 수업 
하루에 한 챕터씩 하더라도 다음주 화요일이면 끝이 난다. 

그래서 

수업과 그리고 오오오 쪽지시험 개념 

  1. 총7장 수업
  2. 쪽지시험 (개념설명 <=-== 면접대비, ncs 시험문제) 
  3. 딥러닝은 평가방법 포트폴리오 (개인프로젝트)

8월 4일 프로젝트 계획서 제출 ( 주제, 참여 인원수, 기간, 상세기간에 계획)
     - 2~3명 : 좀더 좋은 결과물이 나와야하고  
     - 1명   : 계획을 잘 짜서 -> 계획대로 진행

8월 4일까지 계획서 제출 

7월 17일
7월 24일
7월 31일 
8월 7일 : 개인 프로젝트
8월 14일 
8월 21 ----- 8월 23일 (수)


■ 밑바닥 부터 시작하는 딥러닝

■ 1장.  Numpy, matplotlib 사용법

*1장 목차.
  1. 딥러닝이 무엇인가?
  2. 넘파이

■ 1. 딥러닝이 무엇인가?

■ 머신러닝의 종류 3가지
 1.지도학습 
    - 분류 :    knn         : 과일인지 야채인지 단백질인지 분류
                              유방암 종양크기와 둘레로 양성이닞 악성인지 분류
                              동물의 형태로 어떤 종류의 동물인지 분류
               나이브베이즈   : 스팸과 햄 메일 분류
                              직업, 나이, 성별만 가지고 선호하는 
                              영화 장르 
               결정트리      : 1. 대출위험대상자(개인,기업) 분류
                              2.지방간인지 아닌지
                              3.베드민턴 플레이에 날씨가 미치는 영향
                              4.스킨샵 쿠폰반응 여부
               svm         : 서포트벡터머신:                          
1.중산층 분류 실습
2.필기체 분류 숫자 
3.필기체 분류 영어
4.대장균
5.iris
6.mnist(필기체)
7.보스톤 하우징 데이터 분류
    - 회귀 :  선형회귀         
                              1.코스피 지수
                              2.탄닌과 애벌레성장
                              3.미국대학 입학에 미치는 가장큰 변수
                              4.챌린저호 폭파원인분석
                              5.보험비에 미치는 변수(담배, 비만지수)
                              6.스마트폰 구매에 미치는 변수(외관)
               신경망          
                              1.콘크리트 강도에 미치는 변수
                              2.필기체 인식

2.비지도학습 : k-means
                             1.sns 10대들의 관심사를 가지고 10대를 
                                5개의 부류로 분류함 
                             2.가요와 클래식 음악분류

3.강화학습 : 틱택토, 핑퐁


     ■ 머신러닝과 딥러닝의 차이? 


- 딥러닝은 머신러닝에서 나온 한 갈래임

- 머신러닝이란? 
     프로그래머의 프로그래밍없이 컴퓨터에게 배우게 하는 
     능력을 갖게하는 컴퓨터 과학의 한 종류 

예 : 우리가 책상이라는 이미지를 인식하는건 그냥 어렸을때 부터 그게 책상이었고
     그냥 그런가보다 해서 자연스럽게 알게된것이다. 
     컴퓨터에게 이게 책상이다 라고 알려주는 것은 쉬울것 같지만 
     사실 굉장히 어려운 일이다. 

      우리가 책상을 보고 이게 책상이다라고 알 때에 
     우리 뇌에서 일어나느 일들을 우리는 다 알지도 못하고 
     안다해도 그 과정을 프로그래밍 한다는것은 무지막지하게 
     복잡한 일 일것이다. 

     그래서 이런 프로그램을 사람이 작성하는 대신 기계가 
     프로그램을 작성하도록 접근한 것이 머신러닝이다. 

- 머신러닝과 딥러닝의 차이점은? 
     붓꽃의 종을 구별하는 임무가 있다고 했을때 머신러닝은
     사람이 붓꽃의 특성을 정의하고 데이터 세트를 만들고나서
     컴퓨터가 데이터 세트를 기반으로 붓꽃을 구별하는 판별식을 결정하는 방법


머신러닝






딥러닝



 딥러닝은 알고리즘에 의해 컴퓨터가 붓꽃의 사진을 보고 스스로 특성을 찾아내고 판별해 내는 방법이다. 

딥(deep) 이라는 말은 신경망의 층이 많고 각 층마다 고려되는 
변수가 많다는 뜻이다. 

개인프로젝트;
8월 4일 프로젝트 계획서 제출 ( 주제, 참여 인원수, 기간, 상세기간에 계획)
     - 2~3명 : 좀더 좋은 결과물이 나와야하고  
     - 1명   : 계획을 잘 짜서 -> 계획대로 진행


  


■ 밑바닥 부터 시작하는 딥러닝
1장. 파이썬 사용법
2장. 퍼셉트론
3장. 신경망
4장. 신경망 학습
5장. 오차역전파법
6장.학습 관련 시술들
7장. 합성곱 신경망(cnn)
8장. 딥러닝

■ 1장.  Numpy, matplotlib 사용법
1.2 넘파이 (numPy)

- python 언어에서  기본적으로 지원하지 않는
  배열 (array) 혹은 행렬(matrix)의 계산을 쉽게 해주는 라이브러리 

- 머신러닝에서 많이 사용하는 선형대수학에 관련된 수식들을
  파이썬에서 쉽게 프로그래밍 할 수 있게 해준다. 

예제1 : 배열 만들기

import numpy as np 

a = np.array([[1,2],[3,4]])

print(a)

결과 [[1,2]
      [3 4]]

예제2 : 사직연산

a + n : 배열의 모든 원소에 n 만큼을 더합니다.
a - n : 배열의 모든 원소에 n 만큼을 뺀다 .
a * n : 배열의 모든 원소에 n 만큼을 곱한다 .
a / n : 배열의 모든 원소에 n 만큼을 나눈다..

문제1. 아래의 a 배열에 모든 원소에 5를 더한 결과를 출력하시오

a = np.array([[1,2],[3,4]])

문제2. 아래의 배열의 원소들의 평균값을 출력하시오  !

 a = numpy.array([1,2,3,4,5,5,6,10])

답: 
import numpy as np 
a = np.array([1,2,3,4,5,5,6,10])
print(np.mean(a))


문제3. a 배열의 중앙값을 출력하시오
import numpy as np 
a = np.array([1,2,3,4,5,5,6,10])
print(np.median(a))

문제4. a 배열의  최대값과 최소값을 출력하시오 

print(np.max(a))
print(np.min(a))

문제5. a 배열의 표준편차와 분산을 출력하시오 

print(np.std(a))
print(np.var(a))

문제6. 아래의 행렬식으로 numpy로 구현하시오 !
  1 3 7        0  0  5
[        ] + [        ]
  1 0 0        7  5  0 


a=np.array([[1,3,7],[1,0,0]])
b=np.array([[0,0,5],[7,5,0]])
print(a+b)


문제7. 아래의 numpy 배열을 생성하고 원소중에 10만 출력해보시오  !
 1 2 3
[4 10 6 ]
 8 9 20

답 :
a=np.array([[1,2,3],[4,10,6],[8,9,20]])
print(a[1][1])

문제8.아래의 행렬 연산을 파이썬으로 구현하시오 ! (점심시간문제)
 1 2 
(    ) * ( 10 20 ) =?
 3 4 

a= np.array([[1,2],[3,4]]) 
b= np.array([10,20])

print(a*b)



문제9. 아래의 그림의 행렬 연산을 numpy로 구현하시오  !


a=np.array([[0],[10],[20],[30]])
b=np.array([0,1,2])
print(a+b)

문제10. 아래의 행렬 식을 numpy로 구현하고 아래의 요소에서 
     15 이상인 것만 출력하시오 
  55 55
( 14 19 )
   0  4
a=np.array([[55,55],[14,19],[0,4]])
a=a.flatten() # 1차원 배열로 변환 시켜준다. 
a[a>15]

문제11. 아래의 행렬식을 numpy를 이용하지 않고 list변수로 구현하고      
       아래의 행렬식에서 행의 갯수가 몇개인지 출력하시오
1 3 7
1 0 0 

a=[[1,3,7],[1,0,0]]

print(len(a))


문제12. 아래의 행렬식을 numpy를 이용하지 않고 list 변수로 구현하고 
       열의 갯수가 몇개 인지 출력하시오 
1 3 7 
1 0 0 

a=[[1,3,7],[1,0,0]]
print(len(a[0]))

문제13. 아래의 행렬식의 덧셈 연산을 numpy 이용하지 않고 수행하시오 

a=[[1,3,7],[1,0,0]]
b=[[0,0,5],[7,5,0]]
res=[[0,0,0],[0,0,0]]
for in range(len(a)):
    for in range(len(a[0])):
        res[i][j]=a[i][j]+b[i][j]
print(res)

문제14. 아래의 행렬식을 numpy이용하지 않고 구현하시오 ! 

1  2     5  6  
       x          = ?
3  4     7  8




#넘파이 이용
import numpy as np
a=np.array([[1,2],[3,4]])
b=np.array([[5,6],[7,8]])
print(a*b)

# 넘파이 안 이용 
a=[[1,2],[3,4]]
b=[[5,6],[7,8]]
res=[[0,0],[0,0]]
for in range(len(a)):
    for in range(len(a[0])):
        res[i][j]=a[i][j]*b[i][j]
print(res)


문제15. 아래의 행렬 연산을 numpy와 numpy를 이용하지 않았을때 2가지 방법으로 구현하시오 

10   20  -  5  6  = ?
30   40     7  8



#넘파이 이용
a= np.array([[10,20],[30,40]])
b= np.array([[5,6],[7,8]])
print(a-b)

#넘파이 안 이용
a= [[10,20],[30,40]]
b= [[5,6],[7,8]]
res=[[0,0],[0,0]]
for in range(len(a)):
    for in range(len(a[0])):
        res[i][j]=a[i][j]-b[i][j]
print(res)

문제16. numpy의 브로드캐스트를 사용한 연산을 numpy를 이용하지 않는 방법으로 구현하시오 (점심시간 문제를 넘파이 이용하지 않고 )


 1 2 
(    ) * ( 10 20 ) =?
 3 4 


a= [[1,2],[3,4]]
b= [10,20]
res=[[0,0],[0,0]]
for i in range(len(a)):
    for j in range(len(b[0])):
        res[i][j]=a[i][j]-b[j]
print(res)

■ 3. matplotlib 사용법 (p41)

     딥러닝 실험에서는 그래프 그리기와 데이터 시각화가 중요하다
     matplotlib 는 그래프를 그리기 위한 라이브러리이다.

     matplotlib를 이용하면 그래프를 그리기가 쉬워진다. 

예제1:
import matplotlib.pyplot as plt
plt.figure() #객체를 선언한다.
plt.plot([1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1,0])
plt.show()



import matplotlib.pyplot as plt
import numpy as np

t = np.arange(0,12,0.01)
print(t)
plt.figure() #객체를 선언한다.
plt.plot(t)
plt.show()


문제17. 위의 그래프에 grid(격자)를 추가하시오!

import matplotlib.pyplot as plt
import numpy as np

t = np.arange(0,12,0.01)
print(t)
plt.figure() #객체를 선언한다.
plt.plot(t)
plt.grid()
plt.show()


문제18. 위의 그래프에 x축의 이름을 size라고 하고 y축의 이름을 cost라고 하시오 ! 

import matplotlib.pyplot as plt
import numpy as np

t = np.arange(0,12,0.01)
print(t)
plt.figure() #객체를 선언한다.
plt.plot(t)
plt.grid()
plt.xlabel('size')
plt.ylabel('cost')
plt.show()

문제19. 위의 그래프에 전체 제목을 size & cost라고 하시오 


import matplotlib.pyplot as plt
import numpy as np

t = np.arange(0,12,0.01)
print(t)
plt.figure() #객체를 선언한다.
plt.plot(t)
plt.grid()
plt.xlabel('size')
plt.ylabel('cost')
plt.title('size & cost')
plt.show()

문제20. 아래의 numpy 배열로 산포도 그래프를 그리시오 ! 

x = np.array([0,1,2,3,4,5,6,7,8,9])
y = np.array([9,8,7,9,8,3,2,4,3,4])

plt.figure()
plt.scatter(x,y)
plt.show()


문제21. 위 그래프를 선이 그어지게 하시오 


문제22. 치킨집 창업 데이터를 읽어와 그래프를 그리시오


import numpy as np
from matplotlib import pyplot as plt
chi = np.loadtxt('d:\\data\\창업건수.csv', skiprows=1 , unpack=True,delimiter=',')

x = chi[0]
y = chi[4]

plt.figure()
plt.plot(x,y)
plt.xlabel("YEAR")
plt.ylabel('JIP')
plt.title('chicken jip open per year')

문제23. 폐업건수도 위의 그래프에 겹치게 해서 출력하시오 ! 

import numpy as np
from matplotlib import pyplot as plt
chi = np.loadtxt('d:\\data\\창업건수.csv', skiprows=1 , unpack=True,delimiter=',')
pe = np.loadtxt('d:\\data\\창업건수.csv', skiprows=1 , unpack=True,delimiter=',')
unpack=True 세로로 읽겠다 
x = chi[0]
y = chi[4]
p = pe[4]
plt.figure()
plt.plot(x,y)
plt.plot(x,p)
plt.xlabel("YEAR")
plt.ylabel('JIP')
plt.title('chicken jip open per year')
plt.show()


문제24. 위의 그래프에 legend도 출력하시오 (


import numpy as np
from matplotlib import pyplot as plt
chi = np.loadtxt('d:\\data\\창업건수.csv', skiprows=1 , unpack=True,delimiter=',')
pe = np.loadtxt('d:\\data\\창업건수.csv', skiprows=1 , unpack=True,delimiter=',')
unpack=True 세로로 읽겠다 
x = chi[0]
y = chi[4]
p = pe[4]
plt.figure()
plt.plot(x,y)
plt.plot(x,p)
plt.xlabel("YEAR")
plt.ylabel('JIP')
plt.title('chicken jip open per year')
plt.legend()
plt.show()

문제25. 책 44 페이지의 이미지 표시를 파이썬으로 구현하시오 ! 
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.image import imread
img = imread('d:\\data\\lena.png')
plt.imshow(img)
plt.show()

문제26. 고양이 사진을 출력하시오! 

import numpy as np
from matplotlib import pyplot as plt
from matplotlib.image import imread
img = imread('d:\\data\\고양.png')
plt.imshow(img)
plt.show()


  1. 파이썬은 익히기 쉬운 프로그래밍 언어이다
  2. 파이썬오픈 소스다
  3. 이책의 딥러닝 구현은 파이썬 3버전을 이용한다
  4. 외부 라이브러리로는 numpy와 matplotlib을 사용했따.
  5. 파이썬에서는 함수와 클래스 같은 ㅇ모듈로 구현을 정히 할 수 잇따.
  6. 넘파이느 ㄴ다차원 배열을 다루는 편리한 메서드를 많이 제공한ㄷ.


    넘파이를 이용했을때 vs 넘파이를 이용하지 않았을 대

■ 2장. 퍼셉트론 (Perceptron) 

     머신러닝의 한 부류인 딥러닝(이미지를 기계가 직접 인식해서 학습) 
                         ↓
     퍼센트론 ---> 신경망

1943년에 미국의 신경외과 의사인 워렌 맥컬록에 의해 발다닝 되었고

1957년에 프랑크 로젠 블라트가 퍼센트론 알고리즘을 고안했다

사람의 뇌의 동자긍ㄹ 전기 스위치의 on/off로 흉내 낼 수 있다는 이론을 
증명하였다.

간단히 말하면 인간의 신경세포 한를 흉대는 냈는데

고등하굑 생물시간에 배운  3가지 용어 ?

  1. 자극(stinulus)
  2. 반응(response)
  3. 역치(threshold)

 "특정 자극이 있다면 그 자극이 어느 역치 이상이여야만 세포가 반응한다."

예 : 짜게 먹는 사람은 자기가 평소에 먹는 만큼 음식이 짜지 않으면 싱겁다고 느낀다.
    ( 역치 이하의 자극은 무시) 
 
      싱겁게 먹는 사람이 짜게 먹기 시작해서 오랜 시간이 지나면 
      예전에 먹던 싱거운 음식에 만족하지 못한다( 역치가 올라감)

1969년 : 퍼센터론은 단순 선형분류기에 불과하다
          왜냐면? xor분류도 못한다고 단정을 지음 

          인공지능의 침체기 (인공지능의 빙하기)

1970년 중반 : 중요한 논문이 하나 발표 : 역전파 알고리즘  (다층 퍼센트론) 

     당시의 컴퓨터 연산으로는 이 이론을 구현하기가 어려웠음 


1986년 : 은닉층을 갖는 다층 퍼센트론 + 오류 역전파 학습 알고리즘 구현 되기 시작함 

          ↓
     오늘날


































 

































































 



 

'딥러닝' 카테고리의 다른 글

딥러닝 5장 .  (0) 2017.07.26
딥러닝 4장. 신경망 학습  (0) 2017.07.26
딥러닝 3장. 신경망  (0) 2017.07.26
딥러닝 2장. 퍼셉트론  (0) 2017.07.26