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')
# 선형회귀를 만들었음
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 관련 흥미로운 이야기를 해주시는데 덕분에 매 수업에 흥미를 읽지 않고 수업에 잘 따라가고 있는 것 같다. 알려주신 팁과 공부방법도 유용하게 잘 사용하고 있다.
Author And Source
이 문제에 관하여(AI - Deep Learning 1일차), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hanss1122/AI-Deep-Learning저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)