본문 바로가기

deeplearning

3장. 인공 신경망 ( 신경망의 활성화 함수, 3층 신경망 구현 )

728x90
반응형

인공 신경망 ( 신경망의 활성화 함수, 3 신경망 구현 )

 

퍼셉트론 -----------------------> 신경망

   

and    게이트

or      게이트

nand 게이트

xor    게이트

 

결과를 보려면 w 사람이 직접 ----> 신경망은 w 랜덤으로 지정해주기만 하면

정해줬어야 했는데                               컴퓨터가 알아서 w 알아낸다

 

 

활성화 함수(p.66)

 

"입력신호 출력신호로 변환하여

신호를 보낼 보낼지 결정하는 함수"

 

"신호를 강하게 보낼지 약하게 보낼지를 결정하는 함수"

 

k = x0*w0  +  x1*w1  +  x2*w2

 

 

 

 

활성화 함수의 종류 3가지

(x 입력값, y 출력값)

 

1. step 함수(계단함수)

-숫자 0 1 출력(리턴)하는 함수

 -0 신호 안흐름/ 1 신호 흐름

-0 1사이의 숫자들은 파악할 없다.

-예를들어 부자와 가난한 자는 파악할 있으나

   중간계층을 파악할수 없다.

 

 

2. sigmoid 함수

  •  0 1 사이의 실수를 출력(리턴)하는 함수

-예를들어 0.84 , 0.23 숫자처럼 1 가까운 숫자일 수록

-강한 신호라는 것을 파악할 있다.

-부자,거지, 중간층도 파악 가능하다.

 

 

3. Relu 함수

-입력이 0 넘으면 입력을 그대로 출력하고(1이상도 출력함),

0 이하면 0 출력(리턴)하는 함수다.

우리가 흔히 사용하는 함수다. 음수 값이 없다.

 

Relu함수가 학습이 가장 잘된다. 확실할 수록 신호를 보내니까

학습이 빨리 된다.

 

 

 

시그모이드 함수의 유래

"통계학에서는 성공확률이 실패확률보다 얼마나 클지를 나타내는

오즈비() 이라는 값이 있다"  오즈비(): how? success >  failure

 

오즈는 성공할 확률이 실패할 확률의 몇 배인지를 나타낸다.

오즈는 음이 아닌 실수이고

  성공할 가능성이 실패할 가능성보다 많을 때는 1.0보다 큰 값을 갖는다.

 

오즈가 4.0이면 성공확률이 실패확률의 4배 이고,

 반대로 오즈가 1/4이면 실패확률이 성공확률의 4배가 되어,

  4번의 실패마다 한번의 성공을 기대할 수 있다는 의미이다.

 

 

Odds = 성공/실패 = P / 1-P

그래프는 P 값이 1 가까우면 오즈값이 급격히 커져버리는 현상 일어나

P / 1-P 로그를 취한게

로짓함수이다  log ( P / 1-P )

                                 

1 가까울 급격하게 증가하던 현상이 감소했다.

0.5 기준으로 0 가까우면 , 1 가까우면 고양이를 뜻한다.

 

log ( P / 1-P ) = w*x  +  b

 

상용로그 : log 10

자연로그 : log e ---> ln

 

 

오즈비율 함수 ----> 로짓 함수 ----> 시그모이드 함수

                                                             

실패할 확률대비        오즈비 함수에               로짓함수를 신경망에서

성공할 확률을           로그를 사용한 함수         P(확률)값을 계산하기 편하도록

구하는 함수                                                 지수형태로 바꾼 함수

         P                                            P                                                               1

 ------------                              log  (-------)                                     h(x) =  -----------------

     1  -  P                                     1 - P                                                      1 + exp(-x)

                                                                                                                         

                                                                                                                   자연상수 e

 

 

문제44. 파이썬으로 계단함수 만드시오!

"숫자0 1 리턴하는 함수"

x<=0       ------------>  0 출력

x>0       -------------->  1 출력

 

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

 

import numpy as np

 

Def step_function(x):

Return np.where(x>0,1,0)

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

print(step_function(x_data))

 

[0 0 1]

 

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

이수답:

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

 

def step_function(x_data):

 

    import numpy as np

    y = x_data>0

    y_data = y.astype(np.int)  #[0 0 1]---> false:0,  true:1

    y_data1=y

    return y_data, y_data1

 

print(step_function(x_data))

 

 

 

문제45. 계단함수 파이썬으로 시각화 하시오

 

import matplotlib.pylab as plt

import numpy as np

 

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

x=np.arange(-5, 5, 0.1)

 

print(x)

 

def step_function(x_data):

 

    y = x_data>0

    y_data = y.astype(np.int)  #[0 0 1]---> false:0, true:1

   

    return y_data

 

#print(step_function(x_data))

y=step_function(x)

plt.plot(x,y)

plt.ylim(-0.1 , 1.1)   #범위수동지정 xlim, ylim: x y축의 최소,최대값을 정해줌

plt.show()

 

 

 

문제46. 시그모이드 함수 파이썬으로 구현하시오

          

                                               1

*시그모이드 함수식:  h(x) = ----------------------

                                        1 + exp(-x)

                                               

                                              e(자연상수)

 

import matplotlib.pylab as plt

import numpy as np

 

x_data = np.array([1.0,  2.0])

#x=np

 

def sigmoid(x_data):

   

    return 1 / (1 + np.exp(-x))  

    

print(sigmoid(x_data))

 

결과:

[ 0.73105858  0.88079708]

 

 

 

 

 

문제47. 시그모이드 함수의 그래프를 그리시오

 

import matplotlib.pylab as plt

import numpy as np

 

x_data = np.array([1.0,  2.0])

x=np.arange(-5, 5, 0.1)

 

def sigmoid(x_data):

   

    return 1 / (1 + np.exp(-x))   #exp:  np에서 로그화시키는 함수

    

print(sigmoid(x_data))

 

 

y=sigmoid(x)

plt.plot(x,y)

plt.ylim(-0.1 , 1.1)  #범위수동지정 xlim, ylim: x y축의 최소,최대값을 정해줌

plt.show()

 

 

 

Relu 함수 ( Rectified Linear Unit)

    "정류된"

relu 입력이 0 넘으면 입력을 그대로 출력하고

0 이하면 0 출력하는 함수

 

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

 

 

문제48. relu 함수 생성하시오

 

결과:

print(relu (-2) )    #0

print(relu (0.3) )  #0.3

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

def relu(x_data):

   

    if x_data>0:

        return x_data

    else:

        return 0

    

print(relu(0.3))

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

넘파이값 반환하는거

def relu(x):

    return np.where(x>0,x,0)

================

다른방법: ( 77p)

def relu(x_data):   

    return np.maximum(0,x)  #0 x값 중에 큰 값을 출력해라

print(relu(x_data))

 

 

 

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

relu 함수의 그래프로 그리시오

 

import matplotlib.pylab as plt

import numpy as np

 

x=np.arange(-5, 5, 0.1)

 

x_data=np.array([-2 , 0.3])

 

def relu(x):

    return np.where(x>0,x,0)

    

print(relu(x_data))

 

y=relu(x)

plt.plot(x,y)

plt.ylim(-0.5 , 5.5)  #범위수동지정 xlim, ylim: x y축의 최소,최대값을 정해줌

# relu 함수 특징상 y 리미트 해제시켜야함

plt.show()

       

 

 

 

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

다른방법:

 

import matplotlib.pylab as plt

import numpy as np

 

x=np.arange(-5, 5, 0.1)

 

x_data=np.array([-2 , 0.3])

 

def relu(x_data):

    t = np.where(x_data>0, x_data, 0)     # np.where 한번에

     # x_data>0 x_data 출력, else 0

    return t

    

print(relu(x_data))

 

y=relu(x)

plt.plot(x,y)

plt.ylim(-0.5 , 5.5)  #범위수동지정 xlim, ylim: x y축의 최소,최대값을 정해줌

plt.show()

 

 

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

다른방법: ( 77p)

def relu(x_data):   

    return np.maximum(0,x)  #0 x값 중에 큰 값을 출력해라

print(relu(x_data))

 

[ 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.

  0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.

  0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.

  0.   0.   0.   0.   0.   0.   0.1  0.2  0.3  0.4  0.5  0.6  0.7  0.8  0.9

  1.   1.1  1.2  1.3  1.4  1.5  1.6  1.7  1.8  1.9  2.   2.1  2.2  2.3  2.4

  2.5  2.6  2.7  2.8  2.9  3.   3.1  3.2  3.3  3.4  3.5  3.6  3.7  3.8  3.9

  4.   4.1  4.2  4.3  4.4  4.5  4.6  4.7  4.8  4.9]

 

 

 

 

다차원 배열의 계산 (p.77)

넘파이로 행렬을 만들고 차원 (ndim) 확인과

(shape)인지 확인하는 방법

 

: 아래의 3 2열의 행렬을 만드시오

 

1  2

3  4

5  6

 

import numpy as np

b= np.array([[1,2],[3,4],[5,6]])

print(b)

print(np.ndim(b))  #차원   : 2

print(b.shape)  # 행 몇 열: 32 (*반환값 ( ) 튜플 주의)

 

 

 

 

■행렬의 내적

(행렬곱)*그냥 곱이랑 다름, 열*행 의 곱

 

 

1*1 = 11열의 첫번째

1*2 = 11열의 두번째

:

:

2*2 = 22열의 두번째

 

 

문제50. 그림같이 개의 행렬의 내적을 numpy 구현하시오

 

import numpy as np

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

b = np.array([[5,6],[7,8]])

print(np.dot(a,b))

[[19 22]

 [43 50]]

 

 

print(np.array(a*b))

[[ 5 12]

 [21 32]]

 

 

또는

np.matrix 구현할 있다. (내적행렬을 위한 함수 matrix)

 

import numpy as np

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

print(a.shape)

b = np.matrix([[5,6],[7,8]])

print(a*b)

 

 

※ array matrix 차이는

1. array 다차원을 나타낼 있는데 matrix 2차원 밖에 안된다.

 

2. array matrix 포함하고 있기 때문에 matrix array 쓰는 모든 함수는

   사용할 있다.

   =  matrix array 종류 이므로 array 속성을 받을 있다.

 

3. matrix array 달리 dot 사용하지 않고 곱하기 연산자로

   내적을 있다.

 

 

 

문제51.

아래의 2차원 행렬을 만드시오

 

import numpy as np

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

 

print(np.ndim(b))  #차원

 

 

문제52.

3차원 행렬을 만들어 보시오

 

import numpy as np

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

print( a.ndim)

 

2차원 행렬 2개가 앞뒤로 놓인 거다. 그래서 3차원.

 

1차원:  a=np.array([1,2])

2차원:  a=np.array([[1,2]])

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

 

 

 

문제53.

4차원 행렬을 만들어 보시오

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

print(a)

print( a.ndim)

 

[[[[1 2]

   [3 4]]

 

  [[1 2]

   [3 4]]]

 

 

 [[[1 2]

   [3 4]]

 

  [[1 2]

   [3 4]]]]

 

4

 

 

 

문제54. 아래의 3차원 행렬에서 숫자 5 출력하시오

설명

2차원의 요소 검색  -->  a[n][n]

3차원의 요소 검색 -->  a[n][n][n]

 

a = np.array(  [[[1,2], [3,4]], [[5,6], [7,8]]])

print(a[1][0][0])

print( a.ndim)

 

3차원이 2차원 2개니까,

뒤에꺼 2차원 a[1] = ( [ [5,6],[7,8] ] )에서

1행렬=a[0]에서 [0]번째인 5 출력

 

 

문제55. 아래의 4차원 행렬에서 숫자 5 출력하시오

 

a = np.array( [ [ [[1,2], [3,4]], [[5,6], [7,8]] ] , [ [[9,10],[11,12]],[[13,14],[15,16]] ]])

print(a)

print(a[0][1][0][0])

print( a.ndim)

 

[[[[ 1  2]

   [ 3  4]]

 

  [[ 5  6]

   [ 7  8]]]

 

 

 [[[ 9 10]

   [11 12]]

 

  [[13 14]

   [15 16]]]]

5

4

 

 

 

문제56. 아래의 행렬의 내적을 파이썬으로 구현하시오

                  

1 2 3          5 6

            7 8       =  ?

4 5 6         9  10

 

<--내적연산 기호는 앞으로 이렇게 쓰겠다.

 

import numpy as np

a = np.matrix([[1,2,3],[4,5,6]])

#print(a.shape)

b = np.matrix([[5,6],[7,8],[9,10]])

print(a*b)

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

또는 다른

import numpy as np

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

#print(a.shape)

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

print(np.dot(a,b))

 

[[ 46  52]

 [109 124]]

 

 

 

신경망의 내적 (p82)

 

 

 

문제57. 위의 신경망과 연관된 아래의 방정식에서 x1 = 1, x2 = 2 이면

y1 y2 값은 무엇인가?

파이썬의 numpy y1, y2, y3 출력하시오 !

 

x1*1 + x2*2 = y1

x1*3 + x2*4 = y2

x1*5 + x2*6 = y3

              

(x1  x2) ( 1  3  5 )  =  ( y1  y2  y3 )

                2  4  6               

 

import numpy as np

a=np.array([[1,3,5],[2,4,6]])     #shape(2,3)

 

x=np.array([[1,2]])    #shape(2,1)

 

print(np.dot(x,a))     #a,x 순서로 출력하면 dim 에러나온다.

# 행렬의 내적이 [앞의 열* 뒤의 행] 연산이다.

그래서 앞의 행과 뒤의 열이 일치해야 내적연산이 가능하다.

 

[[ 5 11 17]]

 

 

 

 

문제58. 아래의 단층 신경망의 출력값 y값들을 출력하시오

 

import numpy as np

a=np.array([[8,21,1],[4,5,9],[6,34,4],[12,2,5]]) 

 

x=np.array([[4,5,7,2]])

 

print(np.dot(x,a))

 

[[118 351  87]]

 

T 시켜서 풀어보시오

import numpy as np

a=np.array([[8,21,1],[4,5,9],[6,34,4],[12,2,5]])  

x=np.array([[4,5,7,2]]) 

a=a.T

print(np.sum(x*a, axis=1))

 

 

 

 

문제59.

문제 57 신경망에 가중의 합인 y값을 시그모이드 함수에 통과시켜서 나온

y_hat 출력하시오

 

import numpy as np

 

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

b = np.array([[1,3,5],[2,4,6]])

y = np.dot(a,b)   #5,11,17

 

def sigmoid(x):

   

    return 1 / (1 + np.exp(-x))           #exp:  np에서 로그화시키는 함수

    

y_hat= sigmoid(y)

print(y_hat)

 

[[ 0.99330715  0.9999833   0.99999996]]

 

 

 

 

 

 

문제60.

아래의 3 신경망을 구현하고 J1 J2 출력하시오

import numpy as np

 

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

b = np.array([[1,3,5],[2,4,6]])

y = np.dot(a,b)

 

def sigmoid(x):   

    return 1 / (1 + np.exp(-x))   #exp:  np에서 로그화시키는 함수

    

y_hat= sigmoid(y)

 

 

c=y_hat

d=np.array([[3,4],[5,6],[7,8]])

k=np.dot(c,d)

 

k_hat=sigmoid(k)

 

 

e = k_hat

f = np.array([[4,5],[6,7]])

j = np.dot(e,f)

 

print(j)

 

[[  9.99999866  11.99999833]]

 

 

 

 

출력층 함수 (p.90)

"출력층의 함수는 동안 흘러왔던 확률들의 숫자를 취합해서

결론을 내줘야하는 함수 ! "

 

신경망으로 구현하고자 하는 문제

1. 회귀 라면?   항등함수

: 독립변수(콘크리트 재료 : 자갈 200kg, 시멘트 20포대...)

    종속변수(콘크리트 강도)

 

2. 분류 라면?   소프트맥스 함수

: 정상 폐사진  VS  폐결절 사진

 

 

문제61.

입력값을 받아 그대로 출력하는 항등함수를 identify_function 이라는 이름으로

생성하시오 !

 

import numpy as np

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

 

def identify_function(x):

    return x

print(identify_function(a))

 

[[1 2]]   #[1 2] 출력하고 싶으면 x[0]

 

 

 

문제62.

문제61번에서 만든 3 신경망의 3 출력층에 항등함수를 달아서

J1_hat J2_hat 구하는 코드로 완성 시키시오

 

import numpy as np

def sigmoid(x):

    return 1/(1+np.exp(-x))

 

def identify_func(x):

    return x

 

# 0 (입력 층)

x=np.array([[1,2]])

 

# 1 (은닉 1)

y=np.array([[1,3,5],[2,4,6]])   #1층의 가중치(w1)

y_hat=sigmoid(np.dot(x,y))

 

# 2 (은닉 2)

k=np.array([[3,4],[5,6],[7,8]])  #2층의 가중치(w2)

k_hat=sigmoid(np.dot(y_hat,k))

 

# 3 (출력 )

j=np.array([[4,5],[6,7]])         #3층의 가중치(w3)

j_hat=np.dot(k_hat,j)

 

print(identify_func(j_hat))

 

 

 

 

문제63.

위의 3 신경망에 활성화 함수를 relu 함수로 변경하시오

 

import numpy as np

 

def relu(x):

    return np.where(x>0,x,0)

   

 

def identify_func(x):

    return x

 

# 0 (입력 층)

x=np.array([[1,2]])

 

# 1 (은닉 1)

y=np.array([[1,3,5],[2,4,6]])   #1층의 가중치

y_hat=relu(np.dot(x,y))

 

# 2 (은닉 2)

k=np.array([[3,4],[5,6],[7,8]]) #2층의 가중치

k_hat=relu(np.dot(y_hat,k))

 

# 출력

j=np.array([[4,5],[6,7]])   #3층의 가중치

j_hat=np.dot(k_hat,j)

print(identify_func(j_hat))

 

 

 

 

문제63.

위의 3 신경망에 활성화 함수를 relu 함수로 변경하시오

 

import numpy as np

 

def relu(x):

    return np.where(x>0,x,0)

   

 

def identify_func(x):

    return x

 

# 0 (입력 층)

x=np.array([[1,2]])

 

# 1 (은닉 1)

y=np.array([[1,3,5],[2,4,6]])   #1층의 가중치

y_hat=relu(np.dot(x,y))

 

# 2 (은닉 2)

k=np.array([[3,4],[5,6],[7,8]]) #2층의 가중치

k_hat=relu(np.dot(y_hat,k))

 

# 출력

j=np.array([[4,5],[6,7]])   #3층의 가중치

j_hat=np.dot(k_hat,j)

print(identify_func(j_hat))

 

 

[[2088 2499]]

 

----------만약, np.where 함수 안쓰면 for 돌려서 값하나씩 대입시켜줘야 하는데

  relu(np.dot(_,_) 할때 ,for 돌려서 계산시켜야 한다.

 

 

 

 

3 신경망

 

 

 

화면 캡처: 2019-01-11 오후 1:53

 

 

*3 신경망의 가중치인 w1, w2, w3 하나로 모아서 심플하게 코드를 작성하려면?

"딕셔너리를 활용하면 된다"

 

 

:

import numpy as np

 

network = {}

 

network['w1'] = np.array([[1,3,5],[2,4,6]])

network['w2'] = np.array([[3,4],[5,6],[7,8]])

network['w3'] = np.array([[4,5],[6,7]])

 

print(network.keys())

print(network.values())

 

dict_keys(['w1', 'w2', 'w3'])

 

dict_values([array([[1, 3, 5],

       [2, 4, 6]]), array([[3, 4],

       [5, 6],

       [7, 8]]), array([[4, 5],

       [6, 7]])])

 

-------------for 돌리면

import numpy as np

 

network = {}

 

network['w1'] = np.array([[1,3,5],[2,4,6]])

network['w2'] = np.array([[3,4],[5,6],[7,8]])

network['w3'] = np.array([[4,5],[6,7]])

 

 

for i in network.keys():

    print (i)

 

 

for i in network.values():

    print (i)

 

w1

w2

w3

[[1 3 5]

 [2 4 6]]

[[3 4]

 [5 6]

 [7 8]]

[[4 5]

 [6 7]]

 

 

 

문제72.

위의 코드를 함수로 만들어서 아래와 같이 실행될 있게 하시오

 

def init_network():

    import numpy as np

 

    network = {}

   

    network['w1'] = np.array([[1,3,5],[2,4,6]])

    network['w2'] = np.array([[3,4],[5,6],[7,8]])

    network['w3'] = np.array([[4,5],[6,7]])

   

    return network

 

network = init_network()   #함수를 변수에 담아서 있습니다

 

print(network['w1'])

   

[[1 3 5]

 [2 4 6]]

 

 

 

함수를 변수에 담아 사용하기

 

def other_method(a):

    print(a)

   

val = other_method  #함수를 val 라는 변수에 담는다

 

other_method(123)

 

val(123)

 

 

 

문제73.

위에서 만든 init_network() 함수안에 w1,w2,w3 값을

변수 w1,w2,w3 담으시오 !

 

def init_network():

    import numpy as np

 

    network = {}

   

    network['w1'] = np.array([[1,3,5],[2,4,6]])

    network['w2'] = np.array([[3,4],[5,6],[7,8]])

    network['w3'] = np.array([[4,5],[6,7]])

   

    return network

 

network = init_network()w1, w2, w3 = network['w1'], network['w2'], network['w3']

print(w1, w2, w3)

 

 

 

 

문제74.

위의 문제73번의 코드를 가지고 어제 만든 3차신경망 코드를 다시 작성하시오

(sigmoid 함수)

 

import numpy as np

def sigmoid(x):

    return 1 / (1 + np.exp(-x))   #exp:  np에서 로그화시키는 함수

 

def identify_func(x):

    return x

 

 

def init_network():

    import numpy as np

 

    network = {}

   

    network['w1'] = np.array([[1,3,5],[2,4,6]])

    network['w2'] = np.array([[3,4],[5,6],[7,8]])

    network['w3'] = np.array([[4,5],[6,7]])

   

    return network

 

network = init_network()

w1, w2, w3 = network['w1'], network['w2'], network['w3']

 

 

# 0 (입력 층)

x=np.array([[1,2]])

 

# 1 (은닉 1)

#y=np.array([[1,3,5],[2,4,6]])   #1층의 가중치

a1=sigmoid(np.dot(x,w1))   #예전 y값을 딕셔너리에서 w값을 가져온다.

 

# 2 (은닉 2)

#k=np.array([[3,4],[5,6],[7,8]]) #2층의 가중치

a2=sigmoid(np.dot(a1,w2))

 

# 출력

#j=np.array([[4,5],[6,7]])   #3층의 가중치

a3=np.dot(a2,w3)

print(identify_func(a3))

 

 

 

신경망 안에 들어가는 함수들

 

1. 가중치(w) 만드는 함수        : init_network()

2. 순전파 시키는 함수    : forward()

-> 입력*가중치 순전히 흘러가게 해주는 함수(0->1->2->3)

3. 역전파 시키는 함수              : backward()

4. 활성화 함수들(확률정해줌)     : step, sigmoid, relu function

5. 출력층 함수들(답내려줌)       : identify_function() -회귀분석 목적

softmax()              -분류를 목적

6. 오차 함수들                       : 평균오차함수(회귀분석),

교차엔트로피 함수(분류문제)

 

 

 

 

문제75.

입력층, 은닉1, 은닉2, 출력층 코드를 가지고

forward 라는 함수를 생성하시오

 

 

import numpy as np

 

def relu(x):

    return np.where(x>0,x,0)

 

 

def sigmoid(x):

    return 1 / (1 + np.exp(-x))   #exp:  np에서 로그화시키는 함수

 

 

def identify_func(x):   #항등함수

    return x

 

 

def init_network():  #가중치 생성 함수

    import numpy as np

 

    network = {}

   

    network['w1'] = np.array([[1,3,5],[2,4,6]])

    network['w2'] = np.array([[3,4],[5,6],[7,8]])

    network['w3'] = np.array([[4,5],[6,7]])

   

    return network

 

 

def forward(network,x):   #순전파 함수

    w1, w2, w3 = network['w1'], network['w2'], network['w3']

   

    # 1 (은닉 1)

    a1=sigmoid(np.dot(x,w1))

   

    # 2 (은닉 2)

    a2=sigmoid(np.dot(a1,w2))

   

    # 출력

    a3=np.dot(a2,w3)

   

    return identify_func(a3)

 

 

network = init_network()   # 가중치 생성

x=np.array([[1,2]])   # 0 (입력 층),  #입력값

print( forward( network, x) )   #순전파

 

 

 

문제76.

입력값이 1,2 아니라 4,5 일때의 위의 3 신경망을 통과한 결과를 아래와 같이

출력되게 하시오

 

import layers_3 as lay

import numpy as np  # 입력층에서 np 쓰니까

 

network = lay.init_network()   # 가중치 생성

x=np.array([[4,5]])   # 0 (입력 층),  #입력값

print( lay.forward( network, x) )   #순전파

==================================

from 으로 불러오면 코드처럼 일일이 lay 안붙여도 된다 !!!!

 

from layers_3 import *

import numpy as np

 

network = init_network()   # 가중치 생성

x=np.array([[4,5]])   # 0 (입력 층),  #입력값

print( forward( network, x) )   #순전파

 

 

 

 

출력층 함수: 소프트맥스함수(p91)

 

"분류를 위한 출력층 수인데 0~1 사이의 숫자를 출력하는 함수"

 

"순전파로 흘러왔던 확률(숫자)  가지고 결론을 내주는 함수"

 

결론이 뭐냐면? 개와 고양이 분류라면 개인지 고양이인지 결론을 내준다.

 

정상폐, 폐결정,  폐결핵 3 어떤 사진인지 결론을 내야한다면

  3 가지로 결론을 내려주는 함수

 

 

소프트맥스 공식

 

 

import numpy as np

 

print( np.exp(0.4)/( np.exp(0.4) + np.exp(0.9) ) )

 

print( np.exp(0.9)/( np.exp(0.4) + np.exp(0.9) ) )

 

print( 0.3775 + 0.6224 )

 

0.377540668798

0.622459331202

0.9999

 

공식을 파이썬으로 구현해보니, 작은값은 출력가능하다.

 

소프트맥스 함수 수학식을 컴퓨터코드로 구현할 주의사항?

 

소프트맥스 함수는 지수 함수를 사용하는데 지수함수라는 것이

 쉽게 아주 값을 내뱉는다.

 

e ( 스위스의 수학자 오일러가 발견한 무리수 )  10승은

 20,000 넘고 e 100승은 숫자가 40개가 넘고

  e 1000승은 무한대를 뜻하는 inf 출력되어 돌아오므로

컴퓨터로 계산을 수가 없다.

 

import numpy as np

 

print( np.exp(1) )

print( np.exp(1000) )

 

결과:

2.71828182846

inf

__main__:4: RuntimeWarning: overflow encountered in exp

 

 

 

문제77.

아래의 리스트를 무리수(자연상수) 제곱으로 해서

계산한 값이 무엇인가?

 

import numpy as np

 

a = np.array([1010,1000,990])

print(np.exp(a))

 

[ inf  inf  inf]

 

이렇게 숫자가 크면 inf 떠서

뭐가 개고 뭐가 고양이인지 수가 없다.

 

 

문제78.

a = np.array([1010,1000,990])

a 리스트에서 요소값을 가장 요소의 값으로 결과를 출력하시오

힌트 : np.max( )

 

import numpy as np

 

a = np.array([1010,1000,990])

c = np.max(a)

print( (a-c) )

[  0 -10 -20]

 

이제 exp 처리 해보면

print(np.exp(a-c))

[  1.00000000e+00   4.53999298e-05   2.06115362e-09]

 

 

 

문제79. 위의 [  0 -10 -20] 자연상수 e 제곱으로 해서

출력된 결과가 무엇인지 확인하시오

 

import numpy as np

 

a = np.array([1010,1000,990])

 

c = np.max(a)

 

print( np.exp(a-c) )

 

[  1.00000000e+00   4.53999298e-05   2.06115362e-09]

 

 

 

문제80.

위의 코드를 softmax 라는 함수 이름으로 만드시오

(분자식 만드는 공식)

 

import numpy as np

 

a = np.array([1010,1000,990])

 

def softmax(a):

   

    c = np.max(a)

 

    return np.exp(a-c)

 

print(softmax(a))

   

 

출력값의 최대값으로 C값을 주고

그걸 빼줌으로서 softmax 계속 커지는 성질을 죽여준다.

 

 

문제81.

문제80번의 분자구하는 공식에다 분모구하는 공식까지 더해서

softmax 함수를 완성 시키시오

 

 

 

import numpy as np

 

a = np.array([1010,1000,990])

 

def softmax(a):

   

    c = np.max(a)

 

    return np.exp(a-c) / np.sum( np.exp(a - c) )

 

print(softmax(a))

   

[  9.99954600e-01   4.53978686e-05   2.06106005e-09]

 

 

 

문제82.(오늘의 마지막 문제)

위의 출력된 결과의 합이 1인지 확인하시오 !

[오전에 알고리즘 문제랑 같이 글게재]

 

import numpy as np

 

a = np.array([1010,1000,990])

 

def softmax(a):

   

    c = np.max(a)

 

    return np.exp(a-c) / np.sum( np.exp(a - c) )

 

print(np.sum( softmax(a)) )

   

 

1.0

 

 

 

 

출력층 softmax 함수 재정리

 

출력층 함수 2가지?

1. 항등함수

2. 소프트맥스 함수

역할: 0~1사이의 값을 나타내서 가장 확률이 높은것이 무엇인지

결론을 내려주는 역할

 

정상폐   1.2                                                      0.46

폐결절   0.9               ===>소프트맥스===>         0.34

폐결핵   0.4                                                      0.20

                                                              * 더하면 1

"정상폐를 보고 정상폐 확률이 가장 높다라고 결론을 내려줬다."

 

 

 

문제91. 문제75번까지 해서 만들었던 3 신경망(항등함수로 구현된)

출력층 함수를 소프트맥스 함수로 변경하시오

 

layers_3 패키지 불러와서

softmax 함수 집어넣어서 바꿔주기

↓↓↓↓↓↓↓↓↓↓↓

 

import numpy as np

 

def relu(x):

 

    return np.where(x>0,x,0)

 

 

def sigmoid(x):

    #import numpy as np

    return 1 / (1 + np.exp(-x))   #exp:  np에서 로그화시키는 함수

 

 

def softmax(x):

   

    c = np.max(x)

 

    return np.exp(x-c) / np.sum( np.exp(x - c) )

 

#def identify_func(x):

  #  return x

 

 

def init_network():

    #import numpy as np

 

    network = {}

   

    network['w1'] = np.array([[1,3,5],[2,4,6]])

    network['w2'] = np.array([[3,4],[5,6],[7,8]])

    network['w3'] = np.array([[4,5],[6,7]])

   

    return network

 

 

def forward(network,x):

    #import numpy as np

    w1, w2, w3 = network['w1'], network['w2'], network['w3']

   

    # 1 (은닉 1)

    a1=sigmoid(np.dot(x,w1))

   

    # 2 (은닉 2)

    a2=sigmoid(np.dot(a1,w2))

   

    # 출력

    a3=np.dot(a2,w3)

   

    return softmax(a3)

 

 

network = init_network()   # 가중치 생성

x=np.array([[4,5]])   # 0 (입력 층),  #입력값

#print( forward( network, x) )   #순전파

 

============================

from layers_3 import *

import numpy as np

 

network = init_network()   # 가중치 생성

x=np.array([[1,2]])   # 0 (입력 층),  #입력값

print( forward( network, x) )   #순전파

 

 

mnist 구현

 

※ p.95

신경망      학습 --------->소프트맥스 함수를 사용한다

(추론)테스트-----------> 소프트맥스 함수를 사용하지 않는다

*자원낭비를 줄이려고

 

출력층의 뉴런 구하기

                                                            출력층의 뉴런 ?

1. 분류하고자 하는 사진- , 고양이 분류 ----------->   2

2. 분류하고자 하는 사진- 정상폐, 폐결절, 폐결핵-->   3

3. mnist 데이터(필기체 숫자 0~9 까지의 사진)----->  10

 

mnist(손글씨 필기체) 데이터를 파이썬으로 로드하는 방법

 

1. 소스코드와 데이터를 다운로드 받는다.(dataset.zip)

 

2. dataset 이라는 폴더를 working 디렉토리에 가져다 둔다

(실행하는 소스가 있는 디렉토리)

 

3. 아래의 파이썬 코드를 실행해서 필기체 데이터 하나를 시각화 한다

 

↓↓↓↓↓↓↓

 

# coding: utf-8

 

import sys, os

 

sys.path.append(os.pardir)  # 부모디렉토리의 파일을 가져올수

                            # 있도록 설정

 

import numpy as np

from dataset.mnist import load_mnist  

 

#dataset load_mnist 갖고오시오

#mnist 데이터셋을 내려받아 이미지를 넘파이 배열로 변환해주는

#파이썬 스크립트를 제공합니다

 

from PIL import Image

 

 

def img_show(img): # 이미지를 출력하는 함수

    pil_img = Image.fromarray(np.uint8(img))

    # 파이썬 이미지 객체로 변환

 

    pil_img.show()  # pil_img 객체의 show 라는 메소드를 실행

 

(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)

#훈련데이터  ,    테스트 데이터

# x_train = 60000

# t_train = label

# x_test = 10000

# t_test = label

# flatten = True 일렬로 늘어놓겠다

#그래서 일렬로 계속 숫자를 늘여놓게 된다( 1 차원 )

 

img = x_train[0]        # 0~59999 숫자 바꿀 있다

label = t_train[0]      # 0~59999 숫자 바꿀 있다

print(label)  # 5

 

print(img.shape)  # (784,)

img = img.reshape(28, 28)

 

img_show(img)

 

===========================

print(x_train.shape)   #60000

print(t_train.shape)

print(x_test.shape)

print(t_test.shape)

(60000, 784)

(60000,)

(10000, 784)

(10000,)

 

색이 진하면 숫자가 높고

색이 옅으면 0 가까워 진다

 

출력층은 필기체수 10개고

입력층은 픽셀수 784개다.

 

 

 

 

문제92.

아래의 코드의 dataset 패키지의 mnist.py load_mnist 라는 함수가 있는지

확인하시오

 

*파이참에서는 ctrl 키를 누르고 아래의 코드중에 load_mnist

마우스를 가져다대면 바로 있다*

 

# coding: utf-8

 

import sys, os

 

sys.path.append(os.pardir)  # 부모디렉토리의 파일을 가져올수

                            # 있도록 설정

 

import numpy as np

from dataset.mnist import load_mnist  

 

#dataset load_mnist 갖고오시오

#mnist 데이터셋을 내려받아 이미지를 넘파이 배열로 변환해주는

#파이썬 스크립트를 제공합니다

 

from PIL import Image

 

 

def img_show(img): # 이미지를 출력하는 함수

    pil_img = Image.fromarray(np.uint8(img))

    # 파이썬 이미지 객체로 변환

    pil_img.show()  # pil_img 객체의 show 라는 메소드를 실행

 

(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)

#훈련데이터  ,    테스트 데이터

# x_train = 60000

# t_train = label

# x_test = 10000

# t_test = label

# flatten = True 일렬로 늘어놓겠다. 1차원 나오고 값은 784

 

img = x_train[0]        # 1 숫자 바꾸면 0 나온다.

label = t_train[0]      # 1 숫자 바꾸면 0 나온다.

print(label)  # 5

 

print(img.shape)  # (784,)

img = img.reshape(28, 28)

 

img_show(img)

 

 

 

문제93. x_train 프린트 해보시오

print(x_train.shape)   # 60000,784

 

print(x_train)

[[0 0 0 ..., 0 0 0]     -----> 784개의

 [0 0 0 ..., 0 0 0]           ↓ 60,000개의

 [0 0 0 ..., 0 0 0]

 ...,

 [0 0 0 ..., 0 0 0]

 [0 0 0 ..., 0 0 0]

 [0 0 0 ..., 0 0 0]]

 

 

 

문제94. x_train 데이터가 6만장이 맞는지 확인하시오

 

print(x_train.shape)   # 60000,784

print(len(x_train))      # 60000  (행의 갯수)

 

차원수는

print(x_train.ndim)   # 2차원

 

 

 

 

문제95. 아래의 리스트를 numpy array 리스트로 변경하시오 !

x = [[0.1,0.05,0.1,0.0,0.05,0.1,0.0,0.1,0.0,0.0],

 

     [0.1,0.05,0.2,0.0,0.05,0.1,0.0,0.6,0.0,0.0],

 

     [0.0,0.05,0.3,0.0,0.05,0.1,0.0,0.6,0.0,0.0],

 

     [0.0,0.05,0.4,0.0,0.05,0.0,0.0,0.5,0.0,0.0],

 

     [0.0,0.05,0.5,0.0,0.05,0.0,0.0,0.4,0.0,0.0],

 

     [0.0,0.05,0.6,0.0,0.05,0.0,0.0,0.3,0.0,0.0],

 

     [0.0,0.05,0.7,0.0,0.05,0.0,0.0,0.2,0.0,0.0],

 

     [0.0,0.1,0.8,0.0,0.1,0.0,0.0,0.2,0.0,0.0],

 

     [0.0,0.05,0.9,0.0,0.05,0.0,0.0,0.0,0.0,0.0]]

 

import numpy as np

print(np.array(x))

 

결과:

[[ 0.1   0.05  0.1   0.    0.05  0.1   0.    0.1   0.    0.  ]

 [ 0.1   0.05  0.2   0.    0.05  0.1   0.    0.6   0.    0.  ]

 [ 0.    0.05  0.3   0.    0.05  0.1   0.    0.6   0.    0.  ]

 [ 0.    0.05  0.4   0.    0.05  0.    0.    0.5   0.    0.  ]

 [ 0.    0.05  0.5   0.    0.05  0.    0.    0.4   0.    0.  ]

 [ 0.    0.05  0.6   0.    0.05  0.    0.    0.3   0.    0.  ]

 [ 0.    0.05  0.7   0.    0.05  0.    0.    0.2   0.    0.  ]

 [ 0.    0.1   0.8   0.    0.1   0.    0.    0.2   0.    0.  ]

 [ 0.    0.05  0.9   0.    0.05  0.    0.    0.    0.    0.  ]]

 

 

 

문제96. 위의 numpy array 변경한 리스트의 차원을 확인하시오

(그냥 리스트 x 일때는 차원값 구함)

x = [[0.1,0.05,0.1,0.0,0.05,0.1,0.0,0.1,0.0,0.0],

 

     [0.1,0.05,0.2,0.0,0.05,0.1,0.0,0.6,0.0,0.0],

 

     [0.0,0.05,0.3,0.0,0.05,0.1,0.0,0.6,0.0,0.0],

 

     [0.0,0.05,0.4,0.0,0.05,0.0,0.0,0.5,0.0,0.0],

 

     [0.0,0.05,0.5,0.0,0.05,0.0,0.0,0.4,0.0,0.0],

 

     [0.0,0.05,0.6,0.0,0.05,0.0,0.0,0.3,0.0,0.0],

 

     [0.0,0.05,0.7,0.0,0.05,0.0,0.0,0.2,0.0,0.0],

 

     [0.0,0.1,0.8,0.0,0.1,0.0,0.0,0.2,0.0,0.0],

 

     [0.0,0.05,0.9,0.0,0.05,0.0,0.0,0.0,0.0,0.0]]

 

 

import numpy as np

print(np.array(x).ndim)

2

 

 

 

 

문제97. 위의 리스트를 1차원으로 변경하시오

 

x = [[0.1,0.05,0.1,0.0,0.05,0.1,0.0,0.1,0.0,0.0],

 

     [0.1,0.05,0.2,0.0,0.05,0.1,0.0,0.6,0.0,0.0],

 

     [0.0,0.05,0.3,0.0,0.05,0.1,0.0,0.6,0.0,0.0],

 

     [0.0,0.05,0.4,0.0,0.05,0.0,0.0,0.5,0.0,0.0],

 

     [0.0,0.05,0.5,0.0,0.05,0.0,0.0,0.4,0.0,0.0],

 

     [0.0,0.05,0.6,0.0,0.05,0.0,0.0,0.3,0.0,0.0],

 

     [0.0,0.05,0.7,0.0,0.05,0.0,0.0,0.2,0.0,0.0],

 

     [0.0,0.1,0.8,0.0,0.1,0.0,0.0,0.2,0.0,0.0],

 

     [0.0,0.05,0.9,0.0,0.05,0.0,0.0,0.0,0.0,0.0]]

 

 

import numpy as np

 

a = np.array(x)

a2 = a.flatten()

print(a2.ndim)

 

 

 

문제98. mnist 데이터를 load_mnist 함수로 로드할 flatten false 해서

로드하고 훈련 데이터의 shape 확인해보시오

 

import sys, os

 

sys.path.append(os.pardir)  # 부모디렉토리의 파일을 가져올수

                            # 있도록 설정

 

import numpy as np

from dataset.mnist import load_mnist

from PIL import Image

 

 

def img_show(img): # 이미지를 출력하는 함수

    pil_img = Image.fromarray(np.uint8(img))

    # 파이썬 이미지 객체로 변환

    pil_img.show()  # pil_img 객체의 show 라는 메소드를 실행

 

(x_train, t_train), (x_test, t_test) = load_mnist(flatten=False, normalize=False)

 

print(x_train.shape)  

print(t_train.shape)  

print(x_test.shape)   

print(t_test.shape)   

 

(60000,             1,             28,             28)  # False 하니까 4차원으로 바뀌었다.

                                   

전체장수   흑백        가로       세로

 

컬러면? RGB 값으로 해서 1있는 자리에 3 출력됨

 

(60000,)

(10000, 1, 28, 28)

(10000,)

 

 

 

 

문제99. x_train[0] 숫자 5였는데 x_train[0] 라벨(정답)

t_train[0] 출력해서 숫자 5 맞는지 확인하시오 !

 

img = x_train[0]

label = t_train[0]

print(t_train[0])   <-여기만 바꿔줌

 

 

 

 

문제100.

t_train 데이터를 출력할 one_hot_encoding True 해서 출력하시오

 

img = x_train[0]

label = t_train[0]

print(t_train[0])

 

[ 0.  0.  0.  0.  0.  1.  0.  0.  0.  0.]

  0   1   2   3   4    5   6   7   8    9

 

5에서 True 1 나온걸 있다.

 

 

 

문제101.

mnist 데이터를 가져오는 코드를 가지고

아래의 get_data() 함수 생성하고 아래와 같이 실행되게 하시오

 

x , t = get_data()

 

print(x.shape)   # (10000 , 784)

print(t.shape)   # (10000, )

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

import sys, os

sys.path.append(os.pardir)  # 부모디렉토리의 파일을 가져올수

                            # 있도록 설정

import numpy as np

from dataset.mnist import load_mnist

from PIL import Image

 

def get_data():

    (x_train, t_train), (x_test, t_test) =\

     load_mnist(flatten=True, normalize=True, one_hot_label=False)

    

    return x_test, t_test

 

(x , t) = get_data()

 

print(x.shape)

print(t.shape)

 

 

 

필기체 데이터 60000장을 충분히 학습시키고 만들어 가중치값(저자가 미리 생성함)

init_network 함수로 가져오는 방법

 

import pickle

 

def init_network():

    with open("C:\\Users\itwill\sample_weight\sample_weight.pkl",'rb') as f:

        network = pickle.load(f)

       

    return network

 

network = init_network()

print(network['W1'].shape)

 

(784, 50)

 

 

*훈련 데이터의 행렬모습이 60000 * 784 임을 확인한다

print(x_train.shape)  # 60000, 784

 

 

*훈련 데이터 각각의 가중치값을 확인하시오

import pickle

 

def init_network():

    with open("C:\\Users\itwill\sample_weight\sample_weight.pkl",'rb') as f:

        network = pickle.load(f)

       

    return network

 

network = init_network()

print(network['W1'].shape)  #784*50

print(network['W2'].shape)  #50*100

print(network['W3'].shape)  #100*10  (출력층 10개와 맞추고 있다)

(784, 50)  #내적을 위해 열값이 일치하는것을 확인할 있다.

(50, 100)

(100, 10)

 

 

#바이어스 보면  (->바이어스는 x0*w0 했던거. 이게 합해져서 함수처리가는거)

#바이어스는 은닉층 노드의 갯수

print(network['b1'].shape)

print(network['b2'].shape)

print(network['b3'].shape)

(50,)

(100,)

(10,)

 

 

저자가 이미 최적화 해놓은 w1, w2, w3, b1, b2, b3 가지고 만든

     3 신경망 코드

 

 

import sys, os

 

sys.path.append(os.pardir)

 

import numpy as np

from dataset.mnist import load_mnist

from PIL import Image

import  pickle

import  numpy  as np

 

 

# 신경망 함수들

def sigmoid(num):

    rst = (1 / (1 + np.exp(-num)))

    return (rst)

 

 

def identity_function(x):

    return x

 

 

def softmax(a):

    c = np.max(a)

    minus = a - c

    exp_a = np.exp(minus)

    sum_exp_a = np.sum(exp_a)

    y = exp_a / sum_exp_a

    return y

 

def  init_network():

    with open("sample_weight.pkl",'rb')  as  f:

        network = pickle.load(f)

    return  network

 

 

def  predict(network, x):   #우리가 만들었던 forward 같음

    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

 

def  get_data():  #mnist 시키는 함수

    (x_train, t_train) , (x_test, t_test) = \

    load_mnist(normalize=True, flatten=True, one_hot_label=False)

    return  x_test, t_test  #1만장 행렬, 1만장의 라벨

#flatten 으로 28*28=784 일렬러 풀어해침

 

x, t = get_data()

network = init_network()  #피클가중치 불러와서 network 라고 선언

y = predict(network,x[0])  # 숫자 5

print(y)

 

 

결과:

[  8.44125680e-05   2.63506809e-06   7.15495204e-04   1.25862740e-03

   1.17279649e-06   4.49908512e-05   1.62693183e-08   9.97065008e-01

   9.37448840e-06   8.18311993e-04]

 

소프트맥스를 거쳐나온 값이기에 합하면 1.0 이다

여기서 가장 확률 높은값만 보려면 p.101 나온 np.argmax() 함수를 이용한다

 

y = predict(network,x[0])

y = np.argmax(y)

print(y)

결과:  7

 

라벨값도 보려면

print(t[0])

결과 : 7

->라벨값도 똑같이 7 나오는걸 확인할 있다.

 

 

 

 

문제102.(오늘의 마지막 문제)

그림판에서 만든 28*28 픽셀의 숫자를 flatten numpy 배열로 만드시오

 

 

#1. 흑백으로 변경

 

j = 'C:\\Users\\itwill\\number_paint.jpg'   #역슬래시 2개씩 안쓰면 에러뜸

import numpy as np

import matplotlib.pyplot as plt

import matplotlib.image as mpimg

 

def rgb2gray(rgb):

    return np.dot(rgb[...,:3], [0.299, 0.587, 0.114])

 

img = mpimg.imread(j)

gray = rgb2gray(img)

plt.imshow(gray, cmap = plt.get_cmap('gray'))

plt.show()

print(gray.shape)

 

 

#2. 입력값으로 쓰이기 위해 (784,) 로 변경해줌

 

a = np.array(gray)

x= a.flatten()

print(x.shape)

 

 

#3. 신경망에 넣어줌

 

import sys, os

 

sys.path.append(os.pardir)

 

import numpy as np

from dataset.mnist import load_mnist

from PIL import Image

import  pickle

import  numpy  as np

 

 

# 신경망 함수들

def sigmoid(num):

    rst = (1 / (1 + np.exp(-num)))

    return (rst)

 

 

def identity_function(x):

    return x

 

 

def softmax(a):

    c = np.max(a)

    minus = a - c

    exp_a = np.exp(minus)

    sum_exp_a = np.sum(exp_a)

    y = exp_a / sum_exp_a

    return y

 

def init_network():

    with open("C:\\Users\itwill\sample_weight\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

 

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

 

#x, t = get_data()  #우리가 손으로 그린 그림 넣어야 되니까

# get_data 함수도 . mnist 안쓰고

#우리가 만든 그림으로 학습시키니까.

 

network = init_network()

y = predict(network,x)

y = np.argmax(y)

print(y)

 

#print(t[0])

 

 

 

 

다시 짚어보기:

3.   3 신경망 구현하는 방법

-활성화 함수

1. sigmoid 함수

2. relu 함수

3. step 함수

 

-출력층 함수

1. 항등함수

2. 소프트맥스 함수

 

-오차함수

필기체를 인식하는 3 신경망을 구현

 

 

 

 

 

오차함수를 이해하기 위해 기본적으로 알아야할 파이썬 문법

                             

신경망의 정확도를 출력하기 위해 기본적으로 알아야 하는 파이썬 문법

 

오차함수? 예측값과 실제값의 차이를 구하는 함수

 

 

문제116.

아래의 10개의 원소를 갖는 x라는 리스트를 만들고

x리스트에 가장 원소가 번째 인덱스인지 알아내시오

 

import numpy as np

x= [0.05, 0.01, 0.02, 0.1, 0.2, 0.3, 0.4, 0.05, 0.04]

print(x.index(max(x)))

 

또는(행렬로 해서)

x= np.array(x)

print(np.argmax(x, axis=0))  # axis 쓴거지 ( 열 자리에서 최대값 갖고오란 말 )

 

 

 

문제117.

아래의 리스트를 numpy array 리스트로 만들고

shape으로 행렬을 확인하시오

 

x = [[0.1,0.05,0.1,0.0,0.05,0.1,0.0,0.1,0.0,0.0],

     [0.1,0.05,0.2,0.0,0.05,0.1,0.0,0.6,0.0,0.0],

     [0.0,0.05,0.3,0.0,0.05,0.1,0.0,0.6,0.0,0.0],

     [0.0,0.05,0.4,0.0,0.05,0.0,0.0,0.5,0.0,0.0],

     [0.0,0.05,0.5,0.0,0.05,0.0,0.0,0.4,0.0,0.0],

     [0.0,0.05,0.6,0.0,0.05,0.0,0.0,0.3,0.0,0.0],

     [0.0,0.05,0.7,0.0,0.05,0.0,0.0,0.2,0.0,0.0],

     [0.0,0.1,0.8,0.0,0.1,0.0,0.0,0.2,0.0,0.0],

     [0.0,0.05,0.9,0.0,0.05,0.0,0.0,0.0,0.0,0.0],

     [0.0,0.05,0.6,0.0,0.05,0.0,0.0,0.3,0.0,0.0] ]

 

y = np.array(x)

print(y.shape)

 

(10, 10)

 

 

문제118.

아래의 10 10 행렬에서 에서 가장 원소가 번째 있는지

출력하시오

 

x = [[0.2,0.05,0.1,0.0,0.05,0.0,0.0,0.1,0.0,0.0],  

     [0.1,0.05,0.2,0.0,0.05,0.1,0.0,0.6,0.0,0.0],

     [0.0,0.05,0.3,0.0,0.05,0.1,0.0,0.6,0.0,0.0],

     [0.0,0.05,0.4,0.0,0.05,0.0,0.0,0.5,0.0,0.0],

     [0.0,0.05,0.5,0.0,0.05,0.0,0.0,0.4,0.0,0.0],

     [0.0,0.05,0.6,0.0,0.05,0.0,0.0,0.3,0.0,0.0],

     [0.0,0.05,0.7,0.0,0.05,0.0,0.0,0.2,0.0,0.0],

     [0.0,0.1,0.8,0.0,0.1,0.0,0.0,0.2,0.0,0.0],

     [0.0,0.05,0.9,0.0,0.05,0.0,0.0,0.0,0.0,0.0],

     [0.0,0.05,0.6,0.0,0.05,0.0,0.0,0.3,0.0,0.0] ]

 

y = np.array(x)

print(y.shape)

print(np.argmax(x, axis=1))   #행에서 뽑아야 하니까 axis = 1

 

[0 7 7 7 2 2 2 2 2 2]

 

설명:

axis = 0 :

axis = 1    :

 

 

 

문제119.

테스트 데이터 하나 x[34] 필기체의 라벨이 무엇인지 확인하시오

힌트 :  x, t = get_data()

print(x.shape)

 

import sys, os

sys.path.append(os.pardir)  # 부모디렉토리의 파일을 가져올수

                            # 있도록 설정

import numpy as np

from dataset.mnist import load_mnist

from PIL import Image

 

def get_data():

    (x_train, t_train), (x_test, t_test) =\

     load_mnist(flatten=True, normalize=True, one_hot_label=False)

    

    return x_test, t_test  #x_test = 입력,  t_test = 라벨

 

(x , t) = get_data()

 

print(t[34])

print(x.shape)

print(t.shape)

 

7

(10000, 784)

(10000,)

 

 

 

 

문제120.

테스트 데이터 하나인 x[34] 필기체를 신경망에 넣고

신경망이 예측한 것과 라벨이 서로 일치하는지 확인하시오

 

 

 

import sys, os

 

sys.path.append(os.pardir)

 

import numpy as np

from dataset.mnist import load_mnist

from PIL import Image

import  pickle

import  numpy  as np

 

 

# 신경망 함수들

def sigmoid(num):

    rst = (1 / (1 + np.exp(-num)))

    return (rst)

 

 

def identity_function(x):

    return x

 

 

def softmax(a):

    c = np.max(a)

    minus = a - c

    exp_a = np.exp(minus)

    sum_exp_a = np.sum(exp_a)

    y = exp_a / sum_exp_a

    return y

 

def  init_network():

    with open("C:\\Users\itwill\sample_weight\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

 

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

 

x, t = get_data()

network = init_network()

y = predict(network,x[34])

print(np.argmax(y))

print(t[34])

print(7==7)

 

7

7

True

 

 

 

문제121.

위의 코드에 for loop 문을 입혀서 테스트 데이터 10000장을 위의 3 신경망에 넣고

10000 장을 3 신경망이 맞추는지 확인하시오

 

구현결과 : 9352

 

import sys, os

sys.path.append(os.pardir)

import numpy as np

from dataset.mnist import load_mnist

from PIL import Image

import  pickle

import  numpy  as np

 

# 신경망 함수들

def sigmoid(num):

    rst = (1 / (1 + np.exp(-num)))

    return (rst)

 

 

def identity_function(x):

    return x

 

 

def softmax(a):

    c = np.max(a)

    minus = a - c

    exp_a = np.exp(minus)

    sum_exp_a = np.sum(exp_a)

    y = exp_a / sum_exp_a

    return y

 

def  init_network():

    with open("C:\\Users\itwill\sample_weight\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

 

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

 

x, t = get_data()

network = init_network()

 

cnt=0

for i in range(10000):

    y = predict(network,x[i])   # predict 함수가 소프트맥스 처리해서 y 리턴

    if np.argmax(y) == t[i]:      # y에서 argmax 처리해서 확률높은 값을 갖고온다

        cnt+=1

print(cnt)

 

#print(np.argmax(y))

#print(t[34])

 

 

 

문제122.

위의 결과가 9352 아니라 아래와 같이 정확도로 출력되게 하시오

 

정확도 : 0.9352

 

cnt=0

for i in range(10000):

    y = predict(network,x[i])

    if np.argmax(y) == t[i]:

        cnt+=1

print("정확도:",cnt*0.0001)   #토탈이 10000 이니까

 

p.101 보면

↓↓↓↓↓↓↓↓↓↓↓↓↓↓

cnt=0

 

for i in range(len(x)):

    y = predict(network,x[i])

    if np.argmax(y) == t[i]:

        cnt+=1

print("정확도:",cnt/len(x))

 

 

 

 

 

 

배치처리 (p.102)

 

"신경망에 데이터 입력시 배치(batch) 입력하는 방법"

 

"이미지를 장씩 처리하는 아니라 여러장을 번에 처리"

 

 

1. 이미지를 장씩 처리한 신경망

p.103 그림 3-26

 

 

2. 이미지를 100장씩 처리한 신경망

 

*60000장의 사진을 학습시키려면 과정을 600 돌리면 된다.

 

 

 

 

배치로 신경망을 학습 시키기 위한 코드를 이해하기 위해

기본적으로 알아야하는 파이썬 코드 연습

 

문제123.

아래의 결과를 출력하시오

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

 

result = [ i for i in range(10) ]

print(result)   

 

다른방법

y = list(range(10))

print(y)

 

 

문제124.

아래의 결과를 출력하시오
결과: [0, 3, 6, 9]

 

result = [i for i in range(10)]

print(result[0::3])   

 

y = list(range(0,10,3))

print(y)

 

 

 

문제125.

아래의 리스트에서 최대값의 원소 인덱스를 출력하시오

결과: 3

 

import numpy as np

y = list(range(0,10,3))

print(y.index(max(y)))

또는

y = list(range(0,10,3))

y = np.array(y)

print(np.argmax(y))

 

 

 

문제126.

아래의 행렬을 numpy 배열 4*3행렬로 생성하시오

 

import numpy as np

x = [0.1, 0.8, 0.1, 0.3, 0.1, 0.6, 0.2, 0.5, 0.3, 0.8, 0.1, 0.1]

 

x = np.array(x)

x = x.reshape(4,3)

print(x)

 

[[ 0.1  0.8  0.1]

 [ 0.3  0.1  0.6]

 [ 0.2  0.5  0.3]

 [ 0.8  0.1  0.1]]

 

 

 

문제127.

numpy argmax 이용해서 아래의 행렬에서 중에

최대값 원소의 인덱스를 출력하시오

 

import numpy as np

x = [0.1, 0.8, 0.1, 0.3, 0.1, 0.6, 0.2, 0.5, 0.3, 0.8, 0.1, 0.1]

 

x = np.array(x)

x = x.reshape(4,3)

print( np.argmax( x , axis=1 ) )

[1 2 1 0]

 

*axis = 1

 

문제128.

아래의2개의 리스트를 만들고 서로 같은 자리에 같은 숫자가 있는지

출력하시오

 

import numpy as np

 

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

y = [2,1,3,4,5,4,2,1,1,2]

 

result = [ 1 if i1==i2  else 0 for i1, i2 in zip(x,y)  ]

print(sum(result))

 

또다른방법

 

import numpy as np

 

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

y = [2,1,3,4,5,4,2,1,1,2]

 

x = np.array(x)

y = np.array(y)

 

print(x==y)

print( np.sum(x==y) )

 

 

 

 

문제129.

아래의 리스트를 x라는 변수에 담고 앞에 5개의 숫자만 출력하시오

 

결과: [7, 3, 2, 1, 6]

 

x = [7,3,2,1,6,7,7,8,2,4]

print(x[:5])

 

 

 

 

문제130.

 

결과: [100,200,300,400,.......10000]

 

result = [i for i in range(100,10001,100)]

print(result)

다른

import numpy as np

print(np.arange(100,10001,100))   #콤마없이 출력됨

 

 

 

 

문제131.

아래의 코드를 mnist 훈련 데이터를 100개씩 가져오는 코드로 작성하시오

 

1 장씩  신경망에 입력하는 코드

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓            

x, t = get_data()

network = init_network()

 

for i in range(10000):

    y = predict(network,x[i])

    print(len(y))

 

 

100장씩 신경망에 입력하는 코드

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

x, t = get_data()

network = init_network()

 

batch_size = 100

 

for i in range(0,len(x),batch_size):

    x_batch = x[i:i+batch_size]

    print(len(x_batch))

 

설명:

0~99

100~199

200~299

300~399

:

:

9900~9999

 

 

 

문제132.

100개씩 가지고 훈련 데이터를 predict 함수에 입력해서 예측숫자 100개를

출력하는 코드를 작성하시오

 

x, t = get_data()

network = init_network()

 

batch_size = 100

 

for i in range(0,len(x),batch_size):

    x_batch = x[i:i+batch_size]

    #print(len(x_batch))

    y_batch=predict(network, x_batch)

    print(len(y_batch))

 

결과:

100

100

100

:

:

100

 

 

 

 

 

 

문제133.

위의 코드에서 y_batch shape 확인하시오

100*10 shape 갖는 y_batch 에서 행의 최대값의 원소의 인덱스

np.argmax 이용해서 출력하시오

 

x, t = get_data()

network = init_network()

 

batch_size = 100

 

for i in range(0,len(x),batch_size):

    x_batch = x[i:i+batch_size]

    print(len(x_batch))

    y_batch=predict(network, x_batch)

    print(y_batch.shape)

 

(100, 10)   100 10

 

***출력층이 10이라서 10열

--> 10개씩 값이 들어있는 행이 100개씩 출력되는데

(총 1만장이니까) 그렇게 100번 출력된다.

 

x, t = get_data()

network = init_network()

 

batch_size = 100

 

for i in range(0,len(x),batch_size):

    x_batch = x[i:i+batch_size]

    print(len(x_batch))

    y_batch=predict(network, x_batch)

   

    print(np.argmax(y_batch,axis=1))    

# 10 들어있는 하나의 행에서 최대값 뽑음.

#그렇게 100개가 루프 1번임

# X 10000 니까

# 100개가 100 출력됨

 

print(y_batch.shape)

 

 

 

 

 

문제134.(오늘의 마지막 문제)

위의 예측한 100개의 숫자와 실제 숫자(라벨) 비교해서 정확도를 출력하시오

 

힌트1:

x, t = get_data()

t_batch = t[i:i+batch_size]

 

힌트2:

[2,1,3,5,1,........,4,2,1,1,0]   # 100개의 예측 숫자

[2,3,2,5,1,........,5,2,1,1,2]   # 100개의 실제 숫자(라벨)

print(x==y)

print(np.sum(x==y)

 

import sys, os

sys.path.append(os.pardir)

import numpy as np

from dataset.mnist import load_mnist

from PIL import Image

import  pickle

import  numpy  as np

 

# 신경망 함수들

def sigmoid(num):

    rst = (1 / (1 + np.exp(-num)))

    return (rst)

 

 

def identity_function(x):

    return x

 

 

def softmax(a):

    c = np.max(a)

    minus = a - c

    exp_a = np.exp(minus)

    sum_exp_a = np.sum(exp_a)

    y = exp_a / sum_exp_a

    return y

 

def  init_network():

    with open("C:\\Users\itwill\sample_weight\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

 

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

 

##############################################################

x, t = get_data()

network = init_network()

 

 

batch_size = 100

 

result = 0

for i in range(0,len(x),batch_size):

   

    x_batch = x[i:i+batch_size]  

    y = predict(network, x_batch)

    p = np.argmax(y,axis=1)   #예상값

    #print(p)

   

    t_batch = t[i:i+batch_size]    #실제값 (t 라벨. 이미 최대값 뽑아서 나온 실제답임)

   

    result += np.sum( p==t_batch )

 

print(result/len(x))

0.9352

728x90
반응형