신경망에서 행렬 곱(ft.파이썬)

2018. 10. 15. 21:15ML, OpenCV

다차원 배열의 계산에 대해서 먼저 알아봅시다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
>>> import numpy as np
>>> A = np.array([1,2,3,4])
>>> print(A)
[1 2 3 4]
>>> np.ndim(A)
1
>>> A.shape
(4,)
>>> A.shape[0]
4
>>> B=np.array([[1,2],[3,4],[5,6]])
>>> print(B)
[[1 2]
 [3 4]
 [5 6]]
>>> np.ndim(B)
2
>>> B.shape
(32)
>>> np.dot(A,B)
Traceback (most recent call last):
  File "<pyshell#10>", line 1in <module>
    np.dot(A,B)
ValueError: shapes (4,) and (3,2not aligned: 4 (dim 0!= 3 (dim 0)
cs

A는 1차원 B는 2차원 배열을 주고

np.dot으로 A와 B를 곱하려고 했는데 오류가 발생했습니다.


이유는 원소의 수가 다르기 때문입니다.

쉽게 설명하자면 위의 A배열과 B배열은

A.shape = 4

B.shape = 3, 2 입니다.


4와 3, 2 숫자가 전혀 겹치지 않습니다.

곱해주기 위해서는 A의 원소 수(열 수) B의 원소 수(행 수)

A의 원소를 3으로 바꿔보겠습니다.


1
2
3
4
5
6
7
>>> A = np.array([1,2,3])
>>> print(A)
[1 2 3]
>>> A.shape
(3,)
>>> np.dot(A,B)
array([2228])
cs


잘 곱해졌습니다.

1차원 배열은 쉽지만

2차원 배열끼리의 곱에서의 원소 수를 일치시키는 걸 예로들면


2X3 행렬과 3X2행렬은 문제 없이 곱해지지만

2X3 행렬과 2X2행렬은 에러가 발생합니다.

A의 원소 수(열 수) B의 원소 수(행 수)가 일치하지 않았기 때문입니다.


신경망에서의 행렬 곱의 예시는 이렇습니다.

신경망에서의 행렬 곱에 대한 이미지 검색결과

위의 신경망을 파이썬코드로 나타내면

1
2
3
4
5
6
7
8
9
>>> X=np.array([1,2])
>>> X.shape
(2,)
>>> W = np.array([[1,2,3],[4,5,6]])     
>>> W.shape     
(23)
>>> Y = np.dot(X, W)         
>>> print(Y)         
9 12 15]
cs

이렇게 입력된 값과 가중치값을 행렬 곱으로 구할 수 있습니다.