questionet
파이썬, 넘파이, 퍼셉트론 본문
1. 파이썬 이란¶
- 간단하고 배우기 쉬운 프로그래밍 언어입니다. 오픈소스라 무료로 자유롭게 이용할 수 있습니다.
- 영어와 유사한 문법으로 불편한 컴파일 과정도 없어서 편리합니다.
- 파이썬 코드는 읽기 쉽고 성능도 뛰어납니다.
- 파이썬은 과학분야, 특히 기계학습과 데이터 과학 분야에 널리 쓰입니다.
- 파이썬 자체의 뛰어난 성능에 numpy와 SciPy 같은 수치 계산과 통계 처리를 다루는 탁월한 라이브러리가 더해져 데이터 과학 분야에서 확고한 위치를 차지하고 있습니다.
- 딥러닝 프레임워크에서도 파이썬을 애용합니다: Caffe, TensorFlow, Chainer, Theano
★ 파이썬은 데이터 과학 분야에 아주 적합한 프로그래밍 언어입니다.¶
In [22]:
# 파이썬 버전 확인하기
!python --version
Python 3.8.8
1. 산술 연산¶
In [23]:
1 + 2
Out[23]:
3
In [25]:
1 - 2
Out[25]:
-1
In [27]:
4 * 5
Out[27]:
20
In [28]:
7 / 5
Out[28]:
1.4
In [29]:
3 ** 2
Out[29]:
9
2. 자료형¶
- 자료형은 데이터이 성질을 나타냄 : 정수, 실수, 문자열 등
In [30]:
type(10)
Out[30]:
int
In [31]:
type(2.718)
Out[31]:
float
In [32]:
type("hello")
Out[32]:
str
3. 변수¶
- x와 y등의 알파벳을 사용하여 변수를 정의할 수 있습니다.
- 변수를 사용하여 계산하거나 변수에 다른 값을 대입할 수 있습니다.
- 파이썬은 변수의 자료형을 상황에 맞게 자동으로 결정하는 동적 언어로 분류되는 프로그래밍 언어입니다.
- 변수가 10으로 초기화 될 때 x의 형태가 int임을 파이썬이 스스로 판단하는 것입니다.
- 정수와 실수를 곱한 결과는 실수가 되었습니다. (자동 형변환)
In [ ]:
type annotation / type hinting
In [33]:
x = 10
print(x)
10
In [34]:
x = 100
print(x)
100
In [35]:
y = 3.14
x * y
Out[35]:
314.0
In [36]:
type(x * y)
Out[36]:
float
In [37]:
a = [1, 2, 3, 4, 5] # mutable data / immutable type
print(a)
[1, 2, 3, 4, 5]
In [38]:
len(a)
Out[38]:
5
In [39]:
a[0]
Out[39]:
1
In [40]:
a[4]
Out[40]:
5
In [ ]:
a[4] = 99
print(a)
- 파이썬의 인덱스는 0부터 시작합니다.
- 파이썬 리스트에 슬라이싱(slicing) 을 적용하여 범위를 지정하여 부분 리스트를 가져올 수 있습니다.
In [ ]:
a
In [41]:
a[0:2] # 인덱스 0부터 2까지 얻기(2번째는 포함하지 않는다)
Out[41]:
[1, 2]
In [42]:
a[:3] # 처음부터 인덱스 3까지 얻기(3번째는 포함하지 않는다)
Out[42]:
[1, 2, 3]
In [43]:
a[:3] # 처음부터 인덱스 3까지 얻기(3번째는 포함하지 않는다)
Out[43]:
[1, 2, 3]
In [44]:
a[:-1] # 처음부터 마지막 원소 1개 앞까지 얻기
Out[44]:
[1, 2, 3, 4]
In [45]:
a[:-2] # 처음부터 마지막 원소 2개 앞까지 얻기
Out[45]:
[1, 2, 3]
5. 딕셔너리¶
- 키(key)와 값(value)을 한 쌍으로 저장합니다.
- 영어단어처럼 단어와 그 의미를 짝지어 저장합니다.
In [46]:
me = {'height':180} # 딕셔너리 생성
me['height'] # 원소에 접근
Out[46]:
180
In [47]:
me = {'weight':70} # 새 원소 추가
print(me)
{'weight': 70}
6. Bool¶
- 파이썬에는 True, False 값을 가지는 Bool이라는 자료형이 있습니다.
- and, or, not 연산자를 사용할 수 있습니다.
In [48]:
hungry = True # 배가 고프다
sleepy = False # 졸리지 않다
In [49]:
type(hungry)
Out[49]:
bool
In [50]:
not hungry
Out[50]:
False
In [51]:
hungry and sleepy # 배가 고프다 그리고 졸리지 않다.
Out[51]:
False
In [52]:
hungry or sleepy # 배가 고프다 또는 졸리지 않다.
Out[52]:
True
7. if 문¶
- 조건에 따라서 달리 처리하려면 if/else 문을 사용합니다.
- 파이썬에서는 들여쓰기 조건으로 4개 공백 문자가 중요한 의미를 가집니다.
In [53]:
hungry = True
if hungry:
print("I'm hungry")
I'm hungry
In [54]:
hungry = False
if hungry:
print("I'm hungry")
else:
print("I'm not hungry")
print("I'm sleepy")
I'm not hungry I'm sleepy
8. for문¶
- 반복(루프)처리에는 for문을 사용합니다.
- for ... in...: 구문을 사용하면 리스트 등 데이터 집합의 각 원소에 차례로 접근할 수 있습니다.
In [55]:
for i in [1, 2, 3]:
print(i)
1 2 3
9. 함수¶
- 특정 기능을 수행하는 일련의 명령들을 묶어 하나의 함수 function으로 정의할 수 있습니다.
In [56]:
def hello():
print("Hello World!")
In [ ]:
hello()
- 함수는 인자를 취할 수 있습니다.
- + 연산자를 사용하여 문자열을 이어 붙일 수 있습니다.
In [57]:
def hello(object):
print("Hello " + object + "!")
In [58]:
hello("cat")
Hello cat!
10. 클래스¶
- 개발자가 직접 클래스를 정의하면 독자적인 자료형을 만들 수 있습니다.
- 또한 클래스에는 그 클래스만의 전용 함수(메소드)와 속성을 정의할 수도 있습니다.
- __init__라는 특별한 메소드가 있는데, 클래스를 초기화 하는 방법을 정의합니다. 이 초기화용 메서드를 생성자(constructor) 라고도 하며, 클래스의 인스턴스가 만들어 질 때 한번만 불립니다.
- 파이썬에서는 메서드의 첫번째 인수로 자신(자신의 인스턴스) 을 나타내는 self를 명시적으로 쓰는 것이 특징입니다.
In [ ]:
class Man:
def __init__(self, name):
self.name = name
print("Initialized!")
def hello(self):
print("Hello " + self.name + "!")
def goodbye(self):
print("Good-bye " + self.name + "!")
In [ ]:
m = Man("David")
m.hello()
m.goodbye()
파이썬 스크립트 파일 실행¶
In [60]:
!python gradient_check.py
W1 1.5937511731727595e-06 b1 2.6076127667411515e-06 W2 2.758410599715235e-11 b2 3.4569817110047946e-09 W3 7.705909401863866e-11 b3 1.7990765303760314e-07
11. 넘파이¶
- 딥러닝을 구현하다보면 배열이나 행렬 계산이 많이 등장합니다.
- 넘파이의 배열 클래스인 numpy.array에는 편리한 메서드가 많이 준비되어 있습니다.
- 넘파이 배열 numpy.array은 N차원 배열을 작성할 수 있습니다.
- 수학에서 1차원 배열은 벡터(Vector), 2차원 배열은 행렬(Array), 또, 벡터와 행렬을 일반화한 것을 텐서(Tensor)라고 합니다.
- 이 책에서는 2차원 배열을 '행렬', 3차원 이상의 배열을 '다차원 배열'이라고 하겠습니다.
In [1]:
from IPython.display import Image
In [17]:
Image("1.png")
Out[17]:
In [18]:
Image("2.png")
Out[18]:
In [ ]:
In [61]:
import numpy as np
W = np.array([[1, 2, 3], [4, 5, 6]]) # 넘파이 배열 생성하기
X = np.array([[0, 1, 2], [3, 4, 5]])
In [63]:
W
Out[63]:
array([[1, 2, 3], [4, 5, 6]])
In [64]:
X
Out[64]:
array([[0, 1, 2], [3, 4, 5]])
In [62]:
W.shape # 다차원 배열의 형상
Out[62]:
(2, 3)
In [65]:
W.ndim # 배열의 차원수
Out[65]:
2
In [66]:
type(W)
Out[66]:
numpy.ndarray
- x와 y의 원소수가 같다면, 산술 연산은 각 원소별로 대해서 행해집니다.
- 원소별 이라는 말은 영어로 element-wise 라고 합니다.
In [67]:
W + X
Out[67]:
array([[ 1, 3, 5], [ 7, 9, 11]])
In [68]:
W * X # 원소별 곱셈
Out[68]:
array([[ 0, 2, 6], [12, 20, 30]])
In [69]:
W / X # 원소별 나눗셈
<ipython-input-69-9e7d086d61ff>:1: RuntimeWarning: divide by zero encountered in true_divide W / X # 원소별 나눗셈
Out[69]:
array([[ inf, 2. , 1.5 ], [1.33333333, 1.25 , 1.2 ]])
벡터의 내적과 행렬의 곱¶
벡터의 내적은 두 벡터에서 대응하는 원소들의 곱을 모두 더한 것
In [70]:
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
In [21]:
Image("5.png")
Out[21]:
In [71]:
np.dot(a, b)
Out[71]:
32
In [24]:
Image("6.png")
Out[24]:
In [72]:
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
In [73]:
np.matmul(A, B)
Out[73]:
array([[19, 22], [43, 50]])
In [74]:
np.dot(A, B) # np.dot()은 벡터의 내적에도 쓸 수 있고 행렬 곱 연산도 할 수 있다.
Out[74]:
array([[19, 22], [43, 50]])
np.dot() 의 인수가 모두 1차원 배열이면 벡터 내적을 계산하고
2차원 배열이면 행렬곱을 계산한다
matmul()을 쓰는 이유는 행렬곱연산이라는 걸 더 명시적으로 보여주기 위해서.
In [ ]:
파이써닉
12. 브로드캐스트¶
- 넘파이에서는 형상이 다른 배열끼리도 계산할 수 있습니다.
- 앞의 예에서는 2x2 행렬 A에 스칼라값 10을 곱했습니다. 이 때 10이라는 스칼라값이 2x2 행렬로 확대된 후 연산이 이뤄집니다.
- 이 똑똑한 기능을 브로드캐스트(Broadcast) 라고 합니다.
- 브로드캐스트 기능 덕분에 형상이 다른 배열끼리의 연산을 스마트하게 할 수 있습니다.
In [75]:
A = np.array([[1, 2], [3, 4]])
A * 10
Out[75]:
array([[10, 20], [30, 40]])
In [76]:
Image("3.png")
Out[76]:
In [77]:
A = np.array([[1, 2], [3, 4]]) # 다차원 배열
B = np.array([10, 20]) # 행렬
A * B
Out[77]:
array([[10, 40], [30, 80]])
In [78]:
Image("4.png")
Out[78]:
13. 원소 접근¶
- 원소의 인덱스는 0부서 시작합니다.
- 파이썬은 C/C++ 같은 정적언어(컴파일 언어)보다 처리속도가 늦다고 합니다.
- 실제로 무거운 작업을 할 때는 C/C++로 작성한 프로그램을 쓰는 편이 좋습니다.
- 그래서 파이썬에서 빠른 성능이 요구될 경우 해당 부분을 C/C++로 구현하곤 합니다.
- 그 때 파이썬은 C/C++로 쓰인 프로그램을 호출해주는 이른바 중개자 같은 역할을 합니다.
- 넘파이도 주된 처리는 C/C++로 구현했습니다. 그래서 성능을 해치지 않으면서 파이썬의 편리한 문법을 사용할 수 있는 것입니다.
In [79]:
X = np.array([[51, 55], [14, 19], [0,4]])
print(X)
[[51 55] [14 19] [ 0 4]]
In [80]:
X.shape
Out[80]:
(3, 2)
In [81]:
X[0]
Out[81]:
array([51, 55])
In [82]:
X[0][1]
Out[82]:
55
In [83]:
for row in X:
print(row)
[51 55] [14 19] [0 4]
In [84]:
X = X.flatten() # X를 1차원 배열로 변환(평탄화)
print(X)
[51 55 14 19 0 4]
In [85]:
X[np.array([0, 2, 4])] # 인덱스가 0, 2, 4인 원소 얻기
Out[85]:
array([51, 14, 0])
In [86]:
X > 15
Out[86]:
array([ True, True, False, True, False, False])
In [87]:
X[X>15]
Out[87]:
array([51, 55, 19])
14. matplotlib¶
- 딥러닝 실험에서는 그래프 그리기와 데이터 시각화도 중요합니다.
- matplotlib은 그래프를 그려주는 라이브러리 입니다.
- matplotlib을 사용하면 그래프 그리기와 데이터 시각화가 쉬워집니다.
- 이번 절에서는 그래프를 그리고 이미지를 화면에 표시하는 방법을 설명합니다.
In [ ]:
import numpy as np
import matplotlib.pyplot as plt
# 데이터 준비
x = np.arange(0, 6, 0.1) # 0에서 6까지 0.1 간격으로 생성
y = np.sin(x)
# 그래프 그리기
plt.plot(x, y)
plt.show()
In [ ]:
import numpy as np
import matplotlib.pyplot as plt
# 데이터 준비
x = np.arange(0, 6, 0.1) # 0에서 6까지 0.1 간격으로 생성
y1 = np.sin(x)
y2 = np.cos(x)
# 그래프 그리기
plt.plot(x, y1, label="sin")
plt.plot(x, y2, linestyle="--", label="cos") # cos 함수는 점선으로 그리기
plt.xlabel("x") # x축의 이름
plt.ylabel("y") # y축의 이름
plt.title('sin & cos') # 제목
plt.legend()
plt.show()
15. 이미지 표시하기¶
- pyplot에는 이미지를 표시해주는 메서드인 imshow()도 준비되어 있씁니다.
- 이미지를 읽어들일 때는 matplotlib.image 모듈의 imread() 메서드를 이용합니다.
In [ ]:
import matplotlib.pyplot as plt
from matplotlib.image import imread
img = imread('lena.png') # 이미지 읽어오기
plt.imshow(img)
plt.show()
이번 장에서 배운 내용¶
- 파이썬은 간단하고 익히기 쉬운 프로그래밍 언어다.
- 파이썬은 오픈 소스여서 자유롭게 사용할 수 있다.
- 이 책은 딥러닝 구현에 파이썬 3 버전을 이용한다.
- 외부 라이브러리로는 넘파이와 matplotlib을 이용한다.
- 파이썬을 실행하는 방식에는 '인터프리터'와 '스크립트 파일' 두가지가 있다.
- 파이썬에서는 함수와 클래스 같은 모듈로 구현을 정리할 수 있다.
- 넘파이는 다차원 배열을 다루는 편리한 메서드를 많이 제공한다.
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [2]:
Image("XOR_gate.png")
Out[2]:
In [3]:
import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt
In [88]:
mnist = keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
In [89]:
print(x_train.shape)
print(y_train.shape)
print(x_test.shape)
print(y_test.shape)
(60000, 28, 28) (60000,) (10000, 28, 28) (10000,)
In [13]:
x_train_norm, x_test_norm = x_train / 255.0, x_test / 255.0
In [14]:
x_train_norm.shape
Out[14]:
(60000, 28, 28)
In [5]:
x_train_reshaped = x_train_norm.reshape(-1, x_train_norm.shape[1]*x_train_norm.shape[2])
# 28 * 28
x_test_reshaped = x_test_norm.reshape(-1, x_test_norm.shape[1]*x_test_norm.shape[2])
In [8]:
print(x_train_reshaped.shape)
print(x_test_reshaped.shape)
(60000, 784) (10000, 784)
In [6]:
model=keras.models.Sequential()
model.add(keras.layers.Dense(50, activation='sigmoid', input_shape=(784,)))
#은닉층 노드 개수 H=50 입력층 d=784 (50 x 784 가중치 행렬) : 파라미터 개수 39250
model.add(keras.layers.Dense(10, activation='softmax'))
# 출력층 노드 개수 K=10 (10 x 50 가중치 행렬)
model.summary()
Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense (Dense) (None, 50) 39250 _________________________________________________________________ dense_1 (Dense) (None, 10) 510 ================================================================= Total params: 39,760 Trainable params: 39,760 Non-trainable params: 0 _________________________________________________________________
In [ ]:
# 위에서 두번째 레이어의 파라미터 개수가 왜 500이 아니라 510일까?
# 왜 두번째 레이어의 노드 개수가 10개일까?
총 3개의 레이어로 구성 된 퍼셉트론
은닉층에는 H개의 노드
출력층에는 K개의 노드가 존재하는 인공신경망
In [18]:
Image("7.png")
Out[18]:
In [ ]:
In [ ]:
원래 의미의 '퍼셉트론' 또는 '단층 퍼셉트론'은
입력값에 가중치를 곱하고 편향을 더한 Wx + b 선형변환에
계단함수를 활성화함수로 쓴 입출력 네트워크를 가리킨다
'다층 퍼셉트론'은 여러 층으로 구성되고
시그모이드 함수 같은 비선형함수를 활성화 함수를 쓴 '신경망'을 가리킨다
지금 말하는 퍼셉트론은 원래 의미에서 조금 달라졌는데,
노드가 여러 입력값을 받아 각각을 가중치와 곱해 편향을 더해주고,
이들을 모두 더한 값을 활성화 함수를 거쳐 내보내는 네트워크를 의미합니다.
좀 더 구체적으로 말하면
(현재 사용되는 의미의) 퍼셉트론은 세 개의 층으로 이루어진다.
입력 벡터가 자리잡는 층을 입력층(input layer),
최종 출력값이 자리잡는 층을 출력층(output layer),
입력층과 출력층 사이에 위치하는 모든 층을 은닉층(hidden layer)이라고 한다.
이 때 퍼셉트론을 기본 빌딩 블록으로 하여,
이런 패턴에 따라 2차원적으로 연결되어 구성되는 인공신경망의 일종을 특별히
다층 퍼셉트론(MLP: multi-layer perceptron)이라고 한다.
은닉층의 개수가 많아질수록 인공신경망이 ‘깊어졌다(deep)’고 부르며,
이렇게 충분히 깊어진 인공신경망을 러닝 모델로 사용하는 머신러닝 패러다임을 딥러닝(Deep Learning)이라고 한다.
그리고, 딥러닝을 위해 사용하는 충분히 깊은 인공신경망을
심층 신경망(DNN: Deep neural network)이라고 통칭합니다.
1 완전연결신경망
2 CNN
3 RNN
In [ ]:
'Learning questions > 기초 개념' 카테고리의 다른 글
CS 기초, 시스템 버스 - CPU - 메모리(1) (0) | 2024.04.08 |
---|---|
독립사건과 종속사건의 의미, 동시확률(결합확률)과 조건부확률의 관계 (0) | 2022.12.13 |
Mathmatical Notation (0) | 2021.04.16 |
넘파이, 텐서플로에서 '차원', '축' 의 개념 (0) | 2021.02.02 |
Linear classifier (0) | 2021.01.17 |
Comments