AI - Deep Learning 1일차

학습 내용

  • 가장 기본적인 리니어 리그리션의 모습 그리기 (일차함수)
import math # 기본적인 수식을 쓰기 위해 임포트
import numpy as np
import matplotlib.pyplot as plt\
plt.style.use('seaborn-whitegrid') #그리드가 있는 표 그리기

# 함수 생성 (파라미터 1개인 함수 생성)
def linear_funtion(x):
    #a는 기울기와 상수로 생성
    a = 0.5
    b = 2
    # 일차함수 수식 반환
    return a * x + b 
       
# 테스트
print(linear_funtion(5))

결과)
4.5
  • 일차함수 그래프 그리기
x = np.arange(-5, 5, 0.1)
y = linear_funtion(x) #배열을 넣으면 결과인 배열이 y에 담김

#그래프로 그리기
plt.plot(x, y)
plt.xlabel('x')
plt.ylabel('y')
plt.title('Linear Funtion')
# 선형회귀를 만들었음

  • 이차함수
def quadratic_funtion(x):
    a = 1 #기울기
    b = -2 #절편
    c = -2
    
    #x**2은 2제곱
    return a*x**2 + b*x + c
  • 이차함수 그래프 그리기
y = quadratic_funtion(x)

plt.plot(x, y)
plt.xlabel('x')
plt.ylabel('y')
plt.title('Quadratic Funtion')

  • 삼차함수
def cubic_funtion(x):
    a = 4 #기울기
    b = 0
    c = 1
    d = -8
    
    return a*x**3 + b*x**2 + c*x + d
  • 삼차함수 그래프 그리기
y = cubic_funtion(x)

plt.plot(x,y)
plt.xlabel('x')
plt.ylabel('y')
plt.title('Cubic Funtion')

Tensor

딥러닝에서 정보 하나하나를 텐서라고 부른다
텐서가 하나 있으면 스칼라,
텐서가 여러 개 붙어 있으면 방향성이 생긴다 그리고 이것을 벡터라 부른다
텐서가 더 많이 붙어서 방향이 두 개가 되면 2D 벡터,
텐서가 더욱 많이 붙어서 방향에 세 개가 되면 3D 벡터.
4D 이상의 벡터도 있다

이런 텐서를 표현할 때 numpy를 사용한다.

  • 스칼라 (0차원 텐서)
    - 하나의 숫자를 담고 있는 텐서
    - 형상이 없다

Tensor 실습

# 0차원 텐서, 스칼라
x = np.array(3) #3이라는 숫자가 들어간 배열이 생성됨
print(x)
print(x.shape) #모양확인
print(np.ndim(x)) #차원 확인

결과)
3
()  <= 방향이나 차원이 없기 때문에 괄호만 나온다
0
# 1차원 텐서. 벡터
# 1차원 텐서 2개 생성해서 연산
a = np.array([1,2,3,4])
b = np.array([5,6,7,8])

c = a + b #python에서는 배열끼리 연산이 된다

print(c)
print(c.shape)
print(np.ndim(c))

결과)
[ 6  8 10 12]
(4,)
1
  • 차원이 다른 두 텐서의 연산
m = np.array(10) #숫자 10이 하나 들어있는 배열 생성

# 0차원 텐서 m과 1차원 벡터 a 연산
d = a * m
print(d)

결과)
[10 20 30 40]

낮은 차원의 텐서와 높은 차원의 텐서를 연산하면
낮은 차원의 데이터를 복제해서 높은 차원에 맞춰 연산한다.
이것을 Broadcast라고 한다

1차원 텐서와 2차원 텐서를 연산해도 마찬가지로 1차원 텐서를 복제해서 연산한다.

# 2차원 텐서, 벡터
a = np.array([[1,2],[3,4]]) 
#[[1,2],[3,4]] 와 [1,2],[3,4]는 다르다
#[[1,2],[3,4]]는 파라미터 하나이다

print(a)
print(a.shape)
print(a.ndim)

결과)
[[1 2]
 [3 4]]
(2, 2)
2
# 2차원 텐서 스칼라 연산
b = np.array([[10,10],[10,10]]) 

print(a * b)

결과)
[[10 20]
 [30 40]]
  • 전치행렬
    - 행과 열을 바꾼 행렬
a = np.array([[1,2,3], [4,5,6]])

a_ = a.T #전치행렬

print(a)
print(a_)

결과)
[[1 2 3]
 [4 5 6]]
[[1 4]
 [2 5]
 [3 6]]

MNIST 손글씨 이미지

#keras 설치가 안되어 있다면 설치
!pip install keras

#tensorflow 설치가 안되어 있다면 설치
!pip install tensorflow
from keras.datasets import mnist

(X_train, y_train), (X_test, y_test) = mnist.load_data()

print(X_train.shape)
print(X_train.ndim)

결과)
(60000, 28, 28)
3
#데이터 6만개, 3차원 데이터
  • 이미지 확인
temp_image = X_train[3]
plt.imshow(temp_image, cmap='gray') #흑백

논리 회로 확인 (딥러닝의 원리)

import numpy as np
import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')
  • AND GATE : 두 개 다 참일 때만 참
# AND GATE
def AND(x1, x2):
    input = np.array([x1,x2]) #입력값
    weights = np.array([0.4,0.4]) #가중치
    bias = -0.6 #편향치
    # 가중치와 편향치에 따라 로직이 바뀐다
    
    value = np.sum(input * weights) + bias
    
    if value <= 0:
        return 0
    else:
        return 1
print(AND(0,0))
print(AND(0,1))
print(AND(1,0))
print(AND(1,1))

결과)
0
0
0
1
# 그래프로 표현
x1 = np.arange(-2, 2, 0.01)
x2 = np.arange(-2, 2, 0.01)
bias = -0.6

y = (-0.4 * x1 - bias) / 0.4

# 수직과 수평의 축을 지정
plt.axvline(x=0)
plt.axhline(y=0)

plt.plot(x1, y, 'r--')
plt.scatter(0,0,color='orange',marker='o',s=150)
plt.scatter(0,1,color='orange',marker='o',s=150)
plt.scatter(1,0,color='orange',marker='o',s=150)
plt.scatter(1,1,color='black',marker='^',s=150)
plt.xlim(-0.5,1.5)
plt.ylim(-0.5,1.5)
plt.grid()

  • OR Gate : 한 개만 참이어도 참
#OR Gate Funtion
def OR(x1, x2):
    input = np.array([x1,x2])
    weights = np.array([0.4,0.4])
    bias = -0.3 #OR는 이 부분만 바꾸면 된다, 나머지는 그대로
    
    value = np.sum(input * weights) + bias
    
    if value <= 0:
        return 0
    else:
        return 1
# AND와 수식은 같고 bias 값만 다르다
print(OR(0,0))
print(OR(0,1))
print(OR(1,0))
print(OR(1,1))

결과)
0
1
1
1
# OR Gate 그래프로 표현
x1 = np.arange(-2, 2, 0.01)
x2 = np.arange(-2, 2, 0.01)
bias = -0.3 #이 부분만 변경, 가중치를 -0.6에서 -0.3으로 낮춤

y = (-0.4 * x1 - bias) / 0.4

# 수직과 수평의 축을 지정
plt.axvline(x=0)
plt.axhline(y=0)

plt.plot(x1, y, 'r--')
plt.scatter(0,0,color='black',marker='^',s=150) #보기 좋게 변경
plt.scatter(0,1,color='orange',marker='o',s=150)
plt.scatter(1,0,color='orange',marker='o',s=150)
plt.scatter(1,1,color='orange',marker='o',s=150)
plt.xlim(-0.5,1.5)
plt.ylim(-0.5,1.5)
plt.grid()

  • NAND gate : AND의 반대
#NAND gate
def NAND(x1, x2):
    input = np.array([x1,x2])
    weights = np.array([-0.6,-0.6]) #이 부분 변경
    bias = 0.7 #이 부분 변경
    
    value = np.sum(input * weights) + bias
    
    if value <= 0:
        return 0
    else:
        return 1
# AND와 수식은 같고 bias 값만 다르다
print(NAND(0,0))
print(NAND(0,1))
print(NAND(1,0))
print(NAND(1,1))

결과)
1
1
1
0
  • 다층 퍼셉트론
def XOR(x1, x2):
    s1 = NAND(x1, x2) #들어온 값을 NAND으로 먼저 처리
    s2 = OR(x1, x2) #들어온 값을 OR로 처리
    y = AND(s1, s2) #처리한 값들을 AND로 처리
    
    return y
#세가지 게이트를 합쳐서 XOR 게이트를 만들어냄
print(XOR(0,0))
print(XOR(0,1))
print(XOR(1,0))
print(XOR(1,1))

결과)
0
1
1
0

학습 후기

오늘은 어제보다 쉬운 내용이기도 했고 기초적인 그래프 그리기랑 이것을 신경망처럼 코드로 처리하는 방법을 배우고 실습을 해봤다.
수업을 계속 듣다보니 계산을 컴퓨터가 해주긴하지만 좀 더 잘 다루려면 역시 수학 공부가 필수라는 것을 알았다. 주말에 ebs로 수학 공부를 좀 해야겠다.
그리고 강사님이 수업이 지루하지 않도록 중간중간에 개발 이야기부터 IT 관련 흥미로운 이야기를 해주시는데 덕분에 매 수업에 흥미를 읽지 않고 수업에 잘 따라가고 있는 것 같다. 알려주신 팁과 공부방법도 유용하게 잘 사용하고 있다.

좋은 웹페이지 즐겨찾기