밑바닥부터 시작하는 딥러닝 공부한 내용들을 써머리해서 올립니다. 1장에서 3장입니다.

in kr •  16 days ago

1장 헬로 파이썬

넘파이의 N차원 배열
import numpy as np
#2차원 배열
A = np.array([[1,2], [3,4]])
print(A)
[[1 2]
[3 4]]

A.shape
A.dtype
dtype('int64')

B = np.array([[3,0], [0, 6]])
A + B

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

A * B
array([[ 3, 0],
[ 0, 24]])

#형상이 같은 행렬끼리면 행렬의 산술 연산도 대응하는 원소별로 계산됩니다.
#행렬과 스칼라값의 산술 연산도 가능합니다.
print(A)

A * 10
array([[10, 20],
[30, 40]])

#수학에서는 1차원 배열은 벡터(Vector), 2차원 배열은 행렬(Metrix)라고 부릅니다.
#또 벡터와 행렬을 일반화한 것을 텐서(Tensor)라고 합니다.
#이 책에서는 기본적으로 2차원 배열을 행렬, 3차원 이상의 배열을 다차원 배열이라고 부릅니다.

#브로드캐스트
#넘파이에서는 형상이 다른 배열끼리도 계산할 수 있습니다.
#앞의 데모에서 2 * 2행렬 A에 스칼라값 10을 곱했습니다.
#이때 10이라는 스칼라값이 2 * 2행렬로 확대된 후 연산이 이루어집니다.
#이 똑똑한 기능을 브로드캐스트라고 합니다.
A = np.array([[1,2], [3,4]])
B = np.array([10,20])
A * B

array([[10, 40],
[30, 80]])

#위의 경우도 2차원배열에 1차원을 곱하면 브로드캐스트되서 연산이 됩니다.

#원소 접근
X = np.array([[51, 55], [14, 19], [0,4]])
print(X)

[[51 55]
[14 19]
[ 0 4]]

X[0]
array([51, 55])

X[0][1]
55

for row in X:
print(row)
[51 55]
[14 19]
[0 4]

#X를 1차원 배열로 변환(평탄화)
X = X.flatten()
print(X)

[51 55 14 19 0 4]

#인덱스가 0, 2, 4인 원소 얻기
X[np.array([0,2,4])]
array([51, 14, 0])

#이 기법을 응용하면 특정 조건을 만족하는 원소만 얻을 수 있습니다.
X > 15
array([ True, True, False, True, False, False])

X[X > 15]

array([51, 55, 19])

#넘파이 배열에 부등호 연산자를 사용한 결과는 bool배열입니다.

#퍼셉트론 구현하기
def AND(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.7
tmp = x1w1 + x2w2
if tmp <= theta:
return 0
elif tmp > theta:
return 1

AND(0, 0)
AND(1, 0)
AND(0, 1)
AND(1, 1)

#가중치와 편향 도임
#b를 편향(bias)이라고 하며 w1, w2는 그대로 가중치(weight)입니다.
#퍼셉트론은 입력신호에 가중치를 곱한 값과 편향을 합하여 그 값이 0을 넘으면 1을 출력하고
#그렇지 않으면 0을 출력합니다.
import numpy as np
#입력
x = np.array([0,1])
#가중치
w = np.array([0.5, 0.5])
#편향
b = -0.7
w * x
array([0. , 0.5])

np.sum(w*x)
0.5

np.sum(w*x) + b
-0.19999999999999996

#가중치와 편한을 도입한 AND게이트는 다음과 같이 구현합니다.
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
else:
return 1

#구체적으로 말하면 w1과 w2는 각 입력 신호가 결과에 주는 영향력(중요도)를 조절하는 매개변수이고
#편향은 뉴런이 얼마나 쉽게 활성화(결과로 1을 출력)하느냐를 조정하는 매개변수입니다.
#편향이라는 용어는 '한쪽으로 치우쳐 균형을 깬다'라는 의미를 담고 있습니다.

#NAND게이트와 OR게이트를 구현
def NAND(x1, x2):
x = np.array([x1, x2])
#AND와는 가중치(w와 b)만 다르다.
w = np.array([-0.5, -0.5])
b = 0.7
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1

def OR(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.2
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1

#2.4 퍼셉트론의 한계
#XOR게이트(베터적 논리합)
#퍼셉트론은 직선 하나로 나눈 영역만 표현할 수 있다는 한계가 있습니다.
#곡선의 영역을 비선현 영역, 직선의 영역을 선형 영역이라고 합니다.

#2.5 다층 퍼셉트론이 출동한다면
#사실 퍼셉트론의 아름다움은 '층을 쌓아' 다층 퍼셉트론(multi-layer perceptron)을 만들 수 있다는 것에 있습니다.

#XOR게이트 구현하기
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y

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

3장 신경망

import numpy as np
x = np.array([-1.0, 1.0, 2.0])
x
array([-1., 1., 2.])

y = x > 0
y
array([False, True, True])

#넘파이 배열에 부등호 연산을 수행하면 배열의 원소 각각에 부등호 연산을 수행한 bool배열이 생성됩니다.
#아래와 같이 배열의 원소를 bool에서 int형으로 변경해 줍니다.
#자료형을 변환할 때 astype메서드를 사용합니다.
y = y.astype(np.int)
y
array([0, 1, 1])

#계단 함수의 그래프
import numpy as np
import matplotlib.pylab as plt
%pylab inline
def step_function(x):
return np.array(x > 0, dtype=np.int)

x = np.arange(-5.0, 5.0, 0.1)
y = step_function(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1)
plt.show()

#이제 계단 함수로 불리는 이유를 아셨겠죠? 이 그림처럼 값이 바뀌는 형태가 계단처럼 생겼기 때문입니다.

#시그모이드 함수 구현
def sigmoid(x):
return 1 / (1 + np.exp(-x))

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

array([0.26894142, 0.73105858, 0.88079708])

#이 함수가 넘파이 배열도 훌륭히 처리해 줄 수 있는 비밀은 넘파이의 브로드캐스트에 있습니다.
#브로드캐스트 기능이란 넘파이 배열과 스칼라값의 연산을 넘파이 배열의 원소 각각과 스칼라값의 연산으로
#바꿔 수행하는 것입니다.
t = np.array([1.0, 2.0, 3.0])
1.0 + t
array([2., 3., 4.])

1.0 / t
array([1. , 0.5 , 0.33333333])

#시그모이드 함수를 그래프로 그려볼까요?
x = np.arange(-5.0, 5.0, 0.1)
y = sigmoid(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1)
plt.show()

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!